diff options
author | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2013-11-13 11:14:04 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-11-15 13:49:20 +0100 |
commit | 42a4854214a7440f482f0ba613725701688a7efe (patch) | |
tree | 56f52c9a3141de3cb06759c87845b5ed2b03e831 /lib | |
parent | f5be472e0ba4aa19d0c0f91a848dfa5be9ebaa3b (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.cpp | 6 | ||||
-rw-r--r-- | lib/quick/qquickwebengineview_p_p.h | 2 | ||||
-rw-r--r-- | lib/web_contents_adapter.cpp | 10 | ||||
-rw-r--r-- | lib/web_contents_adapter.h | 5 | ||||
-rw-r--r-- | lib/web_contents_adapter_client.h | 8 | ||||
-rw-r--r-- | lib/web_contents_delegate_qt.cpp | 3 | ||||
-rw-r--r-- | lib/web_contents_view_qt.cpp | 9 | ||||
-rw-r--r-- | lib/web_engine_context.cpp | 50 | ||||
-rw-r--r-- | lib/web_engine_context.h | 6 | ||||
-rw-r--r-- | lib/widgets/Api/qwebenginepage.cpp | 4 | ||||
-rw-r--r-- | lib/widgets/Api/qwebenginepage_p.h | 2 |
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; |