summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorJüri Valdmann <juri.valdmann@qt.io>2019-07-02 12:43:52 +0200
committerJüri Valdmann <juri.valdmann@qt.io>2019-07-02 12:43:52 +0200
commit57119f16668cf79dec0dbdfbc9a2183f9e5c44fa (patch)
treea9f6c7ec75d91eb8408d02dd2c16eec4a39e0541 /src/core
parentfb430b4e104dd6313a776980b4798f1333193149 (diff)
parentbd864f6418ed164c19a700fc4b6ebab3be431c62 (diff)
Merge remote-tracking branch 'origin/5.13' into dev
Diffstat (limited to 'src/core')
-rw-r--r--src/core/config/common.pri5
-rw-r--r--src/core/configure.json19
-rw-r--r--src/core/content_browser_client_qt.cpp7
-rw-r--r--src/core/core_chromium.pri7
-rw-r--r--src/core/core_common.pri3
-rw-r--r--src/core/core_generator.pro2
-rw-r--r--src/core/core_gn_config.pri3
-rw-r--r--src/core/core_module.pro2
-rw-r--r--src/core/core_project.pro4
-rw-r--r--src/core/devtools_frontend_qt.cpp3
-rw-r--r--src/core/printing/pdfium_document_wrapper_qt.cpp25
-rw-r--r--src/core/printing/pdfium_document_wrapper_qt.h5
-rw-r--r--src/core/qtwebengine.gni1
-rw-r--r--src/core/renderer/content_renderer_client_qt.cpp5
-rw-r--r--src/core/renderer/content_renderer_client_qt.h3
-rw-r--r--src/core/renderer/extensions/extensions_renderer_client_qt.cpp3
-rw-r--r--src/core/renderer/render_thread_observer_qt.cpp73
-rw-r--r--src/core/renderer/render_thread_observer_qt.h77
-rw-r--r--src/core/renderer_host/resource_dispatcher_host_delegate_qt.cpp2
-rw-r--r--src/core/web_contents_adapter.cpp6
-rw-r--r--src/core/web_contents_adapter.h1
-rw-r--r--src/core/web_contents_adapter_client.h1
-rw-r--r--src/core/web_contents_delegate_qt.cpp58
-rw-r--r--src/core/web_contents_delegate_qt.h22
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;