diff options
Diffstat (limited to 'src/core/web_contents_adapter.cpp')
-rw-r--r-- | src/core/web_contents_adapter.cpp | 79 |
1 files changed, 56 insertions, 23 deletions
diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index 6decf8780..b06ed2121 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -174,10 +174,9 @@ static QVariant fromJSValue(const base::Value *result) return ret; } -static void callbackOnEvaluateJS(WebContentsAdapterClient *adapterClient, quint64 requestId, base::Value result) +static void callbackOnEvaluateJS(WebContentsAdapter *adapter, quint64 requestId, base::Value result) { - if (requestId) - adapterClient->didRunJavaScript(requestId, fromJSValue(&result)); + adapter->didRunJavaScript(requestId, result); } #if QT_CONFIG(webengine_printing_and_pdf) @@ -993,6 +992,9 @@ void WebContentsAdapter::setZoomFactor(qreal factor) const content::GlobalRenderFrameHostId global_id = m_webContents->GetPrimaryMainFrame()->GetGlobalId(); zoomMap->SetTemporaryZoomLevel(global_id, zoomLevel); } + + if (m_adapterClient) + m_adapterClient->zoomFactorChanged(currentZoomFactor()); } qreal WebContentsAdapter::currentZoomFactor() const @@ -1039,36 +1041,67 @@ QAccessibleInterface *WebContentsAdapter::browserAccessible() } #endif // QT_CONFIG(accessibility) -void WebContentsAdapter::runJavaScript(const QString &javaScript, quint32 worldId) +content::RenderFrameHost *WebContentsAdapter::renderFrameHostFromFrameId(quint64 frameId) const { - 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; + content::RenderFrameHost *result; + if (frameId == kUseMainFrameId) { + result = m_webContents->GetPrimaryMainFrame(); + } else { + auto *ftn = content::FrameTreeNode::GloballyFindByID(static_cast<int>(frameId)); + if (!ftn) + return nullptr; + + result = ftn->current_frame_host(); } - if (worldId == 0) - rfh->ExecuteJavaScript(toString16(javaScript), base::NullCallback()); - else - rfh->ExecuteJavaScriptInIsolatedWorld(toString16(javaScript), base::NullCallback(), worldId); + Q_ASSERT(result); + return result; } -quint64 WebContentsAdapter::runJavaScriptCallbackResult(const QString &javaScript, quint32 worldId) +void WebContentsAdapter::runJavaScript(const QString &javaScript, quint32 worldId, quint64 frameId, + const std::function<void(const QVariant &)> &callback) { - CHECK_INITIALIZED(0); - content::RenderFrameHost *rfh = m_webContents->GetPrimaryMainFrame(); - Q_ASSERT(rfh); + auto exit = [&] { + if (callback) + callback(QVariant()); + }; + + if (!isInitialized()) + return exit(); + auto *rfh = renderFrameHostFromFrameId(frameId); + if (!rfh) + return exit(); if (!static_cast<content::RenderFrameHostImpl*>(rfh)->GetAssociatedLocalFrame()) { qWarning() << "Local frame is gone, not running script"; - return 0; + return exit(); + } + + content::RenderFrameHost::JavaScriptResultCallback internalCallback = base::NullCallback(); + if (callback) { + internalCallback = base::BindOnce(&callbackOnEvaluateJS, this, m_nextRequestId); + m_javaScriptCallbacks.insert(m_nextRequestId, callback); + ++m_nextRequestId; } - content::RenderFrameHost::JavaScriptResultCallback callback = base::BindOnce(&callbackOnEvaluateJS, m_adapterClient, m_nextRequestId); if (worldId == 0) - rfh->ExecuteJavaScript(toString16(javaScript), std::move(callback)); + rfh->ExecuteJavaScript(toString16(javaScript), std::move(internalCallback)); else - rfh->ExecuteJavaScriptInIsolatedWorld(toString16(javaScript), std::move(callback), worldId); - return m_nextRequestId++; + rfh->ExecuteJavaScriptInIsolatedWorld(toString16(javaScript), std::move(internalCallback), + worldId); +} + +void WebContentsAdapter::didRunJavaScript(quint64 requestId, const base::Value &result) +{ + Q_ASSERT(requestId); + auto callback = m_javaScriptCallbacks.take(requestId); + Q_ASSERT(callback); + callback(fromJSValue(&result)); +} + +// Called when QWebEnginePage is deleted +void WebContentsAdapter::clearJavaScriptCallbacks() +{ + for (auto varFun : std::as_const(m_javaScriptCallbacks)) + varFun(QVariant()); + m_javaScriptCallbacks.clear(); } quint64 WebContentsAdapter::fetchDocumentMarkup() |