From 9cf0007b6ff49305550754babaeb67eb85c8d5ef Mon Sep 17 00:00:00 2001 From: Jocelyn Turcotte <jocelyn.turcotte@digia.com> Date: Mon, 10 Feb 2014 17:58:18 +0100 Subject: [PATCH] Implement QWebEnginePage::selectedText Change-Id: Idebde8da0befbea7ccc5942de1e09fcc61ce16d4 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com> --- src/core/render_widget_host_view_qt.cpp | 6 ++++++ src/core/render_widget_host_view_qt.h | 3 +++ src/core/web_contents_adapter.cpp | 6 ++++++ src/core/web_contents_adapter.h | 1 + src/core/web_contents_adapter_client.h | 1 + src/webengine/api/qquickwebengineview_p_p.h | 1 + src/webenginewidgets/api/qwebenginepage.cpp | 17 +++++++++++++++++ src/webenginewidgets/api/qwebenginepage_p.h | 1 + src/webenginewidgets/api/qwebengineview.cpp | 11 +++++++++++ .../qwebenginepage/tst_qwebenginepage.cpp | 8 ++++---- 10 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index 39c95098e..4233e91bd 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -624,6 +624,12 @@ void RenderWidgetHostViewQt::OnAccessibilityEvents(const std::vector<Accessibili QT_NOT_USED } +void RenderWidgetHostViewQt::SelectionChanged(const string16 &text, size_t offset, const gfx::Range &range) +{ + content::RenderWidgetHostViewBase::SelectionChanged(text, offset, range); + m_adapterClient->selectionChanged(); +} + bool RenderWidgetHostViewQt::DispatchLongPressGestureEvent(ui::GestureEvent *) { return false; diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h index 5591be190..6d4e1ba80 100644 --- a/src/core/render_widget_host_view_qt.h +++ b/src/core/render_widget_host_view_qt.h @@ -161,6 +161,9 @@ public: virtual void OnAccessibilityEvents(const std::vector<AccessibilityHostMsg_EventParams>&) Q_DECL_OVERRIDE; virtual void ProcessAckedTouchEvent(const content::TouchEventWithLatencyInfo &touch, content::InputEventAckState ack_result) Q_DECL_OVERRIDE; + // Overridden from RenderWidgetHostViewBase. + virtual void SelectionChanged(const string16 &text, size_t offset, const gfx::Range &range) OVERRIDE; + // Overridden from ui::GestureEventHelper. virtual bool DispatchLongPressGestureEvent(ui::GestureEvent *event) Q_DECL_OVERRIDE; virtual bool DispatchCancelTouchEvent(ui::TouchEvent *event) Q_DECL_OVERRIDE; diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index ea360dc99..82d6ed26f 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -319,6 +319,12 @@ QString WebContentsAdapter::pageTitle() const return entry ? toQt(entry->GetTitle()) : QString(); } +QString WebContentsAdapter::selectedText() const +{ + Q_D(const WebContentsAdapter); + return toQt(d->webContents->GetRenderViewHost()->GetView()->GetSelectedText()); +} + void WebContentsAdapter::navigateToIndex(int offset) { Q_D(WebContentsAdapter); diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h index 93027c19c..56e39ba32 100644 --- a/src/core/web_contents_adapter.h +++ b/src/core/web_contents_adapter.h @@ -71,6 +71,7 @@ public: QUrl activeUrl() const; QUrl requestedUrl() const; QString pageTitle() const; + QString selectedText() const; void navigateToIndex(int); void navigateToOffset(int); diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index ba6a45355..778446a12 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -121,6 +121,7 @@ public: virtual void iconChanged(const QUrl&) = 0; virtual void loadingStateChanged() = 0; virtual void loadProgressChanged(int progress) = 0; + virtual void selectionChanged() = 0; virtual QRectF viewportRect() const = 0; virtual qreal dpiScale() const = 0; virtual void loadFinished(bool success, int error_code = 0, const QString &error_description = QString()) = 0; diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index d7c84a1ad..a36eb327c 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -126,6 +126,7 @@ public: virtual void iconChanged(const QUrl&) Q_DECL_OVERRIDE; virtual void loadingStateChanged() Q_DECL_OVERRIDE; virtual void loadProgressChanged(int progress) Q_DECL_OVERRIDE; + virtual void selectionChanged() Q_DECL_OVERRIDE { } virtual QRectF viewportRect() const Q_DECL_OVERRIDE; virtual qreal dpiScale() const Q_DECL_OVERRIDE; virtual void loadFinished(bool success, int error_code = 0, const QString &error_description = QString()) Q_DECL_OVERRIDE; diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 9636598e8..760a8eff7 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -184,6 +184,12 @@ void QWebEnginePagePrivate::loadProgressChanged(int progress) Q_EMIT q->loadProgress(progress); } +void QWebEnginePagePrivate::selectionChanged() +{ + Q_Q(QWebEnginePage); + Q_EMIT q->selectionChanged(); +} + QRectF QWebEnginePagePrivate::viewportRect() const { return view ? view->geometry() : QRectF(); @@ -329,6 +335,17 @@ QWidget *QWebEnginePage::view() const return d->view; } +bool QWebEnginePage::hasSelection() const +{ + return !selectedText().isEmpty(); +} + +QString QWebEnginePage::selectedText() const +{ + Q_D(const QWebEnginePage); + return d->adapter->selectedText(); +} + #ifndef QT_NO_ACTION QAction *QWebEnginePage::action(WebAction action) const { diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h index 9a4dc57fd..e6113b795 100644 --- a/src/webenginewidgets/api/qwebenginepage_p.h +++ b/src/webenginewidgets/api/qwebenginepage_p.h @@ -110,6 +110,7 @@ public: virtual void iconChanged(const QUrl&) Q_DECL_OVERRIDE; virtual void loadingStateChanged() Q_DECL_OVERRIDE; virtual void loadProgressChanged(int progress) Q_DECL_OVERRIDE; + virtual void selectionChanged() Q_DECL_OVERRIDE; virtual QRectF viewportRect() const Q_DECL_OVERRIDE; virtual qreal dpiScale() const Q_DECL_OVERRIDE; virtual void loadFinished(bool success, int error_code, const QString &error_description = QString()) Q_DECL_OVERRIDE; diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index eee68d65d..e5237bc72 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -80,6 +80,7 @@ void QWebEngineViewPrivate::bind(QWebEngineView *view, QWebEnginePage *page) QObject::connect(page, &QWebEnginePage::loadStarted, view, &QWebEngineView::loadStarted); QObject::connect(page, &QWebEnginePage::loadProgress, view, &QWebEngineView::loadProgress); QObject::connect(page, &QWebEnginePage::loadFinished, view, &QWebEngineView::loadFinished); + QObject::connect(page, &QWebEnginePage::selectionChanged, view, &QWebEngineView::selectionChanged); } } @@ -154,6 +155,16 @@ QUrl QWebEngineView::url() const return page()->url(); } +bool QWebEngineView::hasSelection() const +{ + return page()->hasSelection(); +} + +QString QWebEngineView::selectedText() const +{ + return page()->selectedText(); +} + #ifndef QT_NO_ACTION QAction* QWebEngineView::pageAction(QWebEnginePage::WebAction action) const { diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp index a76e4a2ec..d6f154e5e 100644 --- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp +++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp @@ -2900,9 +2900,6 @@ void tst_QWebEnginePage::userAgentNewlineStripping() void tst_QWebEnginePage::crashTests_LazyInitializationOfMainFrame() { -#if !defined(QWEBENGINEPAGE_SELECTEDTEXT) - QSKIP("QWEBENGINEPAGE_SELECTEDTEXT"); -#else { QWebEnginePage webPage; } @@ -2911,19 +2908,22 @@ void tst_QWebEnginePage::crashTests_LazyInitializationOfMainFrame() webPage.selectedText(); } { +#if defined(QWEBENGINEPAGE_SELECTEDHTML) QWebEnginePage webPage; webPage.selectedHtml(); +#endif } { QWebEnginePage webPage; webPage.triggerAction(QWebEnginePage::Back, true); } { +#if defined(QWEBENGINEPAGE_UPDATEPOSITIONDEPENDENTACTIONS) QWebEnginePage webPage; QPoint pos(10,10); webPage.updatePositionDependentActions(pos); - } #endif + } } #if defined(QWEBENGINEPAGE_RENDER) -- GitLab