diff options
Diffstat (limited to 'src/webenginewidgets')
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.cpp | 20 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.h | 45 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage_p.h | 4 |
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 |