summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJüri Valdmann <juri.valdmann@qt.io>2018-07-09 09:27:33 +0200
committerJüri Valdmann <juri.valdmann@qt.io>2018-07-16 08:53:10 +0000
commitf055da31fb011e852345665fceb6933fa966f731 (patch)
tree8f8fbfd4e7c963bebfa7aee577d649009c9d8645
parent5ad6d45d88e020da039872d3187416547b11e605 (diff)
Fix segfault in devtools openInNewTab handling
- Use OpenURL on the devtools WebContents. - Guard against self-destruction (otherwise quicknanobrowser crashes). - Change quicknanobrowser to open links in new tabs. Task-number: QTBUG-69359 Change-Id: I4db379731c6fa855124d38c5066b0aad622861d2 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rw-r--r--examples/webengine/quicknanobrowser/BrowserWindow.qml5
-rw-r--r--src/core/devtools_frontend_qt.cpp11
2 files changed, 15 insertions, 1 deletions
diff --git a/examples/webengine/quicknanobrowser/BrowserWindow.qml b/examples/webengine/quicknanobrowser/BrowserWindow.qml
index fc9cd0253..3bfcaabfd 100644
--- a/examples/webengine/quicknanobrowser/BrowserWindow.qml
+++ b/examples/webengine/quicknanobrowser/BrowserWindow.qml
@@ -505,6 +505,11 @@ ApplicationWindow {
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
+ onNewViewRequested: function(request) {
+ var tab = tabs.createEmptyTab(currentWebView.profile);
+ tabs.currentIndex = tabs.count - 1;
+ request.openIn(tab.item);
+ }
}
MessageDialog {
id: sslDialog
diff --git a/src/core/devtools_frontend_qt.cpp b/src/core/devtools_frontend_qt.cpp
index 810235dba..1f741f526 100644
--- a/src/core/devtools_frontend_qt.cpp
+++ b/src/core/devtools_frontend_qt.cpp
@@ -428,7 +428,16 @@ void DevToolsFrontendQt::HandleMessageFromDevToolsFrontend(const std::string &me
WindowOpenDisposition::NEW_FOREGROUND_TAB,
ui::PAGE_TRANSITION_LINK,
false);
- m_frontendDelegate->OpenURLFromTab(nullptr, openParams);
+ // OpenURL will (via WebContentsDelegateQt::OpenURLFromTab) call
+ // application code, which may decide to close this devtools view (see
+ // quicknanobrowser for example).
+ //
+ // Chromium always calls SendMessageAck through a callback bound to a
+ // WeakPtr, we do the same here, except without the callback.
+ base::WeakPtr<DevToolsFrontendQt> weakThis = m_weakFactory.GetWeakPtr();
+ web_contents()->OpenURL(openParams);
+ if (!weakThis)
+ return;
} else if (method == "bringToFront") {
Activate();
} else {