summaryrefslogtreecommitdiffstats
path: root/src/webenginewidgets
diff options
context:
space:
mode:
Diffstat (limited to 'src/webenginewidgets')
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp20
-rw-r--r--src/webenginewidgets/api/qwebenginepage.h45
-rw-r--r--src/webenginewidgets/api/qwebenginepage_p.h4
3 files changed, 37 insertions, 32 deletions
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index 54abb4384..8192f38ed 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -146,6 +146,11 @@ void QWebEnginePagePrivate::close()
Q_EMIT q->windowCloseRequested();
}
+void QWebEnginePagePrivate::didRunJavaScript(const QVariant& result, quint64 requestId)
+{
+ (*m_variantCallbacks.take(requestId))(result);
+}
+
void QWebEnginePagePrivate::updateAction(QWebEnginePage::WebAction action) const
{
#ifdef QT_NO_ACTION
@@ -490,20 +495,11 @@ void QWebEnginePage::runJavaScript(const QString &scriptSource, const QString &x
d->adapter->runJavaScript(scriptSource, xPath);
}
-namespace {
-struct JSCallbackFunctor : public JSCallbackBase {
- JSCallbackFunctor(QtWebEnginePrivate::FunctorBase *functor) : m_func(functor) { }
- ~JSCallbackFunctor() { delete m_func; }
- void call(const QVariant &value) { (*m_func)(value); }
-private:
- QtWebEnginePrivate::FunctorBase *m_func;
-};
-}
-
-void QWebEnginePage::runJavaScriptHelper(const QString &source, QtWebEnginePrivate::FunctorBase *functor, const QString &xPath)
+void QWebEnginePage::runJavaScript(const QString& scriptSource, const QWebEngineCallback<const QVariant &> &resultCallback, const QString &xPath)
{
Q_D(QWebEnginePage);
- d->adapter->runJavaScript(source, xPath, new JSCallbackFunctor(functor));
+ quint64 requestId = d->adapter->runJavaScriptCallbackResult(scriptSource, xPath);
+ d->m_variantCallbacks.insert(requestId, resultCallback.d);
}
QWebEnginePage *QWebEnginePage::createWindow(WebWindowType type)
diff --git a/src/webenginewidgets/api/qwebenginepage.h b/src/webenginewidgets/api/qwebenginepage.h
index 4d6a72fc4..c33119571 100644
--- a/src/webenginewidgets/api/qwebenginepage.h
+++ b/src/webenginewidgets/api/qwebenginepage.h
@@ -44,6 +44,7 @@ class QWebEngineElementCollection;
class QWebEngineHistory;
class QWebEngineHistoryItem;
+class QWebEnginePage;
class QWebEnginePagePrivate;
class QWebEnginePluginFactory;
class QWebEngineSecurityOrigin;
@@ -52,19 +53,33 @@ class QWebEngineHitTestResultPrivate;
namespace QtWebEnginePrivate {
-struct FunctorBase {
- virtual ~FunctorBase() {}
- virtual void operator()(const QVariant &) = 0;
+template <typename T>
+class QWebEngineCallbackPrivateBase : public QSharedData {
+public:
+ virtual ~QWebEngineCallbackPrivateBase() {}
+ virtual void operator()(T) = 0;
+};
+
+template <typename T, typename F>
+class QWebEngineCallbackPrivate : public QWebEngineCallbackPrivateBase<T> {
+public:
+ QWebEngineCallbackPrivate(F callable) : m_callable(callable) {}
+ virtual void operator()(T value) Q_DECL_OVERRIDE { m_callable(value); }
+private:
+ F m_callable;
};
-template <typename F>
-struct FunctorCallback : public FunctorBase {
- FunctorCallback(F callback) : m_callback(callback) {}
- virtual void operator()(const QVariant &value) Q_DECL_OVERRIDE { m_callback(value); }
+} // namespace QtWebEnginePrivate
+
+template <typename T>
+class QWebEngineCallback {
+public:
+ template <typename F>
+ QWebEngineCallback(F f) : d(new QtWebEnginePrivate::QWebEngineCallbackPrivate<T, F>(f)) { }
private:
- F m_callback;
+ QExplicitlySharedDataPointer<QtWebEnginePrivate::QWebEngineCallbackPrivateBase<T> > d;
+ friend class QWebEnginePage;
};
-}
class QWEBENGINEWIDGETS_EXPORT QWebEngineHitTestResult {
public:
@@ -484,9 +499,7 @@ public:
QWebEngineSecurityOrigin securityOrigin() const;
void runJavaScript(const QString& scriptSource, const QString &xPath = QString());
-
- template <typename F>
- void runJavaScript(const QString& scriptSource, F func, const QString &xPath = QString());
+ void runJavaScript(const QString& scriptSource, const QWebEngineCallback<const QVariant &> &resultCallback, const QString &xPath = QString());
public Q_SLOTS:
// Ex-QWebFrame slot
@@ -564,7 +577,6 @@ private:
#ifndef QT_NO_ACTION
Q_PRIVATE_SLOT(d_func(), void _q_webActionTriggered(bool checked))
#endif
- void runJavaScriptHelper(const QString &source, QtWebEnginePrivate::FunctorBase *, const QString &xPath);
friend class QWebEngineView;
friend class QWebEngineViewPrivate;
@@ -573,13 +585,6 @@ private:
Q_DECLARE_OPERATORS_FOR_FLAGS(QWebEnginePage::FindFlags);
Q_DECLARE_OPERATORS_FOR_FLAGS(QWebEnginePage::RenderLayers);
-
-template <typename F>
-inline void QWebEnginePage::runJavaScript(const QString &scriptSource, F func, const QString &xPath)
-{
- runJavaScriptHelper(scriptSource, new QtWebEnginePrivate::FunctorCallback<F>(func), xPath);
-}
-
QT_END_NAMESPACE
#endif // QWEBENGINEPAGE_H
diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h
index c8dd63daa..656eb4788 100644
--- a/src/webenginewidgets/api/qwebenginepage_p.h
+++ b/src/webenginewidgets/api/qwebenginepage_p.h
@@ -80,6 +80,7 @@ public:
virtual bool contextMenuRequested(const WebEngineContextMenuData &data) Q_DECL_OVERRIDE;
virtual void javascriptDialog(QSharedPointer<JavaScriptDialogController>) Q_DECL_OVERRIDE;
virtual void runFileChooser(FileChooserMode, const QString &defaultFileName, const QStringList &acceptedMimeTypes) Q_DECL_OVERRIDE;
+ virtual void didRunJavaScript(const QVariant& result, quint64 requestId) Q_DECL_OVERRIDE;
void updateAction(QWebEnginePage::WebAction) const;
void updateNavigationActions();
@@ -91,6 +92,9 @@ public:
mutable QAction *actions[QWebEnginePage::WebActionCount];
bool m_isLoading;
WebEngineContextMenuData m_menuData;
+
+ typedef QtWebEnginePrivate::QWebEngineCallbackPrivateBase<const QVariant&> VariantCallback;
+ mutable QHash<quint64, QExplicitlySharedDataPointer<VariantCallback> > m_variantCallbacks;
};
QT_END_NAMESPACE