diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/web_contents_adapter.cpp | 25 | ||||
-rw-r--r-- | src/core/web_contents_adapter.h | 2 | ||||
-rw-r--r-- | src/core/web_contents_adapter_client.h | 1 | ||||
-rw-r--r-- | src/core/web_contents_delegate_qt.cpp | 9 | ||||
-rw-r--r-- | src/core/web_contents_delegate_qt.h | 1 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview_p_p.h | 1 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.cpp | 43 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.h | 5 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage_p.h | 10 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview.cpp | 5 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview.h | 2 |
11 files changed, 98 insertions, 6 deletions
diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index 82d6ed26f..be68e6ef4 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -59,6 +59,7 @@ #include "content/public/common/renderer_preferences.h" #include "content/public/common/url_constants.h" #include "ui/shell_dialogs/selected_file_info.h" +#include "third_party/WebKit/public/web/WebFindOptions.h" #include <QDir> #include <QGuiApplication> @@ -173,6 +174,7 @@ public: scoped_ptr<QtRenderViewObserverHost> renderViewObserverHost; WebContentsAdapterClient *adapterClient; quint64 lastRequestId; + QString lastSearchedString; }; WebContentsAdapterPrivate::WebContentsAdapterPrivate(WebContentsAdapterClient::RenderingMode renderingMode) @@ -429,6 +431,29 @@ quint64 WebContentsAdapter::fetchDocumentInnerText() return d->lastRequestId; } +quint64 WebContentsAdapter::findText(const QString &subString, bool caseSensitively, bool findBackward) +{ + Q_D(WebContentsAdapter); + WebKit::WebFindOptions options; + options.forward = !findBackward; + options.matchCase = caseSensitively; + options.findNext = subString == d->lastSearchedString; + d->lastSearchedString = subString; + + // Find already allows a request ID as input, but only as an int. + // Use the same counter but mod it to MAX_INT, this keeps the same likeliness of request ID clashing. + int shrunkRequestId = ++d->lastRequestId & 0x7fffffff; + d->webContents->GetRenderViewHost()->Find(shrunkRequestId, toString16(subString), options); + return shrunkRequestId; +} + +void WebContentsAdapter::stopFinding() +{ + Q_D(WebContentsAdapter); + d->lastSearchedString = QString(); + d->webContents->GetRenderViewHost()->StopFinding(content::STOP_FIND_ACTION_CLEAR_SELECTION); +} + void WebContentsAdapter::wasShown() { Q_D(WebContentsAdapter); diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h index 56e39ba32..4cef56103 100644 --- a/src/core/web_contents_adapter.h +++ b/src/core/web_contents_adapter.h @@ -89,6 +89,8 @@ public: quint64 runJavaScriptCallbackResult(const QString &javaScript, const QString &xPath); quint64 fetchDocumentMarkup(); quint64 fetchDocumentInnerText(); + quint64 findText(const QString &subString, bool caseSensitively, bool findBackward); + void stopFinding(); void wasShown(); void wasHidden(); diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index 778446a12..f56e31a71 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -136,6 +136,7 @@ public: virtual void didRunJavaScript(quint64 requestId, const QVariant& result) = 0; virtual void didFetchDocumentMarkup(quint64 requestId, const QString& result) = 0; virtual void didFetchDocumentInnerText(quint64 requestId, const QString& result) = 0; + virtual void didFindText(quint64 requestId, int matchCount) = 0; virtual void passOnFocus(bool reverse) = 0; virtual void javaScriptConsoleMessage(int level, const QString& message, int lineNumber, const QString& sourceID) = 0; }; diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp index 16ec54afd..c0b050de6 100644 --- a/src/core/web_contents_delegate_qt.cpp +++ b/src/core/web_contents_delegate_qt.cpp @@ -166,3 +166,12 @@ bool WebContentsDelegateQt::AddMessageToConsole(content::WebContents *source, in m_viewClient->javaScriptConsoleMessage(static_cast<int>(level), toQt(message), static_cast<int>(line_no), toQt(source_id)); return false; } + +void WebContentsDelegateQt::FindReply(content::WebContents *source, int request_id, int number_of_matches, const gfx::Rect& selection_rect, int active_match_ordinal, bool final_update) +{ + Q_UNUSED(source) + Q_UNUSED(selection_rect) + Q_UNUSED(active_match_ordinal) + if (final_update) + m_viewClient->didFindText(request_id, number_of_matches); +} diff --git a/src/core/web_contents_delegate_qt.h b/src/core/web_contents_delegate_qt.h index 460bb9ec2..4c8701945 100644 --- a/src/core/web_contents_delegate_qt.h +++ b/src/core/web_contents_delegate_qt.h @@ -77,6 +77,7 @@ public: virtual bool IsFullscreenForTabOrPending(const content::WebContents* web_contents) const Q_DECL_OVERRIDE; virtual void RunFileChooser(content::WebContents *, const content::FileChooserParams ¶ms) Q_DECL_OVERRIDE; virtual bool AddMessageToConsole(content::WebContents* source, int32 level, const string16& message, int32 line_no, const string16& source_id) Q_DECL_OVERRIDE; + virtual void FindReply(content::WebContents *source, int request_id, int number_of_matches, const gfx::Rect& selection_rect, int active_match_ordinal, bool final_update) Q_DECL_OVERRIDE; private: WebContentsAdapterClient *m_viewClient; diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index a36eb327c..ce8b64001 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -141,6 +141,7 @@ public: virtual void didRunJavaScript(quint64, const QVariant&) Q_DECL_OVERRIDE { } virtual void didFetchDocumentMarkup(quint64, const QString&) Q_DECL_OVERRIDE { } virtual void didFetchDocumentInnerText(quint64, const QString&) Q_DECL_OVERRIDE { } + virtual void didFindText(quint64, int) Q_DECL_OVERRIDE { } virtual void passOnFocus(bool reverse) Q_DECL_OVERRIDE; virtual void javaScriptConsoleMessage(int level, const QString& message, int lineNumber, const QString& sourceID) Q_DECL_OVERRIDE; diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 760a8eff7..ca1c203dd 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -57,6 +57,9 @@ CallbackDirectory::~CallbackDirectory() case CallbackSharedDataPointer::String: (*sharedPtr.stringCallback)(QString()); break; + case CallbackSharedDataPointer::Bool: + (*sharedPtr.boolCallback)(false); + break; default: Q_UNREACHABLE(); } @@ -73,6 +76,11 @@ void CallbackDirectory::registerCallback(quint64 requestId, const QExplicitlySha m_callbackMap.insert(requestId, CallbackSharedDataPointer(callback.data())); } +void CallbackDirectory::registerCallback(quint64 requestId, const QExplicitlySharedDataPointer<BoolCallback> &callback) +{ + m_callbackMap.insert(requestId, CallbackSharedDataPointer(callback.data())); +} + void CallbackDirectory::invoke(quint64 requestId, const QVariant &result) { CallbackSharedDataPointer sharedPtr = m_callbackMap.take(requestId); @@ -91,6 +99,15 @@ void CallbackDirectory::invoke(quint64 requestId, const QString &result) } } +void CallbackDirectory::invoke(quint64 requestId, bool result) +{ + CallbackSharedDataPointer sharedPtr = m_callbackMap.take(requestId); + if (sharedPtr) { + Q_ASSERT(sharedPtr.type == CallbackSharedDataPointer::Bool); + (*sharedPtr.boolCallback)(result); + } +} + void CallbackDirectory::CallbackSharedDataPointer::doRef() { switch (type) { @@ -102,6 +119,9 @@ void CallbackDirectory::CallbackSharedDataPointer::doRef() case String: stringCallback->ref.ref(); break; + case Bool: + boolCallback->ref.ref(); + break; } } @@ -118,6 +138,10 @@ void CallbackDirectory::CallbackSharedDataPointer::doDeref() if (!stringCallback->ref.deref()) delete stringCallback; break; + case Bool: + if (!boolCallback->ref.deref()) + delete boolCallback; + break; } } @@ -251,6 +275,11 @@ void QWebEnginePagePrivate::didFetchDocumentInnerText(quint64 requestId, const Q m_callbacks.invoke(requestId, result); } +void QWebEnginePagePrivate::didFindText(quint64 requestId, int matchCount) +{ + m_callbacks.invoke(requestId, matchCount > 0); +} + void QWebEnginePagePrivate::updateAction(QWebEnginePage::WebAction action) const { #ifdef QT_NO_ACTION @@ -414,6 +443,20 @@ void QWebEnginePage::triggerAction(WebAction action, bool) } } +void QWebEnginePage::findText(const QString &subString, FindFlags options, const QWebEngineCallback<bool> &resultCallback) +{ + Q_D(QWebEnginePage); + if (subString.isEmpty()) { + d->adapter->stopFinding(); + if (resultCallback.d) + (*resultCallback.d)(false); + } else { + quint64 requestId = d->adapter->findText(subString, options & FindCaseSensitively, options & FindBackward); + if (resultCallback.d) + d->m_callbacks.registerCallback(requestId, resultCallback.d); + } +} + void QWebEnginePage::setViewportSize(const QSize &size) const { Q_UNUSED(size) diff --git a/src/webenginewidgets/api/qwebenginepage.h b/src/webenginewidgets/api/qwebenginepage.h index f89115579..aac37bc99 100644 --- a/src/webenginewidgets/api/qwebenginepage.h +++ b/src/webenginewidgets/api/qwebenginepage.h @@ -76,6 +76,7 @@ class QWebEngineCallback { public: template <typename F> QWebEngineCallback(F f) : d(new QtWebEnginePrivate::QWebEngineCallbackPrivate<T, F>(f)) { } + QWebEngineCallback() { } private: QExplicitlySharedDataPointer<QtWebEnginePrivate::QWebEngineCallbackPrivateBase<T> > d; friend class QWebEnginePage; @@ -249,8 +250,6 @@ public: enum FindFlag { FindBackward = 1, FindCaseSensitively = 2, - FindWrapsAroundDocument = 4, - HighlightAllOccurrences = 8 }; Q_DECLARE_FLAGS(FindFlags, FindFlag) @@ -368,7 +367,7 @@ public: QVariant inputMethodQuery(Qt::InputMethodQuery property) const; - bool findText(const QString &subString, FindFlags options = 0); + void findText(const QString &subString, FindFlags options = 0, const QWebEngineCallback<bool> &resultCallback = QWebEngineCallback<bool>()); void setForwardUnsupportedContent(bool forward); bool forwardUnsupportedContent() const; diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h index e6113b795..ed21c3816 100644 --- a/src/webenginewidgets/api/qwebenginepage_p.h +++ b/src/webenginewidgets/api/qwebenginepage_p.h @@ -62,27 +62,33 @@ class CallbackDirectory { public: typedef QtWebEnginePrivate::QWebEngineCallbackPrivateBase<const QVariant&> VariantCallback; typedef QtWebEnginePrivate::QWebEngineCallbackPrivateBase<const QString&> StringCallback; + typedef QtWebEnginePrivate::QWebEngineCallbackPrivateBase<bool> BoolCallback; ~CallbackDirectory(); void registerCallback(quint64 requestId, const QExplicitlySharedDataPointer<VariantCallback> &callback); void registerCallback(quint64 requestId, const QExplicitlySharedDataPointer<StringCallback> &callback); + void registerCallback(quint64 requestId, const QExplicitlySharedDataPointer<BoolCallback> &callback); void invoke(quint64 requestId, const QVariant &result); void invoke(quint64 requestId, const QString &result); + void invoke(quint64 requestId, bool result); private: struct CallbackSharedDataPointer { enum { None, Variant, - String + String, + Bool } type; union { VariantCallback *variantCallback; StringCallback *stringCallback; + BoolCallback *boolCallback; }; CallbackSharedDataPointer() : type(None) { } CallbackSharedDataPointer(VariantCallback *callback) : type(Variant), variantCallback(callback) { callback->ref.ref(); } CallbackSharedDataPointer(StringCallback *callback) : type(String), stringCallback(callback) { callback->ref.ref(); } + CallbackSharedDataPointer(BoolCallback *callback) : type(Bool), boolCallback(callback) { callback->ref.ref(); } CallbackSharedDataPointer(const CallbackSharedDataPointer &other) : type(other.type), variantCallback(other.variantCallback) { doRef(); } ~CallbackSharedDataPointer() { doDeref(); } operator bool () const { return type != None; } @@ -125,8 +131,8 @@ public: virtual void didRunJavaScript(quint64 requestId, const QVariant& result) Q_DECL_OVERRIDE; virtual void didFetchDocumentMarkup(quint64 requestId, const QString& result) Q_DECL_OVERRIDE; virtual void didFetchDocumentInnerText(quint64 requestId, const QString& result) Q_DECL_OVERRIDE; + virtual void didFindText(quint64 requestId, int matchCount) Q_DECL_OVERRIDE; virtual void passOnFocus(bool reverse) Q_DECL_OVERRIDE { Q_UNUSED(reverse); }; - virtual void javaScriptConsoleMessage(int level, const QString& message, int lineNumber, const QString& sourceID) Q_DECL_OVERRIDE; void updateAction(QWebEnginePage::WebAction) const; diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index e5237bc72..3d884f464 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -177,6 +177,11 @@ void QWebEngineView::triggerPageAction(QWebEnginePage::WebAction action, bool ch page()->triggerAction(action, checked); } +void QWebEngineView::findText(const QString &subString, QWebEnginePage::FindFlags options, const QWebEngineCallback<bool> &resultCallback) +{ + page()->findText(subString, options, resultCallback); +} + void QWebEngineView::stop() { page()->triggerAction(QWebEnginePage::Stop); diff --git a/src/webenginewidgets/api/qwebengineview.h b/src/webenginewidgets/api/qwebengineview.h index 46b144d14..836e61be3 100644 --- a/src/webenginewidgets/api/qwebengineview.h +++ b/src/webenginewidgets/api/qwebengineview.h @@ -105,7 +105,7 @@ public: void setRenderHints(QPainter::RenderHints hints); void setRenderHint(QPainter::RenderHint hint, bool enabled = true); - bool findText(const QString& subString, QWebEnginePage::FindFlags options = 0); + void findText(const QString &subString, QWebEnginePage::FindFlags options = 0, const QWebEngineCallback<bool> &resultCallback = QWebEngineCallback<bool>()); virtual QSize sizeHint() const { return QSize(800, 600); } |