diff options
author | Peter Varga <pvarga@inf.u-szeged.hu> | 2019-07-12 13:39:06 +0200 |
---|---|---|
committer | Peter Varga <pvarga@inf.u-szeged.hu> | 2019-08-23 10:25:23 +0200 |
commit | a6abc01319798e2175914323273e91927516eba0 (patch) | |
tree | c7fe231f43e80cc4442c535442f41de1cd521fda /src/core | |
parent | 55a4c28542c6dc9e4a4edc0aab7043feef2ab0d2 (diff) |
Introduce findTextFinished signal
This is a replacement for the callbacks. Also introduces
QWebEngineFindTextResult class what is common for the Quick and Widget
APIs. This makes possible to provide extra information about the match,
eg. the number of matches and the index of the currently highlighted match.
[ChangeLog][QtWebEngine][WebEngineView] Introduces findTextFinished
signal and FindTextResult type to provide extra information about the
result of a text search.
[ChangeLog][QtWebEngineWidgets][QWebEnginePage] Introduces
findTextFinished signal and QWebEngineFindTextResult class to provide
extra information about the result of a text search.
Task-number: QTBUG-50420
Change-Id: Icb9737d2f596e6bc0fc5733144eeeaf2a77aab02
Reviewed-by: Jüri Valdmann <juri.valdmann@qt.io>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/api/core_api.pro | 2 | ||||
-rw-r--r-- | src/core/api/qwebenginefindtextresult.cpp | 116 | ||||
-rw-r--r-- | src/core/api/qwebenginefindtextresult.h | 81 | ||||
-rw-r--r-- | src/core/find_text_helper.cpp | 10 | ||||
-rw-r--r-- | src/core/find_text_helper.h | 5 | ||||
-rw-r--r-- | src/core/web_contents_adapter_client.h | 2 | ||||
-rw-r--r-- | src/core/web_contents_delegate_qt.cpp | 2 |
7 files changed, 214 insertions, 4 deletions
diff --git a/src/core/api/core_api.pro b/src/core/api/core_api.pro index 326d4481f..5e8b8387e 100644 --- a/src/core/api/core_api.pro +++ b/src/core/api/core_api.pro @@ -37,6 +37,7 @@ HEADERS = \ qtwebenginecoreglobal_p.h \ qwebenginecookiestore.h \ qwebenginecookiestore_p.h \ + qwebenginefindtextresult.h \ qwebenginehttprequest.h \ qwebenginemessagepumpscheduler_p.h \ qwebenginenotification.h \ @@ -53,6 +54,7 @@ SOURCES = \ qtwebenginecoreglobal.cpp \ qwebengineclientcertificatestore.cpp \ qwebenginecookiestore.cpp \ + qwebenginefindtextresult.cpp \ qwebenginehttprequest.cpp \ qwebenginemessagepumpscheduler.cpp \ qwebenginenotification.cpp \ diff --git a/src/core/api/qwebenginefindtextresult.cpp b/src/core/api/qwebenginefindtextresult.cpp new file mode 100644 index 000000000..ce1be359e --- /dev/null +++ b/src/core/api/qwebenginefindtextresult.cpp @@ -0,0 +1,116 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwebenginefindtextresult.h" + +QT_BEGIN_NAMESPACE + +class QWebEngineFindTextResultPrivate : public QSharedData { +public: + int numberOfMatches = 0; + int activeMatchOrdinal = 0; +}; + +/*! + \class QWebEngineFindTextResult + \brief The QWebEngineFindTextResult class encapsulates the result of a string search on a page. + \since 5.14 + + \inmodule QtWebEngineCore + + Results are passed to the user in the + \l QWebEnginePage::findTextFinished() and + \l{WebEngineView::findTextFinished()}{WebEngineView.findTextFinished()} signals. +*/ + +/*! \internal +*/ +QWebEngineFindTextResult::QWebEngineFindTextResult() + : d(new QWebEngineFindTextResultPrivate) +{} + +/*! \internal +*/ +QWebEngineFindTextResult::QWebEngineFindTextResult(int numberOfMatches, int activeMatchOrdinal) + : d(new QWebEngineFindTextResultPrivate) +{ + d->numberOfMatches = numberOfMatches; + d->activeMatchOrdinal = activeMatchOrdinal; +} + +/*! \internal +*/ +QWebEngineFindTextResult::QWebEngineFindTextResult(const QWebEngineFindTextResult &other) + : d(other.d) +{} + +/*! \internal +*/ +QWebEngineFindTextResult &QWebEngineFindTextResult::operator=(const QWebEngineFindTextResult &other) +{ + d = other.d; + return *this; +} + +/*! \internal +*/ +QWebEngineFindTextResult::~QWebEngineFindTextResult() +{} + +/*! + \property QWebEngineFindTextResult::numberOfMatches + \brief The number of matches found. +*/ +int QWebEngineFindTextResult::numberOfMatches() const +{ + return d->numberOfMatches; +} + +/*! + \property QWebEngineFindTextResult::activeMatchOrdinal + \brief The index of the currently highlighted match. +*/ +int QWebEngineFindTextResult::activeMatchOrdinal() const +{ + return d->activeMatchOrdinal; +} + +QT_END_NAMESPACE + +#include "moc_qwebenginefindtextresult.cpp" diff --git a/src/core/api/qwebenginefindtextresult.h b/src/core/api/qwebenginefindtextresult.h new file mode 100644 index 000000000..073a8135f --- /dev/null +++ b/src/core/api/qwebenginefindtextresult.h @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWEBENGINEFINDTEXTRESULT_H +#define QWEBENGINEFINDTEXTRESULT_H + +#include <QtWebEngineCore/qtwebenginecoreglobal.h> +#include <QtCore/QObject> +#include <QtCore/QSharedData> + +namespace QtWebEngineCore { +class FindTextHelper; +} + +QT_BEGIN_NAMESPACE + +class QWebEngineFindTextResultPrivate; + +class Q_WEBENGINECORE_EXPORT QWebEngineFindTextResult { + Q_GADGET + Q_PROPERTY(int numberOfMatches READ numberOfMatches CONSTANT FINAL) + Q_PROPERTY(int activeMatchOrdinal READ activeMatchOrdinal CONSTANT FINAL) + +public: + int numberOfMatches() const; + int activeMatchOrdinal() const; + + QWebEngineFindTextResult(); + QWebEngineFindTextResult(const QWebEngineFindTextResult &other); + QWebEngineFindTextResult &operator=(const QWebEngineFindTextResult &other); + ~QWebEngineFindTextResult(); + +private: + QWebEngineFindTextResult(int numberOfMatches, int activeMatchOrdinal); + + QSharedDataPointer<QWebEngineFindTextResultPrivate> d; + + friend class QtWebEngineCore::FindTextHelper; +}; + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QWebEngineFindTextResult) + +#endif // QWEBENGINEFINDTEXTRESULT_H diff --git a/src/core/find_text_helper.cpp b/src/core/find_text_helper.cpp index 5fb56dacc..effda529f 100644 --- a/src/core/find_text_helper.cpp +++ b/src/core/find_text_helper.cpp @@ -38,7 +38,9 @@ ****************************************************************************/ #include "find_text_helper.h" +#include "qwebenginefindtextresult.h" #include "type_conversion.h" +#include "web_contents_adapter_client.h" #include "content/public/browser/web_contents.h" #include "third_party/blink/public/mojom/frame/find_in_page.mojom.h" @@ -48,8 +50,9 @@ namespace QtWebEngineCore { // static int FindTextHelper::m_findRequestIdCounter = -1; -FindTextHelper::FindTextHelper(content::WebContents *webContents) +FindTextHelper::FindTextHelper(content::WebContents *webContents, WebContentsAdapterClient *viewClient) : m_webContents(webContents) + , m_viewClient(viewClient) , m_currentFindRequestId(m_findRequestIdCounter++) , m_lastCompletedFindRequestId(m_currentFindRequestId) { @@ -65,6 +68,7 @@ void FindTextHelper::startFinding(const QString &findText, bool caseSensitively, { if (findText.isEmpty()) { stopFinding(); + m_viewClient->findTextFinished(QWebEngineFindTextResult()); m_widgetCallbacks.invokeEmpty(resultCallback); return; } @@ -77,6 +81,7 @@ void FindTextHelper::startFinding(const QString &findText, bool caseSensitively, { if (findText.isEmpty()) { stopFinding(); + m_viewClient->findTextFinished(QWebEngineFindTextResult()); if (!resultCallback.isUndefined()) { QJSValueList args; args.append(QJSValue(0)); @@ -103,6 +108,7 @@ void FindTextHelper::startFinding(const QString &findText, bool caseSensitively, // waiting for it forever. // Assume that any unfinished find has been unsuccessful when a new one is started // to cover that case. + m_viewClient->findTextFinished(QWebEngineFindTextResult()); invokeResultCallback(m_currentFindRequestId, 0); } @@ -132,7 +138,6 @@ void FindTextHelper::handleFindReply(content::WebContents *source, int requestId const gfx::Rect &selectionRect, int activeMatchOrdinal, bool finalUpdate) { Q_UNUSED(selectionRect); - Q_UNUSED(activeMatchOrdinal); Q_ASSERT(source == m_webContents); @@ -141,6 +146,7 @@ void FindTextHelper::handleFindReply(content::WebContents *source, int requestId Q_ASSERT(m_currentFindRequestId == requestId); m_lastCompletedFindRequestId = requestId; + m_viewClient->findTextFinished(QWebEngineFindTextResult(numberOfMatches, activeMatchOrdinal)); invokeResultCallback(requestId, numberOfMatches); } diff --git a/src/core/find_text_helper.h b/src/core/find_text_helper.h index 17e76ecc7..e8f186272 100644 --- a/src/core/find_text_helper.h +++ b/src/core/find_text_helper.h @@ -66,9 +66,11 @@ class Rect; namespace QtWebEngineCore { +class WebContentsAdapterClient; + class Q_WEBENGINECORE_PRIVATE_EXPORT FindTextHelper { public: - FindTextHelper(content::WebContents *webContents); + FindTextHelper(content::WebContents *webContents, WebContentsAdapterClient *viewClient); ~FindTextHelper(); void startFinding(const QString &findText, bool caseSensitively, bool findBackward, const QWebEngineCallback<bool> resultCallback); @@ -83,6 +85,7 @@ private: void invokeResultCallback(int requestId, int numberOfMatches); content::WebContents *m_webContents; + WebContentsAdapterClient *m_viewClient; static int m_findRequestIdCounter; int m_currentFindRequestId; diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index 4743c1ed7..4bdb55b4c 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -64,6 +64,7 @@ QT_FORWARD_DECLARE_CLASS(CertificateErrorController) QT_FORWARD_DECLARE_CLASS(ClientCertSelectController) QT_FORWARD_DECLARE_CLASS(QKeyEvent) QT_FORWARD_DECLARE_CLASS(QVariant) +QT_FORWARD_DECLARE_CLASS(QWebEngineFindTextResult) QT_FORWARD_DECLARE_CLASS(QWebEngineQuotaRequest) QT_FORWARD_DECLARE_CLASS(QWebEngineRegisterProtocolHandlerRequest) QT_FORWARD_DECLARE_CLASS(QWebEngineUrlRequestInfo) @@ -498,6 +499,7 @@ public: virtual TouchHandleDrawableClient *createTouchHandle(const QMap<int, QImage> &images) = 0; virtual void showTouchSelectionMenu(TouchSelectionMenuController *menuController, const QRect &bounds, const QSize &handleSize) = 0; virtual void hideTouchSelectionMenu() = 0; + virtual void findTextFinished(const QWebEngineFindTextResult &result) = 0; virtual ProfileAdapter *profileAdapter() = 0; virtual WebContentsAdapter* webContentsAdapter() = 0; diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp index e3015d5f6..9855e3859 100644 --- a/src/core/web_contents_delegate_qt.cpp +++ b/src/core/web_contents_delegate_qt.cpp @@ -103,7 +103,7 @@ static WebContentsAdapterClient::JavaScriptConsoleMessageLevel mapToJavascriptCo WebContentsDelegateQt::WebContentsDelegateQt(content::WebContents *webContents, WebContentsAdapterClient *adapterClient) : m_viewClient(adapterClient) , m_faviconManager(new FaviconManager(webContents, adapterClient)) - , m_findTextHelper(new FindTextHelper(webContents)) + , m_findTextHelper(new FindTextHelper(webContents, adapterClient)) , m_lastLoadProgress(-1) , m_loadingState(determineLoadingState(webContents)) , m_didStartLoadingSeen(m_loadingState == LoadingState::Loading) |