diff options
-rw-r--r-- | src/core/web_contents_delegate_qt.cpp | 13 | ||||
-rw-r--r-- | tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp | 28 |
2 files changed, 38 insertions, 3 deletions
diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp index 40fc0934d..e544760c7 100644 --- a/src/core/web_contents_delegate_qt.cpp +++ b/src/core/web_contents_delegate_qt.cpp @@ -44,6 +44,7 @@ #include "web_contents_delegate_qt.h" #include "browser_context_adapter.h" +#include "browser_context_qt.h" #include "color_chooser_qt.h" #include "color_chooser_controller.h" #include "favicon_manager.h" @@ -116,19 +117,25 @@ WebContentsDelegateQt::~WebContentsDelegateQt() content::WebContents *WebContentsDelegateQt::OpenURLFromTab(content::WebContents *source, const content::OpenURLParams ¶ms) { content::WebContents *target = source; + content::SiteInstance *target_site_instance = params.source_site_instance.get(); + content::Referrer referrer = params.referrer; if (params.disposition != WindowOpenDisposition::CURRENT_TAB) { QSharedPointer<WebContentsAdapter> targetAdapter = createWindow(0, params.disposition, gfx::Rect(), params.user_gesture); if (targetAdapter) { + if (targetAdapter->browserContext() != source->GetBrowserContext()) { + target_site_instance = nullptr; + referrer = content::Referrer(); + } if (!targetAdapter->isInitialized()) - targetAdapter->initialize(params.source_site_instance.get()); + targetAdapter->initialize(target_site_instance); target = targetAdapter->webContents(); } } Q_ASSERT(target); content::NavigationController::LoadURLParams load_url_params(params.url); - load_url_params.source_site_instance = params.source_site_instance; - load_url_params.referrer = params.referrer; + load_url_params.source_site_instance = target_site_instance; + load_url_params.referrer = referrer; load_url_params.frame_tree_node_id = params.frame_tree_node_id; load_url_params.redirect_chain = params.redirect_chain; load_url_params.transition_type = params.transition; diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp index 6fd2a06ee..ee7f9b2c2 100644 --- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp +++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp @@ -217,6 +217,7 @@ private Q_SLOTS: void registerProtocolHandler(); void dataURLFragment(); void devTools(); + void openLinkInDifferentProfile(); private: static QPoint elementCenter(QWebEnginePage *page, const QString &id); @@ -4354,6 +4355,33 @@ void tst_QWebEnginePage::devTools() QCOMPARE(devToolsPage.inspectedPage(), nullptr); } +void tst_QWebEnginePage::openLinkInDifferentProfile() +{ + class Page : public QWebEnginePage { + public: + QWebEnginePage *targetPage = nullptr; + Page(QWebEngineProfile *profile) : QWebEnginePage(profile) {} + private: + QWebEnginePage *createWindow(WebWindowType) override { return targetPage; } + }; + QWebEngineProfile profile1, profile2; + Page page1(&profile1), page2(&profile2); + QWebEngineView view; + view.setPage(&page1); + view.show(); + QVERIFY(QTest::qWaitForWindowExposed(&view)); + QSignalSpy spy1(&page1, &QWebEnginePage::loadFinished), spy2(&page2, &QWebEnginePage::loadFinished); + page1.setHtml("<html><body>" + "<a id='link' href='data:,hello'>link</a>" + "</body></html>"); + QTRY_COMPARE(spy1.count(), 1); + QVERIFY(spy1.takeFirst().value(0).toBool()); + page1.targetPage = &page2; + QTest::mouseClick(view.focusProxy(), Qt::MiddleButton, 0, elementCenter(&page1, "link")); + QTRY_COMPARE(spy2.count(), 1); + QVERIFY(spy2.takeFirst().value(0).toBool()); +} + static QByteArrayList params = {QByteArrayLiteral("--use-fake-device-for-media-stream")}; W_QTEST_MAIN(tst_QWebEnginePage, params) |