diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2023-05-05 14:23:55 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2023-05-16 13:29:32 +0200 |
commit | 2b24435c7f5c1a4d5de117ff92d2b3c064952143 (patch) | |
tree | 750f850506e12a1da0239f8503260e9e15ae3681 /src | |
parent | a3e94d3cb6d736a039e5c6e3f6e6d22487277ec9 (diff) | |
download | qtwebengine-2b24435c7f5c1a4d5de117ff92d2b3c064952143.tar.gz |
Test for presence of local frame in runJavaScript
It can be missing if we are in the process of shutting down.
Pick-to: 6.5 6.2
Fixes: QTBUG-113400
Change-Id: Ib494e479db08d51825c15f54354037c265ba96b0
Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/api/qwebenginepage.cpp | 10 | ||||
-rw-r--r-- | src/core/web_contents_adapter.cpp | 8 | ||||
-rw-r--r-- | src/webenginequick/api/qquickwebengineview.cpp | 6 |
3 files changed, 21 insertions, 3 deletions
diff --git a/src/core/api/qwebenginepage.cpp b/src/core/api/qwebenginepage.cpp index 475366c15..f725d437c 100644 --- a/src/core/api/qwebenginepage.cpp +++ b/src/core/api/qwebenginepage.cpp @@ -2031,7 +2031,10 @@ void QWebEnginePage::runJavaScript(const QString& scriptSource, const std::funct return; } quint64 requestId = d->adapter->runJavaScriptCallbackResult(scriptSource, QWebEngineScript::MainWorld); - d->m_variantCallbacks.insert(requestId, resultCallback); + if (requestId) + d->m_variantCallbacks.insert(requestId, resultCallback); + else if (resultCallback) + resultCallback(QVariant()); } void QWebEnginePage::runJavaScript(const QString& scriptSource, quint32 worldId, const std::function<void(const QVariant &)> &resultCallback) @@ -2046,7 +2049,10 @@ void QWebEnginePage::runJavaScript(const QString& scriptSource, quint32 worldId, } if (resultCallback) { quint64 requestId = d->adapter->runJavaScriptCallbackResult(scriptSource, worldId); - d->m_variantCallbacks.insert(requestId, resultCallback); + if (requestId) + d->m_variantCallbacks.insert(requestId, resultCallback); + else + resultCallback(QVariant()); } else { d->adapter->runJavaScript(scriptSource, worldId); } diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index 997019b03..0875408ab 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -1044,6 +1044,10 @@ void WebContentsAdapter::runJavaScript(const QString &javaScript, quint32 worldI CHECK_INITIALIZED(); content::RenderFrameHost *rfh = m_webContents->GetPrimaryMainFrame(); Q_ASSERT(rfh); + if (!static_cast<content::RenderFrameHostImpl*>(rfh)->GetAssociatedLocalFrame()) { + qWarning() << "Local frame is gone, not running script"; + return; + } if (worldId == 0) rfh->ExecuteJavaScript(toString16(javaScript), base::NullCallback()); else @@ -1055,6 +1059,10 @@ quint64 WebContentsAdapter::runJavaScriptCallbackResult(const QString &javaScrip CHECK_INITIALIZED(0); content::RenderFrameHost *rfh = m_webContents->GetPrimaryMainFrame(); Q_ASSERT(rfh); + if (!static_cast<content::RenderFrameHostImpl*>(rfh)->GetAssociatedLocalFrame()) { + qWarning() << "Local frame is gone, not running script"; + return 0; + } content::RenderFrameHost::JavaScriptResultCallback callback = base::BindOnce(&callbackOnEvaluateJS, m_adapterClient, m_nextRequestId); if (worldId == 0) rfh->ExecuteJavaScript(toString16(javaScript), std::move(callback)); diff --git a/src/webenginequick/api/qquickwebengineview.cpp b/src/webenginequick/api/qquickwebengineview.cpp index f11274741..f91efc338 100644 --- a/src/webenginequick/api/qquickwebengineview.cpp +++ b/src/webenginequick/api/qquickwebengineview.cpp @@ -1346,7 +1346,11 @@ void QQuickWebEngineView::runJavaScript(const QString &script, quint32 worldId, d->ensureContentsAdapter(); if (!callback.isUndefined()) { quint64 requestId = d_ptr->adapter->runJavaScriptCallbackResult(script, worldId); - d->m_callbacks.insert(requestId, callback); + if (requestId) { + d->m_callbacks.insert(requestId, callback); + } else { + callback.call(); + } } else d->adapter->runJavaScript(script, worldId); } |