From 16a13b68d873800a7227fe1a39e5c1de46f62247 Mon Sep 17 00:00:00 2001 From: Peter Varga Date: Thu, 21 Jan 2021 13:13:34 +0100 Subject: FIXUP: Doc: Describe the WebEngineView.LoadStoppedStatus enum value Add description for the WebEngineLoadRequest QML type too. Task-number: QTBUG-57636 Change-Id: I021af3c49e8235b04ce60efa6143b2e547fc65ad Reviewed-by: Allan Sandfeld Jensen Reviewed-by: Leena Miettinen --- src/webengine/api/qquickwebengineloadrequest.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/webengine/api/qquickwebengineloadrequest.cpp b/src/webengine/api/qquickwebengineloadrequest.cpp index 5ad99ea2e..db7399dc0 100644 --- a/src/webengine/api/qquickwebengineloadrequest.cpp +++ b/src/webengine/api/qquickwebengineloadrequest.cpp @@ -97,10 +97,13 @@ QUrl QQuickWebEngineLoadRequest::url() const This enumeration represents the load status of a web page load request: - \value WebEngineLoadRequest.LoadStartedStatus Page is currently loading. - \value WebEngineLoadRequest.LoadSucceededStatus + \value WebEngineView.LoadStartedStatus Page is currently loading. + \value WebEngineView.LoadStoppedStatus + Loading the page was stopped by the stop() method or by the loader + code or network stack in Chromium. + \value WebEngineView.LoadSucceededStatus Page has been loaded with success. - \value WebEngineLoadRequest.LoadFailedStatus Page could not be loaded. + \value WebEngineView.LoadFailedStatus Page could not be loaded. \sa WebEngineView::loadingChanged */ -- cgit v1.2.1 From 67c3853a5a162ae4aa4041a0fc6715e33469eaa0 Mon Sep 17 00:00:00 2001 From: Szabolcs David Date: Fri, 29 Jan 2021 00:18:39 +0100 Subject: Update Chromium MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pulls in the following changes: * f9845463789 FIXUP: Fixes for jumbo build * 50a83c68629 [Backport] CVE-2021-21118 (3/3) * d964369bee6 [Backport] CVE-2021-21118 (2/3) * 85b0d34712c [Backport] CVE-2021-21118 (1/3) Change-Id: I06d55d9f27cb99815174aef44cb959af189f6dfd Reviewed-by: Peter Varga Reviewed-by: Michael BrĂ¼ning --- src/3rdparty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/3rdparty b/src/3rdparty index b069c30f6..f98454637 160000 --- a/src/3rdparty +++ b/src/3rdparty @@ -1 +1 @@ -Subproject commit b069c30f6b9563696391be3739cc3859099f7dc2 +Subproject commit f9845463789f5dc3e8e3858280f23700bcb5ed5b -- cgit v1.2.1 From 10d30914e9c5e911492e690e4fba4dedaf0b6796 Mon Sep 17 00:00:00 2001 From: Peter Varga Date: Thu, 28 Jan 2021 14:47:28 +0100 Subject: Clean up header includes and forward declarations in core Change-Id: Ia90172f47f0f6349de9a21f6567bda92a156216c Reviewed-by: Allan Sandfeld Jensen --- src/core/api/qwebengineurlschemehandler.h | 4 - src/core/content_browser_client_qt.cpp | 88 +++++++--------------- src/core/content_browser_client_qt.h | 10 --- ...in_response_interceptor_url_loader_throttle.cpp | 6 +- src/core/net/proxying_url_loader_factory_qt.cpp | 12 +-- src/core/net/proxying_url_loader_factory_qt.h | 8 -- src/core/net/system_network_context_manager.cpp | 20 ----- src/core/net/system_network_context_manager.h | 10 --- src/core/net/webui_controller_factory_qt.cpp | 5 -- src/core/net/webui_controller_factory_qt.h | 8 -- src/core/profile_io_data_qt.h | 1 - .../pepper/pepper_flash_browser_host_qt.cpp | 10 --- .../pepper/pepper_flash_browser_host_qt.h | 8 -- src/core/resource_context_qt.h | 15 ---- src/core/user_notification_controller.h | 2 +- 15 files changed, 31 insertions(+), 176 deletions(-) diff --git a/src/core/api/qwebengineurlschemehandler.h b/src/core/api/qwebengineurlschemehandler.h index 09c5b08cb..4574bf8b0 100644 --- a/src/core/api/qwebengineurlschemehandler.h +++ b/src/core/api/qwebengineurlschemehandler.h @@ -44,10 +44,6 @@ #include -namespace QtWebEngineCore { -class URLRequestContextGetterQt; -} - QT_BEGIN_NAMESPACE class QWebEngineUrlRequestJob; diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp index 6b4b79787..f41d612b3 100644 --- a/src/core/content_browser_client_qt.cpp +++ b/src/core/content_browser_client_qt.cpp @@ -39,69 +39,37 @@ #include "content_browser_client_qt.h" -#include "base/memory/ptr_util.h" #include "base/optional.h" -#include "base/path_service.h" -#include "base/strings/utf_string_conversions.h" #include "base/task/post_task.h" -#include "base/threading/thread_restrictions.h" #include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" -#if QT_CONFIG(webengine_spellchecker) -#include "chrome/browser/spellchecker/spell_check_host_chrome_impl.h" -#endif -#include "components/guest_view/browser/guest_view_base.h" #include "components/navigation_interception/intercept_navigation_throttle.h" #include "components/navigation_interception/navigation_params.h" #include "components/network_hints/browser/simple_network_hints_handler_impl.h" #include "components/performance_manager/embedder/performance_manager_registry.h" #include "components/performance_manager/public/performance_manager.h" -#include "components/spellcheck/spellcheck_buildflags.h" -#include "content/browser/renderer_host/render_view_host_delegate.h" #include "content/browser/web_contents/web_contents_impl.h" -#include "content/common/url_schemes.h" #include "content/public/browser/browser_main_runner.h" -#include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/child_process_security_policy.h" #include "content/public/browser/client_certificate_delegate.h" #include "content/public/browser/file_url_loader.h" #include "content/public/browser/media_observer.h" -#include "content/public/browser/network_service_instance.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/shared_cors_origin_access_list.h" -#include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_user_data.h" #include "content/public/browser/web_ui_url_loader_factory.h" #include "content/public/common/content_switches.h" #include "content/public/common/main_function_params.h" -#include "content/public/common/service_manager_connection.h" #include "content/public/common/service_names.mojom.h" -#include "content/public/common/url_constants.h" #include "content/public/common/user_agent.h" -#include "media/media_buildflags.h" #include "extensions/buildflags/buildflags.h" -#include "extensions/browser/extension_protocols.h" -#include "extensions/browser/guest_view/web_view/web_view_guest.h" -#include "extensions/browser/process_map.h" -#include "mojo/public/cpp/bindings/binding.h" -#include "mojo/public/cpp/bindings/binding_set.h" -#include "mojo/public/cpp/bindings/remote.h" -#include "printing/buildflags/buildflags.h" -#include "qtwebengine/browser/qtwebengine_content_browser_overlay_manifest.h" -#include "qtwebengine/browser/qtwebengine_content_renderer_overlay_manifest.h" #include "net/ssl/client_cert_identity.h" #include "net/ssl/client_cert_store.h" -#include "sandbox/policy/switches.h" #include "services/network/network_service.h" -#include "services/network/public/cpp/features.h" -#include "services/service_manager/switches.h" -#include "services/service_manager/public/cpp/connector.h" -#include "services/service_manager/public/cpp/service.h" -#include "storage/browser/quota/quota_settings.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" #include "third_party/blink/public/common/loader/url_loader_throttle.h" #include "third_party/blink/public/mojom/insecure_input/insecure_input_service.mojom.h" @@ -113,6 +81,8 @@ #include "ui/gl/gpu_timing.h" #include "url/url_util_qt.h" +#include "qtwebengine/browser/qtwebengine_content_browser_overlay_manifest.h" +#include "qtwebengine/browser/qtwebengine_content_renderer_overlay_manifest.h" #include "qtwebengine/common/renderer_configuration.mojom.h" #include "qtwebengine/grit/qt_webengine_resources.h" @@ -129,12 +99,8 @@ #include "net/custom_url_loader_factory.h" #include "net/proxying_restricted_cookie_manager_qt.h" #include "net/proxying_url_loader_factory_qt.h" -#include "net/qrc_url_scheme_handler.h" #include "net/system_network_context_manager.h" #include "platform_notification_service_qt.h" -#if QT_CONFIG(webengine_printing_and_pdf) -#include "printing/printing_message_filter_qt.h" -#endif #include "profile_qt.h" #include "profile_io_data_qt.h" #include "quota_permission_context_qt.h" @@ -143,16 +109,19 @@ #include "web_contents_adapter_client.h" #include "web_contents_adapter.h" #include "web_contents_delegate_qt.h" -#include "web_engine_context.h" #include "web_contents_view_qt.h" #include "web_engine_library_info.h" #include "api/qwebenginecookiestore.h" #include "api/qwebenginecookiestore_p.h" -#include "api/qwebengineurlscheme.h" -#if defined(Q_OS_LINUX) -#include "global_descriptors_qt.h" -#include "ui/base/resource/resource_bundle.h" +#if QT_CONFIG(opengl) +#include +#include +#endif + +#if QT_CONFIG(webengine_geolocation) +#include "base/memory/ptr_util.h" +#include "location_provider_qt.h" #endif #if QT_CONFIG(webengine_pepper_plugins) @@ -161,22 +130,32 @@ #include "renderer_host/pepper/pepper_host_factory_qt.h" #endif -#if QT_CONFIG(webengine_geolocation) -#include "location_provider_qt.h" +#if QT_CONFIG(webengine_printing_and_pdf) +#include "printing/printing_message_filter_qt.h" +#endif + +#if QT_CONFIG(webengine_spellchecker) +#include "chrome/browser/spellchecker/spell_check_host_chrome_impl.h" +#include "components/spellcheck/common/spellcheck.mojom.h" +#endif + +#if defined(Q_OS_LINUX) +#include "global_descriptors_qt.h" #endif #if BUILDFLAG(ENABLE_EXTENSIONS) -#include "content/public/browser/file_url_loader.h" +#include "common/extensions/extensions_client_qt.h" +#include "components/guest_view/browser/guest_view_base.h" #include "extensions/browser/api/mime_handler_private/mime_handler_private.h" #include "extensions/browser/extension_message_filter.h" -#include "extensions/browser/extension_registry.h" +#include "extensions/browser/extension_protocols.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/guest_view/extensions_guest_view_message_filter.h" #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h" +#include "extensions/browser/guest_view/web_view/web_view_guest.h" +#include "extensions/browser/process_map.h" #include "extensions/browser/url_loader_factory_manager.h" #include "extensions/common/constants.h" - -#include "common/extensions/extensions_client_qt.h" #include "extensions/extension_web_contents_observer_qt.h" #include "extensions/extensions_browser_client_qt.h" #include "net/plugin_response_interceptor_url_loader_throttle.h" @@ -187,18 +166,8 @@ #include "media/mojo/services/media_service_factory.h" #endif -#if BUILDFLAG(ENABLE_SPELLCHECK) -#include "chrome/browser/spellchecker/spell_check_host_chrome_impl.h" -#include "components/spellcheck/common/spellcheck.mojom.h" -#endif - #include -#include #include -#if QT_CONFIG(opengl) -# include -# include -#endif #include QT_BEGIN_NAMESPACE @@ -616,12 +585,12 @@ WEB_CONTENTS_USER_DATA_KEY_IMPL(ServiceDriver) void ContentBrowserClientQt::BindHostReceiverForRenderer(content::RenderProcessHost *render_process_host, mojo::GenericPendingReceiver receiver) { -#if BUILDFLAG(ENABLE_SPELLCHECK) +#if QT_CONFIG(webengine_spellchecker) if (auto host_receiver = receiver.As()) { SpellCheckHostChromeImpl::Create(render_process_host->GetID(), std::move(host_receiver)); return; } -#endif // BUILDFLAG(ENABLE_SPELLCHECK) +#endif } static void BindNetworkHintsHandler(content::RenderFrameHost *frame_host, @@ -885,7 +854,6 @@ bool ContentBrowserClientQt::HandleExternalProtocol(const GURL &url, const base::Optional &initiating_origin, mojo::PendingRemote *out_factory) { -// Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); Q_UNUSED(child_id); Q_UNUSED(navigation_data); Q_UNUSED(initiating_origin); diff --git a/src/core/content_browser_client_qt.h b/src/core/content_browser_client_qt.h index 9e578d9d9..ffbfed430 100644 --- a/src/core/content_browser_client_qt.h +++ b/src/core/content_browser_client_qt.h @@ -41,13 +41,8 @@ #define CONTENT_BROWSER_CLIENT_QT_H #include "qtwebenginecoreglobal_p.h" -#include "base/memory/ref_counted.h" #include "content/public/browser/content_browser_client.h" -namespace net { -class URLRequestContextGetter; -} - namespace content { class BrowserContext; class BrowserMainParts; @@ -59,10 +54,7 @@ class BrowserPpapiHost; class DevToolsManagerDelegate; class RenderFrameHost; class RenderProcessHost; -class RenderViewHostDelegateView; class ResourceContext; -class ResourceDispatcherHostDelegate; -class WebContentsViewPort; class WebContents; struct MainFunctionParams; struct Referrer; @@ -74,8 +66,6 @@ class GLShareGroup; namespace QtWebEngineCore { -class BrowserMainPartsQt; -class ProfileQt; class ShareGroupQtQuick; class ContentBrowserClientQt : public content::ContentBrowserClient diff --git a/src/core/net/plugin_response_interceptor_url_loader_throttle.cpp b/src/core/net/plugin_response_interceptor_url_loader_throttle.cpp index 4641717f7..bd03d3083 100644 --- a/src/core/net/plugin_response_interceptor_url_loader_throttle.cpp +++ b/src/core/net/plugin_response_interceptor_url_loader_throttle.cpp @@ -41,7 +41,7 @@ #include "base/bind.h" #include "base/task/post_task.h" -#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/download_manager.h" #include "content/public/browser/download_request_utils.h" @@ -49,10 +49,6 @@ #include "extensions/common/constants.h" #include "extensions/common/extension.h" -#include "extensions/extension_system_qt.h" -#include "profile_adapter.h" -#include "profile_io_data_qt.h" -#include "profile_qt.h" #include "web_contents_delegate_qt.h" #include diff --git a/src/core/net/proxying_url_loader_factory_qt.cpp b/src/core/net/proxying_url_loader_factory_qt.cpp index dfc17e440..6488310c4 100644 --- a/src/core/net/proxying_url_loader_factory_qt.cpp +++ b/src/core/net/proxying_url_loader_factory_qt.cpp @@ -42,26 +42,16 @@ #include #include "base/bind.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/stringprintf.h" #include "base/task/post_task.h" -#include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" -#include "content/public/browser/global_request_id.h" -#include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" -#include "content/public/common/content_constants.h" -#include "content/public/common/url_utils.h" -#include "net/base/load_flags.h" #include "net/http/http_status_code.h" -#include "net/http/http_util.h" +#include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h" #include "api/qwebengineurlrequestinfo_p.h" -#include "profile_qt.h" #include "type_conversion.h" #include "web_contents_adapter_client.h" -#include "web_contents_view_qt.h" #include diff --git a/src/core/net/proxying_url_loader_factory_qt.h b/src/core/net/proxying_url_loader_factory_qt.h index e1bcc276c..50caa69e9 100644 --- a/src/core/net/proxying_url_loader_factory_qt.h +++ b/src/core/net/proxying_url_loader_factory_qt.h @@ -42,16 +42,12 @@ #include "base/callback.h" #include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/memory/ref_counted_delete_on_sequence.h" #include "base/memory/weak_ptr.h" -#include "base/optional.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/cpp/resource_request.h" #include "services/network/public/mojom/url_loader.mojom.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" -#include "url/gurl.h" #include // based on aw_proxying_url_loader_factory.h: @@ -61,10 +57,6 @@ QT_FORWARD_DECLARE_CLASS(QWebEngineUrlRequestInterceptor) -namespace content { -class ResourceContext; -} - namespace QtWebEngineCore { class ProxyingURLLoaderFactoryQt : public network::mojom::URLLoaderFactory diff --git a/src/core/net/system_network_context_manager.cpp b/src/core/net/system_network_context_manager.cpp index 99a207c0e..1fba115c6 100644 --- a/src/core/net/system_network_context_manager.cpp +++ b/src/core/net/system_network_context_manager.cpp @@ -44,35 +44,16 @@ #include "net/system_network_context_manager.h" -#include -#include -#include - #include "base/bind.h" #include "base/command_line.h" -#include "base/feature_list.h" -#include "base/logging.h" -#include "base/sequence_checker.h" -#include "base/strings/string_split.h" -#include "base/task/post_task.h" -#include "base/values.h" -#include "build/build_config.h" #include "chrome/browser/net/chrome_mojo_proxy_resolver_factory.h" #include "chrome/common/chrome_switches.h" #include "components/certificate_transparency/ct_known_logs.h" -#include "components/network_session_configurator/common/network_features.h" #include "components/network_session_configurator/common/network_switches.h" -#include "content/public/browser/browser_task_traits.h" -#include "content/public/browser/browser_thread.h" #include "content/public/browser/network_service_instance.h" -#include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" #include "content/public/common/service_names.mojom.h" -#include "content/public/common/user_agent.h" -#include "mojo/public/cpp/bindings/associated_interface_ptr.h" -#include "net/dns/public/util.h" #include "net/net_buildflags.h" -#include "net/third_party/uri_template/uri_template.h" #include "services/network/network_service.h" #include "services/network/public/cpp/cross_thread_pending_shared_url_loader_factory.h" #include "services/network/public/cpp/features.h" @@ -80,7 +61,6 @@ #include "services/network/public/mojom/host_resolver.mojom.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include "services/proxy_resolver/public/mojom/proxy_resolver.mojom.h" -#include "url/gurl.h" namespace { diff --git a/src/core/net/system_network_context_manager.h b/src/core/net/system_network_context_manager.h index bd12fe217..48cd99173 100644 --- a/src/core/net/system_network_context_manager.h +++ b/src/core/net/system_network_context_manager.h @@ -46,16 +46,10 @@ #define SYSTEM_NETWORK_CONTEXT_MANAGER_H_ #include -#include -#include #include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/optional.h" -#include "services/network/public/mojom/host_resolver.mojom-forward.h" #include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/network_service.mojom-forward.h" -#include "services/network/public/mojom/ssl_config.mojom-forward.h" #include "services/network/public/mojom/url_loader_factory.mojom-forward.h" #include "net/proxy_config_monitor.h" @@ -67,10 +61,6 @@ class URLLoaderFactory; class SharedURLLoaderFactory; } // namespace network -namespace net_log { -class NetExportFileWriter; -} - // Responsible for creating and managing access to the system NetworkContext. // Lives on the UI thread. The NetworkContext this owns is intended for requests // not associated with a profile. It stores no data on disk, and has no HTTP diff --git a/src/core/net/webui_controller_factory_qt.cpp b/src/core/net/webui_controller_factory_qt.cpp index 27e58d75f..c6d50a447 100644 --- a/src/core/net/webui_controller_factory_qt.cpp +++ b/src/core/net/webui_controller_factory_qt.cpp @@ -45,23 +45,18 @@ #include "webui_controller_factory_qt.h" #include "base/bind.h" -#include "base/location.h" -#include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h" #include "chrome/browser/accessibility/accessibility_ui.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/devtools_ui.h" #include "chrome/browser/ui/webui/quota_internals/quota_internals_ui.h" #include "chrome/common/url_constants.h" -#include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" -#include "content/public/common/content_client.h" #include "content/public/common/url_utils.h" #include "extensions/buildflags/buildflags.h" #include "media/media_buildflags.h" #include "ppapi/buildflags/buildflags.h" #include "printing/buildflags/buildflags.h" -#include "ui/web_dialogs/web_dialog_ui.h" #include "url/gurl.h" #if defined(OS_LINUX) || defined(OS_ANDROID) diff --git a/src/core/net/webui_controller_factory_qt.h b/src/core/net/webui_controller_factory_qt.h index 1cc76349b..6dfc612e1 100644 --- a/src/core/net/webui_controller_factory_qt.h +++ b/src/core/net/webui_controller_factory_qt.h @@ -42,16 +42,8 @@ #include "base/macros.h" #include "base/memory/singleton.h" -#include "components/favicon_base/favicon_callback.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_controller_factory.h" -#include "ui/base/layout.h" - -class Profile; - -namespace base { -class RefCountedMemory; -} namespace QtWebEngineCore { diff --git a/src/core/profile_io_data_qt.h b/src/core/profile_io_data_qt.h index 3f8205159..e44d838dd 100644 --- a/src/core/profile_io_data_qt.h +++ b/src/core/profile_io_data_qt.h @@ -53,7 +53,6 @@ namespace net { class ClientCertStore; -class URLRequestContext; } namespace extensions { diff --git a/src/core/renderer_host/pepper/pepper_flash_browser_host_qt.cpp b/src/core/renderer_host/pepper/pepper_flash_browser_host_qt.cpp index af547fcf2..8fa277e78 100644 --- a/src/core/renderer_host/pepper/pepper_flash_browser_host_qt.cpp +++ b/src/core/renderer_host/pepper/pepper_flash_browser_host_qt.cpp @@ -45,19 +45,14 @@ #include "pepper_flash_browser_host_qt.h" #include "base/time/time.h" -#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_ppapi_host.h" -#include "content/public/browser/browser_thread.h" -#include "content/public/browser/render_process_host.h" #include "ipc/ipc_message_macros.h" #include "ppapi/c/pp_errors.h" -#include "ppapi/c/private/ppb_flash.h" #include "ppapi/host/dispatch_host_message.h" #include "ppapi/proxy/ppapi_messages.h" #include "ppapi/proxy/resource_message_params.h" #include "ppapi/shared_impl/time_conversion.h" #include "qtwebenginecoreglobal_p.h" -#include "url/gurl.h" #if defined(OS_WIN) #include @@ -66,8 +61,6 @@ #endif using content::BrowserPpapiHost; -using content::BrowserThread; -using content::RenderProcessHost; namespace QtWebEngineCore { @@ -75,11 +68,8 @@ PepperFlashBrowserHostQt::PepperFlashBrowserHostQt(BrowserPpapiHost* host, PP_Instance instance, PP_Resource resource) : ResourceHost(host->GetPpapiHost(), instance, resource), - host_(host), weak_factory_(this) { - int unused; - host->GetRenderFrameIDsForInstance(instance, &render_process_id_, &unused); } PepperFlashBrowserHostQt::~PepperFlashBrowserHostQt() {} diff --git a/src/core/renderer_host/pepper/pepper_flash_browser_host_qt.h b/src/core/renderer_host/pepper/pepper_flash_browser_host_qt.h index 5d1107dfb..d6d2c8656 100644 --- a/src/core/renderer_host/pepper/pepper_flash_browser_host_qt.h +++ b/src/core/renderer_host/pepper/pepper_flash_browser_host_qt.h @@ -40,7 +40,6 @@ #ifndef PEPPER_FLASH_BROWSER_HOST_QT_H #define PEPPER_FLASH_BROWSER_HOST_QT_H -#include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "ppapi/host/host_message_context.h" #include "ppapi/host/resource_host.h" @@ -51,7 +50,6 @@ class Time; namespace content { class BrowserPpapiHost; -class ResourceContext; } class GURL; @@ -77,12 +75,6 @@ private: const base::Time& t); int32_t OnGetLocalDataRestrictions(ppapi::host::HostMessageContext* context); - void GetLocalDataRestrictions(ppapi::host::ReplyMessageContext reply_context, - const GURL& document_url, - const GURL& plugin_url); - - content::BrowserPpapiHost* host_; - int render_process_id_; base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(PepperFlashBrowserHostQt); diff --git a/src/core/resource_context_qt.h b/src/core/resource_context_qt.h index 4107e7c24..efd3d2e7e 100644 --- a/src/core/resource_context_qt.h +++ b/src/core/resource_context_qt.h @@ -42,21 +42,6 @@ #include "content/public/browser/resource_context.h" -#include "extensions/buildflags/buildflags.h" - -namespace net { -class URLRequestContext; -class URLRequestContextGetter; -} - -#if BUILDFLAG(ENABLE_EXTENSIONS) -namespace extensions { -class ExtensionSystemQt; -} -#endif // BUILDFLAG(ENABLE_EXTENSIONS) - -class GURL; - namespace QtWebEngineCore { class ProfileIODataQt; diff --git a/src/core/user_notification_controller.h b/src/core/user_notification_controller.h index bab85c7ec..f0d7e348f 100644 --- a/src/core/user_notification_controller.h +++ b/src/core/user_notification_controller.h @@ -44,7 +44,7 @@ #include #include -#include +#include class GURL; -- cgit v1.2.1 From 30ccee84327bd7d8156f1a4203bca23858c8defa Mon Sep 17 00:00:00 2001 From: Peter Varga Date: Mon, 1 Feb 2021 18:10:23 +0100 Subject: Enable chrome://user-actions WebUI Also record some actions in WebContentsAdapter. The list is far from complete but these seemed obvious. Change-Id: I7dcddeef416efd6fb26618381a83d2b132b98d83 Reviewed-by: Allan Sandfeld Jensen --- src/core/net/webui_controller_factory_qt.cpp | 7 ++++--- src/core/qtwebengine_sources.gni | 4 ++++ src/core/web_contents_adapter.cpp | 22 +++++++++++++++++++++- .../widgets/qwebengineview/tst_qwebengineview.cpp | 2 +- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/core/net/webui_controller_factory_qt.cpp b/src/core/net/webui_controller_factory_qt.cpp index c6d50a447..d434ebe11 100644 --- a/src/core/net/webui_controller_factory_qt.cpp +++ b/src/core/net/webui_controller_factory_qt.cpp @@ -50,6 +50,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/devtools_ui.h" #include "chrome/browser/ui/webui/quota_internals/quota_internals_ui.h" +#include "chrome/browser/ui/webui/user_actions/user_actions_ui.h" #include "chrome/common/url_constants.h" #include "content/public/browser/web_ui.h" #include "content/public/common/url_utils.h" @@ -67,7 +68,6 @@ // or doesn't work, but would be interesting for us if they did: // #include "chrome/browser/ui/webui/inspect_ui.h" -// #include "chrome/browser/ui/webui/user_actions/user_actions_ui.h" // #if BUILDFLAG(ENABLE_WEBRTC) // #include "chrome/browser/ui/webui/media/webrtc_logs_ui.h" @@ -132,8 +132,9 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI *web_ui, Profile *profile, co if (url.host() == chrome::kChromeUIAccessibilityHost) return &NewWebUI; -// if (url.host_piece() == chrome::kChromeUIUserActionsHost) -// return &NewWebUI; + if (url.host_piece() == chrome::kChromeUIUserActionsHost) + return &NewWebUI; + // if (url.host_piece() == chrome::kChromeUIInspectHost) // return &NewWebUI; // diff --git a/src/core/qtwebengine_sources.gni b/src/core/qtwebengine_sources.gni index 418638536..c715b6432 100644 --- a/src/core/qtwebengine_sources.gni +++ b/src/core/qtwebengine_sources.gni @@ -85,6 +85,10 @@ source_set("qtwebengine_sources") { "//chrome/browser/ui/webui/quota_internals/quota_internals_types.h", "//chrome/browser/ui/webui/quota_internals/quota_internals_ui.cc", "//chrome/browser/ui/webui/quota_internals/quota_internals_ui.h", + "//chrome/browser/ui/webui/user_actions/user_actions_ui.cc", + "//chrome/browser/ui/webui/user_actions/user_actions_ui.h", + "//chrome/browser/ui/webui/user_actions/user_actions_ui_handler.cc", + "//chrome/browser/ui/webui/user_actions/user_actions_ui_handler.h", "//chrome/common/custom_handlers/protocol_handler.cc", "//chrome/common/custom_handlers/protocol_handler.h", "//chrome/common/chrome_switches.cc", diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index 6eff8e9ad..a5473372d 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -61,6 +61,7 @@ #include "web_engine_settings.h" #include "base/command_line.h" +#include "base/metrics/user_metrics.h" #include "base/run_loop.h" #include "base/task/current_thread.h" #include "base/task/post_task.h" @@ -602,8 +603,9 @@ bool WebContentsAdapter::canGoToOffset(int offset) const void WebContentsAdapter::stop() { CHECK_INITIALIZED(); - content::NavigationController& controller = m_webContents->GetController(); + base::RecordAction(base::UserMetricsAction("Stop")); + content::NavigationController& controller = m_webContents->GetController(); int index = controller.GetPendingEntryIndex(); if (index != -1) controller.RemoveEntryAtIndex(index); @@ -615,6 +617,8 @@ void WebContentsAdapter::stop() void WebContentsAdapter::reload() { CHECK_INITIALIZED(); + base::RecordAction(base::UserMetricsAction("Reload")); + bool wasDiscarded = (m_lifecycleState == LifecycleState::Discarded); setLifecycleState(LifecycleState::Active); CHECK_VALID_RENDER_WIDGET_HOST_VIEW(m_webContents->GetRenderViewHost()); @@ -628,6 +632,8 @@ void WebContentsAdapter::reload() void WebContentsAdapter::reloadAndBypassCache() { CHECK_INITIALIZED(); + base::RecordAction(base::UserMetricsAction("ReloadBypassingCache")); + bool wasDiscarded = (m_lifecycleState == LifecycleState::Discarded); setLifecycleState(LifecycleState::Active); CHECK_VALID_RENDER_WIDGET_HOST_VIEW(m_webContents->GetRenderViewHost()); @@ -652,6 +658,7 @@ void WebContentsAdapter::load(const QUrl &url) void WebContentsAdapter::load(const QWebEngineHttpRequest &request) { + base::RecordAction(base::UserMetricsAction("LoadURL")); GURL gurl = toGurl(request.url()); if (!isInitialized()) { scoped_refptr site = @@ -780,6 +787,7 @@ void WebContentsAdapter::setContent(const QByteArray &data, const QString &mimeT void WebContentsAdapter::save(const QString &filePath, int savePageFormat) { CHECK_INITIALIZED(); + base::RecordAction(base::UserMetricsAction("SavePage")); m_webContentsDelegate->setSavePageInfo(SavePageInfo(filePath, savePageFormat)); m_webContents->OnSavePage(); } @@ -834,42 +842,49 @@ QString WebContentsAdapter::selectedText() const void WebContentsAdapter::undo() { CHECK_INITIALIZED(); + base::RecordAction(base::UserMetricsAction("Undo")); m_webContents->Undo(); } void WebContentsAdapter::redo() { CHECK_INITIALIZED(); + base::RecordAction(base::UserMetricsAction("Redo")); m_webContents->Redo(); } void WebContentsAdapter::cut() { CHECK_INITIALIZED(); + base::RecordAction(base::UserMetricsAction("Cut")); m_webContents->Cut(); } void WebContentsAdapter::copy() { CHECK_INITIALIZED(); + base::RecordAction(base::UserMetricsAction("Copy")); m_webContents->Copy(); } void WebContentsAdapter::paste() { CHECK_INITIALIZED(); + base::RecordAction(base::UserMetricsAction("Paste")); m_webContents->Paste(); } void WebContentsAdapter::pasteAndMatchStyle() { CHECK_INITIALIZED(); + base::RecordAction(base::UserMetricsAction("PasteAndMatchStyle")); m_webContents->PasteAndMatchStyle(); } void WebContentsAdapter::selectAll() { CHECK_INITIALIZED(); + base::RecordAction(base::UserMetricsAction("SelectAll")); m_webContents->SelectAll(); } @@ -888,6 +903,7 @@ void WebContentsAdapter::unselect() void WebContentsAdapter::navigateBack() { CHECK_INITIALIZED(); + base::RecordAction(base::UserMetricsAction("Back")); CHECK_VALID_RENDER_WIDGET_HOST_VIEW(m_webContents->GetRenderViewHost()); if (!m_webContents->GetController().CanGoBack()) return; @@ -898,6 +914,7 @@ void WebContentsAdapter::navigateBack() void WebContentsAdapter::navigateForward() { CHECK_INITIALIZED(); + base::RecordAction(base::UserMetricsAction("Forward")); CHECK_VALID_RENDER_WIDGET_HOST_VIEW(m_webContents->GetRenderViewHost()); if (!m_webContents->GetController().CanGoForward()) return; @@ -1284,12 +1301,14 @@ void WebContentsAdapter::devToolsFrontendDestroyed(DevToolsFrontendQt *frontend) void WebContentsAdapter::exitFullScreen() { CHECK_INITIALIZED(); + base::RecordAction(base::UserMetricsAction("ToggleFullscreen")); m_webContents->ExitFullscreen(false); } void WebContentsAdapter::changedFullScreen() { CHECK_INITIALIZED(); + base::RecordAction(base::UserMetricsAction("ToggleFullscreen")); m_webContents->NotifyFullscreenChanged(false); } @@ -1793,6 +1812,7 @@ FindTextHelper *WebContentsAdapter::findTextHelper() void WebContentsAdapter::viewSource() { CHECK_INITIALIZED(); + base::RecordAction(base::UserMetricsAction("ViewSource")); m_webContents->GetMainFrame()->ViewSource(); } diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp index 8e23e02b4..3cdfd75db 100644 --- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp +++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp @@ -3139,7 +3139,7 @@ void tst_QWebEngineView::webUIURLs_data() QTest::newRow("tracing") << QUrl("chrome://tracing") << false; QTest::newRow("translate-internals") << QUrl("chrome://translate-internals") << false; QTest::newRow("usb-internals") << QUrl("chrome://usb-internals") << false; - QTest::newRow("user-actions") << QUrl("chrome://user-actions") << false; + QTest::newRow("user-actions") << QUrl("chrome://user-actions") << true; QTest::newRow("version") << QUrl("chrome://version") << false; QTest::newRow("webrtc-internals") << QUrl("chrome://webrtc-internals") << true; QTest::newRow("webrtc-logs") << QUrl("chrome://webrtc-logs") << false; -- cgit v1.2.1 From f9885840ef2840179f589dd1f71a776df5fd34f3 Mon Sep 17 00:00:00 2001 From: Peter Varga Date: Tue, 2 Feb 2021 09:25:21 +0100 Subject: Remove remains of chrome://flash It was removed in Chromium 73: https://chromium-review.googlesource.com/c/chromium/src/+/1373841 Change-Id: I3755f50d865b22f757714ab50add1bccf463421f Reviewed-by: Allan Sandfeld Jensen --- src/core/net/webui_controller_factory_qt.cpp | 4 ---- tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp | 1 - 2 files changed, 5 deletions(-) diff --git a/src/core/net/webui_controller_factory_qt.cpp b/src/core/net/webui_controller_factory_qt.cpp index d434ebe11..aec192cd0 100644 --- a/src/core/net/webui_controller_factory_qt.cpp +++ b/src/core/net/webui_controller_factory_qt.cpp @@ -146,10 +146,6 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI *web_ui, Profile *profile, co // if (url.host_piece() == chrome::kChromeUIExtensionsFrameHost) // return &NewWebUI; //#endif -//#if BUILDFLAG(ENABLE_PLUGINS) -// if (url.host_piece() == chrome::kChromeUIFlashHost) -// return &NewWebUI; -//#endif //#if BUILDFLAG(ENABLE_PRINT_PREVIEW) // if (url.host_piece() == chrome::kChromeUIPrintHost && // !profile->GetPrefs()->GetBoolean(prefs::kPrintPreviewDisabled)) { diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp index 3cdfd75db..2588852ce 100644 --- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp +++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp @@ -3095,7 +3095,6 @@ void tst_QWebEngineView::webUIURLs_data() QTest::newRow("downloads") << QUrl("chrome://downloads") << false; QTest::newRow("extensions") << QUrl("chrome://extensions") << false; QTest::newRow("flags") << QUrl("chrome://flags") << false; - QTest::newRow("flash") << QUrl("chrome://flash") << false; QTest::newRow("gcm-internals") << QUrl("chrome://gcm-internals") << false; QTest::newRow("gpu") << QUrl("chrome://gpu") << true; QTest::newRow("help") << QUrl("chrome://help") << false; -- cgit v1.2.1 From c43c3c3ae46735e3d23e0ed70c31143d2556a579 Mon Sep 17 00:00:00 2001 From: Peter Varga Date: Mon, 25 Jan 2021 14:59:55 +0100 Subject: Fix loadFinished signal if page has content but server sends HTTP error For triggering an error page 3 conditions should be fulfilled: - main frame navigation - the page's document is empty - the HTTP status code indicates an error This fix adds check for the empty document and sends loadFinished signal without expecting an error page if the document is not empty. Fixes: QTBUG-90517 Change-Id: I6463d75fb5e682932feca64b0f059f9aa475795c Reviewed-by: Kirill Burtsev --- src/core/web_contents_adapter.cpp | 9 +- src/core/web_contents_adapter_client.h | 3 +- src/core/web_contents_delegate_qt.cpp | 28 +++++- src/core/web_contents_delegate_qt.h | 6 +- src/webengine/api/qquickwebengineview.cpp | 4 +- src/webengine/api/qquickwebengineview_p_p.h | 3 +- src/webenginewidgets/api/qwebenginepage.cpp | 8 +- src/webenginewidgets/api/qwebenginepage_p.h | 3 +- tests/auto/widgets/loadsignals/tst_loadsignals.cpp | 106 +++++++++++++++++++++ .../widgets/qwebenginepage/tst_qwebenginepage.cpp | 47 --------- 10 files changed, 153 insertions(+), 64 deletions(-) diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index a5473372d..ee0c1fb3c 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -713,9 +713,10 @@ void WebContentsAdapter::load(const QWebEngineHttpRequest &request) // chromium accepts LOAD_TYPE_HTTP_POST only for the HTTP and HTTPS protocols if (!params.url.SchemeIsHTTPOrHTTPS()) { m_adapterClient->loadFinished(false, request.url(), false, - net::ERR_DISALLOWED_URL_SCHEME, - QCoreApplication::translate("WebContentsAdapter", - "HTTP-POST data can only be sent over HTTP(S) protocol")); + net::ERR_DISALLOWED_URL_SCHEME, + QCoreApplication::translate("WebContentsAdapter", + "HTTP-POST data can only be sent over HTTP(S) protocol"), + false); return; } params.post_data = network::ResourceRequestBody::CreateFromBytes( @@ -771,7 +772,7 @@ void WebContentsAdapter::setContent(const QByteArray &data, const QString &mimeT GURL dataUrlToLoad(urlString); if (dataUrlToLoad.spec().size() > url::kMaxURLChars) { - m_adapterClient->loadFinished(false, baseUrl, false, net::ERR_ABORTED); + m_adapterClient->loadFinished(false, baseUrl, false, net::ERR_ABORTED, QString(), false); return; } content::NavigationController::LoadURLParams params((dataUrlToLoad)); diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index 04df99f0e..267266d81 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -466,7 +466,8 @@ public: virtual void loadStarted(const QUrl &provisionalUrl, bool isErrorPage = false) = 0; virtual void loadCommitted() = 0; virtual void loadVisuallyCommitted() = 0; - virtual void loadFinished(bool success, const QUrl &url, bool isErrorPage = false, int errorCode = 0, const QString &errorDescription = QString()) = 0; + virtual void loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, + const QString &errorDescription, bool triggersErrorPage) = 0; virtual void focusContainer() = 0; virtual void unhandledKeyEvent(QKeyEvent *event) = 0; virtual QSharedPointer diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp index e594f648e..1e92a46f8 100644 --- a/src/core/web_contents_delegate_qt.cpp +++ b/src/core/web_contents_delegate_qt.cpp @@ -341,6 +341,7 @@ void WebContentsDelegateQt::RenderViewHostChanged(content::RenderViewHost *, con void WebContentsDelegateQt::EmitLoadStarted(const QUrl &url, bool isErrorPage) { + m_isDocumentEmpty = true; m_viewClient->loadStarted(url, isErrorPage); m_viewClient->updateNavigationActions(); @@ -383,9 +384,10 @@ void WebContentsDelegateQt::DidStartNavigation(content::NavigationHandle *naviga EmitLoadStarted(toQt(navigation_handle->GetURL())); } -void WebContentsDelegateQt::EmitLoadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, const QString &errorDescription) +void WebContentsDelegateQt::EmitLoadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, const QString &errorDescription, bool triggersErrorPage) { Q_ASSERT(!isErrorPage || webEngineSettings()->testAttribute(WebEngineSettings::ErrorPageEnabled)); + Q_ASSERT((triggersErrorPage && webEngineSettings()->testAttribute(WebEngineSettings::ErrorPageEnabled)) || !triggersErrorPage); // When error page enabled we don't need to send the error page load finished signal if (m_loadProgressMap[url] == 100) @@ -396,7 +398,7 @@ void WebContentsDelegateQt::EmitLoadFinished(bool success, const QUrl &url, bool m_isNavigationCommitted = false; m_viewClient->loadProgressChanged(100); - m_viewClient->loadFinished(success, url, isErrorPage, errorCode, errorDescription); + m_viewClient->loadFinished(success, url, isErrorPage, errorCode, errorDescription, triggersErrorPage); m_viewClient->updateNavigationActions(); } @@ -489,7 +491,11 @@ void WebContentsDelegateQt::DidStopLoading() void WebContentsDelegateQt::didFailLoad(const QUrl &url, int errorCode, const QString &errorDescription) { m_viewClient->iconChanged(QUrl()); - EmitLoadFinished(false /* success */ , url, false /* isErrorPage */, errorCode, errorDescription); + bool errorPageEnabled = webEngineSettings()->testAttribute(WebEngineSettings::ErrorPageEnabled); + // Delay notifying failure until the error-page is done loading. + // Error-pages are not loaded on failures due to abort. + bool aborted = (errorCode == -3 /* ERR_ABORTED*/ ); + EmitLoadFinished(false /* success */ , url, false /* isErrorPage */, errorCode, errorDescription, errorPageEnabled && !aborted); } void WebContentsDelegateQt::DidFailLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url, int error_code) @@ -542,7 +548,9 @@ void WebContentsDelegateQt::DidFinishLoad(content::RenderFrameHost* render_frame content::NavigationEntry *entry = web_contents()->GetController().GetActiveEntry(); int http_statuscode = entry ? entry->GetHttpStatusCode() : 0; - EmitLoadFinished(http_statuscode < 400, toQt(validated_url), false /* isErrorPage */, http_statuscode); + bool errorPageEnabled = webEngineSettings()->testAttribute(WebEngineSettings::ErrorPageEnabled); + bool triggersErrorPage = errorPageEnabled && (http_statuscode >= 400) && m_isDocumentEmpty; + EmitLoadFinished(http_statuscode < 400, toQt(validated_url), false /* isErrorPage */, http_statuscode, QString(), triggersErrorPage); } void WebContentsDelegateQt::DidUpdateFaviconURL(content::RenderFrameHost *render_frame_host, const std::vector &candidates) @@ -856,6 +864,18 @@ bool WebContentsDelegateQt::ShouldNavigateOnBackForwardMouseButtons() #endif } +void WebContentsDelegateQt::ResourceLoadComplete(content::RenderFrameHost* render_frame_host, + const content::GlobalRequestID& request_id, + const blink::mojom::ResourceLoadInfo& resource_load_info) +{ + Q_UNUSED(render_frame_host); + Q_UNUSED(request_id); + + if (resource_load_info.request_destination == network::mojom::RequestDestination::kDocument) { + m_isDocumentEmpty = (resource_load_info.raw_body_bytes == 0); + } +} + FaviconManager *WebContentsDelegateQt::faviconManager() { return m_faviconManager.data(); diff --git a/src/core/web_contents_delegate_qt.h b/src/core/web_contents_delegate_qt.h index cd6d901e4..5a3dff6e9 100644 --- a/src/core/web_contents_delegate_qt.h +++ b/src/core/web_contents_delegate_qt.h @@ -175,6 +175,9 @@ public: void DidFirstVisuallyNonEmptyPaint() override; void ActivateContents(content::WebContents* contents) override; bool ShouldNavigateOnBackForwardMouseButtons() override; + void ResourceLoadComplete(content::RenderFrameHost* render_frame_host, + const content::GlobalRequestID& request_id, + const blink::mojom::ResourceLoadInfo& resource_load_info) override; void didFailLoad(const QUrl &url, int errorCode, const QString &errorDescription); void overrideWebPreferences(content::WebContents *, blink::web_pref::WebPreferences*); @@ -214,7 +217,7 @@ private: const QUrl &url, bool user_gesture); void EmitLoadStarted(const QUrl &url, bool isErrorPage = false); - void EmitLoadFinished(bool success, const QUrl &url, bool isErrorPage = false, int errorCode = 0, const QString &errorDescription = QString()); + void EmitLoadFinished(bool success, const QUrl &url, bool isErrorPage = false, int errorCode = 0, const QString &errorDescription = QString(), bool triggersErrorPage = false); void EmitLoadCommitted(); LoadingState determineLoadingState(content::WebContents *contents); @@ -242,6 +245,7 @@ private: QMap m_loadProgressMap; QUrl m_lastLoadedUrl; bool m_isNavigationCommitted = false; + bool m_isDocumentEmpty = true; base::WeakPtrFactory m_weakPtrFactory { this }; }; diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index db112e7bc..195833fe7 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -495,9 +495,11 @@ Q_STATIC_ASSERT(static_cast(WebEngineError::NoErrorDomain) == static_cast(WebEngineError::CertificateErrorDomain) == static_cast(QQuickWebEngineView::CertificateErrorDomain)); Q_STATIC_ASSERT(static_cast(WebEngineError::DnsErrorDomain) == static_cast(QQuickWebEngineView::DnsErrorDomain)); -void QQuickWebEngineViewPrivate::loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, const QString &errorDescription) +void QQuickWebEngineViewPrivate::loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, + const QString &errorDescription, bool triggersErrorPage) { Q_Q(QQuickWebEngineView); + Q_UNUSED(triggersErrorPage); if (isErrorPage) { #if QT_CONFIG(webengine_testsupport) diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index 68d65410a..ebe55c345 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -116,7 +116,8 @@ public: void loadStarted(const QUrl &provisionalUrl, bool isErrorPage = false) override; void loadCommitted() override; void loadVisuallyCommitted() override; - void loadFinished(bool success, const QUrl &url, bool isErrorPage = false, int errorCode = 0, const QString &errorDescription = QString()) override; + void loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, + const QString &errorDescription, bool triggersErrorPage) override; void focusContainer() override; void unhandledKeyEvent(QKeyEvent *event) override; QSharedPointer diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index f6e4e9f9b..57aa413b9 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -282,7 +282,8 @@ void QWebEnginePagePrivate::loadStarted(const QUrl &provisionalUrl, bool isError QTimer::singleShot(0, q, &QWebEnginePage::loadStarted); } -void QWebEnginePagePrivate::loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, const QString &errorDescription) +void QWebEnginePagePrivate::loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, + const QString &errorDescription, bool triggersErrorPage) { Q_Q(QWebEnginePage); Q_UNUSED(url); @@ -297,9 +298,8 @@ void QWebEnginePagePrivate::loadFinished(bool success, const QUrl &url, bool isE } isLoading = false; - // Delay notifying failure until the error-page is done loading. - // Error-pages are not loaded on failures due to abort. - if (success || errorCode == -3 /* ERR_ABORTED*/ || !settings->testAttribute(QWebEngineSettings::ErrorPageEnabled)) { + Q_ASSERT((success && !triggersErrorPage) || !success); + if (!triggersErrorPage) { QTimer::singleShot(0, q, [q, success](){ emit q->loadFinished(success); }); diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h index 3ddf4b3d6..82ce99503 100644 --- a/src/webenginewidgets/api/qwebenginepage_p.h +++ b/src/webenginewidgets/api/qwebenginepage_p.h @@ -107,7 +107,8 @@ public: void loadStarted(const QUrl &provisionalUrl, bool isErrorPage = false) override; void loadCommitted() override { } void loadVisuallyCommitted() override { } - void loadFinished(bool success, const QUrl &url, bool isErrorPage = false, int errorCode = 0, const QString &errorDescription = QString()) override; + void loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, + const QString &errorDescription, bool triggersErrorPage) override; void focusContainer() override; void unhandledKeyEvent(QKeyEvent *event) override; QSharedPointer diff --git a/tests/auto/widgets/loadsignals/tst_loadsignals.cpp b/tests/auto/widgets/loadsignals/tst_loadsignals.cpp index b4170587d..2dfe341d0 100644 --- a/tests/auto/widgets/loadsignals/tst_loadsignals.cpp +++ b/tests/auto/widgets/loadsignals/tst_loadsignals.cpp @@ -53,6 +53,10 @@ private Q_SLOTS: void loadAfterInPageNavigation_qtbug66869(); void fileDownloadDoesNotTriggerLoadSignals_qtbug66661(); void numberOfStartedAndFinishedSignalsIsSame(); + void loadFinishedAfterNotFoundError_data(); + void loadFinishedAfterNotFoundError(); + void errorPageTriggered_data(); + void errorPageTriggered(); private: QWebEngineProfile profile; @@ -72,6 +76,11 @@ void tst_LoadSignals::initTestCase() void tst_LoadSignals::init() { + // Reset content + loadFinishedSpy.clear(); + view.load(QUrl("about:blank")); + QTRY_COMPARE(loadFinishedSpy.count(), 1); + loadStartedSpy.clear(); loadProgressSpy.clear(); loadFinishedSpy.clear(); @@ -283,5 +292,102 @@ void tst_LoadSignals::numberOfStartedAndFinishedSignalsIsSame() { QVERIFY(loadFinishedSpy[3][0].toBool()); } +void tst_LoadSignals::loadFinishedAfterNotFoundError_data() +{ + QTest::addColumn("rfcInvalid"); + QTest::addColumn("withServer"); + QTest::addRow("rfc_invalid") << true << false; + QTest::addRow("non_existent") << false << false; + QTest::addRow("server_404") << false << true; +} + +void tst_LoadSignals::loadFinishedAfterNotFoundError() +{ + QFETCH(bool, withServer); + QFETCH(bool, rfcInvalid); + + QScopedPointer server; + if (withServer) { + server.reset(new HttpServer); + QVERIFY(server->start()); + } + + view.settings()->setAttribute(QWebEngineSettings::ErrorPageEnabled, false); + auto url = server + ? server->url("/not-found-page.html") + : QUrl(rfcInvalid ? "http://some.invalid" : "http://non.existent/url"); + view.load(url); + QTRY_COMPARE_WITH_TIMEOUT(loadFinishedSpy.count(), 1, 20000); + QVERIFY(!loadFinishedSpy.at(0).at(0).toBool()); + QCOMPARE(toPlainTextSync(view.page()), QString()); + QCOMPARE(loadFinishedSpy.count(), 1); + + view.settings()->setAttribute(QWebEngineSettings::ErrorPageEnabled, true); + url = server + ? server->url("/another-missing-one.html") + : QUrl(rfcInvalid ? "http://some.other.invalid" : "http://another.non.existent/url"); + view.load(url); + QTRY_COMPARE_WITH_TIMEOUT(loadFinishedSpy.count(), 2, 20000); + QVERIFY(!loadFinishedSpy.at(1).at(0).toBool()); + + QEXPECT_FAIL("", "No more loads (like separate load for error pages) are expected", Continue); + QTRY_COMPARE_WITH_TIMEOUT(loadFinishedSpy.count(), 3, 1000); +} + +void tst_LoadSignals::errorPageTriggered_data() +{ + QTest::addColumn("urlPath"); + QTest::addColumn("loadSucceed"); + QTest::addColumn("triggersErrorPage"); + QTest::newRow("/content/200") << QStringLiteral("/content/200") << true << false; + QTest::newRow("/empty/200") << QStringLiteral("/content/200") << true << false; + QTest::newRow("/content/404") << QStringLiteral("/content/404") << false << false; + QTest::newRow("/empty/404") << QStringLiteral("/empty/404") << false << true; +} + +void tst_LoadSignals::errorPageTriggered() +{ + HttpServer server; + connect(&server, &HttpServer::newRequest, [] (HttpReqRep *rr) { + QList parts = rr->requestPath().split('/'); + if (parts.length() != 3) { + // For example, /favicon.ico + rr->sendResponse(404); + return; + } + bool isDocumentEmpty = (parts[1] == "empty"); + int httpStatusCode = parts[2].toInt(); + + rr->setResponseHeader(QByteArrayLiteral("content-type"), QByteArrayLiteral("text/html")); + if (!isDocumentEmpty) { + rr->setResponseBody(QByteArrayLiteral("")); + } + rr->sendResponse(httpStatusCode); + }); + QVERIFY(server.start()); + + QFETCH(QString, urlPath); + QFETCH(bool, loadSucceed); + QFETCH(bool, triggersErrorPage); + + view.settings()->setAttribute(QWebEngineSettings::ErrorPageEnabled, true); + view.load(server.url(urlPath)); + QTRY_COMPARE(loadFinishedSpy.size(), 1); + QCOMPARE(loadFinishedSpy[0][0].toBool(), loadSucceed); + if (triggersErrorPage) + QVERIFY(toPlainTextSync(view.page()).contains("HTTP ERROR 404")); + else + QVERIFY(toPlainTextSync(view.page()).isEmpty()); + loadFinishedSpy.clear(); + + view.settings()->setAttribute(QWebEngineSettings::ErrorPageEnabled, false); + view.load(server.url(urlPath)); + QTRY_COMPARE(loadFinishedSpy.size(), 1); + QCOMPARE(loadFinishedSpy[0][0].toBool(), loadSucceed); + QVERIFY(toPlainTextSync(view.page()).isEmpty()); + loadFinishedSpy.clear(); +} + + QTEST_MAIN(tst_LoadSignals) #include "tst_loadsignals.moc" diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp index 797d4e4e7..7e92ad8cc 100644 --- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp +++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp @@ -174,8 +174,6 @@ private Q_SLOTS: void setUrlUsingStateObject(); void setUrlThenLoads_data(); void setUrlThenLoads(); - void loadFinishedAfterNotFoundError_data(); - void loadFinishedAfterNotFoundError(); void loadInSignalHandlers_data(); void loadInSignalHandlers(); void loadFromQrc(); @@ -2824,51 +2822,6 @@ void tst_QWebEnginePage::setUrlThenLoads() QCOMPARE(baseUrlSync(m_page), extractBaseUrl(urlToLoad2)); } -void tst_QWebEnginePage::loadFinishedAfterNotFoundError_data() -{ - QTest::addColumn("rfcInvalid"); - QTest::addColumn("withServer"); - QTest::addRow("rfc_invalid") << true << false; - QTest::addRow("non_existent") << false << false; - QTest::addRow("server_404") << false << true; -} - -void tst_QWebEnginePage::loadFinishedAfterNotFoundError() -{ - QFETCH(bool, withServer); - QFETCH(bool, rfcInvalid); - - QScopedPointer server; - if (withServer) { - server.reset(new HttpServer); - QVERIFY(server->start()); - } - - QWebEnginePage page; - QSignalSpy spy(&page, SIGNAL(loadFinished(bool))); - - page.settings()->setAttribute(QWebEngineSettings::ErrorPageEnabled, false); - auto url = server - ? server->url("/not-found-page.html") - : QUrl(rfcInvalid ? "http://some.invalid" : "http://non.existent/url"); - page.setUrl(url); - QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 20000); - QVERIFY(!spy.at(0).at(0).toBool()); - QCOMPARE(toPlainTextSync(&page), QString()); - QCOMPARE(spy.count(), 1); - - page.settings()->setAttribute(QWebEngineSettings::ErrorPageEnabled, true); - url = server - ? server->url("/another-missing-one.html") - : QUrl(rfcInvalid ? "http://some.other.invalid" : "http://another.non.existent/url"); - page.setUrl(url); - QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 2, 20000); - QVERIFY(!spy.at(1).at(0).toBool()); - - QEXPECT_FAIL("", "No more loads (like separate load for error pages) are expected", Continue); - QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 3, 1000); -} - class URLSetter : public QObject { Q_OBJECT -- cgit v1.2.1 From e6a8c12e0a94fa12066cf0a91a337bb63f7cadc3 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Thu, 4 Feb 2021 12:01:00 +0100 Subject: Match Chrome behavior closer with extensions Set most of the exceptions chrome does, and register the performance manager earlier where chrome does. Needed for future extensions. Change-Id: I0d16882d87096bedb24abe1341a008d1fdacf6db Reviewed-by: Szabolcs David Reviewed-by: Peter Varga --- src/core/content_browser_client_qt.cpp | 38 ++++++++++++++++++++++++++++++++++ src/core/content_browser_client_qt.h | 5 +++++ src/core/content_client_qt.cpp | 12 ++++++++++- src/core/web_contents_view_qt.cpp | 5 ----- 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp index f41d612b3..ec2d1156a 100644 --- a/src/core/content_browser_client_qt.cpp +++ b/src/core/content_browser_client_qt.cpp @@ -43,6 +43,7 @@ #include "base/task/post_task.h" #include "chrome/browser/custom_handlers/protocol_handler_registry.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" +#include "chrome/browser/tab_contents/form_interaction_tab_helper.h" #include "components/navigation_interception/intercept_navigation_throttle.h" #include "components/navigation_interception/navigation_params.h" #include "components/network_hints/browser/simple_network_hints_handler_impl.h" @@ -1051,6 +1052,16 @@ bool ContentBrowserClientQt::ShouldTreatURLSchemeAsFirstPartyWhenTopLevel(base:: #endif } +bool ContentBrowserClientQt::DoesSchemeAllowCrossOriginSharedWorker(const std::string &scheme) +{ +#if BUILDFLAG(ENABLE_EXTENSIONS) + // Extensions are allowed to start cross-origin shared workers. + return scheme == extensions::kExtensionScheme; +#else + return false; +#endif +} + void ContentBrowserClientQt::OverrideURLLoaderFactoryParams(content::BrowserContext *browser_context, const url::Origin &origin, bool is_for_isolated_world, @@ -1148,6 +1159,24 @@ void ContentBrowserClientQt::RegisterNonNetworkWorkerMainResourceURLLoaderFactor for (const QByteArray &scheme : profileAdapter->customUrlSchemes()) factories->emplace(scheme.toStdString(), CreateCustomURLLoaderFactory(profileAdapter)); + +#if BUILDFLAG(ENABLE_EXTENSIONS) + factories->emplace( + extensions::kExtensionScheme, + extensions::CreateExtensionWorkerMainResourceURLLoaderFactory(browser_context)); +#endif // BUILDFLAG(ENABLE_EXTENSIONS) +} + +void ContentBrowserClientQt::RegisterNonNetworkServiceWorkerUpdateURLLoaderFactories(content::BrowserContext* browser_context, + NonNetworkURLLoaderFactoryMap* factories) +{ + DCHECK(browser_context); + DCHECK(factories); +#if BUILDFLAG(ENABLE_EXTENSIONS) + factories->emplace( + extensions::kExtensionScheme, + extensions::CreateExtensionServiceWorkerScriptURLLoaderFactory(browser_context)); +#endif // BUILDFLAG(ENABLE_EXTENSIONS) } void ContentBrowserClientQt::RegisterNonNetworkSubresourceURLLoaderFactories(int render_process_id, int render_frame_id, @@ -1301,4 +1330,13 @@ void ContentBrowserClientQt::SiteInstanceDeleting(content::SiteInstance *site_in #endif } +content::WebContentsViewDelegate *ContentBrowserClientQt::GetWebContentsViewDelegate(content::WebContents *web_contents) +{ + FormInteractionTabHelper::CreateForWebContents(web_contents); + if (auto *registry = performance_manager::PerformanceManagerRegistry::GetInstance()) + registry->MaybeCreatePageNodeForWebContents(web_contents); + + return nullptr; +} + } // namespace QtWebEngineCore diff --git a/src/core/content_browser_client_qt.h b/src/core/content_browser_client_qt.h index ffbfed430..eb1bb5fd0 100644 --- a/src/core/content_browser_client_qt.h +++ b/src/core/content_browser_client_qt.h @@ -177,6 +177,7 @@ public: bool ShouldUseSpareRenderProcessHost(content::BrowserContext *browser_context, const GURL& site_url) override; bool ShouldTreatURLSchemeAsFirstPartyWhenTopLevel(base::StringPiece scheme, bool is_embedded_origin_secure) override; + bool DoesSchemeAllowCrossOriginSharedWorker(const std::string &scheme) override; void OverrideURLLoaderFactoryParams(content::BrowserContext *browser_context, const url::Origin &origin, bool is_for_isolated_world, @@ -250,9 +251,13 @@ public: NonNetworkURLLoaderFactoryMap *factories) override; void RegisterNonNetworkWorkerMainResourceURLLoaderFactories(content::BrowserContext* browser_context, NonNetworkURLLoaderFactoryMap* factories) override; + void RegisterNonNetworkServiceWorkerUpdateURLLoaderFactories(content::BrowserContext* browser_context, + NonNetworkURLLoaderFactoryMap* factories) override; void SiteInstanceGotProcess(content::SiteInstance *site_instance) override; void SiteInstanceDeleting(content::SiteInstance *site_instance) override; + content::WebContentsViewDelegate* GetWebContentsViewDelegate(content::WebContents* web_contents) override; + static std::string getUserAgent(); std::string GetUserAgent() override { return getUserAgent(); } diff --git a/src/core/content_client_qt.cpp b/src/core/content_client_qt.cpp index d74e7eb76..83c367de0 100644 --- a/src/core/content_client_qt.cpp +++ b/src/core/content_client_qt.cpp @@ -48,6 +48,8 @@ #include "base/version.h" #include "content/public/common/cdm_info.h" #include "content/public/common/content_constants.h" +#include "extensions/buildflags/buildflags.h" +#include "extensions/common/constants.h" #include "media/base/media_switches.h" #include "media/base/video_codecs.h" #include "media/media_buildflags.h" @@ -445,7 +447,15 @@ void ContentClientQt::AddContentDecryptionModules(std::vector void ContentClientQt::AddAdditionalSchemes(Schemes* schemes) { - schemes->standard_schemes.push_back("chrome-extension"); + // Matching ChromeContentClient::AddAdditionalSchemes + schemes->standard_schemes.push_back(extensions::kExtensionScheme); + schemes->secure_schemes.push_back(extensions::kExtensionScheme); + +#if BUILDFLAG(ENABLE_EXTENSIONS) + schemes->service_worker_schemes.push_back(extensions::kExtensionScheme); + schemes->cors_enabled_schemes.push_back(extensions::kExtensionScheme); + schemes->csp_bypassing_schemes.push_back(extensions::kExtensionScheme); +#endif } base::StringPiece ContentClientQt::GetDataResource(int resource_id, ui::ScaleFactor scale_factor) diff --git a/src/core/web_contents_view_qt.cpp b/src/core/web_contents_view_qt.cpp index 1db641205..6c5e76742 100644 --- a/src/core/web_contents_view_qt.cpp +++ b/src/core/web_contents_view_qt.cpp @@ -51,8 +51,6 @@ #include "web_engine_context.h" #include "web_contents_delegate_qt.h" -#include "chrome/browser/tab_contents/form_interaction_tab_helper.h" -#include "components/performance_manager/embedder/performance_manager_registry.h" #include "components/spellcheck/spellcheck_buildflags.h" #include "content/browser/renderer_host/render_view_host_impl.h" #include "content/browser/renderer_host/render_widget_host_impl.h" @@ -72,9 +70,6 @@ WebContentsViewQt::WebContentsViewQt(content::WebContents *webContents) , m_client(nullptr) , m_factoryClient(nullptr) { - FormInteractionTabHelper::CreateForWebContents(webContents); - if (auto *performance_manager_registry = performance_manager::PerformanceManagerRegistry::GetInstance()) - performance_manager_registry->CreatePageNodeForWebContents(webContents); } void WebContentsViewQt::setFactoryClient(WebContentsAdapterClient* client) -- cgit v1.2.1 From 8ef886d4994536314c31af5edfe85b98404a7451 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 5 Feb 2021 10:44:56 +0100 Subject: Update Chromium Submodule src/3rdparty f9845463..19c6bab8: > [Backport] Security bug 1097499 > [Backport] CVE-2021-21128: Heap buffer overflow in Blink > [Backport] CVE-2021-21127: Insufficient policy enforcement in extensions > [Backport] CVE-2021-21126: Insufficient policy enforcement in extensions > [Backport] CVE-2020-16044: Use after free in WebRTC [3/3] > [Backport] CVE-2020-16044: Use after free in WebRTC [2/3] > [Backport] CVE-2020-16044: Use after free in WebRTC [1/3] > [Backport] CVE-2021-21121: Use after free in Omnibox > [Backport] CVE-2021-21120: Use after free in WebSQL > [Backport] CVE-2021-21119: Use after free in Media > FIXUP: Fix build with msvc2019 16.8.0 > FIXUP: Make GpuSwitchingManager::RemoveObserver() thread safe Change-Id: Ib77701fa61c9e05d1c29485edb12da5c016982ad Reviewed-by: Kirill Burtsev --- src/3rdparty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/3rdparty b/src/3rdparty index f98454637..19c6bab86 160000 --- a/src/3rdparty +++ b/src/3rdparty @@ -1 +1 @@ -Subproject commit f9845463789f5dc3e8e3858280f23700bcb5ed5b +Subproject commit 19c6bab869563fc97a5047eeea6eed7992458af8 -- cgit v1.2.1 From 97e210ef3fe4869041448780a6ca097163414494 Mon Sep 17 00:00:00 2001 From: Kirill Burtsev Date: Fri, 5 Feb 2021 14:34:04 +0100 Subject: Fix devtools page resource loading as raw data instead of html string Change-Id: Id4790b38b5a8dafeba18dac3142f6e0693330652 Reviewed-by: Allan Sandfeld Jensen --- src/core/devtools_manager_delegate_qt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/devtools_manager_delegate_qt.cpp b/src/core/devtools_manager_delegate_qt.cpp index 8c4037879..51f00d3e5 100644 --- a/src/core/devtools_manager_delegate_qt.cpp +++ b/src/core/devtools_manager_delegate_qt.cpp @@ -181,7 +181,7 @@ void DevToolsManagerDelegateQt::Initialized(const net::IPEndPoint *ip_address) std::string DevToolsManagerDelegateQt::GetDiscoveryPageHTML() { - return ui::ResourceBundle::GetSharedInstance().GetRawDataResource(IDR_DEVTOOLS_DISCOVERY_PAGE_HTML).as_string(); + return ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(IDR_DEVTOOLS_DISCOVERY_PAGE_HTML); } bool DevToolsManagerDelegateQt::HasBundledFrontendResources() -- cgit v1.2.1 From a4fce092cbd877560dd75b38a2e495aaa75f60f3 Mon Sep 17 00:00:00 2001 From: Kirill Burtsev Date: Tue, 2 Feb 2021 21:40:33 +0100 Subject: Remove frame metadata observer (RenderWidgetHostViewQt) on destroy Change-Id: I9eac9537b60ba35a53e85c6437bb67b59bf0e35d Reviewed-by: Peter Varga --- src/core/render_widget_host_view_qt.cpp | 2 ++ .../auto/widgets/qwebengineview/resources/dummy.html | 6 ++++++ .../widgets/qwebengineview/tst_qwebengineview.cpp | 20 ++++++++++++++++++++ .../widgets/qwebengineview/tst_qwebengineview.qrc | 1 + 4 files changed, 29 insertions(+) create mode 100644 tests/auto/widgets/qwebengineview/resources/dummy.html diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index 877f3c630..4dd999115 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -381,6 +381,8 @@ RenderWidgetHostViewQt::~RenderWidgetHostViewQt() m_touchSelectionController.reset(); m_touchSelectionControllerClient.reset(); + + host()->render_frame_metadata_provider()->RemoveObserver(this); } void RenderWidgetHostViewQt::setDelegate(RenderWidgetHostViewQtDelegate* delegate) diff --git a/tests/auto/widgets/qwebengineview/resources/dummy.html b/tests/auto/widgets/qwebengineview/resources/dummy.html new file mode 100644 index 000000000..9075f27c3 --- /dev/null +++ b/tests/auto/widgets/qwebengineview/resources/dummy.html @@ -0,0 +1,6 @@ + +Dummy simple page without real content + + +This is test content + diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp index 2588852ce..ed62d3638 100644 --- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp +++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp @@ -168,6 +168,7 @@ private Q_SLOTS: void setPagePreservesExplicitPage(); void setViewPreservesExplicitPage(); void closeDiscardsPage(); + void loadAfterRendererCrashed(); }; // This will be called before the first test function is executed. @@ -3387,5 +3388,24 @@ void tst_QWebEngineView::closeDiscardsPage() QCOMPARE(page.lifecycleState(), QWebEnginePage::LifecycleState::Discarded); } + +void tst_QWebEngineView::loadAfterRendererCrashed() +{ + QWebEngineView view; + view.resize(640, 480); + view.show(); + QVERIFY(QTest::qWaitForWindowExposed(&view)); + + bool terminated = false; + connect(view.page(), &QWebEnginePage::renderProcessTerminated, [&] () { terminated = true; }); + view.load(QUrl("chrome://crash")); + QTRY_VERIFY_WITH_TIMEOUT(terminated, 30000); + + QSignalSpy loadSpy(&view, &QWebEngineView::loadFinished); + view.load(QUrl("qrc:///resources/dummy.html")); + QTRY_COMPARE(loadSpy.count(), 1); + QVERIFY(loadSpy.first().first().toBool()); +} + QTEST_MAIN(tst_QWebEngineView) #include "tst_qwebengineview.moc" diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.qrc b/tests/auto/widgets/qwebengineview/tst_qwebengineview.qrc index a09be0399..a0e81e242 100644 --- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.qrc +++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.qrc @@ -6,5 +6,6 @@ resources/scrolltest_page.html resources/keyboardEvents.html resources/image2.png + resources/dummy.html -- cgit v1.2.1 From 0185f4114579c818fd50374ff1e7d8c054c01e24 Mon Sep 17 00:00:00 2001 From: Kirill Burtsev Date: Tue, 3 Nov 2020 19:36:18 +0100 Subject: Resolve installed interceptors right before interception point Ammends a05bb73747. Since request processing is asynchronous, resolve interceptors right before actual interception point to accommodate cases where interceptor on profile or page was replaced or uninstalled before all instantiated InterceptedRequest's are processed. Effectively, this doesn't send url requests to uninstalled interceptors. Fixes: QTBUG-86286 Change-Id: Iaf55e5ef99d62b55f7304ee68a0c89a1469fd86f Reviewed-by: Allan Sandfeld Jensen --- src/core/content_browser_client_qt.cpp | 34 +--- src/core/net/proxying_url_loader_factory_qt.cpp | 202 ++++++++++++--------- src/core/net/proxying_url_loader_factory_qt.h | 10 +- .../tst_qwebengineurlrequestinterceptor.cpp | 127 +++++++++++++ .../qwebengineprofile/tst_qwebengineprofile.cpp | 6 +- 5 files changed, 261 insertions(+), 118 deletions(-) diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp index ec2d1156a..5a30a4388 100644 --- a/src/core/content_browser_client_qt.cpp +++ b/src/core/content_browser_client_qt.cpp @@ -1270,32 +1270,14 @@ bool ContentBrowserClientQt::WillCreateURLLoaderFactory( bool *disable_secure_dns, network::mojom::URLLoaderFactoryOverridePtr *factory_override) { - auto *web_contents = content::WebContents::FromRenderFrameHost(frame); - ProfileQt *profile = static_cast(browser_context); - - QWebEngineUrlRequestInterceptor *profile_interceptor = profile->profileAdapter()->requestInterceptor(); - QWebEngineUrlRequestInterceptor *page_interceptor = nullptr; - - if (web_contents) { - WebContentsAdapterClient *client = - WebContentsViewQt::from(static_cast(web_contents)->GetView())->client(); - if (!client) - return false; - - page_interceptor = client->webContentsAdapter()->requestInterceptor(); - } - - if (profile_interceptor || page_interceptor) { - int process_id = type == URLLoaderFactoryType::kNavigation ? 0 : render_process_id; - auto proxied_receiver = std::move(*factory_receiver); - mojo::PendingRemote pending_url_loader_factory; - *factory_receiver = pending_url_loader_factory.InitWithNewPipeAndPassReceiver(); - // Will manage its own lifetime - new ProxyingURLLoaderFactoryQt(process_id, profile_interceptor, page_interceptor, std::move(proxied_receiver), - std::move(pending_url_loader_factory)); - return true; - } - return false; + auto adapter = static_cast(browser_context)->profileAdapter(); + int process_id = type == URLLoaderFactoryType::kNavigation ? 0 : render_process_id; + auto proxied_receiver = std::move(*factory_receiver); + mojo::PendingRemote pending_url_loader_factory; + *factory_receiver = pending_url_loader_factory.InitWithNewPipeAndPassReceiver(); + // Will manage its own lifetime + new ProxyingURLLoaderFactoryQt(adapter, process_id, std::move(proxied_receiver), std::move(pending_url_loader_factory)); + return true; } void ContentBrowserClientQt::SiteInstanceGotProcess(content::SiteInstance *site_instance) diff --git a/src/core/net/proxying_url_loader_factory_qt.cpp b/src/core/net/proxying_url_loader_factory_qt.cpp index 6488310c4..c541c17b6 100644 --- a/src/core/net/proxying_url_loader_factory_qt.cpp +++ b/src/core/net/proxying_url_loader_factory_qt.cpp @@ -43,6 +43,7 @@ #include "base/bind.h" #include "base/task/post_task.h" +#include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents.h" @@ -51,7 +52,9 @@ #include "api/qwebengineurlrequestinfo_p.h" #include "type_conversion.h" +#include "web_contents_adapter.h" #include "web_contents_adapter_client.h" +#include "web_contents_view_qt.h" #include @@ -104,11 +107,10 @@ class InterceptedRequest : public network::mojom::URLLoader , public network::mojom::URLLoaderClient { public: - InterceptedRequest(int process_id, uint64_t request_id, int32_t routing_id, uint32_t options, + InterceptedRequest(ProfileAdapter *profile_adapter, + int process_id, uint64_t request_id, int32_t routing_id, uint32_t options, const network::ResourceRequest &request, const net::MutableNetworkTrafficAnnotationTag &traffic_annotation, - QWebEngineUrlRequestInterceptor *profile_request_interceptor, - QWebEngineUrlRequestInterceptor *page_request_interceptor, mojo::PendingReceiver loader, mojo::PendingRemote client, mojo::PendingRemote target_factory); @@ -134,9 +136,8 @@ public: void PauseReadingBodyFromNet() override; void ResumeReadingBodyFromNet() override; -private: - void InterceptOnUIThread(); - void InterceptOnIOThread(base::WaitableEvent *event); + void InterceptOnUIThread(QWebEngineUrlRequestInterceptor *profileInterceptor); + void InterceptOnIOThread(base::WaitableEvent *event, QWebEngineUrlRequestInterceptor *profileInterceptor); void ContinueAfterIntercept(); // This is called when the original URLLoaderClient has a connection error. @@ -152,12 +153,15 @@ private: void SendErrorAndCompleteImmediately(int error_code); + content::WebContents* webContents(); + QWebEngineUrlRequestInterceptor* getProfileInterceptor(); + QWebEngineUrlRequestInterceptor* getPageInterceptor(); + + QPointer profile_adapter_; const int process_id_; const uint64_t request_id_; const int32_t routing_id_; const uint32_t options_; - bool input_stream_previously_failed_ = false; - bool request_was_redirected_ = false; // If the |target_loader_| called OnComplete with an error this stores it. // That way the destructor can send it to OnReceivedError if safe browsing @@ -168,9 +172,9 @@ private: const net::MutableNetworkTrafficAnnotationTag traffic_annotation_; - QWebEngineUrlRequestInfo request_info_; - QPointer profile_request_interceptor_; - QPointer page_request_interceptor_; + static inline void cleanup(QWebEngineUrlRequestInfo *info) { delete info; } + QScopedPointer request_info_; + mojo::Receiver proxied_loader_receiver_; mojo::Remote target_client_; mojo::Receiver proxied_client_receiver_{this}; @@ -181,22 +185,20 @@ private: DISALLOW_COPY_AND_ASSIGN(InterceptedRequest); }; -InterceptedRequest::InterceptedRequest(int process_id, uint64_t request_id, int32_t routing_id, uint32_t options, +InterceptedRequest::InterceptedRequest(ProfileAdapter *profile_adapter, + int process_id, uint64_t request_id, int32_t routing_id, uint32_t options, const network::ResourceRequest &request, const net::MutableNetworkTrafficAnnotationTag &traffic_annotation, - QWebEngineUrlRequestInterceptor *profile_request_interceptor, - QWebEngineUrlRequestInterceptor *page_request_interceptor, mojo::PendingReceiver loader_receiver, mojo::PendingRemote client, mojo::PendingRemote target_factory) - : process_id_(process_id) + : profile_adapter_(profile_adapter) + , process_id_(process_id) , request_id_(request_id) , routing_id_(routing_id) , options_(options) , request_(request) , traffic_annotation_(traffic_annotation) - , profile_request_interceptor_(profile_request_interceptor) - , page_request_interceptor_(page_request_interceptor) , proxied_loader_receiver_(this, std::move(loader_receiver)) , target_client_(std::move(client)) , target_factory_(std::move(target_factory)) @@ -215,109 +217,144 @@ InterceptedRequest::~InterceptedRequest() weak_factory_.InvalidateWeakPtrs(); } +content::WebContents* InterceptedRequest::webContents() +{ + if (process_id_) { + content::RenderFrameHost *frameHost = content::RenderFrameHost::FromID(process_id_, request_.render_frame_id); + return content::WebContents::FromRenderFrameHost(frameHost); + } + + return content::WebContents::FromFrameTreeNodeId(request_.render_frame_id); +} + +QWebEngineUrlRequestInterceptor* InterceptedRequest::getProfileInterceptor() +{ + return profile_adapter_ ? profile_adapter_->requestInterceptor() : nullptr; +} + +QWebEngineUrlRequestInterceptor* InterceptedRequest::getPageInterceptor() +{ + if (auto wc = webContents()) { + auto view = static_cast(wc)->GetView(); + WebContentsAdapterClient *client = WebContentsViewQt::from(view)->client(); + return client->webContentsAdapter()->requestInterceptor(); + } + return nullptr; +} + void InterceptedRequest::Restart() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - blink::mojom::ResourceType resourceType = blink::mojom::ResourceType(request_.resource_type); - WebContentsAdapterClient::NavigationType navigationType = - pageTransitionToNavigationType(ui::PageTransition(request_.transition_type)); + // MEMO since all codepatch leading to Restart scheduled and executed as asynchronous tasks in main thread, + // interceptors may change in meantime and also during intercept call, so they should be resolved anew. + // Set here only profile's interceptor since it runs first without going to user code. + auto profileInterceptor = getProfileInterceptor(); + if (!profileInterceptor && !getPageInterceptor()) { + ContinueAfterIntercept(); + return; + } + + auto resourceType = toQt(blink::mojom::ResourceType(request_.resource_type)); + auto navigationType = toQt(pageTransitionToNavigationType(ui::PageTransition(request_.transition_type))); const QUrl originalUrl = toQt(request_.url); const QUrl initiator = request_.request_initiator.has_value() ? toQt(request_.request_initiator->GetURL()) : QUrl(); - content::WebContents *webContents = nullptr; - if (process_id_) { - content::RenderFrameHost *frameHost = content::RenderFrameHost::FromID(process_id_, request_.render_frame_id); - webContents = content::WebContents::FromRenderFrameHost(frameHost); - } else { - webContents = content::WebContents::FromFrameTreeNodeId(request_.render_frame_id); - } - - GURL top_document_url = webContents ? webContents->GetVisibleURL() : GURL(); + auto wc = webContents(); + GURL top_document_url = wc ? wc->GetVisibleURL() : GURL(); QUrl firstPartyUrl; if (!top_document_url.is_empty()) firstPartyUrl = toQt(top_document_url); else firstPartyUrl = toQt(request_.site_for_cookies.RepresentativeUrl()); // m_topDocumentUrl can be empty for the main-frame. - QWebEngineUrlRequestInfoPrivate *infoPrivate = - new QWebEngineUrlRequestInfoPrivate(toQt(resourceType), toQt(navigationType), originalUrl, firstPartyUrl, - initiator, QByteArray::fromStdString(request_.method)); - request_info_ = QWebEngineUrlRequestInfo(infoPrivate); + auto info = new QWebEngineUrlRequestInfoPrivate(resourceType, navigationType, originalUrl, firstPartyUrl, + initiator, QByteArray::fromStdString(request_.method)); + Q_ASSERT(!request_info_); + request_info_.reset(new QWebEngineUrlRequestInfo(info)); // TODO: remove for Qt6 - if (profile_request_interceptor_ && profile_request_interceptor_->property("deprecated").toBool()) { + bool isDeprecatedProfileInterceptor = profileInterceptor == nullptr; + if (profileInterceptor && profileInterceptor->property("deprecated").toBool()) { + isDeprecatedProfileInterceptor = true; // sync call supports depracated call of an interceptor on io thread base::WaitableEvent event; base::PostTask(FROM_HERE, { content::BrowserThread::IO }, - base::BindOnce(&InterceptedRequest::InterceptOnIOThread, base::Unretained(this), &event)); + base::BindOnce(&InterceptedRequest::InterceptOnIOThread, + base::Unretained(this), &event, profileInterceptor)); event.Wait(); - if (request_info_.changed()) { + if (request_info_->changed()) { ContinueAfterIntercept(); return; } } - InterceptOnUIThread(); + InterceptOnUIThread(isDeprecatedProfileInterceptor ? nullptr : profileInterceptor); ContinueAfterIntercept(); } -void InterceptedRequest::InterceptOnIOThread(base::WaitableEvent *event) +void InterceptedRequest::InterceptOnIOThread(base::WaitableEvent *event, QWebEngineUrlRequestInterceptor *interceptor) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - if (profile_request_interceptor_) - profile_request_interceptor_->interceptRequest(request_info_); + interceptor->interceptRequest(*request_info_); event->Signal(); } -void InterceptedRequest::InterceptOnUIThread() +void InterceptedRequest::InterceptOnUIThread(QWebEngineUrlRequestInterceptor *profileInterceptor) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (profile_request_interceptor_ && !profile_request_interceptor_->property("deprecated").toBool()) - profile_request_interceptor_->interceptRequest(request_info_); + if (profileInterceptor) + profileInterceptor->interceptRequest(*request_info_); - if (!request_info_.changed() && page_request_interceptor_) - page_request_interceptor_->interceptRequest(request_info_); + if (!request_info_->changed()) { + if (auto interceptor = getPageInterceptor()) + interceptor->interceptRequest(*request_info_); + } } void InterceptedRequest::ContinueAfterIntercept() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (request_info_.changed()) { - QWebEngineUrlRequestInfoPrivate &info = *request_info_.d_ptr; - if (info.shouldBlockRequest) - return SendErrorAndCompleteImmediately(net::ERR_BLOCKED_BY_CLIENT); - - for (auto header = info.extraHeaders.constBegin(); header != info.extraHeaders.constEnd(); ++header) { - std::string h = header.key().toStdString(); - if (base::LowerCaseEqualsASCII(h, "referer")) { - request_.referrer = GURL(header.value().toStdString()); - } else { - request_.headers.SetHeader(h, header.value().toStdString()); + if (request_info_) { + // cleanup in scope because of delete this and it's not needed else where after + decltype(request_info_) scoped_request_info(request_info_.take()); + QWebEngineUrlRequestInfoPrivate &info = *scoped_request_info->d_ptr; + + if (info.changed) { + if (info.shouldBlockRequest) + return SendErrorAndCompleteImmediately(net::ERR_BLOCKED_BY_CLIENT); + + for (auto header = info.extraHeaders.constBegin(); header != info.extraHeaders.constEnd(); ++header) { + std::string h = header.key().toStdString(); + if (base::LowerCaseEqualsASCII(h, "referer")) { + request_.referrer = GURL(header.value().toStdString()); + } else { + request_.headers.SetHeader(h, header.value().toStdString()); + } } - } - if (info.shouldRedirectRequest) { - net::RedirectInfo::FirstPartyURLPolicy first_party_url_policy = - request_.update_first_party_url_on_redirect ? net::RedirectInfo::FirstPartyURLPolicy::UPDATE_URL_ON_REDIRECT - : net::RedirectInfo::FirstPartyURLPolicy::NEVER_CHANGE_URL; - net::RedirectInfo redirectInfo = net::RedirectInfo::ComputeRedirectInfo( - request_.method, request_.url, request_.site_for_cookies, - first_party_url_policy, request_.referrer_policy, request_.referrer.spec(), - net::HTTP_TEMPORARY_REDIRECT, toGurl(request_info_.requestUrl()), base::nullopt, - false /*insecure_scheme_was_upgraded*/); - - // FIXME: Should probably create a new header. - current_response_->encoded_data_length = 0; - request_.method = redirectInfo.new_method; - request_.url = redirectInfo.new_url; - request_.site_for_cookies = redirectInfo.new_site_for_cookies; - request_.referrer = GURL(redirectInfo.new_referrer); - request_.referrer_policy = redirectInfo.new_referrer_policy; - if (request_.method == net::HttpRequestHeaders::kGetMethod) - request_.request_body = nullptr; - target_client_->OnReceiveRedirect(redirectInfo, std::move(current_response_)); - return; + if (info.shouldRedirectRequest) { + net::RedirectInfo::FirstPartyURLPolicy first_party_url_policy = + request_.update_first_party_url_on_redirect ? net::RedirectInfo::FirstPartyURLPolicy::UPDATE_URL_ON_REDIRECT + : net::RedirectInfo::FirstPartyURLPolicy::NEVER_CHANGE_URL; + net::RedirectInfo redirectInfo = net::RedirectInfo::ComputeRedirectInfo( + request_.method, request_.url, request_.site_for_cookies, + first_party_url_policy, request_.referrer_policy, request_.referrer.spec(), + net::HTTP_TEMPORARY_REDIRECT, toGurl(info.url), base::nullopt, + false /*insecure_scheme_was_upgraded*/); + + // FIXME: Should probably create a new header. + current_response_->encoded_data_length = 0; + request_.method = redirectInfo.new_method; + request_.url = redirectInfo.new_url; + request_.site_for_cookies = redirectInfo.new_site_for_cookies; + request_.referrer = GURL(redirectInfo.new_referrer); + request_.referrer_policy = redirectInfo.new_referrer_policy; + if (request_.method == net::HttpRequestHeaders::kGetMethod) + request_.request_body = nullptr; + target_client_->OnReceiveRedirect(redirectInfo, std::move(current_response_)); + return; + } } } @@ -340,7 +377,6 @@ void InterceptedRequest::OnReceiveResponse(network::mojom::URLResponseHeadPtr he void InterceptedRequest::OnReceiveRedirect(const net::RedirectInfo &redirect_info, network::mojom::URLResponseHeadPtr head) { // TODO(timvolodine): handle redirect override. - request_was_redirected_ = true; current_response_ = head.Clone(); target_client_->OnReceiveRedirect(redirect_info, std::move(head)); request_.url = redirect_info.new_url; @@ -470,10 +506,10 @@ void InterceptedRequest::SendErrorAndCompleteImmediately(int error_code) delete this; } -ProxyingURLLoaderFactoryQt::ProxyingURLLoaderFactoryQt(int process_id, QWebEngineUrlRequestInterceptor *profile, QWebEngineUrlRequestInterceptor *page, +ProxyingURLLoaderFactoryQt::ProxyingURLLoaderFactoryQt(ProfileAdapter *adapter, int process_id, mojo::PendingReceiver loader_receiver, mojo::PendingRemote target_factory_info) - : m_processId(process_id), m_profileRequestInterceptor(profile), m_pageRequestInterceptor(page), m_weakFactory(this) + : m_profileAdapter(adapter), m_processId(process_id), m_weakFactory(this) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (target_factory_info) { @@ -502,8 +538,8 @@ void ProxyingURLLoaderFactoryQt::CreateLoaderAndStart(mojo::PendingReceiverClone(target_factory_clone.InitWithNewPipeAndPassReceiver()); // Will manage its own lifetime - InterceptedRequest *req = new InterceptedRequest(m_processId, request_id, routing_id, options, request, traffic_annotation, - m_profileRequestInterceptor, m_pageRequestInterceptor, std::move(loader), + InterceptedRequest *req = new InterceptedRequest(m_profileAdapter, m_processId, request_id, routing_id, options, + request, traffic_annotation, std::move(loader), std::move(url_loader_client), std::move(target_factory_clone)); req->Restart(); } diff --git a/src/core/net/proxying_url_loader_factory_qt.h b/src/core/net/proxying_url_loader_factory_qt.h index 50caa69e9..5345e3220 100644 --- a/src/core/net/proxying_url_loader_factory_qt.h +++ b/src/core/net/proxying_url_loader_factory_qt.h @@ -55,15 +55,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -QT_FORWARD_DECLARE_CLASS(QWebEngineUrlRequestInterceptor) - namespace QtWebEngineCore { +class ProfileAdapter; + class ProxyingURLLoaderFactoryQt : public network::mojom::URLLoaderFactory { public: - ProxyingURLLoaderFactoryQt(int processId, QWebEngineUrlRequestInterceptor *profile, - QWebEngineUrlRequestInterceptor *page, + ProxyingURLLoaderFactoryQt(ProfileAdapter *adapter, int processId, mojo::PendingReceiver loader_receiver, mojo::PendingRemote pending_target_factory_remote); @@ -81,11 +80,10 @@ private: void OnTargetFactoryError(); void OnProxyBindingError(); + QPointer m_profileAdapter; int m_processId; mojo::ReceiverSet m_proxyReceivers; mojo::Remote m_targetFactory; - QPointer m_profileRequestInterceptor; - QPointer m_pageRequestInterceptor; base::WeakPtrFactory m_weakFactory; DISALLOW_COPY_AND_ASSIGN(ProxyingURLLoaderFactoryQt); diff --git a/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp b/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp index bf4acec14..4750c8d0e 100644 --- a/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp +++ b/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp @@ -76,6 +76,9 @@ private Q_SLOTS: void initiator(); void jsServiceWorker_data(); void jsServiceWorker(); + void replaceInterceptor_data(); + void replaceInterceptor(); + void replaceOnIntercept(); }; tst_QWebEngineUrlRequestInterceptor::tst_QWebEngineUrlRequestInterceptor() @@ -128,6 +131,7 @@ public: QUrl redirectUrl; QMap> requestInitiatorUrls; QMap headers; + std::function onIntercept; void interceptRequest(QWebEngineUrlRequestInfo &info) override { @@ -139,6 +143,9 @@ public: if (info.requestUrl().scheme() == QLatin1String("blob")) return; + if (onIntercept && !onIntercept(info)) + return; + bool block = info.requestMethod() != QByteArrayLiteral("GET"); bool redirect = shouldRedirect && info.requestUrl() != redirectUrl; @@ -800,5 +807,125 @@ void tst_QWebEngineUrlRequestInterceptor::jsServiceWorker() QVERIFY(server.stop()); } +void tst_QWebEngineUrlRequestInterceptor::replaceInterceptor_data() +{ + QTest::addColumn("firstInterceptIsInPage"); + QTest::addColumn("keepInterceptionPoint"); + QTest::newRow("page") << true << true; + QTest::newRow("page-profile") << true << false; + QTest::newRow("profile") << false << true; + QTest::newRow("profile-page") << false << false; +} + +void tst_QWebEngineUrlRequestInterceptor::replaceInterceptor() +{ + QFETCH(bool, firstInterceptIsInPage); + QFETCH(bool, keepInterceptionPoint); + + HttpServer server; + server.setResourceDirs({ ":/resources" }); + QVERIFY(server.start()); + + QWebEngineProfile profile; + profile.settings()->setAttribute(QWebEngineSettings::ErrorPageEnabled, false); + QWebEnginePage page(&profile); + QSignalSpy spy(&page, SIGNAL(loadFinished(bool))); + bool fetchFinished = false; + + auto setInterceptor = [&] (QWebEngineUrlRequestInterceptor *interceptor, bool interceptInPage) { + interceptInPage ? page.setUrlRequestInterceptor(interceptor) : profile.setUrlRequestInterceptor(interceptor); + }; + + std::vector interceptors(3); + std::vector requestsOnReplace; + setInterceptor(&interceptors.front(), firstInterceptIsInPage); + + auto sc = connect(&page, &QWebEnginePage::loadFinished, [&] () { + auto currentInterceptorIndex = requestsOnReplace.size(); + requestsOnReplace.push_back(interceptors[currentInterceptorIndex].requestInfos.size()); + + bool isFirstReinstall = currentInterceptorIndex == 0; + bool interceptInPage = keepInterceptionPoint ? firstInterceptIsInPage : (isFirstReinstall ^ firstInterceptIsInPage); + setInterceptor(&interceptors[++currentInterceptorIndex], interceptInPage); + if (!keepInterceptionPoint) + setInterceptor(nullptr, !interceptInPage); + + if (isFirstReinstall) { + page.triggerAction(QWebEnginePage::Reload); + } else { + page.runJavaScript("fetch('http://nonexistent.invalid').catch(() => {})", [&, interceptInPage] (const QVariant &) { + requestsOnReplace.push_back(interceptors.back().requestInfos.size()); + setInterceptor(nullptr, interceptInPage); + fetchFinished = true; + }); + } + }); + + page.setUrl(server.url("/favicon.html")); + QTRY_COMPARE(spy.count(), 2); + QTRY_VERIFY(fetchFinished); + + QString s; QDebug d(&s); + for (auto i = 0u; i < interceptors.size(); ++i) { + auto &&interceptor = interceptors[i]; + auto &&requests = interceptor.requestInfos; + d << "\nInterceptor [" << i << "] with" << requestsOnReplace[i] << "requests on replace and" << requests.size() << "in the end:"; + for (int j = 0; j < requests.size(); ++j) { + auto &&r = requests[j]; + d << "\n\t" << j << "| url:" << r.requestUrl << "firstPartyUrl:" << r.firstPartyUrl; + } + QVERIFY2(!requests.isEmpty(), qPrintable(s)); + QVERIFY2(requests.size() == requestsOnReplace[i], qPrintable(s)); + } +} + +void tst_QWebEngineUrlRequestInterceptor::replaceOnIntercept() +{ + HttpServer server; + server.setResourceDirs({ ":/resources" }); + QVERIFY(server.start()); + + QWebEngineProfile profile; + profile.settings()->setAttribute(QWebEngineSettings::ErrorPageEnabled, false); + QWebEnginePage page(&profile); + QSignalSpy spy(&page, SIGNAL(loadFinished(bool))); + + struct Interceptor : QWebEngineUrlRequestInterceptor { + Interceptor(const std::function &a) : action(a) { } + void interceptRequest(QWebEngineUrlRequestInfo &) override { action(); } + std::function action; + int interceptRequestReceived = 0; + }; + + TestRequestInterceptor profileInterceptor, pageInterceptor1, pageInterceptor2; + page.setUrlRequestInterceptor(&pageInterceptor1); + profile.setUrlRequestInterceptor(&profileInterceptor); + profileInterceptor.onIntercept = [&] (QWebEngineUrlRequestInfo &) { + page.setUrlRequestInterceptor(&pageInterceptor2); + return true; + }; + + page.setUrl(server.url("/favicon.html")); + QTRY_COMPARE(spy.count(), 1); + QTRY_COMPARE(profileInterceptor.requestInfos.size(), 2); + + // if interceptor for page was replaced on intercept call in profile then, since request first + // comes to profile, forward to page's interceptor should land to second one + QCOMPARE(pageInterceptor1.requestInfos.size(), 0); + QCOMPARE(profileInterceptor.requestInfos.size(), pageInterceptor2.requestInfos.size()); + + page.setUrlRequestInterceptor(&pageInterceptor1); + bool fetchFinished = false; + page.runJavaScript("fetch('http://nonexistent.invalid').catch(() => {})", [&] (const QVariant &) { + page.setUrlRequestInterceptor(&pageInterceptor2); + fetchFinished = true; + }); + + QTRY_VERIFY(fetchFinished); + QCOMPARE(profileInterceptor.requestInfos.size(), 3); + QCOMPARE(pageInterceptor1.requestInfos.size(), 0); + QCOMPARE(profileInterceptor.requestInfos.size(), pageInterceptor2.requestInfos.size()); +} + QTEST_MAIN(tst_QWebEngineUrlRequestInterceptor) #include "tst_qwebengineurlrequestinterceptor.moc" diff --git a/tests/auto/widgets/qwebengineprofile/tst_qwebengineprofile.cpp b/tests/auto/widgets/qwebengineprofile/tst_qwebengineprofile.cpp index f4c0484eb..1b0f95064 100644 --- a/tests/auto/widgets/qwebengineprofile/tst_qwebengineprofile.cpp +++ b/tests/auto/widgets/qwebengineprofile/tst_qwebengineprofile.cpp @@ -514,7 +514,7 @@ void tst_QWebEngineProfile::urlSchemeHandlerStreaming() view.setPage(new QWebEnginePage(&profile, &view)); view.settings()->setAttribute(QWebEngineSettings::ErrorPageEnabled, false); view.load(QUrl(QStringLiteral("stream://whatever"))); - QVERIFY(loadFinishedSpy.wait()); + QTRY_COMPARE_WITH_TIMEOUT(loadFinishedSpy.count(), 1, 30000); QByteArray result; result.append(1000, 'c'); QCOMPARE(toPlainTextSync(view.page()), QString::fromLatin1(result)); @@ -575,7 +575,7 @@ void tst_QWebEngineProfile::urlSchemeHandlerRequestHeaders() QWebEnginePage page(&profile); QSignalSpy loadFinishedSpy(&page, SIGNAL(loadFinished(bool))); page.load(QUrl(QStringLiteral("myscheme://whatever"))); - QVERIFY(loadFinishedSpy.wait()); + QTRY_COMPARE_WITH_TIMEOUT(loadFinishedSpy.count(), 1, 30000); } void tst_QWebEngineProfile::urlSchemeHandlerInstallation() @@ -707,7 +707,7 @@ void tst_QWebEngineProfile::urlSchemeHandlerXhrStatus() profile.installUrlSchemeHandler("aviancarrier", &handler); page.setWebChannel(&channel); page.load(QUrl("aviancarrier:/")); - QTRY_VERIFY(host.isReady()); + QTRY_VERIFY_WITH_TIMEOUT(host.isReady(), 30000); host.load(QUrl("aviancarrier:/ok")); host.load(QUrl("aviancarrier:/redirect")); host.load(QUrl("aviancarrier:/fail")); -- cgit v1.2.1 From 3f4db416150e06afca2d3010a9ea4ea61e74b8b6 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 8 Feb 2021 10:51:37 +0100 Subject: Update Chromium Submodule src/3rdparty 19c6bab8..471e102b: > [Backport] CVE-2021-21123: Insufficient data validation in File System API (3/3) > [Backport] CVE-2021-21123: Insufficient data validation in File System API (2/3) > [Backport] CVE-2021-21123(1/3), CVE-2021-21125, CVE-2021-21129,CVE-2021-21130, CVE-2021-21131, CVE-2021-21141 > [Backport] CVE-2021-21137: Inappropriate implementation in DevTools > [Backport] CVE-2021-21135: Inappropriate implementation in Performance API Change-Id: Icb814f643421b814a0065c859942d9c6000695eb Reviewed-by: Peter Varga Reviewed-by: Kirill Burtsev --- src/3rdparty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/3rdparty b/src/3rdparty index 19c6bab86..471e102ba 160000 --- a/src/3rdparty +++ b/src/3rdparty @@ -1 +1 @@ -Subproject commit 19c6bab869563fc97a5047eeea6eed7992458af8 +Subproject commit 471e102ba11517b5e5a3a996c621b2006e41070b -- cgit v1.2.1 From a66b48a06bc60c3b9591f5f9170c60d22ca67dcf Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Tue, 3 Nov 2020 13:00:45 +0100 Subject: Update searches faster Cancel previous search if not yet finished. Change-Id: Ie17b2b773bc9d23970c8178ef8be47c19cd768a3 Reviewed-by: Peter Varga --- src/core/find_text_helper.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/core/find_text_helper.cpp b/src/core/find_text_helper.cpp index c3b407ab1..534e25862 100644 --- a/src/core/find_text_helper.cpp +++ b/src/core/find_text_helper.cpp @@ -97,18 +97,18 @@ void FindTextHelper::startFinding(const QString &findText, bool caseSensitively, void FindTextHelper::startFinding(const QString &findText, bool caseSensitively, bool findBackward) { - if (findText.isEmpty()) { - stopFinding(); - return; - } + Q_ASSERT(!findText.isEmpty()); - if (m_currentFindRequestId > m_lastCompletedFindRequestId) { + const bool findNext = !m_previousFindText.isEmpty() && findText == m_previousFindText; + if (isFindTextInProgress()) { // There are cases where the render process will overwrite a previous request // with the new search and we'll have a dangling callback, leaving the application // waiting for it forever. // Assume that any unfinished find has been unsuccessful when a new one is started // to cover that case. m_lastCompletedFindRequestId = m_currentFindRequestId; + if (!findNext) + m_webContents->StopFinding(content::STOP_FIND_ACTION_KEEP_SELECTION); m_viewClient->findTextFinished(QWebEngineFindTextResult()); invokeResultCallback(m_currentFindRequestId, 0); } @@ -116,7 +116,7 @@ void FindTextHelper::startFinding(const QString &findText, bool caseSensitively, blink::mojom::FindOptionsPtr options = blink::mojom::FindOptions::New(); options->forward = !findBackward; options->match_case = caseSensitively; - options->new_session = findText != m_previousFindText; + options->new_session = !findNext; m_previousFindText = findText; m_currentFindRequestId = m_findRequestIdCounter++; -- cgit v1.2.1 From 4b06a7439d4ad929f0edd52087a8f7dceb5bcf41 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 8 Feb 2021 13:01:22 +0100 Subject: Add nodejs error message We require node.js now. Change-Id: I9f0bbd7c374102e2a5d4a256237b89977d073980 Reviewed-by: Michal Klocek --- src/buildtools/config/support.pri | 1 + 1 file changed, 1 insertion(+) diff --git a/src/buildtools/config/support.pri b/src/buildtools/config/support.pri index 4ba387fc2..e7f869a15 100644 --- a/src/buildtools/config/support.pri +++ b/src/buildtools/config/support.pri @@ -22,6 +22,7 @@ defineReplace(qtwebengine_checkWebEngineCoreError) { !qtwebengine_checkForBison(QtWebEngine):return(false) !qtwebengine_checkForFlex(QtWebEngine):return(false) !qtwebengine_checkForPython2(QtWebEngine):return(false) + !qtwebengine_checkForNodejs(QtWebEngine):return(false) !qtwebengine_checkForSanitizer(QtWebEngine):return(false) linux:!qtwebengine_checkForPkgCfg(QtWebEngine):return(false) linux:!qtwebengine_checkForHostPkgCfg(QtWebEngine):return(false) -- cgit v1.2.1 From 9651da8fdedb3533c5f95fa7a8028a017e508d07 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 8 Feb 2021 13:18:39 +0100 Subject: Remove more leftovers of the old compositor Also removes another private dependency Change-Id: Ie0a671c66f9aa49e7001c44e69bf94e11ab058a5 Reviewed-by: Kirill Burtsev --- src/core/render_widget_host_view_qt_delegate.h | 4 ---- .../render_widget_host_view_qt_delegate_quick.cpp | 20 ++++++-------------- .../render_widget_host_view_qt_delegate_quick.h | 2 -- ...nder_widget_host_view_qt_delegate_quickwindow.cpp | 10 ---------- ...render_widget_host_view_qt_delegate_quickwindow.h | 2 -- .../render_widget_host_view_qt_delegate_widget.cpp | 12 ------------ .../render_widget_host_view_qt_delegate_widget.h | 2 -- 7 files changed, 6 insertions(+), 46 deletions(-) diff --git a/src/core/render_widget_host_view_qt_delegate.h b/src/core/render_widget_host_view_qt_delegate.h index 46f1802a6..5fda0eeb7 100644 --- a/src/core/render_widget_host_view_qt_delegate.h +++ b/src/core/render_widget_host_view_qt_delegate.h @@ -59,9 +59,7 @@ QT_BEGIN_NAMESPACE class QEvent; class QInputMethodEvent; -class QSGLayer; class QSGNode; -class QSGRectangleNode; class QSGTexture; class QVariant; class QWheelEvent; @@ -101,9 +99,7 @@ public: virtual bool isVisible() const = 0; virtual QWindow* window() const = 0; virtual QSGTexture *createTextureFromImage(const QImage &) = 0; - virtual QSGLayer *createLayer() = 0; virtual QSGImageNode *createImageNode() = 0; - virtual QSGRectangleNode *createRectangleNode() = 0; virtual void update() = 0; virtual void updateCursor(const QCursor &) = 0; virtual void resize(int width, int height) = 0; diff --git a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp index e1ae8863e..e729f7532 100644 --- a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp +++ b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp @@ -41,13 +41,16 @@ #include "qquickwebengineview_p.h" #include "qquickwebengineview_p_p.h" + #include -#include #include -#include #include #include -#include + +#if defined(Q_OS_MACOS) && QT_CONFIG(opengl) +#include +#include +#endif namespace QtWebEngineCore { @@ -167,22 +170,11 @@ QSGTexture *RenderWidgetHostViewQtDelegateQuick::createTextureFromImage(const QI return QQuickItem::window()->createTextureFromImage(image, QQuickWindow::TextureCanUseAtlas); } -QSGLayer *RenderWidgetHostViewQtDelegateQuick::createLayer() -{ - QSGRenderContext *renderContext = QQuickWindowPrivate::get(QQuickItem::window())->context; - return renderContext->sceneGraphContext()->createLayer(renderContext); -} - QSGImageNode *RenderWidgetHostViewQtDelegateQuick::createImageNode() { return QQuickItem::window()->createImageNode(); } -QSGRectangleNode *RenderWidgetHostViewQtDelegateQuick::createRectangleNode() -{ - return QQuickItem::window()->createRectangleNode(); -} - void RenderWidgetHostViewQtDelegateQuick::update() { QQuickItem::update(); diff --git a/src/webengine/render_widget_host_view_qt_delegate_quick.h b/src/webengine/render_widget_host_view_qt_delegate_quick.h index f70de50d7..86ee5fedd 100644 --- a/src/webengine/render_widget_host_view_qt_delegate_quick.h +++ b/src/webengine/render_widget_host_view_qt_delegate_quick.h @@ -72,9 +72,7 @@ public: bool isVisible() const override; QWindow* window() const override; QSGTexture *createTextureFromImage(const QImage &) override; - QSGLayer *createLayer() override; QSGImageNode *createImageNode() override; - QSGRectangleNode *createRectangleNode() override; void update() override; void updateCursor(const QCursor &) override; void resize(int width, int height) override; diff --git a/src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp b/src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp index 01a5b1299..3192197d0 100644 --- a/src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp +++ b/src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp @@ -125,21 +125,11 @@ QSGTexture *RenderWidgetHostViewQtDelegateQuickWindow::createTextureFromImage(co return m_realDelegate->createTextureFromImage(image); } -QSGLayer *RenderWidgetHostViewQtDelegateQuickWindow::createLayer() -{ - return m_realDelegate->createLayer(); -} - QSGImageNode *RenderWidgetHostViewQtDelegateQuickWindow::createImageNode() { return m_realDelegate->createImageNode(); } -QSGRectangleNode *RenderWidgetHostViewQtDelegateQuickWindow::createRectangleNode() -{ - return m_realDelegate->createRectangleNode(); -} - void RenderWidgetHostViewQtDelegateQuickWindow::update() { QQuickWindow::update(); diff --git a/src/webengine/render_widget_host_view_qt_delegate_quickwindow.h b/src/webengine/render_widget_host_view_qt_delegate_quickwindow.h index bebbfa439..647b014c5 100644 --- a/src/webengine/render_widget_host_view_qt_delegate_quickwindow.h +++ b/src/webengine/render_widget_host_view_qt_delegate_quickwindow.h @@ -67,9 +67,7 @@ public: bool isVisible() const override; QWindow* window() const override; QSGTexture *createTextureFromImage(const QImage &) override; - QSGLayer *createLayer() override; QSGImageNode *createImageNode() override; - QSGRectangleNode *createRectangleNode() override; void update() override; void updateCursor(const QCursor &) override; void resize(int width, int height) override; diff --git a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp index 1dfcc4c5a..5124eabed 100644 --- a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp +++ b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp @@ -50,7 +50,6 @@ #include #include #include -#include namespace QtWebEngineCore { @@ -296,22 +295,11 @@ QSGTexture *RenderWidgetHostViewQtDelegateWidget::createTextureFromImage(const Q return quickWindow()->createTextureFromImage(image, QQuickWindow::TextureCanUseAtlas); } -QSGLayer *RenderWidgetHostViewQtDelegateWidget::createLayer() -{ - QSGRenderContext *renderContext = QQuickWindowPrivate::get(quickWindow())->context; - return renderContext->sceneGraphContext()->createLayer(renderContext); -} - QSGImageNode *RenderWidgetHostViewQtDelegateWidget::createImageNode() { return quickWindow()->createImageNode(); } -QSGRectangleNode *RenderWidgetHostViewQtDelegateWidget::createRectangleNode() -{ - return quickWindow()->createRectangleNode(); -} - void RenderWidgetHostViewQtDelegateWidget::update() { m_rootItem->update(); diff --git a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h index 034fdd65c..fd8654d95 100644 --- a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h +++ b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h @@ -80,9 +80,7 @@ public: bool isVisible() const override; QWindow* window() const override; QSGTexture *createTextureFromImage(const QImage &) override; - QSGLayer *createLayer() override; QSGImageNode *createImageNode() override; - QSGRectangleNode *createRectangleNode() override; void update() override; void updateCursor(const QCursor &) override; void resize(int width, int height) override; -- cgit v1.2.1 From 95e93830e45f5f10397248a794672ff6a681c8b8 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 8 Feb 2021 13:34:19 +0100 Subject: QtPdf apparently depends on libnss on linux At least that pkg-config can resolve it. Change-Id: Id0e0a37ad4aa85f11dfdd74bc174d17d36ed4ce2 Reviewed-by: Michal Klocek --- src/buildtools/config/support.pri | 1 + src/buildtools/configure.json | 1 + 2 files changed, 2 insertions(+) diff --git a/src/buildtools/config/support.pri b/src/buildtools/config/support.pri index e7f869a15..54b5738cd 100644 --- a/src/buildtools/config/support.pri +++ b/src/buildtools/config/support.pri @@ -55,6 +55,7 @@ defineReplace(qtwebengine_checkPdfError) { !qtwebengine_checkForSanitizer(QtPdf):return(false) linux:!qtwebengine_checkForPkgCfg(QtPdf):return(false) linux:!qtwebengine_checkForHostPkgCfg(QtPdf):return(false) + linux:!qtwebengine_checkForPackage(QtPdf,nss):return(false) win32:!qtwebengine_checkForWinVersion(QtPdf):return(false) return(true) } diff --git a/src/buildtools/configure.json b/src/buildtools/configure.json index 812a91f9c..8b77d5c8c 100644 --- a/src/buildtools/configure.json +++ b/src/buildtools/configure.json @@ -398,6 +398,7 @@ && (!config.sanitizer || features.webengine-sanitizer) && (!config.linux || features.pkg-config) && (!config.linux || features.webengine-host-pkg-config) + && (!config.linux || features.webengine-system-nss) && (!config.win32 || features.webengine-winversion)", "output": [ "privateFeature" ] }, -- cgit v1.2.1 From 78c5516711414ed8fd9b1b473a58b038b4a80279 Mon Sep 17 00:00:00 2001 From: Peter Varga Date: Fri, 5 Feb 2021 10:56:48 +0100 Subject: Enable webrtc logging and the corresponding WebUI The corresponding WebUI is chrome://webrtc-logs It only makes sense with the hangout services extension. It seems to be only useable with meet.google.com. The behavior is same for Chrome. Uploading logs to Google is disabled in the Chromium patch. It is an extension API functionality. The WebUI only lists the previously generated logs. Pulls in the following changes: 1dda5314b02 Enable webrtcLoggingPrivate extension API for hangout extension 7d71aca116d FIXUP: Enable webrtcLoggingPrivate extension API for hangout extension Change-Id: I455fce7c8081e71967e55ab1f889df6ef91ed253 Reviewed-by: Allan Sandfeld Jensen --- src/3rdparty | 2 +- src/core/chromium_overrides.cpp | 78 ++++++++++++++++++++++ src/core/content_browser_client_qt.cpp | 9 +++ src/core/net/webui_controller_factory_qt.cpp | 18 ++--- src/core/qtwebengine_resources.gni | 9 +++ src/core/qtwebengine_sources.gni | 46 +++++++++++++ src/core/renderer/content_renderer_client_qt.cpp | 24 +++++++ src/core/renderer/content_renderer_client_qt.h | 12 ++++ src/core/web_engine_context.cpp | 21 ++++++ src/core/web_engine_context.h | 7 ++ .../widgets/qwebengineview/tst_qwebengineview.cpp | 2 +- 11 files changed, 218 insertions(+), 10 deletions(-) diff --git a/src/3rdparty b/src/3rdparty index 471e102ba..7d71aca11 160000 --- a/src/3rdparty +++ b/src/3rdparty @@ -1 +1 @@ -Subproject commit 471e102ba11517b5e5a3a996c621b2006e41070b +Subproject commit 7d71aca116de5f2a4e6ceaef91f0d989dcf69d17 diff --git a/src/core/chromium_overrides.cpp b/src/core/chromium_overrides.cpp index 121f664e9..979f91ba2 100644 --- a/src/core/chromium_overrides.cpp +++ b/src/core/chromium_overrides.cpp @@ -70,6 +70,10 @@ #include "net/ssl/openssl_client_key_store.h" #endif +#if !QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) +#include "chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.h" +#endif + void *GetQtXDisplay() { return GLContextHelper::getXDisplay(); @@ -197,3 +201,77 @@ std::unique_ptr ui::OSExchangeDataProviderFactory::C { return nullptr; } + +#if !QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) +namespace extensions { +ExtensionFunction::ResponseAction WebrtcLoggingPrivateSetMetaDataFunction::Run() +{ + return RespondNow(NoArguments()); +} + +ExtensionFunction::ResponseAction WebrtcLoggingPrivateStartFunction::Run() +{ + return RespondNow(NoArguments()); +} + +ExtensionFunction::ResponseAction WebrtcLoggingPrivateSetUploadOnRenderCloseFunction::Run() +{ + return RespondNow(NoArguments()); +} + +ExtensionFunction::ResponseAction WebrtcLoggingPrivateStopFunction::Run() +{ + return RespondNow(NoArguments()); +} + +ExtensionFunction::ResponseAction WebrtcLoggingPrivateStoreFunction::Run() +{ + return RespondNow(NoArguments()); +} + +ExtensionFunction::ResponseAction WebrtcLoggingPrivateUploadStoredFunction::Run() +{ + return RespondNow(NoArguments()); +} + +ExtensionFunction::ResponseAction WebrtcLoggingPrivateUploadFunction::Run() +{ + return RespondNow(NoArguments()); +} + +ExtensionFunction::ResponseAction WebrtcLoggingPrivateDiscardFunction::Run() +{ + return RespondNow(NoArguments()); +} + +ExtensionFunction::ResponseAction WebrtcLoggingPrivateStartRtpDumpFunction::Run() +{ + return RespondNow(NoArguments()); +} + +ExtensionFunction::ResponseAction WebrtcLoggingPrivateStopRtpDumpFunction::Run() +{ + return RespondNow(NoArguments()); +} + +ExtensionFunction::ResponseAction WebrtcLoggingPrivateStartAudioDebugRecordingsFunction::Run() +{ + return RespondNow(NoArguments()); +} + +ExtensionFunction::ResponseAction WebrtcLoggingPrivateStopAudioDebugRecordingsFunction::Run() +{ + return RespondNow(NoArguments()); +} + +ExtensionFunction::ResponseAction WebrtcLoggingPrivateStartEventLoggingFunction::Run() +{ + return RespondNow(NoArguments()); +} + +ExtensionFunction::ResponseAction WebrtcLoggingPrivateGetLogsDirectoryFunction::Run() +{ + return RespondNow(NoArguments()); +} +} // namespace extensions +#endif // !QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp index 5a30a4388..fbc57999e 100644 --- a/src/core/content_browser_client_qt.cpp +++ b/src/core/content_browser_client_qt.cpp @@ -111,6 +111,7 @@ #include "web_contents_adapter.h" #include "web_contents_delegate_qt.h" #include "web_contents_view_qt.h" +#include "web_engine_context.h" #include "web_engine_library_info.h" #include "api/qwebenginecookiestore.h" #include "api/qwebenginecookiestore_p.h" @@ -140,6 +141,10 @@ #include "components/spellcheck/common/spellcheck.mojom.h" #endif +#if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) +#include "chrome/browser/media/webrtc/webrtc_logging_controller.h" +#endif + #if defined(Q_OS_LINUX) #include "global_descriptors_qt.h" #endif @@ -319,6 +324,10 @@ void ContentBrowserClientQt::RenderProcessWillLaunch(content::RenderProcessHost const int id = host->GetID(); Profile *profile = Profile::FromBrowserContext(host->GetBrowserContext()); +#if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) + WebRtcLoggingController::AttachToRenderProcessHost(host, WebEngineContext::current()->webRtcLogUploader()); +#endif + // Allow requesting custom schemes. const auto policy = content::ChildProcessSecurityPolicy::GetInstance(); const auto profileAdapter = static_cast(profile)->profileAdapter(); diff --git a/src/core/net/webui_controller_factory_qt.cpp b/src/core/net/webui_controller_factory_qt.cpp index aec192cd0..59c5ca205 100644 --- a/src/core/net/webui_controller_factory_qt.cpp +++ b/src/core/net/webui_controller_factory_qt.cpp @@ -44,6 +44,8 @@ #include "webui_controller_factory_qt.h" +#include "build_config_qt.h" + #include "base/bind.h" #include "build/build_config.h" #include "chrome/browser/accessibility/accessibility_ui.h" @@ -64,15 +66,15 @@ #include "chrome/browser/ui/webui/sandbox/sandbox_internals_ui.h" #endif +#if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) +#include "chrome/browser/ui/webui/media/webrtc_logs_ui.h" +#endif + // The Following WebUIs are disabled because they currently doesn't build // or doesn't work, but would be interesting for us if they did: // #include "chrome/browser/ui/webui/inspect_ui.h" -// #if BUILDFLAG(ENABLE_WEBRTC) -// #include "chrome/browser/ui/webui/media/webrtc_logs_ui.h" -// #endif - // #if BUILDFLAG(ENABLE_PRINT_PREVIEW) // #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" // #endif @@ -152,10 +154,10 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI *web_ui, Profile *profile, co // return &NewWebUI; // } //#endif -//#if BUILDFLAG(ENABLE_WEBRTC) -// if (url.host_piece() == chrome::kChromeUIWebRtcLogsHost) -// return &NewWebUI; -//#endif +#if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) + if (url.host_piece() == chrome::kChromeUIWebRtcLogsHost) + return &NewWebUI; +#endif #if defined(OS_LINUX) || defined(OS_ANDROID) if (url.host_piece() == chrome::kChromeUISandboxHost) return &NewWebUI; diff --git a/src/core/qtwebengine_resources.gni b/src/core/qtwebengine_resources.gni index 38e824f5e..dfc3ea8d5 100644 --- a/src/core/qtwebengine_resources.gni +++ b/src/core/qtwebengine_resources.gni @@ -70,6 +70,15 @@ repack("qtwebengine_repack_resources") { "//content/browser/webrtc/resources", ] } + + if (enable_webrtc && enable_extensions) { + sources += [ + "$root_gen_dir/chrome/webrtc_logs_resources.pak", + ] + deps += [ + "//chrome/browser/resources/media:webrtc_logs_resources", + ] + } } repack("qtwebengine_repack_resources_100") { diff --git a/src/core/qtwebengine_sources.gni b/src/core/qtwebengine_sources.gni index c715b6432..7ff192bf3 100644 --- a/src/core/qtwebengine_sources.gni +++ b/src/core/qtwebengine_sources.gni @@ -89,6 +89,8 @@ source_set("qtwebengine_sources") { "//chrome/browser/ui/webui/user_actions/user_actions_ui.h", "//chrome/browser/ui/webui/user_actions/user_actions_ui_handler.cc", "//chrome/browser/ui/webui/user_actions/user_actions_ui_handler.h", + "//chrome/browser/ui/webui/webui_util.cc", + "//chrome/browser/ui/webui/webui_util.h", "//chrome/common/custom_handlers/protocol_handler.cc", "//chrome/common/custom_handlers/protocol_handler.h", "//chrome/common/chrome_switches.cc", @@ -198,6 +200,50 @@ source_set("qtwebengine_sources") { "//components/printing/renderer", ] } + + if (enable_webrtc && enable_extensions) { + deps += [ + "//chrome/browser/resources/media:webrtc_logs_resources", + "//components/upload_list", + "//components/webrtc_logging/browser", + "//components/webrtc_logging/common", + ] + + sources += [ + "//chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc", + "//chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.h", + "//chrome/browser/media/webrtc/audio_debug_recordings_handler.cc", + "//chrome/browser/media/webrtc/audio_debug_recordings_handler.h", + "//chrome/browser/media/webrtc/webrtc_event_log_history.cc", + "//chrome/browser/media/webrtc/webrtc_event_log_history.h", + "//chrome/browser/media/webrtc/webrtc_event_log_manager.cc", + "//chrome/browser/media/webrtc/webrtc_event_log_manager.h", + "//chrome/browser/media/webrtc/webrtc_event_log_manager_common.cc", + "//chrome/browser/media/webrtc/webrtc_event_log_manager_common.h", + "//chrome/browser/media/webrtc/webrtc_event_log_manager_local.cc", + "//chrome/browser/media/webrtc/webrtc_event_log_manager_local.h", + "//chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc", + "//chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h", + "//chrome/browser/media/webrtc/webrtc_event_log_uploader.cc", + "//chrome/browser/media/webrtc/webrtc_event_log_uploader.h", + "//chrome/browser/media/webrtc/webrtc_log_buffer.cc", + "//chrome/browser/media/webrtc/webrtc_log_buffer.h", + "//chrome/browser/media/webrtc/webrtc_log_uploader.cc", + "//chrome/browser/media/webrtc/webrtc_log_uploader.h", + "//chrome/browser/media/webrtc/webrtc_logging_controller.cc", + "//chrome/browser/media/webrtc/webrtc_logging_controller.h", + "//chrome/browser/media/webrtc/webrtc_rtp_dump_handler.cc", + "//chrome/browser/media/webrtc/webrtc_rtp_dump_handler.h", + "//chrome/browser/media/webrtc/webrtc_rtp_dump_writer.cc", + "//chrome/browser/media/webrtc/webrtc_rtp_dump_writer.h", + "//chrome/browser/media/webrtc/webrtc_text_log_handler.cc", + "//chrome/browser/media/webrtc/webrtc_text_log_handler.h", + "//chrome/browser/ui/webui/media/webrtc_logs_ui.cc", + "//chrome/browser/ui/webui/media/webrtc_logs_ui.h", + "//chrome/renderer/media/webrtc_logging_agent_impl.cc", + "//chrome/renderer/media/webrtc_logging_agent_impl.h", + ] + } } if (is_win) { diff --git a/src/core/renderer/content_renderer_client_qt.cpp b/src/core/renderer/content_renderer_client_qt.cpp index 8dddf7a15..cafdeddb4 100644 --- a/src/core/renderer/content_renderer_client_qt.cpp +++ b/src/core/renderer/content_renderer_client_qt.cpp @@ -113,6 +113,10 @@ #include "third_party/widevine/cdm/widevine_cdm_common.h" #endif +#if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) +#include "chrome/renderer/media/webrtc_logging_agent_impl.h" +#endif + namespace QtWebEngineCore { static const char kHttpErrorDomain[] = "http"; @@ -183,6 +187,15 @@ void ContentRendererClientQt::ExposeInterfacesToBrowser(mojo::BinderMap* binders }, this), base::SequencedTaskRunnerHandle::Get()); #endif + +#if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) + binders->Add(base::BindRepeating( + [](ContentRendererClientQt *client, + mojo::PendingReceiver receiver) { + client->GetWebRtcLoggingAgent()->AddReceiver(std::move(receiver)); + }, this), + base::SequencedTaskRunnerHandle::Get()); +#endif } void ContentRendererClientQt::RenderFrameCreated(content::RenderFrame *render_frame) @@ -367,6 +380,17 @@ blink::WebPlugin* ContentRendererClientQt::CreatePlugin(content::RenderFrame* re } #endif //BUILDFLAG(ENABLE_PLUGINS) +#if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) +chrome::WebRtcLoggingAgentImpl *ContentRendererClientQt::GetWebRtcLoggingAgent() +{ + if (!m_webrtcLoggingAgentImpl) { + m_webrtcLoggingAgentImpl = std::make_unique(); + } + + return m_webrtcLoggingAgentImpl.get(); +} +#endif // QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) + void ContentRendererClientQt::GetInterface(const std::string &interface_name, mojo::ScopedMessagePipeHandle interface_pipe) { content::RenderThread::Get()->BindHostReceiver(mojo::GenericPendingReceiver(interface_name, std::move(interface_pipe))); diff --git a/src/core/renderer/content_renderer_client_qt.h b/src/core/renderer/content_renderer_client_qt.h index 82d8af514..0b0a7b68c 100644 --- a/src/core/renderer/content_renderer_client_qt.h +++ b/src/core/renderer/content_renderer_client_qt.h @@ -53,6 +53,10 @@ #include +namespace chrome { +class WebRtcLoggingAgentImpl; +} + namespace error_page { class Error; } @@ -130,6 +134,11 @@ public: const chrome::mojom::PluginInfo& plugin_info); #endif +#if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) + chrome::WebRtcLoggingAgentImpl *GetWebRtcLoggingAgent(); +#endif + + private: #if BUILDFLAG(ENABLE_SPELLCHECK) void InitSpellCheck(); @@ -147,6 +156,9 @@ private: #if QT_CONFIG(webengine_spellchecker) QScopedPointer m_spellCheck; #endif +#if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) + std::unique_ptr m_webrtcLoggingAgentImpl; +#endif DISALLOW_COPY_AND_ASSIGN(ContentRendererClientQt); }; diff --git a/src/core/web_engine_context.cpp b/src/core/web_engine_context.cpp index 5f3212374..863b46a57 100644 --- a/src/core/web_engine_context.cpp +++ b/src/core/web_engine_context.cpp @@ -52,6 +52,9 @@ #include "base/task/thread_pool/thread_pool_instance.h" #include "base/threading/thread_restrictions.h" #include "cc/base/switches.h" +#if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) +#include "chrome/browser/media/webrtc/webrtc_log_uploader.h" +#endif #include "chrome/common/chrome_switches.h" #include "content/gpu/gpu_child_thread.h" #include "content/browser/compositor/surface_utils.h" @@ -356,6 +359,10 @@ void WebEngineContext::destroy() if (m_devtoolsServer) m_devtoolsServer->stop(); +#if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) + if (m_webrtcLogUploader) + m_webrtcLogUploader->Shutdown(); +#endif base::MessagePump::Delegate *delegate = static_cast( @@ -413,6 +420,10 @@ void WebEngineContext::destroy() // Drop the false reference. m_handle->Release(); + +#if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) + m_webrtcLogUploader.reset(); +#endif } WebEngineContext::~WebEngineContext() @@ -841,6 +852,16 @@ printing::PrintJobManager* WebEngineContext::getPrintJobManager() } #endif +#if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) +WebRtcLogUploader *WebEngineContext::webRtcLogUploader() +{ + if (!m_webrtcLogUploader) + m_webrtcLogUploader = std::make_unique(); + return m_webrtcLogUploader.get(); +} +#endif + + static QMutex s_spmMutex; QAtomicPointer WebEngineContext::s_syncPointManager; diff --git a/src/core/web_engine_context.h b/src/core/web_engine_context.h index e2190f8a2..a74b83eae 100644 --- a/src/core/web_engine_context.h +++ b/src/core/web_engine_context.h @@ -86,6 +86,7 @@ struct SandboxInterfaceInfo; #endif QT_FORWARD_DECLARE_CLASS(QObject) +class WebRtcLogUploader; namespace QtWebEngineCore { @@ -114,6 +115,9 @@ public: QObject *globalQObject(); #if QT_CONFIG(webengine_printing_and_pdf) printing::PrintJobManager* getPrintJobManager(); +#endif +#if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) + WebRtcLogUploader *webRtcLogUploader(); #endif void destroyProfileAdapter(); void addProfileAdapter(ProfileAdapter *profileAdapter); @@ -151,6 +155,9 @@ private: #if QT_CONFIG(webengine_printing_and_pdf) std::unique_ptr m_printJobManager; +#endif +#if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) + std::unique_ptr m_webrtcLogUploader; #endif static scoped_refptr m_handle; static bool m_destroyed; diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp index ed62d3638..bf3774702 100644 --- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp +++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp @@ -3142,7 +3142,7 @@ void tst_QWebEngineView::webUIURLs_data() QTest::newRow("user-actions") << QUrl("chrome://user-actions") << true; QTest::newRow("version") << QUrl("chrome://version") << false; QTest::newRow("webrtc-internals") << QUrl("chrome://webrtc-internals") << true; - QTest::newRow("webrtc-logs") << QUrl("chrome://webrtc-logs") << false; + QTest::newRow("webrtc-logs") << QUrl("chrome://webrtc-logs") << true; } void tst_QWebEngineView::webUIURLs() -- cgit v1.2.1 From c0941bd984b6736fb2c1dc087811edf2ce2f81d4 Mon Sep 17 00:00:00 2001 From: Ma Aiguo Date: Mon, 8 Feb 2021 17:27:33 +0800 Subject: Feat support mips64el platform CPU(loongson 3A4000) Change-Id: I794eed65730b8a054df8ebcf666401fd266c59c2 Reviewed-by: Allan Sandfeld Jensen --- configure.pri | 1 + mkspecs/features/functions.prf | 1 + 2 files changed, 2 insertions(+) diff --git a/configure.pri b/configure.pri index 5f4641f26..e072961f0 100644 --- a/configure.pri +++ b/configure.pri @@ -143,6 +143,7 @@ defineTest(qtConfTest_detectArch) { contains(QT_ARCH, "i386")|contains(QT_ARCH, "x86_64"): return(true) contains(QT_ARCH, "arm")|contains(QT_ARCH, "arm64"): return(true) contains(QT_ARCH, "mips"): return(true) + contains(QT_ARCH, "mips64"): return(true) qtLog("Architecture not supported.") return(false) } diff --git a/mkspecs/features/functions.prf b/mkspecs/features/functions.prf index d3ceb4c5e..2750d7071 100644 --- a/mkspecs/features/functions.prf +++ b/mkspecs/features/functions.prf @@ -106,6 +106,7 @@ defineReplace(gnArch) { contains(qtArch, "arm64"): return(arm64) contains(qtArch, "mips"): return(mipsel) contains(qtArch, "mips64"): return(mips64el) + contains(qtArch, "mips64el"): return(mips64el) return(unknown) } -- cgit v1.2.1 From e37459146d28e815038c44999d6a525806183fc1 Mon Sep 17 00:00:00 2001 From: Peter Varga Date: Mon, 8 Feb 2021 11:22:36 +0100 Subject: Add tracing UI resources Also add third party python dependencies of tracing to the snapshot. Pulls in the following changes: a7c1c17e0b9 [Revert] Do not bundle the tracing UI resources 1711a9c9bf4 Enable build of tracing UI Change-Id: I0a6abfeb04cb66ae33b26b6353edad2aecf39365 Reviewed-by: Allan Sandfeld Jensen --- src/3rdparty | 2 +- src/core/qtwebengine_resources.gni | 2 ++ tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp | 2 +- tools/scripts/take_snapshot.py | 5 ++++- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/3rdparty b/src/3rdparty index 7d71aca11..1711a9c9b 160000 --- a/src/3rdparty +++ b/src/3rdparty @@ -1 +1 @@ -Subproject commit 7d71aca116de5f2a4e6ceaef91f0d989dcf69d17 +Subproject commit 1711a9c9bf4e87e143064d33a9afc9e7cdd9c676 diff --git a/src/core/qtwebengine_resources.gni b/src/core/qtwebengine_resources.gni index dfc3ea8d5..73ec8bda9 100644 --- a/src/core/qtwebengine_resources.gni +++ b/src/core/qtwebengine_resources.gni @@ -26,6 +26,7 @@ repack("qtwebengine_repack_resources") { "$root_gen_dir/components/components_resources.pak", "$root_gen_dir/components/dev_ui_components_resources.pak", "$root_gen_dir/content/browser/resources/media/media_internals_resources.pak", + "$root_gen_dir/content/browser/tracing/tracing_resources.pak", "$root_gen_dir/content/content_resources.pak", "$root_gen_dir/content/dev_ui_content_resources.pak", "$root_gen_dir/mojo/public/js/mojo_bindings_resources.pak", @@ -41,6 +42,7 @@ repack("qtwebengine_repack_resources") { "//components/resources:components_resources_grit", "//components/resources:dev_ui_components_resources_grit", "//content/browser/resources/media:media_internals_resources", + "//content/browser/tracing:resources", "//content:content_resources_grit", "//content:dev_ui_content_resources_grit", "//mojo/public/js:resources", diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp index bf3774702..99c447ddc 100644 --- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp +++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp @@ -3136,7 +3136,7 @@ void tst_QWebEngineView::webUIURLs_data() QTest::newRow("system") << QUrl("chrome://system") << false; QTest::newRow("terms") << QUrl("chrome://terms") << false; QTest::newRow("thumbnails") << QUrl("chrome://thumbnails") << false; - QTest::newRow("tracing") << QUrl("chrome://tracing") << false; + QTest::newRow("tracing") << QUrl("chrome://tracing") << true; QTest::newRow("translate-internals") << QUrl("chrome://translate-internals") << false; QTest::newRow("usb-internals") << QUrl("chrome://usb-internals") << false; QTest::newRow("user-actions") << QUrl("chrome://user-actions") << true; diff --git a/tools/scripts/take_snapshot.py b/tools/scripts/take_snapshot.py index c8cad2ef3..b2c1276af 100755 --- a/tools/scripts/take_snapshot.py +++ b/tools/scripts/take_snapshot.py @@ -156,7 +156,10 @@ def isInChromiumBlacklist(file_path): or (file_path.startswith('third_party/catapult/') and not file_path.startswith('third_party/catapult/catapult_build') and not file_path.startswith('third_party/catapult/common') - and not file_path.startswith('third_party/catapult/third_party/polymer/components/polymer') + and not file_path.startswith('third_party/catapult/third_party/beautifulsoup4') + and not file_path.startswith('third_party/catapult/third_party/html5lib-python') + and not file_path.startswith('third_party/catapult/third_party/polymer') + and not file_path.startswith('third_party/catapult/third_party/six') and not file_path.startswith('third_party/catapult/tracing')) or file_path.startswith('third_party/catapult/tracing/test_data/') or file_path.startswith('third_party/chromevox') -- cgit v1.2.1 From 1905b33d7c3e1c338db218e97794a4db63b2811e Mon Sep 17 00:00:00 2001 From: Peter Varga Date: Wed, 10 Feb 2021 11:31:53 +0100 Subject: Update tst_QWebEngineView::webUIURLs auto test Remove URLs of removed WebUIs. Some removed URLs are just not for WebUI. Also add new ones that are available with Chromium 87. Change-Id: I2a749b5ff20621f2fc4cb168a2a40b571d79bdd0 Reviewed-by: Allan Sandfeld Jensen --- .../auto/widgets/qwebengineview/tst_qwebengineview.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp index 99c447ddc..021986381 100644 --- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp +++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp @@ -3080,19 +3080,20 @@ void tst_QWebEngineView::webUIURLs_data() QTest::newRow("accessibility") << QUrl("chrome://accessibility") << true; QTest::newRow("appcache-internals") << QUrl("chrome://appcache-internals") << true; QTest::newRow("apps") << QUrl("chrome://apps") << false; + QTest::newRow("autofill-internals") << QUrl("chrome://autofill-internals") << false; QTest::newRow("blob-internals") << QUrl("chrome://blob-internals") << true; QTest::newRow("bluetooth-internals") << QUrl("chrome://bluetooth-internals") << false; QTest::newRow("bookmarks") << QUrl("chrome://bookmarks") << false; - QTest::newRow("cache") << QUrl("chrome://cache") << false; - QTest::newRow("chrome") << QUrl("chrome://chrome") << false; QTest::newRow("chrome-urls") << QUrl("chrome://chrome-urls") << false; QTest::newRow("components") << QUrl("chrome://components") << false; + QTest::newRow("conversion-internals") << QUrl("chrome://conversion-internals") << true; QTest::newRow("crashes") << QUrl("chrome://crashes") << false; QTest::newRow("credits") << QUrl("chrome://credits") << false; QTest::newRow("device-log") << QUrl("chrome://device-log") << false; QTest::newRow("devices") << QUrl("chrome://devices") << false; QTest::newRow("dino") << QUrl("chrome://dino") << false; // It works but this is an error page - QTest::newRow("dns") << QUrl("chrome://dns") << false; + QTest::newRow("discards") << QUrl("chrome://discards") << false; + QTest::newRow("download-internals") << QUrl("chrome://download-internals") << false; QTest::newRow("downloads") << QUrl("chrome://downloads") << false; QTest::newRow("extensions") << QUrl("chrome://extensions") << false; QTest::newRow("flags") << QUrl("chrome://flags") << false; @@ -3100,25 +3101,29 @@ void tst_QWebEngineView::webUIURLs_data() QTest::newRow("gpu") << QUrl("chrome://gpu") << true; QTest::newRow("help") << QUrl("chrome://help") << false; QTest::newRow("histograms") << QUrl("chrome://histograms") << true; + QTest::newRow("history") << QUrl("chrome://history") << false; QTest::newRow("indexeddb-internals") << QUrl("chrome://indexeddb-internals") << true; QTest::newRow("inspect") << QUrl("chrome://inspect") << false; + QTest::newRow("interstitials") << QUrl("chrome://interstitials") << false; + QTest::newRow("interventions-internals") << QUrl("chrome://interventions-internals") << false; QTest::newRow("invalidations") << QUrl("chrome://invalidations") << false; QTest::newRow("linux-proxy-config") << QUrl("chrome://linux-proxy-config") << false; QTest::newRow("local-state") << QUrl("chrome://local-state") << false; + QTest::newRow("management") << QUrl("chrome://management") << false; + QTest::newRow("media-engagement") << QUrl("chrome://media-engagement") << false; QTest::newRow("media-internals") << QUrl("chrome://media-internals") << true; QTest::newRow("net-export") << QUrl("chrome://net-export") << false; QTest::newRow("net-internals") << QUrl("chrome://net-internals") << false; QTest::newRow("network-error") << QUrl("chrome://network-error") << false; QTest::newRow("network-errors") << QUrl("chrome://network-errors") << true; - QTest::newRow("newtab") << QUrl("chrome://newtab") << false; QTest::newRow("ntp-tiles-internals") << QUrl("chrome://ntp-tiles-internals") << false; QTest::newRow("omnibox") << QUrl("chrome://omnibox") << false; QTest::newRow("password-manager-internals") << QUrl("chrome://password-manager-internals") << false; QTest::newRow("policy") << QUrl("chrome://policy") << false; QTest::newRow("predictors") << QUrl("chrome://predictors") << false; + QTest::newRow("prefs-internals") << QUrl("chrome://prefs-internals") << false; QTest::newRow("print") << QUrl("chrome://print") << false; QTest::newRow("process-internals") << QUrl("chrome://process-internals") << true; - QTest::newRow("profiler") << QUrl("chrome://profiler") << false; QTest::newRow("quota-internals") << QUrl("chrome://quota-internals") << true; QTest::newRow("safe-browsing") << QUrl("chrome://safe-browsing") << false; #ifdef Q_OS_LINUX @@ -3135,9 +3140,9 @@ void tst_QWebEngineView::webUIURLs_data() QTest::newRow("sync-internals") << QUrl("chrome://sync-internals") << false; QTest::newRow("system") << QUrl("chrome://system") << false; QTest::newRow("terms") << QUrl("chrome://terms") << false; - QTest::newRow("thumbnails") << QUrl("chrome://thumbnails") << false; QTest::newRow("tracing") << QUrl("chrome://tracing") << true; QTest::newRow("translate-internals") << QUrl("chrome://translate-internals") << false; + QTest::newRow("ukm") << QUrl("chrome://ukm") << true; QTest::newRow("usb-internals") << QUrl("chrome://usb-internals") << false; QTest::newRow("user-actions") << QUrl("chrome://user-actions") << true; QTest::newRow("version") << QUrl("chrome://version") << false; -- cgit v1.2.1 From 095105140a145773d9d46983a23f50a5fc30b5ce Mon Sep 17 00:00:00 2001 From: Szabolcs David Date: Thu, 11 Feb 2021 13:23:25 +0100 Subject: Fix crash on meet.google.com This site crashes after 0185f41 when it tries to use the Hangouts extension. Background WebContent of this extension (and future guest views) doesn't have a corresponding WebContentsAdapterClient. Change-Id: I2028372a176a7194bf037093f9364d942bef969a Reviewed-by: Peter Varga Reviewed-by: Allan Sandfeld Jensen --- src/core/net/proxying_url_loader_factory_qt.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/net/proxying_url_loader_factory_qt.cpp b/src/core/net/proxying_url_loader_factory_qt.cpp index c541c17b6..ec107fe70 100644 --- a/src/core/net/proxying_url_loader_factory_qt.cpp +++ b/src/core/net/proxying_url_loader_factory_qt.cpp @@ -236,8 +236,8 @@ QWebEngineUrlRequestInterceptor* InterceptedRequest::getPageInterceptor() { if (auto wc = webContents()) { auto view = static_cast(wc)->GetView(); - WebContentsAdapterClient *client = WebContentsViewQt::from(view)->client(); - return client->webContentsAdapter()->requestInterceptor(); + if (WebContentsAdapterClient *client = WebContentsViewQt::from(view)->client()) + return client->webContentsAdapter()->requestInterceptor(); } return nullptr; } -- cgit v1.2.1 From 4c94370394ccf1e00233669df01599cb6141a5dc Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Thu, 11 Feb 2021 15:53:30 +0100 Subject: Update Chromium Submodule src/3rdparty 1711a9c9..a38752bf: > [Backport] CVE-2021-21147: Inappropriate implementation in Skia > [Backport] CVE-2021-21146: Use after free in Navigation > [Backport] CVE-2021-21145: Use after free in Fonts > [Backport] CVE-2021-21148: Heap buffer overflow in V8 Change-Id: I4955f682de0e741a0bf279218fb3ce2efa9f8aac Reviewed-by: Michal Klocek --- src/3rdparty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/3rdparty b/src/3rdparty index 1711a9c9b..a38752bff 160000 --- a/src/3rdparty +++ b/src/3rdparty @@ -1 +1 @@ -Subproject commit 1711a9c9bf4e87e143064d33a9afc9e7cdd9c676 +Subproject commit a38752bff0fd3ae3e98ce973a437413e074403a0 -- cgit v1.2.1