From fd61d752e313bf91a09c85020b3fb50067c610c8 Mon Sep 17 00:00:00 2001 From: Jocelyn Turcotte Date: Tue, 19 Nov 2013 17:55:49 +0100 Subject: Moving sources to src part 1: Move files. This only move files without adjusting any paths. This moves: - lib/quick -> src/webengine/api (API files) lib/quick -> src/webengine (other files) This contains the main QtWebEngine module library since . - lib/widgets -> src/webenginewidgets Also rename this directory to match its module name and rename Api to api. - lib -> src/core - process -> src/process - resources -> src/core/resources - tools/* -> tools/scripts/ The build directory is spread as follow: - build/build.pro -> src/core/gyp_run.pro - build/qmake_extras/* -> src/core/ (for the host and target .pro files) - build/qmake -> tools/qmake - Build related scripts -> tools/buildscripts Change-Id: I0cded1de772c99c0c1da6536c9afea353236b4a1 Reviewed-by: Zeno Albisser Reviewed-by: Pierre Rossi Reviewed-by: Andras Becsi --- src/core/web_engine_context.cpp | 184 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 src/core/web_engine_context.cpp (limited to 'src/core/web_engine_context.cpp') diff --git a/src/core/web_engine_context.cpp b/src/core/web_engine_context.cpp new file mode 100644 index 000000000..e26027207 --- /dev/null +++ b/src/core/web_engine_context.cpp @@ -0,0 +1,184 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "web_engine_context.h" + +#include + +#include "base/command_line.h" +#include "base/files/file_path.h" +#include "base/path_service.h" +#include "base/run_loop.h" +#include "base/threading/thread_restrictions.h" +#include "content/public/app/content_main_delegate.h" +#include "content/public/app/content_main_runner.h" +#include "content/public/browser/browser_main_runner.h" +#include "content/public/common/content_paths.h" +#include "content/public/common/content_switches.h" +#include "content/public/common/main_function_params.h" +#include "ui/gl/gl_switches.h" +#include "webkit/common/user_agent/user_agent_util.h" + +#include "content_browser_client_qt.h" +#include "content_client_qt.h" +#include "type_conversion.h" +#include +#include +#include + +namespace { + +scoped_refptr sContext; + +static QByteArray subProcessPath() { + static bool initialized = false; +#ifdef QTWEBENGINEPROCESS_PATH + static QByteArray processPath(QTWEBENGINEPROCESS_PATH); +#else + static QByteArray processPath; +#endif + if (initialized) + return processPath; + // Allow overriding at runtime for the time being. + const QByteArray fromEnv = qgetenv("QTWEBENGINEPROCESS_PATH"); + if (!fromEnv.isEmpty()) + processPath = fromEnv; + if (processPath.isEmpty()) + qFatal("QTWEBENGINEPROCESS_PATH environment variable not set or empty."); + initialized = true; + return processPath; +} + +} // namespace + +class ContentMainDelegateQt : public content::ContentMainDelegate +{ +public: + + // This is where the embedder puts all of its startup code that needs to run + // before the sandbox is engaged. + void PreSandboxStartup() Q_DECL_OVERRIDE + { + PathService::Override(base::FILE_EXE, base::FilePath(toFilePathString(subProcessPath()))); + } + + content::ContentBrowserClient* CreateContentBrowserClient() Q_DECL_OVERRIDE + { + m_browserClient.reset(new ContentBrowserClientQt); + return m_browserClient.get(); + } + + bool BasicStartupComplete(int* exit_code) Q_DECL_OVERRIDE + { + SetContentClient(new ContentClientQt); + return false; + } + +private: + scoped_ptr m_browserClient; +}; + + +WebEngineContext::~WebEngineContext() +{ + m_runLoop->AfterRun(); +} + +scoped_refptr 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::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()) +{ + QList args; + Q_FOREACH (const QString& arg, QCoreApplication::arguments()) + args << arg.toUtf8(); + const char* argv[args.size()]; + for (int i = 0; i < args.size(); ++i) + argv[i] = args[i].constData(); + CommandLine::Init(args.size(), argv); + + CommandLine* parsedCommandLine = CommandLine::ForCurrentProcess(); + parsedCommandLine->AppendSwitchASCII(switches::kUserAgent, webkit_glue::BuildUserAgentFromProduct("QtWebEngine/0.1")); + parsedCommandLine->AppendSwitchASCII(switches::kBrowserSubprocessPath, subProcessPath().constData()); + 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); + + m_contentRunner->Initialize(0, 0, m_mainDelegate.get()); + m_browserRunner->Initialize(content::MainFunctionParams(*CommandLine::ForCurrentProcess())); + + // Once the MessageLoop has been created, attach a top-level RunLoop. + m_runLoop.reset(new base::RunLoop); + m_runLoop->BeforeRun(); +} -- cgit v1.2.3