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