summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJüri Valdmann <juri.valdmann@qt.io>2018-04-24 10:44:08 +0200
committerJani Heikkinen <jani.heikkinen@qt.io>2018-04-30 05:58:43 +0000
commit9fe01886396ef8ac9466d8f2f24eb6ddc3c2aaae (patch)
tree0aa1a0e43d77404575507904d4211b4ade439f7f
parentdf1d549c56ff6a1214e566336f0c7dad2eacd503 (diff)
Fix invalid site instance when switching browser contexts
All pages in a site instance should belong to the same browser context, an invariant which is violated by our WebContentsDelegateQt::OpenURLFromTab. Task-number: QTBUG-67900 Change-Id: I754180bb96de07448ee3058210391f7856f4caeb Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rw-r--r--src/core/web_contents_delegate_qt.cpp13
-rw-r--r--tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp28
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 &params)
{
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)