summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@digia.com>2013-11-13 11:14:04 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-11-15 13:49:20 +0100
commit42a4854214a7440f482f0ba613725701688a7efe (patch)
tree56f52c9a3141de3cb06759c87845b5ed2b03e831 /lib
parentf5be472e0ba4aa19d0c0f91a848dfa5be9ebaa3b (diff)
Delegated renderer: enable by default for QQuickWebView.
This also allows the software code path to be enabled: - Programmatically by setting this dynamic property on the QCoreApplication: "QQuickWebEngineView_DisableHardwareAcceleration" - Through the Chromium command line switch "--disable-delegated-renderer" for quick development use cases. Change-Id: I32136d880444e0a24f042c7c4862950b7ed0c910 Reviewed-by: Zeno Albisser <zeno.albisser@digia.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/quick/qquickwebengineview.cpp6
-rw-r--r--lib/quick/qquickwebengineview_p_p.h2
-rw-r--r--lib/web_contents_adapter.cpp10
-rw-r--r--lib/web_contents_adapter.h5
-rw-r--r--lib/web_contents_adapter_client.h8
-rw-r--r--lib/web_contents_delegate_qt.cpp3
-rw-r--r--lib/web_contents_view_qt.cpp9
-rw-r--r--lib/web_engine_context.cpp50
-rw-r--r--lib/web_engine_context.h6
-rw-r--r--lib/widgets/Api/qwebenginepage.cpp4
-rw-r--r--lib/widgets/Api/qwebenginepage_p.h2
11 files changed, 64 insertions, 41 deletions
diff --git a/lib/quick/qquickwebengineview.cpp b/lib/quick/qquickwebengineview.cpp
index 0fad5c985..970033a22 100644
--- a/lib/quick/qquickwebengineview.cpp
+++ b/lib/quick/qquickwebengineview.cpp
@@ -50,17 +50,17 @@
QT_BEGIN_NAMESPACE
QQuickWebEngineViewPrivate::QQuickWebEngineViewPrivate()
- : adapter(new WebContentsAdapter)
+ : adapter(new WebContentsAdapter(qApp->property("QQuickWebEngineView_DisableHardwareAcceleration").toBool() ? SoftwareRenderingMode : HardwareAccelerationMode))
, loadProgress(0)
, inspectable(false)
{
adapter->initialize(this);
}
-RenderWidgetHostViewQtDelegate *QQuickWebEngineViewPrivate::CreateRenderWidgetHostViewQtDelegate(RenderWidgetHostViewQtDelegateClient *client, CompositingMode mode)
+RenderWidgetHostViewQtDelegate *QQuickWebEngineViewPrivate::CreateRenderWidgetHostViewQtDelegate(RenderWidgetHostViewQtDelegateClient *client, RenderingMode mode)
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
- if (mode == DelegatedCompositing)
+ if (mode == HardwareAccelerationMode)
return new RenderWidgetHostViewQtDelegateQuick(client);
#endif
return new RenderWidgetHostViewQtDelegateQuickPainted(client);
diff --git a/lib/quick/qquickwebengineview_p_p.h b/lib/quick/qquickwebengineview_p_p.h
index 99f0c943e..040b3fe14 100644
--- a/lib/quick/qquickwebengineview_p_p.h
+++ b/lib/quick/qquickwebengineview_p_p.h
@@ -58,7 +58,7 @@ public:
Q_DECLARE_PUBLIC(QQuickWebEngineView)
QQuickWebEngineViewPrivate();
- virtual RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(RenderWidgetHostViewQtDelegateClient *client, CompositingMode mode) Q_DECL_OVERRIDE;
+ virtual RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(RenderWidgetHostViewQtDelegateClient *client, RenderingMode) Q_DECL_OVERRIDE;
virtual void titleChanged(const QString&) Q_DECL_OVERRIDE;
virtual void urlChanged(const QUrl&) Q_DECL_OVERRIDE;
virtual void iconChanged(const QUrl&) Q_DECL_OVERRIDE;
diff --git a/lib/web_contents_adapter.cpp b/lib/web_contents_adapter.cpp
index a5eab5648..c09fc362a 100644
--- a/lib/web_contents_adapter.cpp
+++ b/lib/web_contents_adapter.cpp
@@ -147,21 +147,21 @@ static void callbackOnEvaluateJS(JSCallbackBase *callback, const base::Value *re
class WebContentsAdapterPrivate {
public:
- WebContentsAdapterPrivate();
+ WebContentsAdapterPrivate(WebContentsAdapterClient::RenderingMode renderingMode);
scoped_refptr<WebEngineContext> engineContext;
scoped_ptr<content::WebContents> webContents;
scoped_ptr<WebContentsDelegateQt> webContentsDelegate;
WebContentsAdapterClient *adapterClient;
};
-WebContentsAdapterPrivate::WebContentsAdapterPrivate()
+WebContentsAdapterPrivate::WebContentsAdapterPrivate(WebContentsAdapterClient::RenderingMode renderingMode)
// This has to be the first thing we create, and the last we destroy.
- : engineContext(WebEngineContext::current())
+ : engineContext(WebEngineContext::currentOrCreate(renderingMode))
{
}
-WebContentsAdapter::WebContentsAdapter(content::WebContents *webContents)
- : d_ptr(new WebContentsAdapterPrivate)
+WebContentsAdapter::WebContentsAdapter(WebContentsAdapterClient::RenderingMode renderingMode, content::WebContents *webContents)
+ : d_ptr(new WebContentsAdapterPrivate(renderingMode))
{
Q_D(WebContentsAdapter);
d->webContents.reset(webContents);
diff --git a/lib/web_contents_adapter.h b/lib/web_contents_adapter.h
index 75db8207c..cde5a147d 100644
--- a/lib/web_contents_adapter.h
+++ b/lib/web_contents_adapter.h
@@ -42,6 +42,7 @@
#define WEB_CONTENTS_ADAPTER_H
#include "qtwebengineglobal.h"
+#include "web_contents_adapter_client.h"
#include <QScopedPointer>
#include <QSharedData>
@@ -52,7 +53,6 @@ QT_FORWARD_DECLARE_CLASS(QVariant)
namespace content {
class WebContents;
}
-class WebContentsAdapterClient;
class WebContentsAdapterPrivate;
struct JSCallbackBase {
@@ -61,10 +61,9 @@ struct JSCallbackBase {
};
class QWEBENGINE_EXPORT WebContentsAdapter : public QSharedData {
-
public:
// Takes ownership of the WebContents.
- WebContentsAdapter(content::WebContents *webContents = 0);
+ WebContentsAdapter(WebContentsAdapterClient::RenderingMode renderingMode, content::WebContents *webContents = 0);
~WebContentsAdapter();
void initialize(WebContentsAdapterClient *adapterClient);
diff --git a/lib/web_contents_adapter_client.h b/lib/web_contents_adapter_client.h
index e4c3a1dab..c92d6ddc0 100644
--- a/lib/web_contents_adapter_client.h
+++ b/lib/web_contents_adapter_client.h
@@ -72,9 +72,9 @@ public:
class QWEBENGINE_EXPORT WebContentsAdapterClient {
public:
- enum CompositingMode {
- NoCompositing,
- DelegatedCompositing
+ enum RenderingMode {
+ SoftwareRenderingMode,
+ HardwareAccelerationMode
};
// This must match window_open_disposition_list.h.
@@ -101,7 +101,7 @@ public:
virtual ~WebContentsAdapterClient() { }
- virtual RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(RenderWidgetHostViewQtDelegateClient *client, CompositingMode mode) = 0;
+ virtual RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(RenderWidgetHostViewQtDelegateClient *client, RenderingMode mode) = 0;
virtual void titleChanged(const QString&) = 0;
virtual void urlChanged(const QUrl&) = 0;
virtual void iconChanged(const QUrl&) = 0;
diff --git a/lib/web_contents_delegate_qt.cpp b/lib/web_contents_delegate_qt.cpp
index 32e0ea1ca..5a96d9be4 100644
--- a/lib/web_contents_delegate_qt.cpp
+++ b/lib/web_contents_delegate_qt.cpp
@@ -44,6 +44,7 @@
#include "type_conversion.h"
#include "web_contents_adapter.h"
#include "web_contents_adapter_client.h"
+#include "web_engine_context.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
@@ -65,7 +66,7 @@ void WebContentsDelegateQt::NavigationStateChanged(const content::WebContents* s
void WebContentsDelegateQt::AddNewContents(content::WebContents* source, content::WebContents* new_contents, WindowOpenDisposition disposition, const gfx::Rect& initial_pos, bool user_gesture, bool* was_blocked)
{
- WebContentsAdapter *newAdapter = new WebContentsAdapter(new_contents);
+ WebContentsAdapter *newAdapter = new WebContentsAdapter(WebEngineContext::current()->renderingMode(), new_contents);
// Do the first ref-count manually to be able to know if the application is handling adoptNewWindow through the public API.
newAdapter->ref.ref();
diff --git a/lib/web_contents_view_qt.cpp b/lib/web_contents_view_qt.cpp
index 32617a440..e89bac7a2 100644
--- a/lib/web_contents_view_qt.cpp
+++ b/lib/web_contents_view_qt.cpp
@@ -44,10 +44,9 @@
#include "browser_context_qt.h"
#include "content_browser_client_qt.h"
#include "render_widget_host_view_qt_delegate.h"
+#include "web_engine_context.h"
-#include "base/command_line.h"
#include "content/browser/renderer_host/render_view_host_impl.h"
-#include "content/public/common/content_switches.h"
#include "content/public/common/context_menu_params.h"
void WebContentsViewQt::initialize(WebContentsAdapterClient* client)
@@ -73,12 +72,8 @@ content::RenderWidgetHostView* WebContentsViewQt::CreateViewForPopupWidget(conte
{
RenderWidgetHostViewQt *view = new RenderWidgetHostViewQt(render_widget_host);
- WebContentsAdapterClient::CompositingMode compositingMode = WebContentsAdapterClient::NoCompositing;
- if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableDelegatedRenderer))
- compositingMode = WebContentsAdapterClient::DelegatedCompositing;
-
Q_ASSERT(m_factoryClient);
- view->setDelegate(m_factoryClient->CreateRenderWidgetHostViewQtDelegate(view, compositingMode));
+ view->setDelegate(m_factoryClient->CreateRenderWidgetHostViewQtDelegate(view, WebEngineContext::current()->renderingMode()));
if (m_client)
view->setAdapterClient(m_client);
diff --git a/lib/web_engine_context.cpp b/lib/web_engine_context.cpp
index 4a6a6c5cb..fe557b86c 100644
--- a/lib/web_engine_context.cpp
+++ b/lib/web_engine_context.cpp
@@ -117,7 +117,37 @@ private:
scoped_ptr<ContentBrowserClientQt> m_browserClient;
};
-WebEngineContext::WebEngineContext()
+
+WebEngineContext::~WebEngineContext()
+{
+ m_runLoop->AfterRun();
+}
+
+scoped_refptr<WebEngineContext> WebEngineContext::currentOrCreate(WebContentsAdapterClient::RenderingMode renderingMode)
+{
+ if (!sContext)
+ sContext = new WebEngineContext(renderingMode);
+ else if (renderingMode != sContext->renderingMode())
+ qFatal("Switching the QtWebEngine rendering mode once initialized in an application is not supported."
+ " If you're using both a QQuickWebView and a QtQuick WebEngineView, make sure that the"
+ " later is configured to use software rendering by setting:"
+ "\nqApp->setProperty(\"QQuickWebEngineView_DisableHardwareAcceleration\", QVariant(true));");
+ return sContext;
+}
+
+scoped_refptr<WebEngineContext> WebEngineContext::current()
+{
+ return sContext;
+}
+
+WebContentsAdapterClient::RenderingMode WebEngineContext::renderingMode()
+{
+ return CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableDelegatedRenderer)
+ ? WebContentsAdapterClient::HardwareAccelerationMode
+ : WebContentsAdapterClient::SoftwareRenderingMode;
+}
+
+WebEngineContext::WebEngineContext(WebContentsAdapterClient::RenderingMode renderingMode)
: m_mainDelegate(new ContentMainDelegateQt)
, m_contentRunner(content::ContentMainRunner::Create())
, m_browserRunner(content::BrowserMainRunner::Create())
@@ -136,6 +166,12 @@ WebEngineContext::WebEngineContext()
parsedCommandLine->AppendSwitch(switches::kNoSandbox);
parsedCommandLine->AppendSwitch(switches::kDisablePlugins);
+ if (renderingMode == WebContentsAdapterClient::HardwareAccelerationMode && !parsedCommandLine->HasSwitch(switches::kDisableDelegatedRenderer)) {
+ parsedCommandLine->AppendSwitch(switches::kEnableDelegatedRenderer);
+ parsedCommandLine->AppendSwitch(switches::kEnableThreadedCompositing);
+ parsedCommandLine->AppendSwitch(switches::kInProcessGPU);
+ }
+
// Tell Chromium to use EGL instead of GLX if the Qt xcb plugin also does.
if (qApp->platformName() == QStringLiteral("xcb") && qApp->platformNativeInterface()->nativeResourceForWindow(QByteArrayLiteral("egldisplay"), 0))
parsedCommandLine->AppendSwitchASCII(switches::kUseGL, gfx::kGLImplementationEGLName);
@@ -147,15 +183,3 @@ WebEngineContext::WebEngineContext()
m_runLoop.reset(new base::RunLoop);
m_runLoop->BeforeRun();
}
-
-WebEngineContext::~WebEngineContext()
-{
- m_runLoop->AfterRun();
-}
-
-scoped_refptr<WebEngineContext> WebEngineContext::current()
-{
- if (!sContext)
- sContext = new WebEngineContext;
- return sContext;
-}
diff --git a/lib/web_engine_context.h b/lib/web_engine_context.h
index e0624afa1..cdd3e34b2 100644
--- a/lib/web_engine_context.h
+++ b/lib/web_engine_context.h
@@ -42,6 +42,8 @@
#ifndef WEB_ENGINE_CONTEXT_H
#define WEB_ENGINE_CONTEXT_H
+#include "web_contents_adapter_client.h"
+
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
@@ -58,11 +60,13 @@ class ContentMainDelegateQt;
class WebEngineContext : public base::RefCounted<WebEngineContext> {
public:
+ static scoped_refptr<WebEngineContext> currentOrCreate(WebContentsAdapterClient::RenderingMode renderingMode);
static scoped_refptr<WebEngineContext> current();
+ WebContentsAdapterClient::RenderingMode renderingMode();
private:
friend class base::RefCounted<WebEngineContext>;
- WebEngineContext();
+ WebEngineContext(WebContentsAdapterClient::RenderingMode renderingMode);
~WebEngineContext();
scoped_ptr<base::RunLoop> m_runLoop;
diff --git a/lib/widgets/Api/qwebenginepage.cpp b/lib/widgets/Api/qwebenginepage.cpp
index 6b82c8947..4fafb17ff 100644
--- a/lib/widgets/Api/qwebenginepage.cpp
+++ b/lib/widgets/Api/qwebenginepage.cpp
@@ -44,7 +44,7 @@ QT_BEGIN_NAMESPACE
QWebEnginePagePrivate::QWebEnginePagePrivate()
: QObjectPrivate(QObjectPrivateVersion)
- , adapter(new WebContentsAdapter)
+ , adapter(new WebContentsAdapter(SoftwareRenderingMode))
, history(new QWebEngineHistory(new QWebEngineHistoryPrivate(adapter.data())))
, view(0)
, m_isLoading(false)
@@ -58,7 +58,7 @@ QWebEnginePagePrivate::~QWebEnginePagePrivate()
delete history;
}
-RenderWidgetHostViewQtDelegate *QWebEnginePagePrivate::CreateRenderWidgetHostViewQtDelegate(RenderWidgetHostViewQtDelegateClient *client, CompositingMode mode)
+RenderWidgetHostViewQtDelegate *QWebEnginePagePrivate::CreateRenderWidgetHostViewQtDelegate(RenderWidgetHostViewQtDelegateClient *client, RenderingMode mode)
{
Q_UNUSED(mode);
return new RenderWidgetHostViewQtDelegateWidget(client);
diff --git a/lib/widgets/Api/qwebenginepage_p.h b/lib/widgets/Api/qwebenginepage_p.h
index 8822cd094..0e654e6c9 100644
--- a/lib/widgets/Api/qwebenginepage_p.h
+++ b/lib/widgets/Api/qwebenginepage_p.h
@@ -64,7 +64,7 @@ public:
QWebEnginePagePrivate();
~QWebEnginePagePrivate();
- virtual RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(RenderWidgetHostViewQtDelegateClient *client, CompositingMode mode) Q_DECL_OVERRIDE;
+ virtual RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(RenderWidgetHostViewQtDelegateClient *client, RenderingMode mode) Q_DECL_OVERRIDE;
virtual void titleChanged(const QString&) Q_DECL_OVERRIDE;
virtual void urlChanged(const QUrl&) Q_DECL_OVERRIDE;
virtual void iconChanged(const QUrl&) Q_DECL_OVERRIDE;