diff --git a/examples/webengine/quicknanobrowser/doc/images/quicknanobrowser-demo.jpg b/examples/webengine/quicknanobrowser/doc/images/quicknanobrowser-demo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12693bb0fd9323234e38e3269862412579b3be42 Binary files /dev/null and b/examples/webengine/quicknanobrowser/doc/images/quicknanobrowser-demo.jpg differ diff --git a/examples/webengine/quicknanobrowser/doc/src/quicknanobrowser.qdoc b/examples/webengine/quicknanobrowser/doc/src/quicknanobrowser.qdoc new file mode 100644 index 0000000000000000000000000000000000000000..e426370737a79818bdae86991b7aba5b8b289647 --- /dev/null +++ b/examples/webengine/quicknanobrowser/doc/src/quicknanobrowser.qdoc @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** 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 Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: http://www.gnu.org/copyleft/fdl.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example quicknanobrowser + \title WebEngine Quick Nano Browser + \ingroup webengine-examples + \brief A web browser implemented using the WebEngineView QML type. + + The Quick Nano Browser demo shows the \l{Qt WebEngine} module in action, + providing a little QML web browser with support for tabs and keyboard + shortcuts. + + \image quicknanobrowser-demo.jpg + + \include examples-run.qdocinc +*/ diff --git a/examples/webenginewidgets/browser/doc/src/browser.qdoc b/examples/webenginewidgets/browser/doc/src/browser.qdoc index a8208184d47f534378cbc5f79b49734f4ff7cdfe..f4a51518b958dcbcc81163f6bb119d22ea6cf8f5 100644 --- a/examples/webenginewidgets/browser/doc/src/browser.qdoc +++ b/examples/webenginewidgets/browser/doc/src/browser.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. @@ -28,10 +28,13 @@ /*! \example browser \title WebEngine Tab Browser Example + \ingroup webengine-widgetexamples \brief The QtWebKit browser example ported to use QtWebEngine The Tab Browser example shows the \l{Qt WebEngine Widgets} module in action, providing a little Web browser application with support for tabs. \image browser-demo.png + + \include examples-run.qdocinc */ diff --git a/examples/webenginewidgets/fancybrowser/doc/src/fancybrowser.qdoc b/examples/webenginewidgets/fancybrowser/doc/src/fancybrowser.qdoc index 60652c69ab31a6a8e85492c0144a6ddc91b520ab..f4b5321a120742a0136c83877470b70343a80448 100644 --- a/examples/webenginewidgets/fancybrowser/doc/src/fancybrowser.qdoc +++ b/examples/webenginewidgets/fancybrowser/doc/src/fancybrowser.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the documentation of the Qt Toolkit. @@ -28,6 +28,7 @@ /*! \example fancybrowser \title WebEngine Fancy Browser Example + \ingroup webengine-widgetexamples \brief Demonstrates how to use browse web and manipulate content \brief The Fancy Browser example shows how to use JQuery with QtWebEngine to @@ -40,6 +41,8 @@ evaluate the jQuery JavaScript code. A QMainWindow with a QWebEngineView as central widget builds up the browser itself. + \include examples-run.qdocinc + \section1 MainWindow Class Definition The \c MainWindow class inherits QMainWindow. It implements a number of diff --git a/src/3rdparty b/src/3rdparty index 0dcd4e35086a90f643bb721fad1ef786f5fff8ba..577cd47e54bb88c81b7a5b5a6d658d8d61b2c747 160000 --- a/src/3rdparty +++ b/src/3rdparty @@ -1 +1 @@ -Subproject commit 0dcd4e35086a90f643bb721fad1ef786f5fff8ba +Subproject commit 577cd47e54bb88c81b7a5b5a6d658d8d61b2c747 diff --git a/src/core/Info_mac.plist b/src/core/Info_mac.plist new file mode 100644 index 0000000000000000000000000000000000000000..58362c810013fb9350d7b69d895d792f9c5eed0f --- /dev/null +++ b/src/core/Info_mac.plist @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundlePackageType</key> + <string>FMWK</string> + <key>CFBundleShortVersionString</key> + <string>@SHORT_VERSION@</string> + <key>CFBundleVersion</key> + <string>@FULL_VERSION@</string> + <key>CFBundleGetInfoString</key> + <string>Created by Qt/QMake</string> + <key>CFBundleSignature</key> + <string>@TYPEINFO@</string> + <key>CFBundleExecutable</key> + <string>@LIBRARY@</string> + <key>CFBundleIdentifier</key> + <string>org.qt-project.Qt.QtWebEngineCore</string> +</dict> +</plist> diff --git a/src/core/access_token_store_qt.cpp b/src/core/access_token_store_qt.cpp new file mode 100644 index 0000000000000000000000000000000000000000..85a91c3f73f77ffd9928953d6c53a60df2f5fa50 --- /dev/null +++ b/src/core/access_token_store_qt.cpp @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2014 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 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later 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 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "access_token_store_qt.h" + +#include <QDebug> + +AccessTokenStoreQt::AccessTokenStoreQt() +{ +} + +AccessTokenStoreQt::~AccessTokenStoreQt() +{ +} + +void AccessTokenStoreQt::LoadAccessTokens(const LoadAccessTokensCallbackType& callback) +{ +} + +void AccessTokenStoreQt::SaveAccessToken(const GURL& server_url, const base::string16& access_token) +{ +} + diff --git a/src/core/access_token_store_qt.h b/src/core/access_token_store_qt.h new file mode 100644 index 0000000000000000000000000000000000000000..2a76681f0f733c922968448d91b23abe996fd3bc --- /dev/null +++ b/src/core/access_token_store_qt.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2014 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 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later 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 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef ACCESS_TOKEN_STORE_QT_H +#define ACCESS_TOKEN_STORE_QT_H + +#include "content/public/browser/access_token_store.h" + +#include <QtCore/qcompilerdetection.h> // Needed for Q_DECL_OVERRIDE + +class AccessTokenStoreQt : public content::AccessTokenStore +{ +public: + AccessTokenStoreQt(); + ~AccessTokenStoreQt(); + + virtual void LoadAccessTokens(const LoadAccessTokensCallbackType& callback) Q_DECL_OVERRIDE; + virtual void SaveAccessToken(const GURL& server_url, const base::string16& access_token) Q_DECL_OVERRIDE; + +private: + DISALLOW_COPY_AND_ASSIGN(AccessTokenStoreQt); +}; + +#endif // ACCESS_TOKEN_STORE_QT_H diff --git a/src/core/config/embedded_linux.pri b/src/core/config/embedded_linux.pri index dc6a5f612d80ce22d4f45c97bd83d9a798ab3693..4000625c68e2393e6c4ae8531930bcc4f257da31 100644 --- a/src/core/config/embedded_linux.pri +++ b/src/core/config/embedded_linux.pri @@ -46,6 +46,7 @@ GYP_CONFIG += \ use_pulseaudio=0 \ use_system_harfbuzz=0 \ use_system_icu=1 \ + icu_use_data_file_flag=0 \ use_x11=0 \ v8_use_snapshot=false \ want_separate_host_toolset=1 \ diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp index 3ead5314f9fad23d11fd57d9c776befca93a1110..ee403298bbdad39c8aa2aef9bc7fbc71d0d5ae54 100644 --- a/src/core/content_browser_client_qt.cpp +++ b/src/core/content_browser_client_qt.cpp @@ -62,6 +62,7 @@ #include "media_capture_devices_dispatcher.h" #include "resource_dispatcher_host_delegate_qt.h" #include "web_contents_delegate_qt.h" +#include "access_token_store_qt.h" #include <QGuiApplication> #include <QOpenGLContext> @@ -347,6 +348,11 @@ void ContentBrowserClientQt::OverrideWebkitPrefs(content::RenderViewHost *rvh, c static_cast<WebContentsDelegateQt*>(webContents->GetDelegate())->overrideWebPreferences(webContents, web_prefs); } +content::AccessTokenStore *ContentBrowserClientQt::CreateAccessTokenStore() +{ + return new AccessTokenStoreQt; +} + BrowserContextQt* ContentBrowserClientQt::browser_context() { Q_ASSERT(m_browserMainParts); return static_cast<BrowserMainPartsQt*>(m_browserMainParts)->browser_context(); diff --git a/src/core/content_browser_client_qt.h b/src/core/content_browser_client_qt.h index dd5d9f3a1cbe0bc18ce9150ac927e42087be630f..4f216030cd8e1eaa5ab37086d69c571497908454 100644 --- a/src/core/content_browser_client_qt.h +++ b/src/core/content_browser_client_qt.h @@ -79,6 +79,7 @@ public: virtual gfx::GLShareGroup* GetInProcessGpuShareGroup() Q_DECL_OVERRIDE; virtual content::MediaObserver* GetMediaObserver() Q_DECL_OVERRIDE; virtual void OverrideWebkitPrefs(content::RenderViewHost *, const GURL &, WebPreferences *) Q_DECL_OVERRIDE; + virtual content::AccessTokenStore *CreateAccessTokenStore() Q_DECL_OVERRIDE; virtual void AllowCertificateError( int render_process_id, int render_frame_id, diff --git a/src/core/core.pro b/src/core/core.pro index 927f8bab464c26ebc14fdd5939a5208411dcf93f..cf00f39cbd80f6d71124eeff93948012ed254aa8 100644 --- a/src/core/core.pro +++ b/src/core/core.pro @@ -28,30 +28,3 @@ SUBDIRS += core_gyp_generator \ gyp_run.depends += gyp_configure_host gyp_configure_target SUBDIRS += gyp_configure_host gyp_configure_target } - -REPACK_DIR = $$OUT_PWD/$$getConfigDir()/gen/repack -locales.files = "$$REPACK_DIR/qtwebengine_locales/*" -locales.CONFIG += no_check_exist -locales.path = $$[QT_INSTALL_TRANSLATIONS]/qtwebengine_locales -resources.files = $$REPACK_DIR/qtwebengine_resources.pak -resources.CONFIG += no_check_exist -resources.path = $$[QT_INSTALL_DATA] - -PLUGIN_EXTENSION = .so -PLUGIN_PREFIX = lib -macx: PLUGIN_PREFIX = -win32 { - PLUGIN_EXTENSION = .dll - PLUGIN_PREFIX = -} - -icu.files = $$OUT_PWD/$$getConfigDir()/icudtl.dat -icu.CONFIG += no_check_exist -icu.path = $$[QT_INSTALL_DATA] - -plugins.files = $$OUT_PWD/$$getConfigDir()/$${PLUGIN_PREFIX}ffmpegsumo$${PLUGIN_EXTENSION} -plugins.CONFIG += no_check_exist -plugins.path = $$[QT_INSTALL_PLUGINS]/qtwebengine - -INSTALLS += icu locales resources plugins - diff --git a/src/core/core_gyp_generator.pro b/src/core/core_gyp_generator.pro index c50d56df4af42367ef091347fd3938909fc18696..38aba3a76934bc66c7340ed8fbcaa75a38f835da 100644 --- a/src/core/core_gyp_generator.pro +++ b/src/core/core_gyp_generator.pro @@ -33,6 +33,7 @@ RESOURCES += devtools.qrc INCLUDEPATH += $$[QT_INSTALL_HEADERS] $$PWD SOURCES = \ + access_token_store_qt.cpp \ browser_accessibility_manager_qt.cpp \ browser_accessibility_qt.cpp \ browser_context_qt.cpp \ @@ -80,6 +81,7 @@ SOURCES = \ yuv_video_node.cpp HEADERS = \ + access_token_store_qt.h \ browser_accessibility_manager_qt.h \ browser_accessibility_qt.h \ browser_context_qt.h \ diff --git a/src/core/core_module.pro b/src/core/core_module.pro index 08e0b7822b88b6289f6a1be3983e5472fad1bbb5..66ab3ee4d81c8c6469e1c0571cd9997c4919e127 100644 --- a/src/core/core_module.pro +++ b/src/core/core_module.pro @@ -6,11 +6,58 @@ CMAKE_MODULE_TESTS = "-" QT += qml quick QT_PRIVATE += gui-private +# Needed to set a CFBundleIdentifier +QMAKE_INFO_PLIST = Info_mac.plist + # Look for linking information produced by gyp for our target according to core_generated.gyp !include($$OUT_PWD/$$getConfigDir()/$${TARGET}_linking.pri) { error("Could not find the linking information that gyp should have generated.") } +REPACK_DIR = $$OUT_PWD/$$getConfigDir()/gen/repack +# Duplicated from resources/resources.gyp +LOCALE_LIST = am ar bg bn ca cs da de el en-GB en-US es-419 es et fa fi fil fr gu he hi hr hu id it ja kn ko lt lv ml mr ms nb nl pl pt-BR pt-PT ro ru sk sl sr sv sw ta te th tr uk vi zh-CN zh-TW +for(LOC, LOCALE_LIST) { + locales.files += $$REPACK_DIR/qtwebengine_locales/$${LOC}.pak +} +resources.files = $$REPACK_DIR/qtwebengine_resources.pak + +PLUGIN_EXTENSION = .so +PLUGIN_PREFIX = lib +osx: PLUGIN_PREFIX = +win32 { + PLUGIN_EXTENSION = .dll + PLUGIN_PREFIX = +} +icu.files = $$OUT_PWD/$$getConfigDir()/icudtl.dat + +plugins.files = $$OUT_PWD/$$getConfigDir()/$${PLUGIN_PREFIX}ffmpegsumo$${PLUGIN_EXTENSION} + +!debug_and_release|!build_all|CONFIG(release, debug|release):contains(QT_CONFIG, qt_framework) { + locales.version = Versions + locales.path = Resources/qtwebengine_locales + resources.version = Versions + resources.path = Resources + icu.version = Versions + icu.path = Resources + plugins.version = Versions + plugins.path = Libraries + # No files, this prepares the bundle Helpers symlink, process.pro will create the directories + qtwebengineprocessplaceholder.version = Versions + qtwebengineprocessplaceholder.path = Helpers + QMAKE_BUNDLE_DATA += icu locales resources plugins qtwebengineprocessplaceholder +} else { + locales.CONFIG += no_check_exist + locales.path = $$[QT_INSTALL_TRANSLATIONS]/qtwebengine_locales + resources.CONFIG += no_check_exist + resources.path = $$[QT_INSTALL_DATA] + icu.CONFIG += no_check_exist + icu.path = $$[QT_INSTALL_DATA] + plugins.CONFIG += no_check_exist + plugins.path = $$[QT_INSTALL_PLUGINS]/qtwebengine + INSTALLS += icu locales resources plugins +} + # We distribute the module binary but headers are only available in-tree. CONFIG += no_module_headers load(qt_module) diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index 2cc5510aef3958d205d8afb88bb6c71cde5d0848..c221e94e358e69b69cb042ba5641823010db3056 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -133,6 +133,12 @@ static inline ui::GestureProvider::Config QtGestureProviderConfig() { return config; } +static inline bool compareTouchPoints(const QTouchEvent::TouchPoint &lhs, const QTouchEvent::TouchPoint &rhs) +{ + // TouchPointPressed < TouchPointMoved < TouchPointReleased + return lhs.state() < rhs.state(); +} + class MotionEventQt : public ui::MotionEvent { public: MotionEventQt(const QList<QTouchEvent::TouchPoint> &touchPoints, const base::TimeTicks &eventTime, Action action, int index = -1) @@ -983,6 +989,10 @@ void RenderWidgetHostViewQt::handleTouchEvent(QTouchEvent *ev) if (ev->type() == QEvent::TouchBegin) m_sendMotionActionDown = true; + // Make sure that ACTION_POINTER_DOWN is delivered before ACTION_MOVE, + // and ACTION_MOVE before ACTION_POINTER_UP. + std::sort(touchPoints.begin(), touchPoints.end(), compareTouchPoints); + for (int i = 0; i < touchPoints.size(); ++i) { ui::MotionEvent::Action action; switch (touchPoints[i].state()) { diff --git a/src/core/renderer/content_renderer_client_qt.h b/src/core/renderer/content_renderer_client_qt.h index 4e3c70cf888e6e818dfce09df7c9cd41bc370c03..7103bc29b1e0fb85bf155b78d30a14ead4099576 100644 --- a/src/core/renderer/content_renderer_client_qt.h +++ b/src/core/renderer/content_renderer_client_qt.h @@ -33,6 +33,8 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ +#ifndef CONTENT_RENDERER_CLIENT_QT_H +#define CONTENT_RENDERER_CLIENT_QT_H #include "content/public/renderer/content_renderer_client.h" @@ -61,3 +63,5 @@ public: private: QScopedPointer<visitedlink::VisitedLinkSlave> m_visitedLinkSlave; }; + +#endif // CONTENT_RENDERER_CLIENT_QT_H diff --git a/src/core/renderer/qt_render_view_observer.h b/src/core/renderer/qt_render_view_observer.h index fed5852e45ec981303355aed4eb7cd6f88a850b9..94f8baa4032d6fabf242bbe5dcbfbc898d2c2dfd 100644 --- a/src/core/renderer/qt_render_view_observer.h +++ b/src/core/renderer/qt_render_view_observer.h @@ -33,6 +33,8 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ +#ifndef QT_RENDER_VIEW_OBSERVER_H +#define QT_RENDER_VIEW_OBSERVER_H #include "content/public/renderer/render_view_observer.h" @@ -52,3 +54,5 @@ private: DISALLOW_COPY_AND_ASSIGN(QtRenderViewObserver); }; + +#endif // QT_RENDER_VIEW_OBSERVER_H diff --git a/src/core/web_engine_context.cpp b/src/core/web_engine_context.cpp index 20bf3e0519a7793574656764857285c30f39acb7..ac9a921e748eec68c662085ee3aaf7da3d36644d 100644 --- a/src/core/web_engine_context.cpp +++ b/src/core/web_engine_context.cpp @@ -142,7 +142,11 @@ WebEngineContext::WebEngineContext() #if defined(OS_WIN) parsedCommandLine->AppendSwitch(switches::kDisableD3D11); + // ANGLE doesn't support multi-threading, doing texture upload from the GPU thread + // hasn't been causing problems yet but doing rendering there is conflicting with + // Qt's rendering of the scene graph. parsedCommandLine->AppendSwitch(switches::kDisableExperimentalWebGL); + parsedCommandLine->AppendSwitch(switches::kDisableAccelerated2dCanvas); #endif #if defined(QTWEBENGINE_MOBILE_SWITCHES) diff --git a/src/core/web_engine_library_info.cpp b/src/core/web_engine_library_info.cpp index 4cdf3813e89c6d105083f4cc35f62353523af1a3..026f4db83f62017b7fb53873fd86964f03b37d29 100644 --- a/src/core/web_engine_library_info.cpp +++ b/src/core/web_engine_library_info.cpp @@ -92,6 +92,39 @@ QString location(QLibraryInfo::LibraryLocation path) return QLibraryInfo::location(path); } +#if defined(OS_MACOSX) +static inline CFBundleRef frameworkBundle() +{ + return CFBundleGetBundleWithIdentifier(CFSTR("org.qt-project.Qt.QtWebEngineCore")); +} + +static QString getPath(CFBundleRef frameworkBundle) +{ + QString path; + if (frameworkBundle) { + CFURLRef bundleUrl = CFBundleCopyBundleURL(frameworkBundle); + CFStringRef bundlePath = CFURLCopyFileSystemPath(bundleUrl, kCFURLPOSIXPathStyle); + path = QString::fromCFString(bundlePath); + CFRelease(bundlePath); + CFRelease(bundleUrl); + } + return path; +} + +static QString getResourcesPath(CFBundleRef frameworkBundle) +{ + QString path; + if (frameworkBundle) { + CFURLRef resourcesRelativeUrl = CFBundleCopyResourcesDirectoryURL(frameworkBundle); + CFStringRef resourcesRelativePath = CFURLCopyFileSystemPath(resourcesRelativeUrl, kCFURLPOSIXPathStyle); + path = getPath(frameworkBundle) % QLatin1Char('/') % QString::fromCFString(resourcesRelativePath); + CFRelease(resourcesRelativePath); + CFRelease(resourcesRelativeUrl); + } + return path; +} +#endif + QString subProcessPath() { static bool initialized = false; @@ -100,14 +133,19 @@ QString subProcessPath() #else static QString processBinary (QLatin1String(QTWEBENGINEPROCESS_NAME)); #endif +#if defined(OS_MACOSX) && defined(QT_MAC_FRAMEWORK_BUILD) + static QString processPath (getPath(frameworkBundle()) + % QStringLiteral("/Helpers/" QTWEBENGINEPROCESS_NAME ".app/Contents/MacOS/" QTWEBENGINEPROCESS_NAME)); +#else static QString processPath (location(QLibraryInfo::LibraryExecutablesPath) % QDir::separator() % processBinary); +#endif if (!initialized) { // Allow overriding at runtime for the time being. const QByteArray fromEnv = qgetenv("QTWEBENGINEPROCESS_PATH"); if (!fromEnv.isEmpty()) processPath = QString::fromLatin1(fromEnv); - if (processPath.isEmpty() || !QFileInfo(processPath).exists()) { + if (!QFileInfo(processPath).exists()) { qWarning("QtWebEngineProcess not found at location %s. Trying fallback path...", qPrintable(processPath)); processPath = QCoreApplication::applicationDirPath() % QDir::separator() % processBinary; } @@ -121,12 +159,20 @@ QString subProcessPath() QString pluginsPath() { +#if defined(OS_MACOSX) && defined(QT_MAC_FRAMEWORK_BUILD) + return getPath(frameworkBundle()) % QLatin1String("/Libraries"); +#else return location(QLibraryInfo::PluginsPath) % QDir::separator() % QLatin1String("qtwebengine"); +#endif } QString localesPath() { +#if defined(OS_MACOSX) && defined(QT_MAC_FRAMEWORK_BUILD) + return getResourcesPath(frameworkBundle()) % QLatin1String("/qtwebengine_locales"); +#else return location(QLibraryInfo::TranslationsPath) % QLatin1String("/qtwebengine_locales"); +#endif } QString fallbackDir() { @@ -155,7 +201,11 @@ base::FilePath WebEngineLibraryInfo::getPath(int key) QString directory; switch (key) { case QT_RESOURCES_PAK: +#if defined(OS_MACOSX) && defined(QT_MAC_FRAMEWORK_BUILD) + return toFilePath(getResourcesPath(frameworkBundle()) % QLatin1String("/qtwebengine_resources.pak")); +#else return toFilePath(location(QLibraryInfo::DataPath) % QLatin1String("/qtwebengine_resources.pak")); +#endif case base::FILE_EXE: case content::CHILD_PROCESS_EXE: return toFilePath(subProcessPath()); @@ -171,7 +221,11 @@ base::FilePath WebEngineLibraryInfo::getPath(int key) directory = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); break; case base::DIR_QT_LIBRARY_DATA: +#if defined(OS_MACOSX) && defined(QT_MAC_FRAMEWORK_BUILD) + return toFilePath(getResourcesPath(frameworkBundle())); +#else return toFilePath(location(QLibraryInfo::DataPath)); +#endif #if defined(OS_ANDROID) case base::DIR_SOURCE_ROOT: case base::DIR_ANDROID_EXTERNAL_STORAGE: diff --git a/src/process/process.pro b/src/process/process.pro index a9f5d183f1c99ad71be337232deba247e5e18d2a..ad1575c81f253d432a9f7163dba3cdf0706fe24a 100644 --- a/src/process/process.pro +++ b/src/process/process.pro @@ -1,16 +1,42 @@ TARGET = $$QTWEBENGINEPROCESS_NAME TEMPLATE = app -QT_PRIVATE += webenginecore +load(qt_build_paths) +contains(QT_CONFIG, qt_framework) { + # Deploy the QtWebEngineProcess app bundle into the QtWebEngineCore framework. + DESTDIR = $$MODULE_BASE_OUTDIR/lib/QtWebEngineCore.framework/Versions/5/Helpers -CONFIG -= app_bundle + # FIXME: We can remove those steps in Qt 5.5 once @rpath works + # "QT += webenginecore" would pull all dependencies that we'd also need to update + # with install_name_tool on OSX, but we only need access to the private + # QtWebEngine::processMain. qtAddModule will take care of finding where + # the library is without pulling additional librarie. + QT = core + qtAddModule(webenginecore, LIBS) + CONFIG -= link_prl + QMAKE_POST_LINK = \ + "xcrun install_name_tool -change " \ + "`xcrun otool -X -L $(TARGET) | grep QtWebEngineCore | cut -d ' ' -f 1` " \ + "@executable_path/../../../../QtWebEngineCore " \ + "$(TARGET); " \ + "xcrun install_name_tool -change " \ + "`xcrun otool -X -L $(TARGET) | grep QtCore | cut -d ' ' -f 1` " \ + "@executable_path/../../../../../../../QtCore.framework/QtCore " \ + "$(TARGET) " +} else { + CONFIG -= app_bundle + DESTDIR = $$MODULE_BASE_OUTDIR/libexec -load(qt_build_paths) -DESTDIR = $$MODULE_BASE_OUTDIR/libexec + QT_PRIVATE += webenginecore +} INCLUDEPATH += ../core SOURCES = main.cpp -target.path = $$[QT_INSTALL_LIBEXECS] +contains(QT_CONFIG, qt_framework) { + target.path = $$[QT_INSTALL_LIBS]/QtWebEngineCore.framework/Versions/5/Helpers +} else { + target.path = $$[QT_INSTALL_LIBEXECS] +} INSTALLS += target diff --git a/src/webengine/api/qquickwebenginesettings.cpp b/src/webengine/api/qquickwebenginesettings.cpp index 7f36bad5e0fbac6ee0037a71fccb63140acf2cf9..743d22d815d1894d700909c070ccc78c7099bf69 100644 --- a/src/webengine/api/qquickwebenginesettings.cpp +++ b/src/webengine/api/qquickwebenginesettings.cpp @@ -78,6 +78,7 @@ QQuickWebEngineSettings *QQuickWebEngineSettings::globalSettings() QQuickWebEngineSettings::~QQuickWebEngineSettings() { + allSettings->removeAll(this->d_func()); } bool QQuickWebEngineSettings::autoLoadImages() const diff --git a/src/webenginewidgets/doc/src/qtwebenginewidgets.qdoc b/src/webenginewidgets/doc/src/qtwebenginewidgets.qdoc index 3f6e888f35b22046c469505205cf1f34fa62d072..d440dd06ad6777909fa1f60119ed817486b0abfc 100644 --- a/src/webenginewidgets/doc/src/qtwebenginewidgets.qdoc +++ b/src/webenginewidgets/doc/src/qtwebenginewidgets.qdoc @@ -117,6 +117,12 @@ \li \l {Qt WebEngine Widgets C++ Classes} \endlist + \section1 Examples + + \list + \li \l {Qt WebEngine Widgets Examples} + \endlist + \section1 License Information This is a snapshot of the integration of Chromium into Qt. diff --git a/tests/auto/quick/qmltests/data/tst_loadFail.qml b/tests/auto/quick/qmltests/data/tst_loadFail.qml index 7b0a1849e357afe1a7b22e635240aa2b7f9842a0..694547863b3c9668d3987014ea5af3b7c0e1b130 100644 --- a/tests/auto/quick/qmltests/data/tst_loadFail.qml +++ b/tests/auto/quick/qmltests/data/tst_loadFail.qml @@ -42,38 +42,49 @@ import QtQuick 2.0 import QtTest 1.0 import QtWebEngine 1.0 +import QtWebEngine.experimental 1.0 TestWebEngineView { id: webEngineView width: 400 height: 300 - property variant testUrl - - SignalSpy { - id: spyIconChanged - target: webEngineView - signalName: "iconChanged" - } + property variant unavailableUrl TestCase { id: test name: "WebEngineViewLoadFail" + + function initTestCase() { + WebEngine.settings.errorPageEnabled = false + } + function test_fail() { - testUrl = Qt.resolvedUrl("file_that_does_not_exist.html") - webEngineView.url = testUrl + unavailableUrl = Qt.resolvedUrl("file_that_does_not_exist.html") + webEngineView.url = unavailableUrl verify(webEngineView.waitForLoadFailed()) - spyIconChanged.clear() + } - // If this testcase finishes too early, we can not handle the received replacement content. - // So we should wait to ignore this error page. - spyIconChanged.wait() + function test_fail_url() { + var url = Qt.resolvedUrl("test1.html") + webEngineView.url = url + compare(webEngineView.url, url) + verify(webEngineView.waitForLoadSucceeded()) + compare(webEngineView.url, url) + + unavailableUrl = Qt.resolvedUrl("file_that_does_not_exist.html") + webEngineView.url = unavailableUrl + compare(webEngineView.url, unavailableUrl) + verify(webEngineView.waitForLoadFailed()) + // When error page is disabled in case of LoadFail the entry of the unavailable page is not stored. + // We expect the url of the previously loaded page here. + compare(webEngineView.url, url) } } onLoadingChanged: { if (loadRequest.status == WebEngineView.LoadFailedStatus) { - test.compare(loadRequest.url, testUrl) + test.compare(loadRequest.url, unavailableUrl) test.compare(loadRequest.errorDomain, WebEngineView.InternalErrorDomain) } } diff --git a/tests/auto/quick/qmltests/data/tst_loadUrl.qml b/tests/auto/quick/qmltests/data/tst_loadUrl.qml index 5f51e90364a58a9e33d6df94c649a0baef9baf51..e0e185eb0310bc84cc999868d1561e02a045d441 100644 --- a/tests/auto/quick/qmltests/data/tst_loadUrl.qml +++ b/tests/auto/quick/qmltests/data/tst_loadUrl.qml @@ -42,6 +42,7 @@ import QtQuick 2.0 import QtTest 1.0 import QtWebEngine 1.0 +import QtWebEngine.experimental 1.0 TestWebEngineView { id: webEngineView @@ -106,6 +107,8 @@ TestWebEngineView { } function test_urlProperty() { + WebEngine.settings.errorPageEnabled = false + var url = Qt.resolvedUrl("test1.html") webEngineView.url = url @@ -117,7 +120,7 @@ TestWebEngineView { webEngineView.url = bogusSite compare(webEngineView.url, bogusSite) verify(webEngineView.waitForLoadFailed()) - compare(webEngineView.url, bogusSite) + compare(webEngineView.url, url) webEngineView.url = "about:blank" // Reset from previous test verify(webEngineView.waitForLoadSucceeded())