diff options
author | Jüri Valdmann <juri.valdmann@qt.io> | 2019-07-02 12:43:52 +0200 |
---|---|---|
committer | Jüri Valdmann <juri.valdmann@qt.io> | 2019-07-02 12:43:52 +0200 |
commit | 57119f16668cf79dec0dbdfbc9a2183f9e5c44fa (patch) | |
tree | a9f6c7ec75d91eb8408d02dd2c16eec4a39e0541 /src/core | |
parent | fb430b4e104dd6313a776980b4798f1333193149 (diff) | |
parent | bd864f6418ed164c19a700fc4b6ebab3be431c62 (diff) |
Merge remote-tracking branch 'origin/5.13' into dev
Change-Id: I806417dd7a6d2594a86ee49feedc4ad9ee48add2
Diffstat (limited to 'src/core')
24 files changed, 297 insertions, 40 deletions
diff --git a/src/core/config/common.pri b/src/core/config/common.pri index 6f3ce75b3..18bd358f3 100644 --- a/src/core/config/common.pri +++ b/src/core/config/common.pri @@ -108,10 +108,7 @@ optimize_size: gn_args += optimize_for_size=true sanitize_address: gn_args += is_asan=true sanitize_thread: gn_args += is_tsan=true sanitize_memory: gn_args += is_msan=true - # rtti is required for a specific check of ubsan, -fsanitize=vptr, which uses the runtime - # type information to check that correct derived objects are assigned to base pointers. Without - # rtti, linking would fail at build time. - sanitize_undefined: gn_args += is_ubsan=true use_rtti=true + sanitize_undefined: gn_args += is_ubsan=true is_ubsan_vptr=true } qtConfig(webengine-v8-snapshot) { diff --git a/src/core/configure.json b/src/core/configure.json index bb8ad7997..98eee347f 100644 --- a/src/core/configure.json +++ b/src/core/configure.json @@ -147,9 +147,9 @@ ] }, "webengine-icu": { - "label": "icu >= 53", + "label": "icu >= 63", "sources": [ - { "type": "pkgConfig", "args": "icu-uc >= 53 icu-i18n >= 53" } + { "type": "pkgConfig", "args": "icu-uc >= 63 icu-i18n >= 63" } ] }, "webengine-ffmpeg": { @@ -312,8 +312,9 @@ "type": "compile" }, "webengine-glibc": { - "label": "glibc > 2.16", - "type": "detectGlibc" + "label": "glibc > 2.26", + "type": "compile", + "test": "glibc" }, "webengine-libxml2-compatible": { "label" : "compatible system libxml2", @@ -335,6 +336,11 @@ "webengine-extensions-gcc-version" : { "label": "GCC 6 or newer", "type": "hasGcc6OrNewer" + }, + "webengine-noexecstack" : { + "label": "linker supports -z noexecstack", + "type": "linkerSupportsFlag", + "flag": "-z,noexecstack" } }, @@ -678,6 +684,11 @@ "purpose": "Provides WebEngine Qml support.", "section": "WebEngine", "output": [ "privateFeature" ] + }, + "webengine-noexecstack": { + "label": "linker supports -z noexecstack", + "condition": "config.unix && tests.webengine-noexecstack", + "output": [ "privateFeature" ] } }, diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp index 8dcc59472..1a9ba0929 100644 --- a/src/core/content_browser_client_qt.cpp +++ b/src/core/content_browser_client_qt.cpp @@ -86,6 +86,7 @@ #include "services/service_manager/public/cpp/connector.h" #include "services/service_manager/public/cpp/service.h" #include "services/service_manager/sandbox/switches.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" #include "third_party/blink/public/platform/modules/insecure_input/insecure_input_service.mojom.h" #include "ui/base/resource/resource_bundle.h" #include "ui/base/ui_base_switches.h" @@ -95,6 +96,7 @@ #include "ui/gl/gpu_timing.h" #include "url/url_util_qt.h" +#include "qtwebengine/common/renderer_configuration.mojom.h" #include "qtwebengine/grit/qt_webengine_resources.h" #include "profile_adapter.h" @@ -283,6 +285,11 @@ void ContentBrowserClientQt::RenderProcessWillLaunch(content::RenderProcessHost* host->AddFilter(new extensions::ExtensionsGuestViewMessageFilter(host->GetID(), host->GetBrowserContext())); #endif //ENABLE_EXTENSIONS + bool is_incognito_process = profile->IsOffTheRecord(); + qtwebengine::mojom::RendererConfigurationAssociatedPtr renderer_configuration; + host->GetChannel()->GetRemoteAssociatedInterface(&renderer_configuration); + renderer_configuration->SetInitialConfiguration(is_incognito_process); + service_manager::mojom::ServicePtr service; *service_request = mojo::MakeRequest(&service); service_manager::mojom::PIDReceiverPtr pid_receiver; diff --git a/src/core/core_chromium.pri b/src/core/core_chromium.pri index 69a7f48d8..f99513adf 100644 --- a/src/core/core_chromium.pri +++ b/src/core/core_chromium.pri @@ -1,10 +1,5 @@ -include($$QTWEBENGINE_OUT_ROOT/src/core/qtwebenginecore-config.pri) -QT_FOR_CONFIG += webenginecore webenginecore-private - qtConfig(debug_and_release): CONFIG += debug_and_release -include(core_common.pri) - macos { # This fixes namespace builds on macOS. Specifically namespace ambiguity issues between Qt and # Chromium forward declarations of NSString. @@ -117,6 +112,7 @@ SOURCES = \ renderer/content_settings_observer_qt.cpp \ renderer/render_frame_observer_qt.cpp \ renderer/render_view_observer_qt.cpp \ + renderer/render_thread_observer_qt.cpp \ renderer/user_resource_controller.cpp \ renderer_host/render_view_observer_host_qt.cpp \ renderer_host/user_resource_controller_host.cpp \ @@ -225,6 +221,7 @@ HEADERS = \ renderer/content_settings_observer_qt.h \ renderer/render_frame_observer_qt.h \ renderer/render_view_observer_qt.h \ + renderer/render_thread_observer_qt.h \ renderer/user_resource_controller.h \ renderer_host/render_view_observer_host_qt.h \ renderer_host/user_resource_controller_host.h \ diff --git a/src/core/core_common.pri b/src/core/core_common.pri index 51f5e21b0..c92278657 100644 --- a/src/core/core_common.pri +++ b/src/core/core_common.pri @@ -1,3 +1,6 @@ +include($$QTWEBENGINE_OUT_ROOT/src/core/qtwebenginecore-config.pri) +QT_FOR_CONFIG += webenginecore webenginecore-private + # NOTE: The TARGET, QT, QT_PRIVATE variables are used in both core_module.pro and core_gyp_generator.pro # gyp/ninja will take care of the compilation, qmake/make will finish with linking and install. diff --git a/src/core/core_generator.pro b/src/core/core_generator.pro index 916c211f9..935c653a4 100644 --- a/src/core/core_generator.pro +++ b/src/core/core_generator.pro @@ -1,3 +1,5 @@ +include(core_common.pri) + include(core_gn_config.pri) TEMPLATE = lib diff --git a/src/core/core_gn_config.pri b/src/core/core_gn_config.pri index b76cdc81a..a089eecd0 100644 --- a/src/core/core_gn_config.pri +++ b/src/core/core_gn_config.pri @@ -1,6 +1,3 @@ -include($$QTWEBENGINE_OUT_ROOT/src/core/qtwebenginecore-config.pri) -QT_FOR_CONFIG += webenginecore webenginecore-private - CONFIG = gn_generator $$CONFIG GN_SRC_DIR = $$PWD GN_FILE = $$OUT_PWD/$$getConfigDir()/BUILD.gn diff --git a/src/core/core_module.pro b/src/core/core_module.pro index f5234f88b..02aa6ac38 100644 --- a/src/core/core_module.pro +++ b/src/core/core_module.pro @@ -39,6 +39,8 @@ LIBS_PRIVATE += $$NINJA_LIB_DIRS $$NINJA_LIBS # GN's LFLAGS doesn't always work across all the Linux configurations we support. # The Windows and macOS ones from GN does provide a few useful flags however +unix:qtConfig(webengine-noexecstack): \ + QMAKE_LFLAGS += -Wl,-z,noexecstack linux { QMAKE_LFLAGS += -Wl,--gc-sections -Wl,-O1 -Wl,-z,now # Embedded address sanitizer symbols are undefined and are picked up by the dynamic link loader diff --git a/src/core/core_project.pro b/src/core/core_project.pro index 3205ac604..9c8e20808 100644 --- a/src/core/core_project.pro +++ b/src/core/core_project.pro @@ -1,10 +1,8 @@ TEMPLATE = lib # Fake project to make QtCreator happy. -include(core_chromium.pri) +include(core_common.pri) -HEADERS = -SOURCES = linking_pri = $$OUT_PWD/$$getConfigDir()/$${TARGET}.pri diff --git a/src/core/devtools_frontend_qt.cpp b/src/core/devtools_frontend_qt.cpp index c2d79331f..3311bea72 100644 --- a/src/core/devtools_frontend_qt.cpp +++ b/src/core/devtools_frontend_qt.cpp @@ -79,7 +79,6 @@ #include "services/network/public/cpp/simple_url_loader.h" #include "services/network/public/cpp/simple_url_loader_stream_consumer.h" -#include <QDebug> using namespace QtWebEngineCore; namespace { @@ -194,7 +193,7 @@ DevToolsFrontendQt *DevToolsFrontendQt::Show(QSharedPointer<WebContentsAdapter> content::WebContents *contents = frontendAdapter->webContents(); if (contents == inspectedContents) { - qWarning() << "You can not inspect youself"; + LOG(WARNING) << "You can not inspect yourself"; return nullptr; } diff --git a/src/core/printing/pdfium_document_wrapper_qt.cpp b/src/core/printing/pdfium_document_wrapper_qt.cpp index 1be27f1c6..6f415b50b 100644 --- a/src/core/printing/pdfium_document_wrapper_qt.cpp +++ b/src/core/printing/pdfium_document_wrapper_qt.cpp @@ -50,11 +50,11 @@ int PdfiumDocumentWrapperQt::m_libraryUsers = 0; class PdfiumPageWrapperQt { public: - PdfiumPageWrapperQt(FPDF_DOCUMENT data, int pageIndex, int targetWidth, int targetHeight) + PdfiumPageWrapperQt(FPDF_DOCUMENT data, int pageIndex) : m_pageData(FPDF_LoadPage(data, pageIndex)) , m_width(FPDF_GetPageWidth(m_pageData)) , m_height(FPDF_GetPageHeight(m_pageData)) - , m_image(createImage(targetWidth, targetHeight)) + , m_image(createImage()) { } @@ -77,16 +77,11 @@ public: } private: - QImage createImage(int targetWidth, int targetHeight) + QImage createImage() { Q_ASSERT(m_pageData); - if (targetWidth <= 0) - targetWidth = m_width; - if (targetHeight <= 0) - targetHeight = m_height; - - QImage image(targetWidth, targetHeight, QImage::Format_ARGB32); + QImage image(m_width * 2, m_height * 2, QImage::Format_ARGB32); Q_ASSERT(!image.isNull()); image.fill(0xFFFFFFFF); @@ -112,9 +107,7 @@ private: PdfiumDocumentWrapperQt::PdfiumDocumentWrapperQt(const void *pdfData, size_t size, - const QSize& imageSize, const char *password) - : m_imageSize(imageSize * 2.0) { Q_ASSERT(pdfData); Q_ASSERT(size); @@ -137,11 +130,17 @@ QImage PdfiumDocumentWrapperQt::pageAsQImage(size_t index) return QImage(); } - PdfiumPageWrapperQt pageWrapper((FPDF_DOCUMENT)m_documentHandle, index, - m_imageSize.width(), m_imageSize.height()); + PdfiumPageWrapperQt pageWrapper((FPDF_DOCUMENT)m_documentHandle, index); return pageWrapper.image(); } +bool PdfiumDocumentWrapperQt::pageIsLandscape(size_t index) +{ + double width = 0, height = 0; + FPDF_GetPageSizeByIndex((FPDF_DOCUMENT)m_documentHandle, index, &width, &height); + return (width > height); +} + PdfiumDocumentWrapperQt::~PdfiumDocumentWrapperQt() { FPDF_CloseDocument((FPDF_DOCUMENT)m_documentHandle); diff --git a/src/core/printing/pdfium_document_wrapper_qt.h b/src/core/printing/pdfium_document_wrapper_qt.h index 2dab268fc..121742aa3 100644 --- a/src/core/printing/pdfium_document_wrapper_qt.h +++ b/src/core/printing/pdfium_document_wrapper_qt.h @@ -61,17 +61,16 @@ class PdfiumPageWrapperQt; class Q_WEBENGINECORE_PRIVATE_EXPORT PdfiumDocumentWrapperQt { public: - PdfiumDocumentWrapperQt(const void *pdfData, size_t size, const QSize &imageSize, - const char *password = nullptr); + PdfiumDocumentWrapperQt(const void *pdfData, size_t size, const char *password = nullptr); virtual ~PdfiumDocumentWrapperQt(); QImage pageAsQImage(size_t index); + bool pageIsLandscape(size_t index); int pageCount() const { return m_pageCount; } private: static int m_libraryUsers; int m_pageCount; void *m_documentHandle; - QSize m_imageSize; }; } // namespace QtWebEngineCore diff --git a/src/core/qtwebengine.gni b/src/core/qtwebengine.gni index 702943261..11a72a2e9 100644 --- a/src/core/qtwebengine.gni +++ b/src/core/qtwebengine.gni @@ -40,6 +40,7 @@ deps = [ "//ui/gl", "//qtwebengine/browser:interfaces", "//qtwebengine/browser:service_manifests", + "//qtwebengine/common:mojo_bindings", ":qtwebengine_sources", ":qtwebengine_resources", ] diff --git a/src/core/renderer/content_renderer_client_qt.cpp b/src/core/renderer/content_renderer_client_qt.cpp index f69a8b64f..5fd4c7d65 100644 --- a/src/core/renderer/content_renderer_client_qt.cpp +++ b/src/core/renderer/content_renderer_client_qt.cpp @@ -84,6 +84,7 @@ #include "renderer/render_frame_observer_qt.h" #include "renderer/render_view_observer_qt.h" +#include "renderer/render_thread_observer_qt.h" #include "renderer/user_resource_controller.h" #if QT_CONFIG(webengine_webchannel) #include "renderer/web_channel_ipc_transport.h" @@ -129,6 +130,7 @@ void ContentRendererClientQt::RenderThreadStarted() { content::RenderThread *renderThread = content::RenderThread::Get(); (void)GetConnector(); + m_renderThreadObserver.reset(new RenderThreadObserverQt()); m_visitedLinkSlave.reset(new visitedlink::VisitedLinkSlave); m_webCacheImpl.reset(new web_cache::WebCacheImpl()); @@ -140,6 +142,7 @@ void ContentRendererClientQt::RenderThreadStarted() content::ChildThread::Get()->GetServiceManagerConnection()->AddConnectionFilter( std::make_unique<content::SimpleConnectionFilter>(std::move(registry))); + renderThread->AddObserver(m_renderThreadObserver.data()); renderThread->AddObserver(UserResourceController::instance()); #if QT_CONFIG(webengine_spellchecker) @@ -285,7 +288,7 @@ void ContentRendererClientQt::GetNavigationErrorStringsInternal(content::RenderF error_page::LocalizedError::GetStrings( error.reason(), error.domain(), error.url(), isPost, - error.stale_copy_in_cache(), false, false, + error.stale_copy_in_cache(), false, RenderThreadObserverQt::is_incognito_process(), error_page::LocalizedError::OfflineContentOnNetErrorFeatureState::kDisabled, false, locale, std::unique_ptr<error_page::ErrorPageParams>(), &errorStrings); resourceId = IDR_NET_ERROR_HTML; diff --git a/src/core/renderer/content_renderer_client_qt.h b/src/core/renderer/content_renderer_client_qt.h index 9aebe5bb3..dd164fa3a 100644 --- a/src/core/renderer/content_renderer_client_qt.h +++ b/src/core/renderer/content_renderer_client_qt.h @@ -72,6 +72,8 @@ class SpellCheck; namespace QtWebEngineCore { +class RenderThreadObserverQt; + class ContentRendererClientQt : public content::ContentRendererClient , public service_manager::Service , public service_manager::LocalInterfaceProvider @@ -138,6 +140,7 @@ private: void GetNavigationErrorStringsInternal(content::RenderFrame* renderFrame, const std::string &httpMethod, const error_page::Error& error, std::string* errorHtml); + QScopedPointer<RenderThreadObserverQt> m_renderThreadObserver; QScopedPointer<visitedlink::VisitedLinkSlave> m_visitedLinkSlave; QScopedPointer<web_cache::WebCacheImpl> m_webCacheImpl; #if QT_CONFIG(webengine_spellchecker) diff --git a/src/core/renderer/extensions/extensions_renderer_client_qt.cpp b/src/core/renderer/extensions/extensions_renderer_client_qt.cpp index f36c679bf..c25494590 100644 --- a/src/core/renderer/extensions/extensions_renderer_client_qt.cpp +++ b/src/core/renderer/extensions/extensions_renderer_client_qt.cpp @@ -45,6 +45,7 @@ #include "extensions_renderer_client_qt.h" #include "extensions_dispatcher_delegate_qt.h" +#include "renderer/render_thread_observer_qt.h" #include "renderer_permissions_policy_delegate_qt.h" #include "resource_request_policy_qt.h" @@ -85,7 +86,7 @@ ExtensionsRendererClientQt::~ExtensionsRendererClientQt() // Returns true if the current render process was launched incognito. bool ExtensionsRendererClientQt::IsIncognitoProcess() const { - return false; + return RenderThreadObserverQt::is_incognito_process(); } // Returns the lowest isolated world ID available to extensions. diff --git a/src/core/renderer/render_thread_observer_qt.cpp b/src/core/renderer/render_thread_observer_qt.cpp new file mode 100644 index 000000000..64b9fd961 --- /dev/null +++ b/src/core/renderer/render_thread_observer_qt.cpp @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/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.LGPL3 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-3.0.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 (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// based on chrome/renderer/chrome_render_thread_observer.cc: +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "renderer/render_thread_observer_qt.h" + +#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" + +namespace QtWebEngineCore { + +bool RenderThreadObserverQt::m_isIncognitoProcess = false; + +void RenderThreadObserverQt::RegisterMojoInterfaces(blink::AssociatedInterfaceRegistry *associated_interfaces) +{ + associated_interfaces->AddInterface(base::Bind(&RenderThreadObserverQt::OnRendererConfigurationAssociatedRequest, base::Unretained(this))); +} + +void RenderThreadObserverQt::UnregisterMojoInterfaces(blink::AssociatedInterfaceRegistry *associated_interfaces) +{ + associated_interfaces->RemoveInterface(qtwebengine::mojom::RendererConfiguration::Name_); +} + +void RenderThreadObserverQt::SetInitialConfiguration(bool is_incognito_process) +{ + m_isIncognitoProcess = is_incognito_process; +} + +void RenderThreadObserverQt::OnRendererConfigurationAssociatedRequest(qtwebengine::mojom::RendererConfigurationAssociatedRequest request) +{ + m_rendererConfigurationBindings.AddBinding(this, std::move(request)); +} + +} // namespace diff --git a/src/core/renderer/render_thread_observer_qt.h b/src/core/renderer/render_thread_observer_qt.h new file mode 100644 index 000000000..29b842ab4 --- /dev/null +++ b/src/core/renderer/render_thread_observer_qt.h @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/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.LGPL3 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-3.0.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 (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef RENDER_THREAD_OBSERVER_QT_H +#define RENDER_THREAD_OBSERVER_QT_H + +#include "content/public/renderer/render_thread_observer.h" +#include "mojo/public/cpp/bindings/associated_binding_set.h" +#include "qtwebengine/common/renderer_configuration.mojom.h" + +namespace QtWebEngineCore { + +class RenderThreadObserverQt : public content::RenderThreadObserver, + public qtwebengine::mojom::RendererConfiguration { +public: + + RenderThreadObserverQt() = default; + ~RenderThreadObserverQt() override = default; + + static bool is_incognito_process() { return m_isIncognitoProcess; } + +private: + // content::RenderThreadObserver: + void RegisterMojoInterfaces(blink::AssociatedInterfaceRegistry *associated_interfaces) override; + void UnregisterMojoInterfaces(blink::AssociatedInterfaceRegistry *associated_interfaces) override; + + // qtwebengine::mojom::RendererConfiguration: + void SetInitialConfiguration(bool is_incognito_process) override; + + void OnRendererConfigurationAssociatedRequest(qtwebengine::mojom::RendererConfigurationAssociatedRequest request); + + static bool m_isIncognitoProcess; + + mojo::AssociatedBindingSet<qtwebengine::mojom::RendererConfiguration> m_rendererConfigurationBindings; + + DISALLOW_COPY_AND_ASSIGN(RenderThreadObserverQt); +}; + +} // namespace QtWebEngineCore + +#endif // RENDER_THREAD_OBSERVER_QT_H diff --git a/src/core/renderer_host/resource_dispatcher_host_delegate_qt.cpp b/src/core/renderer_host/resource_dispatcher_host_delegate_qt.cpp index 442694bb9..36c5e6ed1 100644 --- a/src/core/renderer_host/resource_dispatcher_host_delegate_qt.cpp +++ b/src/core/renderer_host/resource_dispatcher_host_delegate_qt.cpp @@ -109,7 +109,7 @@ void OnPdfStreamIntercepted( content::NavigationController::LoadURLParams params( GURL(base::StringPrintf("%s://%s/index.html?%s", extensions::kExtensionScheme, extension_id.c_str(), - net::EscapeUrlEncodedData(original_url.spec(), false).c_str()))); + original_url.spec().c_str()))); params.frame_tree_node_id = frame_tree_node_id; web_contents->GetController().LoadURLWithParams(params); diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index 3c6e651a7..05615bb4c 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -1665,6 +1665,12 @@ bool WebContentsAdapter::isFindTextInProgress() const return m_lastFindRequestId != m_webContentsDelegate->lastReceivedFindReply(); } +bool WebContentsAdapter::hasFocusedFrame() const +{ + CHECK_INITIALIZED(false); + return m_webContents->GetFocusedFrame() != nullptr; +} + WebContentsAdapterClient::RenderProcessTerminationStatus WebContentsAdapterClient::renderProcessExitStatus(int terminationStatus) { auto status = WebContentsAdapterClient::RenderProcessTerminationStatus(-1); diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h index ab9ec5b81..f90634dd5 100644 --- a/src/core/web_contents_adapter.h +++ b/src/core/web_contents_adapter.h @@ -225,6 +225,7 @@ public: bool canViewSource(); void focusIfNecessary(); bool isFindTextInProgress() const; + bool hasFocusedFrame() const; // meant to be used within WebEngineCore only void initialize(content::SiteInstance *site); diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index 780c14466..d53568215 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -485,6 +485,7 @@ public: virtual void updateScrollPosition(const QPointF &position) = 0; virtual void updateContentsSize(const QSizeF &size) = 0; virtual void updateNavigationActions() = 0; + virtual void updateEditActions() = 0; virtual void startDragging(const content::DropData &dropData, Qt::DropActions allowedActions, const QPixmap &pixmap, const QPoint &offset) = 0; virtual bool supportsDragging() const = 0; diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp index f4d794de5..11276f3a5 100644 --- a/src/core/web_contents_delegate_qt.cpp +++ b/src/core/web_contents_delegate_qt.cpp @@ -64,6 +64,7 @@ #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "components/web_cache/browser/web_cache_manager.h" +#include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/browser_context.h" @@ -106,6 +107,7 @@ WebContentsDelegateQt::WebContentsDelegateQt(content::WebContents *webContents, , m_lastLoadProgress(-1) , m_loadingState(determineLoadingState(webContents)) , m_didStartLoadingSeen(m_loadingState == LoadingState::Loading) + , m_frameFocusedObserver(adapterClient) { webContents->SetDelegate(this); Observe(webContents); @@ -264,6 +266,12 @@ bool WebContentsDelegateQt::HandleKeyboardEvent(content::WebContents *, const co return true; } +void WebContentsDelegateQt::RenderFrameCreated(content::RenderFrameHost *render_frame_host) +{ + content::FrameTreeNode *node = static_cast<content::RenderFrameHostImpl *>(render_frame_host)->frame_tree_node(); + m_frameFocusedObserver.addNode(node); +} + void WebContentsDelegateQt::RenderFrameDeleted(content::RenderFrameHost *render_frame_host) { m_loadingErrorFrameList.removeOne(render_frame_host->GetRoutingID()); @@ -281,6 +289,19 @@ void WebContentsDelegateQt::RenderProcessGone(base::TerminationStatus status) setLoadingState(LoadingState::Unloaded); } +void WebContentsDelegateQt::RenderFrameHostChanged(content::RenderFrameHost *old_host, content::RenderFrameHost *new_host) +{ + if (old_host) { + content::FrameTreeNode *old_node = static_cast<content::RenderFrameHostImpl *>(old_host)->frame_tree_node(); + m_frameFocusedObserver.removeNode(old_node); + } + + if (new_host) { + content::FrameTreeNode *new_node = static_cast<content::RenderFrameHostImpl *>(new_host)->frame_tree_node(); + m_frameFocusedObserver.addNode(new_node); + } +} + void WebContentsDelegateQt::RenderViewHostChanged(content::RenderViewHost *, content::RenderViewHost *newHost) { if (newHost && newHost->GetWidget() && newHost->GetWidget()->GetView()) { @@ -857,4 +878,41 @@ void WebContentsDelegateQt::removeDevices(const blink::MediaStreamDevices &devic webContentsAdapter()->updateRecommendedState(); } +FrameFocusedObserver::FrameFocusedObserver(WebContentsAdapterClient *adapterClient) + : m_viewClient(adapterClient) +{} + +void FrameFocusedObserver::addNode(content::FrameTreeNode *node) +{ + if (m_observedNodes.contains(node)) + return; + + node->AddObserver(this); + m_observedNodes.append(node); +} + +void FrameFocusedObserver::removeNode(content::FrameTreeNode *node) +{ + node->RemoveObserver(this); + m_observedNodes.removeOne(node); +} + +void FrameFocusedObserver::OnFrameTreeNodeFocused(content::FrameTreeNode *node) +{ + Q_UNUSED(node); + m_viewClient->updateEditActions(); +} + +void FrameFocusedObserver::OnFrameTreeNodeDestroyed(content::FrameTreeNode *node) +{ + m_observedNodes.removeOne(node); + m_viewClient->updateEditActions(); +} + +FrameFocusedObserver::~FrameFocusedObserver() +{ + for (content::FrameTreeNode *node : m_observedNodes) + node->RemoveObserver(this); +} + } // namespace QtWebEngineCore diff --git a/src/core/web_contents_delegate_qt.h b/src/core/web_contents_delegate_qt.h index 2ef4f22fc..11b35c549 100644 --- a/src/core/web_contents_delegate_qt.h +++ b/src/core/web_contents_delegate_qt.h @@ -40,6 +40,7 @@ #ifndef WEB_CONTENTS_DELEGATE_QT_H #define WEB_CONTENTS_DELEGATE_QT_H +#include "content/browser/frame_host/frame_tree_node.h" #include "content/public/browser/media_capture_devices.h" #include "content/public/browser/web_contents_delegate.h" #include "content/public/browser/web_contents_observer.h" @@ -71,6 +72,23 @@ class WebContentsAdapter; class WebContentsAdapterClient; class WebEngineSettings; +class FrameFocusedObserver : public content::FrameTreeNode::Observer +{ +public: + FrameFocusedObserver(WebContentsAdapterClient *adapterClient); + ~FrameFocusedObserver(); + void addNode(content::FrameTreeNode *node); + void removeNode(content::FrameTreeNode *node); + +protected: + void OnFrameTreeNodeFocused(content::FrameTreeNode *node) override; + void OnFrameTreeNodeDestroyed(content::FrameTreeNode *node) override; + +private: + WebContentsAdapterClient *m_viewClient; + QVector<content::FrameTreeNode *> m_observedNodes; +}; + class SavePageInfo { public: @@ -133,8 +151,10 @@ public: bool TakeFocus(content::WebContents *source, bool reverse) override; // WebContentsObserver overrides + void RenderFrameCreated(content::RenderFrameHost *render_frame_host) override; void RenderFrameDeleted(content::RenderFrameHost *render_frame_host) override; void RenderProcessGone(base::TerminationStatus status) override; + void RenderFrameHostChanged(content::RenderFrameHost *old_host, content::RenderFrameHost *new_host) override; void RenderViewHostChanged(content::RenderViewHost *old_host, content::RenderViewHost *new_host) override; void DidStartNavigation(content::NavigationHandle *navigation_handle) override; void DidFinishNavigation(content::NavigationHandle *navigation_handle) override; @@ -202,6 +222,8 @@ private: int m_lastLoadProgress; LoadingState m_loadingState; bool m_didStartLoadingSeen; + FrameFocusedObserver m_frameFocusedObserver; + QUrl m_url; QString m_title; int m_audioStreamCount = 0; |