summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@digia.com>2014-01-15 19:10:22 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-22 08:45:25 +0100
commit1fcd7970e07a0ecab206224824d1c71488fc19e9 (patch)
tree7bc6ba73623a69aa303f1f4d5c075e8ef37ca45e /src
parent3fcd31f5bd86cb568b1ca4f4f5c7c12c6675dceb (diff)
Implement QWebEnginePage::toHtml and toPlainText
Those methods are now made asynchronous and need to be given a callback to handle the result. Update the code in the browser and fancybrowser examples using std::bind when using C++11 or tr1::bind with C++03 (which should be available with compilers on platforms that we support). Add a (currently failing) earlyToHtml test to make sure that an empty page doesn't crash because of a possibly incomplete attachment of the QtRenderViewObserver. Change-Id: I3ab7cb6f25b91b584dd80df5e4e9ad1e3214348e Reviewed-by: Pierre Rossi <pierre.rossi@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/core/common/qt_messages.h22
-rw-r--r--src/core/qt_render_view_observer_host.cpp14
-rw-r--r--src/core/qt_render_view_observer_host.h4
-rw-r--r--src/core/renderer/qt_render_view_observer.cpp18
-rw-r--r--src/core/renderer/qt_render_view_observer.h3
-rw-r--r--src/core/web_contents_adapter.cpp14
-rw-r--r--src/core/web_contents_adapter.h2
-rw-r--r--src/core/web_contents_adapter_client.h2
-rw-r--r--src/webengine/api/qquickwebengineview_p_p.h2
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp24
-rw-r--r--src/webenginewidgets/api/qwebenginepage.h4
-rw-r--r--src/webenginewidgets/api/qwebenginepage_p.h4
12 files changed, 111 insertions, 2 deletions
diff --git a/src/core/common/qt_messages.h b/src/core/common/qt_messages.h
index 77be79360..47303d38d 100644
--- a/src/core/common/qt_messages.h
+++ b/src/core/common/qt_messages.h
@@ -18,3 +18,25 @@ namespace IPC {
#endif // RENDER_VIEW_MESSAGES_H
#define IPC_MESSAGE_START QtMsgStart
+
+//-----------------------------------------------------------------------------
+// RenderView messages
+// These are messages sent from the browser to the renderer process.
+
+IPC_MESSAGE_ROUTED1(QtRenderViewObserver_FetchDocumentMarkup,
+ uint64 /* requestId */)
+
+IPC_MESSAGE_ROUTED1(QtRenderViewObserver_FetchDocumentInnerText,
+ uint64 /* requestId */)
+
+//-----------------------------------------------------------------------------
+// WebContents messages
+// These are messages sent from the renderer back to the browser process.
+
+IPC_MESSAGE_ROUTED2(QtRenderViewObserverHost_DidFetchDocumentMarkup,
+ base::string16 /* markup */,
+ uint64 /* requestId */)
+
+IPC_MESSAGE_ROUTED2(QtRenderViewObserverHost_DidFetchDocumentInnerText,
+ base::string16 /* innerText */,
+ uint64 /* requestId */)
diff --git a/src/core/qt_render_view_observer_host.cpp b/src/core/qt_render_view_observer_host.cpp
index fec2c4b0c..4b3cc0189 100644
--- a/src/core/qt_render_view_observer_host.cpp
+++ b/src/core/qt_render_view_observer_host.cpp
@@ -51,10 +51,24 @@ QtRenderViewObserverHost::QtRenderViewObserverHost(content::WebContents *webCont
{
}
+void QtRenderViewObserverHost::fetchDocumentMarkup(quint64 requestId)
+{
+ Send(new QtRenderViewObserver_FetchDocumentMarkup(routing_id(), requestId));
+}
+
+void QtRenderViewObserverHost::fetchDocumentInnerText(quint64 requestId)
+{
+ Send(new QtRenderViewObserver_FetchDocumentInnerText(routing_id(), requestId));
+}
+
bool QtRenderViewObserverHost::OnMessageReceived(const IPC::Message& message)
{
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(QtRenderViewObserverHost, message)
+ IPC_MESSAGE_HANDLER(QtRenderViewObserverHost_DidFetchDocumentMarkup,
+ onDidFetchDocumentMarkup)
+ IPC_MESSAGE_HANDLER(QtRenderViewObserverHost_DidFetchDocumentInnerText,
+ onDidFetchDocumentInnerText)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
diff --git a/src/core/qt_render_view_observer_host.h b/src/core/qt_render_view_observer_host.h
index 61b6a4124..7d93176c5 100644
--- a/src/core/qt_render_view_observer_host.h
+++ b/src/core/qt_render_view_observer_host.h
@@ -55,9 +55,13 @@ class QtRenderViewObserverHost : public content::WebContentsObserver
{
public:
QtRenderViewObserverHost(content::WebContents*, WebContentsAdapterClient *adapterClient);
+ void fetchDocumentMarkup(quint64 requestId);
+ void fetchDocumentInnerText(quint64 requestId);
private:
bool OnMessageReceived(const IPC::Message& message) Q_DECL_OVERRIDE;
+ void onDidFetchDocumentMarkup(const base::string16& markup, quint64 requestId);
+ void onDidFetchDocumentInnerText(const base::string16& innerText, quint64 requestId);
WebContentsAdapterClient *m_adapterClient;
};
diff --git a/src/core/renderer/qt_render_view_observer.cpp b/src/core/renderer/qt_render_view_observer.cpp
index b3b4c38c4..0f5ca6556 100644
--- a/src/core/renderer/qt_render_view_observer.cpp
+++ b/src/core/renderer/qt_render_view_observer.cpp
@@ -54,10 +54,28 @@ QtRenderViewObserver::QtRenderViewObserver(content::RenderView* render_view)
{
}
+void QtRenderViewObserver::onFetchDocumentMarkup(quint64 requestId)
+{
+ Send(new QtRenderViewObserverHost_DidFetchDocumentMarkup(
+ routing_id(),
+ render_view()->GetWebView()->mainFrame()->document().createMarkup(),
+ requestId));
+}
+
+void QtRenderViewObserver::onFetchDocumentInnerText(quint64 requestId)
+{
+ Send(new QtRenderViewObserverHost_DidFetchDocumentInnerText(
+ routing_id(),
+ render_view()->GetWebView()->mainFrame()->document().documentElement().innerText(),
+ requestId));
+}
+
bool QtRenderViewObserver::OnMessageReceived(const IPC::Message& message)
{
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(QtRenderViewObserver, message)
+ IPC_MESSAGE_HANDLER(QtRenderViewObserver_FetchDocumentMarkup, onFetchDocumentMarkup)
+ IPC_MESSAGE_HANDLER(QtRenderViewObserver_FetchDocumentInnerText, onFetchDocumentInnerText)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
diff --git a/src/core/renderer/qt_render_view_observer.h b/src/core/renderer/qt_render_view_observer.h
index 8c5713c4a..c37dce16d 100644
--- a/src/core/renderer/qt_render_view_observer.h
+++ b/src/core/renderer/qt_render_view_observer.h
@@ -48,6 +48,9 @@ public:
QtRenderViewObserver(content::RenderView* render_view);
private:
+ void onFetchDocumentMarkup(quint64 requestId);
+ void onFetchDocumentInnerText(quint64 requestId);
+
virtual bool OnMessageReceived(const IPC::Message& message) Q_DECL_OVERRIDE;
DISALLOW_COPY_AND_ASSIGN(QtRenderViewObserver);
diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp
index bd3be1744..6cdc83375 100644
--- a/src/core/web_contents_adapter.cpp
+++ b/src/core/web_contents_adapter.cpp
@@ -394,6 +394,20 @@ quint64 WebContentsAdapter::runJavaScriptCallbackResult(const QString &javaScrip
return d->lastRequestId;
}
+quint64 WebContentsAdapter::fetchDocumentMarkup()
+{
+ Q_D(WebContentsAdapter);
+ d->renderViewObserverHost->fetchDocumentMarkup(++d->lastRequestId);
+ return d->lastRequestId;
+}
+
+quint64 WebContentsAdapter::fetchDocumentInnerText()
+{
+ Q_D(WebContentsAdapter);
+ d->renderViewObserverHost->fetchDocumentInnerText(++d->lastRequestId);
+ return d->lastRequestId;
+}
+
void WebContentsAdapter::dpiScaleChanged()
{
Q_D(WebContentsAdapter);
diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h
index 49c1de4c0..e70aae259 100644
--- a/src/core/web_contents_adapter.h
+++ b/src/core/web_contents_adapter.h
@@ -86,6 +86,8 @@ public:
void filesSelectedInChooser(const QStringList &fileList, WebContentsAdapterClient::FileChooserMode);
void runJavaScript(const QString &javaScript, const QString &xPath);
quint64 runJavaScriptCallbackResult(const QString &javaScript, const QString &xPath);
+ quint64 fetchDocumentMarkup();
+ quint64 fetchDocumentInnerText();
void dpiScaleChanged();
diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h
index e3e88e110..77a02f5e7 100644
--- a/src/core/web_contents_adapter_client.h
+++ b/src/core/web_contents_adapter_client.h
@@ -130,6 +130,8 @@ public:
virtual void javascriptDialog(QSharedPointer<JavaScriptDialogController>) = 0;
virtual void runFileChooser(FileChooserMode, const QString &defaultFileName, const QStringList &acceptedMimeTypes) = 0;
virtual void didRunJavaScript(const QVariant& result, quint64 requestId) = 0;
+ virtual void didFetchDocumentMarkup(const QString& result, quint64 requestId) = 0;
+ virtual void didFetchDocumentInnerText(const QString& result, quint64 requestId) = 0;
};
#endif // WEB_CONTENTS_ADAPTER_CLIENT_H
diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h
index 96632904c..87c0a092b 100644
--- a/src/webengine/api/qquickwebengineview_p_p.h
+++ b/src/webengine/api/qquickwebengineview_p_p.h
@@ -139,6 +139,8 @@ public:
virtual void javascriptDialog(QSharedPointer<JavaScriptDialogController>) Q_DECL_OVERRIDE;
virtual void runFileChooser(FileChooserMode, const QString &defaultFileName, const QStringList &acceptedMimeTypes) Q_DECL_OVERRIDE;
virtual void didRunJavaScript(const QVariant&, quint64) Q_DECL_OVERRIDE { }
+ virtual void didFetchDocumentMarkup(const QString&, quint64) Q_DECL_OVERRIDE { }
+ virtual void didFetchDocumentInnerText(const QString&, quint64) Q_DECL_OVERRIDE { }
void setDevicePixelRatio(qreal);
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index 8192f38ed..1a3cf5dde 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -151,6 +151,16 @@ void QWebEnginePagePrivate::didRunJavaScript(const QVariant& result, quint64 req
(*m_variantCallbacks.take(requestId))(result);
}
+void QWebEnginePagePrivate::didFetchDocumentMarkup(const QString& result, quint64 requestId)
+{
+ (*m_stringCallbacks.take(requestId))(result);
+}
+
+void QWebEnginePagePrivate::didFetchDocumentInnerText(const QString& result, quint64 requestId)
+{
+ (*m_stringCallbacks.take(requestId))(result);
+}
+
void QWebEnginePagePrivate::updateAction(QWebEnginePage::WebAction action) const
{
#ifdef QT_NO_ACTION
@@ -448,6 +458,20 @@ void QWebEnginePage::load(const QUrl& url)
d->adapter->load(url);
}
+void QWebEnginePage::toHtml(const QWebEngineCallback<const QString &> &resultCallback) const
+{
+ Q_D(const QWebEnginePage);
+ quint64 requestId = d->adapter->fetchDocumentMarkup();
+ d->m_stringCallbacks.insert(requestId, resultCallback.d);
+}
+
+void QWebEnginePage::toPlainText(const QWebEngineCallback<const QString &> &resultCallback) const
+{
+ Q_D(const QWebEnginePage);
+ quint64 requestId = d->adapter->fetchDocumentInnerText();
+ d->m_stringCallbacks.insert(requestId, resultCallback.d);
+}
+
void QWebEnginePage::setHtml(const QString &html, const QUrl &baseUrl)
{
Q_D(QWebEnginePage);
diff --git a/src/webenginewidgets/api/qwebenginepage.h b/src/webenginewidgets/api/qwebenginepage.h
index c33119571..d92e87cc6 100644
--- a/src/webenginewidgets/api/qwebenginepage.h
+++ b/src/webenginewidgets/api/qwebenginepage.h
@@ -434,8 +434,8 @@ public:
void setContent(const QByteArray &data, const QString &mimeType = QString(), const QUrl &baseUrl = QUrl());
void addToJavaScriptWindowObject(const QString &name, QObject *object, ValueOwnership ownership = QtOwnership);
- QString toHtml() const;
- QString toPlainText() const;
+ void toHtml(const QWebEngineCallback<const QString &> &resultCallback) const;
+ void toPlainText(const QWebEngineCallback<const QString &> &resultCallback) const;
QString title() const;
void setUrl(const QUrl &url);
diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h
index 656eb4788..60317972a 100644
--- a/src/webenginewidgets/api/qwebenginepage_p.h
+++ b/src/webenginewidgets/api/qwebenginepage_p.h
@@ -81,6 +81,8 @@ public:
virtual void javascriptDialog(QSharedPointer<JavaScriptDialogController>) Q_DECL_OVERRIDE;
virtual void runFileChooser(FileChooserMode, const QString &defaultFileName, const QStringList &acceptedMimeTypes) Q_DECL_OVERRIDE;
virtual void didRunJavaScript(const QVariant& result, quint64 requestId) Q_DECL_OVERRIDE;
+ virtual void didFetchDocumentMarkup(const QString& result, quint64 requestId) Q_DECL_OVERRIDE;
+ virtual void didFetchDocumentInnerText(const QString& result, quint64 requestId) Q_DECL_OVERRIDE;
void updateAction(QWebEnginePage::WebAction) const;
void updateNavigationActions();
@@ -94,7 +96,9 @@ public:
WebEngineContextMenuData m_menuData;
typedef QtWebEnginePrivate::QWebEngineCallbackPrivateBase<const QVariant&> VariantCallback;
+ typedef QtWebEnginePrivate::QWebEngineCallbackPrivateBase<const QString&> StringCallback;
mutable QHash<quint64, QExplicitlySharedDataPointer<VariantCallback> > m_variantCallbacks;
+ mutable QHash<quint64, QExplicitlySharedDataPointer<StringCallback> > m_stringCallbacks;
};
QT_END_NAMESPACE