summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@digia.com>2014-02-10 18:04:33 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-13 14:28:04 +0100
commit324706a5fe9fbfd5aeaef54387dd4b08159a92a0 (patch)
tree5a99ceb64b794890fd339d0e67ea6fee5ed79abf /src
parent9cf0007b6ff49305550754babaeb67eb85c8d5ef (diff)
Implement QWebEnginePage::findText
A few changes to the API: - Return the success result asynchronously. - FindWrapsAroundDocument and HighlightAllOccurrences are enabled by defaults and cannot be disabled. - Found text isn't updating the selection on the page like QtWebKit did, but triggers a separate state not available. A find count and current index could be exposed, but isn't in this case to keep the API delta lower. This also adds the possibility to pass bool results through the CallbackDirectory and add a new tst_QWebEnginePage::findTextResult test since the old test relied on the selection to be updated when the searched text is found. Change-Id: I8189b5aea8d832df183c6c1ae03e3f08198a9c45 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/core/web_contents_adapter.cpp25
-rw-r--r--src/core/web_contents_adapter.h2
-rw-r--r--src/core/web_contents_adapter_client.h1
-rw-r--r--src/core/web_contents_delegate_qt.cpp9
-rw-r--r--src/core/web_contents_delegate_qt.h1
-rw-r--r--src/webengine/api/qquickwebengineview_p_p.h1
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp43
-rw-r--r--src/webenginewidgets/api/qwebenginepage.h5
-rw-r--r--src/webenginewidgets/api/qwebenginepage_p.h10
-rw-r--r--src/webenginewidgets/api/qwebengineview.cpp5
-rw-r--r--src/webenginewidgets/api/qwebengineview.h2
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 &params) 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); }