diff --git a/webenginepart/src/CMakeLists.txt b/webenginepart/src/CMakeLists.txt --- a/webenginepart/src/CMakeLists.txt +++ b/webenginepart/src/CMakeLists.txt @@ -29,6 +29,7 @@ if(Qt5WebEngineWidgets_VERSION VERSION_GREATER_EQUAL "5.12.0") add_definitions(-DUSE_QWEBENGINE_URL_SCHEME) + add_definitions(-DDOWNLOADITEM_KNOWS_PAGE) else() list(APPEND kwebenginepartlib_LIB_SRCS, webengineparthtmlembedder.cpp) endif() diff --git a/webenginepart/src/webenginepage.h b/webenginepart/src/webenginepage.h --- a/webenginepart/src/webenginepage.h +++ b/webenginepart/src/webenginepage.h @@ -82,7 +82,9 @@ */ void loadAborted(const QUrl &url); +#ifndef DOWNLOADITEM_KNOWS_PAGE void navigationRequested(WebEnginePage* page, const QUrl& url); +#endif protected: /** diff --git a/webenginepart/src/webenginepage.cpp b/webenginepart/src/webenginepage.cpp --- a/webenginepart/src/webenginepage.cpp +++ b/webenginepart/src/webenginepage.cpp @@ -95,7 +95,9 @@ { this->profile()->setHttpUserAgent(this->profile()->httpUserAgent() + " Konqueror (WebEnginePart)"); } + WebEnginePartDownloadManager::instance()->addPage(this); + m_wallet = new WebEngineWallet(this, parent ? parent->window()->winId() : 0); } @@ -265,7 +267,9 @@ // Honor the enabling/disabling of plugins per host. settings()->setAttribute(QWebEngineSettings::PluginsEnabled, WebEngineSettings::self()->isPluginsEnabled(reqUrl.host())); +#ifndef DOWNLOADITEM_KNOWS_PAGE emit navigationRequested(this, url); +#endif return QWebEnginePage::acceptNavigationRequest(url, type, isMainFrame); } @@ -847,7 +851,10 @@ m_createNewWindow = false; } + +#ifndef DOWNLOADITEM_KNOWS_PAGE emit navigationRequested(this, url); +#endif return WebEnginePage::acceptNavigationRequest(url, type, isMainFrame); } diff --git a/webenginepart/src/webenginepartdownloadmanager.h b/webenginepart/src/webenginepartdownloadmanager.h --- a/webenginepart/src/webenginepartdownloadmanager.h +++ b/webenginepart/src/webenginepartdownloadmanager.h @@ -37,21 +37,29 @@ ~WebEnginePartDownloadManager() override; +private: + WebEnginePartDownloadManager(); + public Q_SLOTS: void addPage(WebEnginePage *page); void removePage(QObject *page); +private Q_SLOTS: + void performDownload(QWebEngineDownloadItem *it); + +#ifndef DOWNLOADITEM_KNOWS_PAGE private: - WebEnginePartDownloadManager(); WebEnginePage* pageForDownload(QWebEngineDownloadItem *it); private Q_SLOTS: - void performDownload(QWebEngineDownloadItem *it); void recordNavigationRequest(WebEnginePage* page, const QUrl& url); +#endif private: QVector m_pages; +#ifndef DOWNLOADITEM_KNOWS_PAGE QHash m_requests; +#endif }; #endif // WEBENGINEPARTDOWNLOADMANAGER_H diff --git a/webenginepart/src/webenginepartdownloadmanager.cpp b/webenginepart/src/webenginepartdownloadmanager.cpp --- a/webenginepart/src/webenginepartdownloadmanager.cpp +++ b/webenginepart/src/webenginepartdownloadmanager.cpp @@ -35,7 +35,9 @@ WebEnginePartDownloadManager::~WebEnginePartDownloadManager() { +#ifndef DOWNLOADITEM_KNOWS_PAGE m_requests.clear(); +#endif } WebEnginePartDownloadManager * WebEnginePartDownloadManager::instance() @@ -49,21 +51,30 @@ if (!m_pages.contains(page)) { m_pages.append(page); } +#ifndef DOWNLOADITEM_KNOWS_PAGE connect(page, &WebEnginePage::navigationRequested, this, &WebEnginePartDownloadManager::recordNavigationRequest); +#endif connect(page, &QObject::destroyed, this, &WebEnginePartDownloadManager::removePage); } void WebEnginePartDownloadManager::removePage(QObject* page) { +#ifndef DOWNLOADITEM_KNOWS_PAGE const QUrl url = m_requests.key(static_cast(page)); m_requests.remove(url); +#endif m_pages.removeOne(static_cast(page)); } void WebEnginePartDownloadManager::performDownload(QWebEngineDownloadItem* it) { +#ifdef DOWNLOADITEM_KNOWS_PAGE + WebEnginePage *page = qobject_cast(it->page()); +#else WebEnginePage *page = m_requests.take(it->url()); +#endif bool forceNew = false; + //According to the documentation, QWebEngineDownloadItem::page() can return nullptr "if the download was not triggered by content in a page" if (!page && !m_pages.isEmpty()) { qCDebug(WEBENGINEPART_LOG) << "downloading" << it->url() << "in new window or tab"; page = m_pages.first(); @@ -75,6 +86,8 @@ page->download(it->url(), forceNew); } +#ifndef DOWNLOADITEM_KNOWS_PAGE + void WebEnginePartDownloadManager::recordNavigationRequest(WebEnginePage *page, const QUrl& url) { // qCDebug(WEBENGINEPART_LOG) << url; @@ -89,3 +102,4 @@ } return page; } +#endif