summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/android/qandroidwebview.cpp31
-rw-r--r--src/plugins/android/qandroidwebview_p.h11
-rw-r--r--src/plugins/darwin/qdarwinwebview.mm11
-rw-r--r--src/plugins/darwin/qdarwinwebview_p.h5
-rw-r--r--src/plugins/wasm/qwasmwebview.cpp7
-rw-r--r--src/plugins/wasm/qwasmwebview_p.h5
-rw-r--r--src/plugins/webengine/qwebenginewebview.cpp6
-rw-r--r--src/plugins/webengine/qwebenginewebview_p.h10
-rw-r--r--src/plugins/windows/qwebview2webview.cpp22
-rw-r--r--src/plugins/windows/qwebview2webview_p.h5
10 files changed, 67 insertions, 46 deletions
diff --git a/src/plugins/android/qandroidwebview.cpp b/src/plugins/android/qandroidwebview.cpp
index ee33e2c..42cddc0 100644
--- a/src/plugins/android/qandroidwebview.cpp
+++ b/src/plugins/android/qandroidwebview.cpp
@@ -190,19 +190,19 @@ QString QAndroidWebViewPrivate::title() const
return m_viewController.callMethod<QString>("getTitle");
}
-void QAndroidWebViewPrivate::runJavaScriptPrivate(const QString &script,
- int callbackId)
+void QAndroidWebViewPrivate::runJavaScript(
+ const QString &script, const std::function<void(const QVariant &)> &resultCallback)
{
if (QtAndroidPrivate::androidSdkVersion() < 19) {
qWarning("runJavaScript() requires API level 19 or higher.");
- if (callbackId == -1)
- return;
-
- // Emit signal here to remove the callback.
- emit q_ptr->javaScriptResult(callbackId, QVariant());
+ if (resultCallback)
+ resultCallback(QVariant());
+ return;
}
- m_viewController.callMethod<void>("runJavaScript", script, jlong(callbackId));
+ m_callbacks.insert(m_callbackId, resultCallback);
+ m_viewController.callMethod<void>("runJavaScript", script, jlong(m_callbackId));
+ ++m_callbackId;
}
QWebViewSettingsPrivate *QAndroidWebViewPrivate::settings() const
@@ -259,6 +259,17 @@ void QAndroidWebViewPrivate::onApplicationStateChanged(Qt::ApplicationState stat
m_viewController.callMethod<void>("onPause");
}
+void QAndroidWebViewPrivate::javaScriptResult(int id, const QVariant &result)
+{
+ auto it = m_callbacks.find(id);
+ if (it != m_callbacks.end()) {
+ auto callback = it.value();
+ if (callback)
+ callback(result);
+ m_callbacks.erase(it);
+ }
+}
+
static void c_onRunJavaScriptResult(JNIEnv *env,
jobject thiz,
jlong id,
@@ -285,8 +296,8 @@ static void c_onRunJavaScriptResult(JNIEnv *env,
jsonValue = object.value(QStringLiteral("data"));
}
- emit wc->q_ptr->javaScriptResult(int(callbackId),
- jsonValue.isNull() ? resultString : jsonValue.toVariant());
+ wc->javaScriptResult(int(callbackId),
+ jsonValue.isNull() ? resultString : jsonValue.toVariant());
}
Q_DECLARE_JNI_NATIVE_METHOD(c_onRunJavaScriptResult)
diff --git a/src/plugins/android/qandroidwebview_p.h b/src/plugins/android/qandroidwebview_p.h
index 1cacd19..5a8d229 100644
--- a/src/plugins/android/qandroidwebview_p.h
+++ b/src/plugins/android/qandroidwebview_p.h
@@ -80,16 +80,21 @@ public:
void deleteCookie(const QString &domain, const QString &name) override;
void deleteAllCookies() override;
+ void runJavaScript(const QString &script,
+ const std::function<void(const QVariant &)> &resultCallback) override;
+
+ void javaScriptResult(int id, const QVariant &result);
+
protected:
- void runJavaScriptPrivate(const QString& script,
- int callbackId) override;
QWebViewSettingsPrivate *settings() const override;
private Q_SLOTS:
void onApplicationStateChanged(Qt::ApplicationState state);
private:
- quint64 m_callbackId;
+ int m_callbackId;
+ QMap<int, std::function<void(const QVariant &)>> m_callbacks;
+
QWindow *m_window;
QtJniTypes::WebViewController m_viewController;
QtJniTypes::WebView m_webView;
diff --git a/src/plugins/darwin/qdarwinwebview.mm b/src/plugins/darwin/qdarwinwebview.mm
index 967eaa0..0727768 100644
--- a/src/plugins/darwin/qdarwinwebview.mm
+++ b/src/plugins/darwin/qdarwinwebview.mm
@@ -460,13 +460,16 @@ QVariant fromJSValue(id result)
return QVariant();
}
-void QDarwinWebViewPrivate::runJavaScriptPrivate(const QString &script, int callbackId)
+void QDarwinWebViewPrivate::runJavaScript(
+ const QString &script, const std::function<void(const QVariant &)> &resultCallback)
{
+ std::function<void(const QVariant &)> callbackCopy = resultCallback;
QPointer<QDarwinWebViewPrivate> observer(this);
[wkWebView evaluateJavaScript:script.toNSString()
- completionHandler:^(id result, NSError *) {
- if (callbackId != -1 && observer)
- emit q_ptr->javaScriptResult(callbackId, fromJSValue(result));
+ completionHandler:^(id result, NSError *error) {
+ QVariant r = error ? QVariant() : fromJSValue(result);
+ if (callbackCopy && observer)
+ callbackCopy(r);
}];
}
diff --git a/src/plugins/darwin/qdarwinwebview_p.h b/src/plugins/darwin/qdarwinwebview_p.h
index a7d8b83..a23e12c 100644
--- a/src/plugins/darwin/qdarwinwebview_p.h
+++ b/src/plugins/darwin/qdarwinwebview_p.h
@@ -82,9 +82,8 @@ public:
void deleteCookie(const QString &domain, const QString &name) override;
void deleteAllCookies() override;
-protected:
- void runJavaScriptPrivate(const QString& script,
- int callbackId) override;
+ void runJavaScript(const QString &script,
+ const std::function<void(const QVariant &)> &resultCallback) override;
public:
WKWebView *wkWebView;
diff --git a/src/plugins/wasm/qwasmwebview.cpp b/src/plugins/wasm/qwasmwebview.cpp
index ca93c5e..31a7579 100644
--- a/src/plugins/wasm/qwasmwebview.cpp
+++ b/src/plugins/wasm/qwasmwebview.cpp
@@ -195,11 +195,12 @@ void QWasmWebViewPrivate::deleteAllCookies()
qWarning("deleteAllCookies() not supported on this platform");
}
-void QWasmWebViewPrivate::runJavaScriptPrivate(const QString &script, int callbackId)
+void QWasmWebViewPrivate::runJavaScript(const QString &script,
+ const std::function<void(const QVariant &)> &resultCallback)
{
Q_UNUSED(script);
- Q_UNUSED(callbackId);
- qWarning("runJavaScriptPrivate() not supported on this platform");
+ Q_UNUSED(resultCallback);
+ qWarning("runJavaScript() not supported on this platform");
}
QWebViewSettingsPrivate *QWasmWebViewPrivate::settings() const
diff --git a/src/plugins/wasm/qwasmwebview_p.h b/src/plugins/wasm/qwasmwebview_p.h
index 6695f66..bb251ed 100644
--- a/src/plugins/wasm/qwasmwebview_p.h
+++ b/src/plugins/wasm/qwasmwebview_p.h
@@ -76,9 +76,10 @@ public:
void deleteCookie(const QString &domain, const QString &name) final;
void deleteAllCookies() final;
+ void runJavaScript(const QString &script,
+ const std::function<void(const QVariant &)> &resultCallback) final;
+
protected:
- void runJavaScriptPrivate(const QString& script,
- int callbackId) final;
QWebViewSettingsPrivate *settings() const final;
private:
diff --git a/src/plugins/webengine/qwebenginewebview.cpp b/src/plugins/webengine/qwebenginewebview.cpp
index 8dd3421..2c58a2f 100644
--- a/src/plugins/webengine/qwebenginewebview.cpp
+++ b/src/plugins/webengine/qwebenginewebview.cpp
@@ -121,10 +121,10 @@ QString QWebEngineWebViewPrivate::title() const
return m_webEngineView->title();
}
-void QWebEngineWebViewPrivate::runJavaScriptPrivate(const QString &script,
- int callbackId)
+void QWebEngineWebViewPrivate::runJavaScript(
+ const QString &script, const std::function<void(const QVariant &)> &resultCallback)
{
- m_webEngineView->runJavaScript(script, QQuickWebView::takeCallback(callbackId));
+ m_webEngineView->runJavaScript(script, resultCallback);
}
void QWebEngineWebViewPrivate::setCookie(const QString &domain, const QString &name, const QString &value)
diff --git a/src/plugins/webengine/qwebenginewebview_p.h b/src/plugins/webengine/qwebenginewebview_p.h
index 4681f16..a73c712 100644
--- a/src/plugins/webengine/qwebenginewebview_p.h
+++ b/src/plugins/webengine/qwebenginewebview_p.h
@@ -22,12 +22,12 @@
#include <QtQml/qqmlcomponent.h>
-#include <private/qwebview_p.h>
+#include <QtWebView/private/qwebview_p.h>
#include <QtWebEngineQuick/QQuickWebEngineProfile>
#include <QtWebEngineQuick/private/qquickwebenginesettings_p.h>
#include <QtCore/qpointer.h>
-
+#include <QVariant>
QT_BEGIN_NAMESPACE
class QQuickItem;
@@ -84,7 +84,6 @@ public:
QWebViewSettingsPrivate *settings() const override;
QWindow *nativeWindow() const override { return nullptr; }
-public Q_SLOTS:
void goBack() override;
void goForward() override;
void reload() override;
@@ -94,6 +93,8 @@ public Q_SLOTS:
const QString &value) override;
void deleteCookie(const QString &domain, const QString &name) override;
void deleteAllCookies() override;
+ void runJavaScript(const QString &script,
+ const std::function<void(const QVariant &)> &resultCallback) override;
private Q_SLOTS:
void q_urlChanged();
@@ -105,9 +106,6 @@ private Q_SLOTS:
void q_cookieAdded(const QNetworkCookie &cookie);
void q_cookieRemoved(const QNetworkCookie &cookie);
-protected:
- void runJavaScriptPrivate(const QString& script,
- int callbackId) override;
private:
friend class QWebEngineWebViewSettingsPrivate;
diff --git a/src/plugins/windows/qwebview2webview.cpp b/src/plugins/windows/qwebview2webview.cpp
index 204d9d8..205f7bb 100644
--- a/src/plugins/windows/qwebview2webview.cpp
+++ b/src/plugins/windows/qwebview2webview.cpp
@@ -637,14 +637,15 @@ void QWebView2WebViewPrivate::updateWindowGeometry()
}
}
-void QWebView2WebViewPrivate::runJavaScriptPrivate(const QString &script, int callbackId)
+void QWebView2WebViewPrivate::runJavaScript(
+ const QString &script, const std::function<void(const QVariant &)> &resultCallback)
{
if (m_webview) {
- const HRESULT hr = m_webview->ExecuteScript(
+ m_webview->ExecuteScript(
(wchar_t *)script.utf16(),
Microsoft::WRL::Callback<ICoreWebView2ExecuteScriptCompletedHandler>(
- [this, callbackId](HRESULT errorCode,
- LPCWSTR resultObjectAsJson) -> HRESULT {
+ [this, resultCallback](HRESULT errorCode,
+ LPCWSTR resultObjectAsJson) -> HRESULT {
QString resultStr = QString::fromWCharArray(resultObjectAsJson);
QJsonParseError parseError;
@@ -664,15 +665,16 @@ void QWebView2WebViewPrivate::runJavaScriptPrivate(const QString &script, int ca
resultVariant = val.toVariant();
}
}
- if (errorCode != S_OK)
- emit q_ptr->javaScriptResult(callbackId,
- qt_error_string(errorCode));
- else
- emit q_ptr->javaScriptResult(callbackId, resultVariant);
+ QVariant r =
+ errorCode == S_OK ? resultVariant : qt_error_string(errorCode);
+ if (resultCallback)
+ resultCallback(r);
return errorCode;
})
.Get());
- Q_ASSERT_SUCCEEDED(hr);
+ } else {
+ if (resultCallback)
+ resultCallback(QVariant());
}
}
diff --git a/src/plugins/windows/qwebview2webview_p.h b/src/plugins/windows/qwebview2webview_p.h
index 60201f0..2b00277 100644
--- a/src/plugins/windows/qwebview2webview_p.h
+++ b/src/plugins/windows/qwebview2webview_p.h
@@ -86,8 +86,10 @@ public:
void setCookie(const QString &domain, const QString &name, const QString &value) override;
void deleteCookie(const QString &domain, const QString &name) override;
void deleteAllCookies() override;
+ void runJavaScript(const QString &script,
+ const std::function<void(const QVariant &)> &resultCallback) override;
-private Q_SLOTS:
+private:
HRESULT onNavigationStarting(ICoreWebView2* webview, ICoreWebView2NavigationStartingEventArgs* args);
HRESULT onNavigationCompleted(ICoreWebView2* webview, ICoreWebView2NavigationCompletedEventArgs* args);
HRESULT onWebResourceRequested(ICoreWebView2* sender, ICoreWebView2WebResourceRequestedEventArgs* args);
@@ -97,7 +99,6 @@ private Q_SLOTS:
void initialize(HWND hWnd);
protected:
- void runJavaScriptPrivate(const QString &script, int callbackId) override;
QWebViewSettingsPrivate *settings() const override;
private: