From 7282fb4fb4861320539f2b7288f63e1d4f48749d Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Wed, 19 Jul 2017 14:12:54 +0200 Subject: Adaptations for Chromium 60 Change-Id: I536258e22c2ec143f2fd3f1cbda229e0611b6af4 Reviewed-by: Allan Sandfeld Jensen Reviewed-by: Qt CI Bot --- src/core/browser_accessibility_qt.cpp | 4 +- src/core/browser_context_qt.cpp | 7 +- src/core/browser_context_qt.h | 6 +- src/core/clipboard_qt.cpp | 19 ++-- src/core/common/qt_messages.h | 6 +- src/core/config/common.pri | 7 +- src/core/config/linux.pri | 3 +- src/core/config/windows.pri | 15 ++- src/core/content_browser_client_qt.cpp | 51 +++++++++- src/core/content_browser_client_qt.h | 21 +++- src/core/core_module.pro | 12 ++- src/core/delegated_frame_node.cpp | 17 ++-- src/core/desktop_screen_qt.cpp | 4 +- src/core/gl_surface_qt.cpp | 5 + src/core/network_delegate_qt.cpp | 20 ++++ src/core/network_delegate_qt.h | 7 ++ src/core/print_view_manager_qt.cpp | 5 + src/core/qtwebengine_sources.gni | 4 +- src/core/render_widget_host_view_qt.cpp | 39 +++++--- src/core/render_widget_host_view_qt.h | 2 + src/core/renderer/content_renderer_client_qt.cpp | 19 +++- src/core/renderer/render_frame_observer_qt.cpp | 4 + src/core/renderer/render_frame_observer_qt.h | 2 +- src/core/renderer/render_view_observer_qt.cpp | 5 + src/core/renderer/render_view_observer_qt.h | 2 +- src/core/renderer/user_resource_controller.cpp | 110 ++++++++++++++------- src/core/renderer/user_resource_controller.h | 6 +- src/core/renderer/web_channel_ipc_transport.cpp | 5 + src/core/renderer/web_channel_ipc_transport.h | 2 +- .../user_resource_controller_host.cpp | 51 ++++++---- src/core/url_request_context_getter_qt.cpp | 6 +- src/core/web_contents_adapter.cpp | 2 +- src/core/web_contents_delegate_qt.cpp | 10 +- src/core/web_contents_delegate_qt.h | 7 +- src/core/web_engine_context.cpp | 15 ++- src/core/web_engine_settings.cpp | 7 +- src/core/web_engine_settings.h | 2 + 37 files changed, 387 insertions(+), 122 deletions(-) (limited to 'src/core') diff --git a/src/core/browser_accessibility_qt.cpp b/src/core/browser_accessibility_qt.cpp index ffc510bf2..b718ed3bf 100644 --- a/src/core/browser_accessibility_qt.cpp +++ b/src/core/browser_accessibility_qt.cpp @@ -261,7 +261,7 @@ QAccessible::Role BrowserAccessibilityQt::role() const return QAccessible::NoRole; // FIXME case ui::AX_ROLE_DISCLOSURE_TRIANGLE: return QAccessible::NoRole; // FIXME - case ui::AX_ROLE_DIV: + case ui::AX_ROLE_GENERIC_CONTAINER: return QAccessible::Section; case ui::AX_ROLE_DOCUMENT: return QAccessible::Document; @@ -454,7 +454,7 @@ QAccessible::State BrowserAccessibilityQt::state() const int32_t s = GetState(); if (s & (1 << ui::AX_STATE_BUSY)) state.busy = true; - if (s & (1 << ui::AX_STATE_CHECKED)) + if (s & (1 << ui::AX_CHECKED_STATE_TRUE)) state.checked = true; if (s & (1 << ui::AX_STATE_COLLAPSED)) state.collapsed = true; diff --git a/src/core/browser_context_qt.cpp b/src/core/browser_context_qt.cpp index 6fa91688b..16b7e5514 100644 --- a/src/core/browser_context_qt.cpp +++ b/src/core/browser_context_qt.cpp @@ -57,7 +57,7 @@ #include "base/base_paths.h" #include "components/prefs/pref_member.h" #include "components/prefs/pref_service.h" -#include "components/prefs/testing_pref_store.h" +#include "components/prefs/in_memory_pref_store.h" #include "components/prefs/pref_service.h" #include "components/prefs/pref_service_factory.h" #include "components/prefs/pref_registry_simple.h" @@ -72,9 +72,8 @@ namespace QtWebEngineCore { BrowserContextQt::BrowserContextQt(BrowserContextAdapter *adapter) : m_adapter(adapter), - m_prefStore(new TestingPrefStore()) + m_prefStore(new InMemoryPrefStore()) { - m_prefStore->SetInitializationCompleted(); PrefServiceFactory factory; factory.set_user_prefs(m_prefStore); scoped_refptr registry(new PrefRegistrySimple()); @@ -206,7 +205,7 @@ net::URLRequestContextGetter *BrowserContextQt::CreateRequestContextForStoragePa } #if BUILDFLAG(ENABLE_SPELLCHECK) -void BrowserContextQt::failedToLoadDictionary(const std::string &language) +void BrowserContextQt::FailedToLoadDictionary(const std::string &language) { Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); qWarning() << "Could not load dictionary for:" << toQt(language) << endl diff --git a/src/core/browser_context_qt.h b/src/core/browser_context_qt.h index af250f506..681657d96 100644 --- a/src/core/browser_context_qt.h +++ b/src/core/browser_context_qt.h @@ -50,7 +50,7 @@ QT_BEGIN_NAMESPACE class QStringList; QT_END_NAMESPACE -class TestingPrefStore; +class InMemoryPrefStore; class PrefService; namespace QtWebEngineCore { @@ -100,7 +100,7 @@ public: BrowserContextAdapter *adapter() { return m_adapter; } #if BUILDFLAG(ENABLE_SPELLCHECK) - void failedToLoadDictionary(const std::string& language) override; + void FailedToLoadDictionary(const std::string& language) override; void setSpellCheckLanguages(const QStringList &languages); QStringList spellCheckLanguages() const; void setSpellCheckEnabled(bool enabled); @@ -115,7 +115,7 @@ private: std::unique_ptr permissionManager; std::unique_ptr sslHostStateDelegate; BrowserContextAdapter *m_adapter; - scoped_refptr m_prefStore; + scoped_refptr m_prefStore; std::unique_ptr m_prefService; friend class BrowserContextAdapter; diff --git a/src/core/clipboard_qt.cpp b/src/core/clipboard_qt.cpp index 9d2ff4c0e..997c7ba43 100644 --- a/src/core/clipboard_qt.cpp +++ b/src/core/clipboard_qt.cpp @@ -352,13 +352,20 @@ SkBitmap ClipboardQt::ReadImage(ui::ClipboardType type) const image = image.convertToFormat(QImage::Format_ARGB32); SkBitmap bitmap; - bitmap.setInfo(SkImageInfo::MakeN32(image.width(), image.height(), kOpaque_SkAlphaType)); - bitmap.setPixels(const_cast(image.constBits())); - // Return a deep copy of the pixel data. - SkBitmap copy; - bitmap.copyTo(©, kN32_SkColorType); - return copy; + bitmap.allocN32Pixels(image.width(), image.height(), true); + const size_t bytesPerRowDst = bitmap.rowBytes(); + const size_t bytesPerLineSrc = static_cast(image.bytesPerLine()); + const size_t dataBytes = std::min(bytesPerRowDst, bytesPerLineSrc); + uchar *dst = static_cast(bitmap.getPixels()); + const uchar *src = image.constBits(); + for (int y = 0; y < image.height(); ++y) { + memcpy(dst, src, dataBytes); + dst += bytesPerRowDst; + src += bytesPerLineSrc; + } + + return bitmap; } void ClipboardQt::ReadCustomData(ui::ClipboardType clipboard_type, const base::string16& type, base::string16* result) const diff --git a/src/core/common/qt_messages.h b/src/core/common/qt_messages.h index d998db20e..00efa485e 100644 --- a/src/core/common/qt_messages.h +++ b/src/core/common/qt_messages.h @@ -43,11 +43,11 @@ IPC_MESSAGE_ROUTED1(WebChannelIPCTransport_Uninstall, uint /* worldId */) IPC_MESSAGE_ROUTED2(WebChannelIPCTransport_Message, std::vector /*binaryJSON*/, uint /* worldId */) // User scripts messages -IPC_MESSAGE_ROUTED1(RenderViewObserverHelper_AddScript, +IPC_MESSAGE_ROUTED1(RenderFrameObserverHelper_AddScript, UserScriptData /* script */) -IPC_MESSAGE_ROUTED1(RenderViewObserverHelper_RemoveScript, +IPC_MESSAGE_ROUTED1(RenderFrameObserverHelper_RemoveScript, UserScriptData /* script */) -IPC_MESSAGE_ROUTED0(RenderViewObserverHelper_ClearScripts) +IPC_MESSAGE_ROUTED0(RenderFrameObserverHelper_ClearScripts) IPC_MESSAGE_CONTROL1(UserResourceController_AddScript, UserScriptData /* scriptContents */) IPC_MESSAGE_CONTROL1(UserResourceController_RemoveScript, UserScriptData /* scriptContents */) diff --git a/src/core/config/common.pri b/src/core/config/common.pri index 8c06b9b35..ce7364ff9 100644 --- a/src/core/config/common.pri +++ b/src/core/config/common.pri @@ -4,11 +4,10 @@ gn_args += \ use_qt=true \ is_component_build=false \ is_shared=true \ - enable_media_router=false \ enable_nacl=false \ enable_remoting=false \ enable_web_speech=false \ - use_experimental_allocator_shim=false \ + use_allocator_shim=false \ use_allocator=\"none\" \ v8_use_external_startup_data=false \ treat_warnings_as_errors=false \ @@ -56,6 +55,10 @@ CONFIG(release, debug|release) { } } +CONFIG(debug, debug|release) { + gn_args += use_debug_fission=false +} + !webcore_debug: gn_args += remove_webcore_debug_symbols=true !v8base_debug: gn_args += remove_v8base_debug_symbols=true diff --git a/src/core/config/linux.pri b/src/core/config/linux.pri index 28278e903..ee410bdde 100644 --- a/src/core/config/linux.pri +++ b/src/core/config/linux.pri @@ -122,8 +122,9 @@ host_build { } qtConfig(system-zlib): use?(system_minizip): gn_args += use_system_zlib=true use_system_minizip=true - qtConfig(system-png): gn_args += use_system_libpng=true + use?(system_libpng): gn_args += use_system_libpng=true qtConfig(system-jpeg): gn_args += use_system_libjpeg=true + qtConfig(system-freetype): gn_args += use_system_freetype=true use?(system_harfbuzz): gn_args += use_system_harfbuzz=true !use?(glib): gn_args += use_glib=false qtConfig(pulseaudio) { diff --git a/src/core/config/windows.pri b/src/core/config/windows.pri index f5dd4a9d3..f74e0bb85 100644 --- a/src/core/config/windows.pri +++ b/src/core/config/windows.pri @@ -7,12 +7,25 @@ gn_args += \ enable_session_service=false \ ninja_use_custom_environment_files=false \ is_multi_dll_chrome=false \ - use_incremental_linking=false \ win_linker_timing=true isDeveloperBuild() { gn_args += \ is_win_fastlink=true + + # Incremental linking doesn't work in release developer builds due to usage of /OPT:ICF + # by Chromium. + CONFIG(debug, debug|release) { + gn_args += \ + use_incremental_linking=true + } else { + gn_args += \ + use_incremental_linking=false + } +} else { + gn_args += \ + is_win_fastlink=false \ + use_incremental_linking=false } defineTest(usingMSVC32BitCrossCompiler) { diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp index 5bce81f25..a087940ef 100644 --- a/src/core/content_browser_client_qt.cpp +++ b/src/core/content_browser_client_qt.cpp @@ -69,7 +69,8 @@ #include "device/geolocation/geolocation_provider.h" #include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding_set.h" -#include "services/service_manager/public/cpp/interface_registry.h" +#include "services/service_manager/public/cpp/bind_source_info.h" +#include "services/service_manager/public/cpp/binder_registry.h" #include "third_party/WebKit/public/platform/modules/sensitive_input_visibility/sensitive_input_visibility_service.mojom.h" #include "ui/base/ui_base_switches.h" #include "ui/display/screen.h" @@ -489,6 +490,7 @@ void ContentBrowserClientQt::AllowCertificateError(content::WebContents *webCont void ContentBrowserClientQt::SelectClientCertificate(content::WebContents * /*webContents*/, net::SSLCertRequestInfo * /*certRequestInfo*/, + net::CertificateList /*client_certs*/, std::unique_ptr delegate) { delegate->ContinueWithCertificate(nullptr); @@ -569,6 +571,7 @@ public: return FromWebContents(web_contents); } static void BindSensitiveInputVisibilityService(content::RenderFrameHost* render_frame_host, + const service_manager::BindSourceInfo& source_info, blink::mojom::SensitiveInputVisibilityServiceRequest request) { CreateForRenderFrameHost(render_frame_host); @@ -595,12 +598,54 @@ private: }; -void ContentBrowserClientQt::RegisterRenderFrameMojoInterfaces(service_manager::InterfaceRegistry* registry, - content::RenderFrameHost* render_frame_host) +void ContentBrowserClientQt::ExposeInterfacesToFrame(service_manager::BinderRegistry* registry, + content::RenderFrameHost* render_frame_host) { registry->AddInterface(base::Bind(&ServiceDriver::BindSensitiveInputVisibilityService, render_frame_host)); } +bool ContentBrowserClientQt::CanCreateWindow( + content::RenderFrameHost* opener, + const GURL& opener_url, + const GURL& opener_top_level_frame_url, + const GURL& source_origin, + content::mojom::WindowContainerType container_type, + const GURL& target_url, + const content::Referrer& referrer, + const std::string& frame_name, + WindowOpenDisposition disposition, + const blink::mojom::WindowFeatures& features, + bool user_gesture, + bool opener_suppressed, + bool* no_javascript_access) { + + Q_UNUSED(opener_url); + Q_UNUSED(opener_top_level_frame_url); + Q_UNUSED(source_origin); + Q_UNUSED(container_type); + Q_UNUSED(target_url); + Q_UNUSED(referrer); + Q_UNUSED(frame_name); + Q_UNUSED(disposition); + Q_UNUSED(features); + Q_UNUSED(opener_suppressed); + + if (no_javascript_access) + *no_javascript_access = false; + + content::WebContents* webContents = content::WebContents::FromRenderFrameHost(opener); + + WebEngineSettings *settings = nullptr; + if (webContents) { + WebContentsDelegateQt* delegate = + static_cast(webContents->GetDelegate()); + if (delegate) + settings = delegate->webEngineSettings(); + } + + return (settings && settings->getJavaScriptCanOpenWindowsAutomatically()) || user_gesture; +} + } // namespace QtWebEngineCore DEFINE_WEB_CONTENTS_USER_DATA_KEY(QtWebEngineCore::ServiceDriver); diff --git a/src/core/content_browser_client_qt.h b/src/core/content_browser_client_qt.h index 95c7d2894..eab8e42ab 100644 --- a/src/core/content_browser_client_qt.h +++ b/src/core/content_browser_client_qt.h @@ -66,6 +66,7 @@ class ResourceContext; class WebContentsViewPort; class WebContents; struct MainFunctionParams; +struct Referrer; } namespace gl { @@ -73,7 +74,7 @@ class GLShareGroup; } namespace service_manager { -class InterfaceRegistry; +class BinderRegistry; } namespace QtWebEngineCore { @@ -109,6 +110,7 @@ public: const base::Callback& callback) override; void SelectClientCertificate(content::WebContents* web_contents, net::SSLCertRequestInfo* cert_request_info, + net::CertificateList client_certs, std::unique_ptr delegate) override; content::DevToolsManagerDelegate *GetDevToolsManagerDelegate() override; @@ -117,7 +119,22 @@ public: void AppendExtraCommandLineSwitches(base::CommandLine* command_line, int child_process_id) override; void GetAdditionalWebUISchemes(std::vector* additional_schemes) override; - void RegisterRenderFrameMojoInterfaces(service_manager::InterfaceRegistry* registry, content::RenderFrameHost* render_frame_host) override; + void ExposeInterfacesToFrame(service_manager::BinderRegistry* registry, content::RenderFrameHost* render_frame_host) override; + + bool CanCreateWindow( + content::RenderFrameHost* opener, + const GURL& opener_url, + const GURL& opener_top_level_frame_url, + const GURL& source_origin, + content::mojom::WindowContainerType container_type, + const GURL& target_url, + const content::Referrer& referrer, + const std::string& frame_name, + WindowOpenDisposition disposition, + const blink::mojom::WindowFeatures& features, + bool user_gesture, + bool opener_suppressed, + bool* no_javascript_access) override; #if defined(Q_OS_LINUX) void GetAdditionalMappedFilesForChildProcess(const base::CommandLine& command_line, int child_process_id, content::FileDescriptorInfo* mappings) override; diff --git a/src/core/core_module.pro b/src/core/core_module.pro index 3785ddc46..1a5b66867 100644 --- a/src/core/core_module.pro +++ b/src/core/core_module.pro @@ -47,7 +47,17 @@ CONFIG *= no_smart_library_merge osx { LIBS_PRIVATE += -Wl,-force_load,$${api_library_path}$${QMAKE_DIR_SEP}lib$${api_library_name}.a } else:msvc { - QMAKE_LFLAGS += /OPT:REF + !isDeveloperBuild() { + # Remove unused functions and data in debug non-developer builds, because the binaries will + # be smaller in the shipped packages. + QMAKE_LFLAGS += /OPT:REF + } else:CONFIG(debug, debug|release) { + # Make sure to override qtbase's QMAKE_LFLAGS_DEBUG option in debug developer builds, + # because qmake chooses and overrides the option when it gets appended to QMAKE_LFLAGS in + # qtbase\mkspecs\features\default_post.prf, regardless of what Chromium passes back from GN. + QMAKE_LFLAGS_DEBUG -= /DEBUG + QMAKE_LFLAGS_DEBUG += /DEBUG:FASTLINK + } QMAKE_LFLAGS += /WHOLEARCHIVE:$${api_library_path}$${QMAKE_DIR_SEP}$${api_library_name}.lib } else { LIBS_PRIVATE += -Wl,-whole-archive -l$$api_library_name -Wl,-no-whole-archive diff --git a/src/core/delegated_frame_node.cpp b/src/core/delegated_frame_node.cpp index 0384d1ce4..dba25d679 100644 --- a/src/core/delegated_frame_node.cpp +++ b/src/core/delegated_frame_node.cpp @@ -69,7 +69,7 @@ #include "cc/quads/yuv_video_draw_quad.h" #include "cc/resources/returned_resource.h" #include "cc/resources/transferable_resource.h" -#include "components/display_compositor/host_shared_bitmap_manager.h" +#include "components/viz/display_compositor/host_shared_bitmap_manager.h" #include "gpu/command_buffer/service/mailbox_manager.h" #include "ui/gl/gl_context.h" #include "ui/gl/gl_fence.h" @@ -236,8 +236,11 @@ public: QSGNode *) override { QSGTextureNode *textureNode = static_cast(*m_nodeIterator++); - if (textureNode->texture() != texture) + if (textureNode->texture() != texture) { textureNode->setTexture(texture); + // @TODO: This is a workaround for funky rendering, figure out why this is needed. + textureNode->markDirty(QSGTextureNode::DirtyGeometry); + } if (textureNode->textureCoordinatesTransform() != texCoordTransForm) textureNode->setTextureCoordinatesTransform(texCoordTransForm); if (textureNode->rect() != rect) @@ -251,15 +254,17 @@ public: QSGTexture::Filtering filtering, QSGNode *) override { QSGTextureNode *textureNode = static_cast(*m_nodeIterator++); - + if (textureNode->texture() != texture) { + textureNode->setTexture(texture); + // @TODO: This is a workaround for funky rendering, figure out why this is needed. + textureNode->markDirty(QSGTextureNode::DirtyGeometry); + } if (textureNode->rect() != rect) textureNode->setRect(rect); if (textureNode->sourceRect() != sourceRect) textureNode->setSourceRect(sourceRect); if (textureNode->filtering() != filtering) textureNode->setFiltering(filtering); - if (textureNode->texture() != texture) - textureNode->setTexture(texture); } void setupSolidColorNode(const QRect &rect, const QColor &color, QSGNode *) override { @@ -652,7 +657,7 @@ QSharedPointer ResourceHolder::initTexture(bool quadNeedsBlending, R if (!texture) { if (m_resource.is_software) { Q_ASSERT(apiDelegate); - std::unique_ptr sharedBitmap = display_compositor::HostSharedBitmapManager::current()->GetSharedBitmapFromId(m_resource.size, m_resource.mailbox_holder.mailbox); + std::unique_ptr sharedBitmap = viz::HostSharedBitmapManager::current()->GetSharedBitmapFromId(m_resource.size, m_resource.mailbox_holder.mailbox); // QSG interprets QImage::hasAlphaChannel meaning that a node should enable blending // to draw it but Chromium keeps this information in the quads. // The input format is currently always Format_ARGB32_Premultiplied, so assume that all diff --git a/src/core/desktop_screen_qt.cpp b/src/core/desktop_screen_qt.cpp index 380a876e4..b63511c92 100644 --- a/src/core/desktop_screen_qt.cpp +++ b/src/core/desktop_screen_qt.cpp @@ -81,7 +81,7 @@ display::Display DesktopScreenQt::GetDisplayNearestWindow(gfx::NativeWindow wind { // RenderViewHostImpl::OnStartDragging uses this to determine // the scale factor for the view. - return display::Display(); + return display::Display(0); } display::Display DesktopScreenQt::GetDisplayNearestPoint(const gfx::Point& point) const @@ -98,7 +98,7 @@ display::Display DesktopScreenQt::GetDisplayMatching(const gfx::Rect& match_rect display::Display DesktopScreenQt::GetPrimaryDisplay() const { - return display::Display(); + return display::Display(0); } void DesktopScreenQt::AddObserver(display::DisplayObserver* observer) diff --git a/src/core/gl_surface_qt.cpp b/src/core/gl_surface_qt.cpp index e54e959c3..69609f4d4 100644 --- a/src/core/gl_surface_qt.cpp +++ b/src/core/gl_surface_qt.cpp @@ -437,6 +437,11 @@ bool GLSurfaceEGL::IsCreateContextWebGLCompatabilitySupported() return false; } +bool GLSurfaceEGL::IsEGLContextPrioritySupported() +{ + return false; +} + void GLSurfaceEGL::ShutdownOneOff() { } diff --git a/src/core/network_delegate_qt.cpp b/src/core/network_delegate_qt.cpp index 5878095e6..6507ac1cc 100644 --- a/src/core/network_delegate_qt.cpp +++ b/src/core/network_delegate_qt.cpp @@ -316,4 +316,24 @@ bool NetworkDelegateQt::OnCancelURLRequestWithPolicyViolatingReferrerHeader(cons return false; } +bool NetworkDelegateQt::OnCanQueueReportingReport(const url::Origin& origin) const +{ + return false; +} + +bool NetworkDelegateQt::OnCanSendReportingReport(const url::Origin& origin) const +{ + return false; +} + +bool NetworkDelegateQt::OnCanSetReportingClient(const url::Origin& origin, const GURL& endpoint) const +{ + return false; +} + +bool NetworkDelegateQt::OnCanUseReportingClient(const url::Origin& origin, const GURL& endpoint) const +{ + return false; +} + } // namespace QtWebEngineCore diff --git a/src/core/network_delegate_qt.h b/src/core/network_delegate_qt.h index da5b36d19..590b3b20c 100644 --- a/src/core/network_delegate_qt.h +++ b/src/core/network_delegate_qt.h @@ -93,6 +93,13 @@ public: virtual bool OnCanEnablePrivacyMode(const GURL&, const GURL&) const override; virtual bool OnAreExperimentalCookieFeaturesEnabled() const override; virtual bool OnCancelURLRequestWithPolicyViolatingReferrerHeader(const net::URLRequest&, const GURL&, const GURL&) const override; + + virtual bool OnCanQueueReportingReport(const url::Origin& origin) const override; + virtual bool OnCanSendReportingReport(const url::Origin& origin) const override; + virtual bool OnCanSetReportingClient(const url::Origin& origin, + const GURL& endpoint) const override; + virtual bool OnCanUseReportingClient(const url::Origin& origin, + const GURL& endpoint) const override; }; } // namespace QtWebEngineCore diff --git a/src/core/print_view_manager_qt.cpp b/src/core/print_view_manager_qt.cpp index 6493bb7d5..b35f5df4d 100644 --- a/src/core/print_view_manager_qt.cpp +++ b/src/core/print_view_manager_qt.cpp @@ -57,6 +57,7 @@ #include "content/public/common/web_preferences.h" #include "printing/pdf_metafile_skia.h" #include "printing/print_job_constants.h" +#include "printing/units.h" DEFINE_WEB_CONTENTS_USER_DATA_KEY(QtWebEngineCore::PrintViewManagerQt); @@ -129,6 +130,10 @@ static base::DictionaryValue *createPrintSettings() printSettings->SetBoolean(printing::kSettingGenerateDraftData, false); printSettings->SetBoolean(printing::kSettingPreviewModifiable, false); + + printSettings->SetInteger(printing::kSettingDpiHorizontal, printing::kPointsPerInch); + printSettings->SetInteger(printing::kSettingDpiVertical, printing::kPointsPerInch); + printSettings->SetInteger(printing::kSettingDuplexMode, printing::SIMPLEX); printSettings->SetInteger(printing::kSettingCopies, 1); printSettings->SetBoolean(printing::kSettingCollate, false); diff --git a/src/core/qtwebengine_sources.gni b/src/core/qtwebengine_sources.gni index d766bde38..d7fe4d70d 100644 --- a/src/core/qtwebengine_sources.gni +++ b/src/core/qtwebengine_sources.gni @@ -47,8 +47,8 @@ source_set("qtwebengine_sources") { "//chrome/browser/media/webrtc/desktop_streams_registry.h", "//chrome/common/chrome_switches.cc", "//chrome/common/chrome_switches.h", - "//components/prefs/testing_pref_store.cc", - "//components/prefs/testing_pref_store.h", + "//components/prefs/in_memory_pref_store.cc", + "//components/prefs/in_memory_pref_store.h", "//extensions/common/constants.cc", "//extensions/common/constants.h", "//extensions/common/url_pattern.cc", diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index bf96b1d9b..f36de68c7 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -73,6 +73,7 @@ #include "ui/gfx/geometry/size_conversions.h" #if defined(USE_AURA) +#include "ui/base/cursor/cursor.h" #include "ui/base/cursor/cursors_aura.h" #endif @@ -218,7 +219,8 @@ public: } int GetFlags() const override { return flags; } float GetPressure(size_t pointer_index) const override { return touchPoints.at(pointer_index).pressure(); } - float GetTilt(size_t pointer_index) const override { return 0; } + float GetTiltX(size_t pointer_index) const override { return 0; } + float GetTiltY(size_t pointer_index) const override { return 0; } base::TimeTicks GetEventTime() const override { return eventTime; } size_t GetHistorySize() const override { return 0; } @@ -267,6 +269,7 @@ RenderWidgetHostViewQt::RenderWidgetHostViewQt(content::RenderWidgetHost* widget , m_initPending(false) , m_beginFrameSource(nullptr) , m_needsBeginFrames(false) + , m_needsFlushInput(false) , m_addedFrameObserver(false) , m_backgroundColor(SK_ColorWHITE) , m_imState(0) @@ -487,7 +490,7 @@ void RenderWidgetHostViewQt::UpdateCursor(const content::WebCursor &webCursor) webCursor.GetCursorInfo(&cursorInfo); Qt::CursorShape shape = Qt::ArrowCursor; #if defined(USE_AURA) - int auraType = -1; + ui::CursorType auraType = ui::CursorType::kNull; #endif switch (cursorInfo.type) { case blink::WebCursorInfo::kTypePointer: @@ -551,25 +554,25 @@ void RenderWidgetHostViewQt::UpdateCursor(const content::WebCursor &webCursor) break; #if defined(USE_AURA) case blink::WebCursorInfo::kTypeVerticalText: - auraType = ui::kCursorVerticalText; + auraType = ui::CursorType::kVerticalText; break; case blink::WebCursorInfo::kTypeCell: - auraType = ui::kCursorCell; + auraType = ui::CursorType::kCell; break; case blink::WebCursorInfo::kTypeContextMenu: - auraType = ui::kCursorContextMenu; + auraType = ui::CursorType::kContextMenu; break; case blink::WebCursorInfo::kTypeAlias: - auraType = ui::kCursorAlias; + auraType = ui::CursorType::kAlias; break; case blink::WebCursorInfo::kTypeCopy: - auraType = ui::kCursorCopy; + auraType = ui::CursorType::kCopy; break; case blink::WebCursorInfo::kTypeZoomIn: - auraType = ui::kCursorZoomIn; + auraType = ui::CursorType::kZoomIn; break; case blink::WebCursorInfo::kTypeZoomOut: - auraType = ui::kCursorZoomOut; + auraType = ui::CursorType::kZoomOut; break; #else case blink::WebCursorInfo::kTypeVerticalText: @@ -604,7 +607,7 @@ void RenderWidgetHostViewQt::UpdateCursor(const content::WebCursor &webCursor) break; } #if defined(USE_AURA) - if (auraType > 0) { + if (auraType != ui::CursorType::kNull) { SkBitmap bitmap; gfx::Point hotspot; if (ui::GetCursorBitmap(auraType, &bitmap, &hotspot)) { @@ -1479,24 +1482,34 @@ void RenderWidgetHostViewQt::SetNeedsBeginFrames(bool needs_begin_frames) updateNeedsBeginFramesInternal(); } +void RenderWidgetHostViewQt::OnSetNeedsFlushInput() +{ + m_needsFlushInput = true; + updateNeedsBeginFramesInternal(); +} + void RenderWidgetHostViewQt::updateNeedsBeginFramesInternal() { if (!m_beginFrameSource) return; - if (m_addedFrameObserver == m_needsBeginFrames) + // Based on upstream Chromium commit 7f7c8cc8b97dd0d5c9159d9e60c62efbc35e6b53. + bool needsFrame = m_needsBeginFrames || m_needsFlushInput; + if (m_addedFrameObserver == needsFrame) return; - if (m_needsBeginFrames) + m_addedFrameObserver = needsFrame; + if (needsFrame) m_beginFrameSource->AddObserver(this); else m_beginFrameSource->RemoveObserver(this); - m_addedFrameObserver = m_needsBeginFrames; } bool RenderWidgetHostViewQt::OnBeginFrameDerivedImpl(const cc::BeginFrameArgs& args) { + m_needsFlushInput = false; m_beginFrameSource->OnUpdateVSyncParameters(args.frame_time, args.interval); + updateNeedsBeginFramesInternal(); m_host->Send(new ViewMsg_BeginFrame(m_host->GetRoutingID(), args)); return true; } diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h index 7fc29adb1..63efad87e 100644 --- a/src/core/render_widget_host_view_qt.h +++ b/src/core/render_widget_host_view_qt.h @@ -158,6 +158,7 @@ public: void ProcessAckedTouchEvent(const content::TouchEventWithLatencyInfo &touch, content::InputEventAckState ack_result) override; void ClearCompositorFrame() override; void SetNeedsBeginFrames(bool needs_begin_frames) override; + void OnSetNeedsFlushInput() override; // Overridden from ui::GestureProviderClient. void OnGestureEvent(const ui::GestureEventData& gesture) override; @@ -255,6 +256,7 @@ private: std::unique_ptr m_beginFrameSource; bool m_needsBeginFrames; + bool m_needsFlushInput; bool m_addedFrameObserver; gfx::Vector2dF m_lastScrollOffset; diff --git a/src/core/renderer/content_renderer_client_qt.cpp b/src/core/renderer/content_renderer_client_qt.cpp index a3b0fece8..ab8e27939 100644 --- a/src/core/renderer/content_renderer_client_qt.cpp +++ b/src/core/renderer/content_renderer_client_qt.cpp @@ -57,6 +57,9 @@ #include "components/visitedlink/renderer/visitedlink_slave.h" #include "components/web_cache/renderer/web_cache_impl.h" #include "content/public/renderer/render_frame.h" +#include "content/public/child/child_thread.h" +#include "content/public/common/service_manager_connection.h" +#include "content/public/common/simple_connection_filter.h" #include "content/public/renderer/render_thread.h" #include "content/public/renderer/render_view.h" #include "net/base/net_errors.h" @@ -75,7 +78,7 @@ #include "renderer/render_view_observer_qt.h" #include "renderer/user_resource_controller.h" #include "renderer/web_channel_ipc_transport.h" -#include "services/service_manager/public/cpp/interface_registry.h" +#include "services/service_manager/public/cpp/binder_registry.h" #include "components/grit/components_resources.h" @@ -98,8 +101,16 @@ void ContentRendererClientQt::RenderThreadStarted() content::RenderThread *renderThread = content::RenderThread::Get(); m_visitedLinkSlave.reset(new visitedlink::VisitedLinkSlave); m_webCacheImpl.reset(new web_cache::WebCacheImpl()); - renderThread->GetInterfaceRegistry()->AddInterface( - m_visitedLinkSlave->GetBindCallback()); + + auto registry = base::MakeUnique(); + registry->AddInterface(m_visitedLinkSlave->GetBindCallback(), + base::ThreadTaskRunnerHandle::Get()); + content::ChildThread::Get() + ->GetServiceManagerConnection() + ->AddConnectionFilter(base::MakeUnique( + std::move(registry))); + + renderThread->AddObserver(UserResourceController::instance()); #if BUILDFLAG(ENABLE_SPELLCHECK) @@ -119,6 +130,8 @@ void ContentRendererClientQt::RenderViewCreated(content::RenderView* render_view void ContentRendererClientQt::RenderFrameCreated(content::RenderFrame* render_frame) { new QtWebEngineCore::RenderFrameObserverQt(render_frame); + UserResourceController::instance()->renderFrameCreated(render_frame); + #if BUILDFLAG(ENABLE_SPELLCHECK) new SpellCheckProvider(render_frame, m_spellCheck.data()); #endif diff --git a/src/core/renderer/render_frame_observer_qt.cpp b/src/core/renderer/render_frame_observer_qt.cpp index 111323b8a..7e6d11644 100644 --- a/src/core/renderer/render_frame_observer_qt.cpp +++ b/src/core/renderer/render_frame_observer_qt.cpp @@ -64,6 +64,10 @@ RenderFrameObserverQt::~RenderFrameObserverQt() { } +void RenderFrameObserverQt::OnDestruct() { + delete this; +} + #if BUILDFLAG(ENABLE_PLUGINS) void RenderFrameObserverQt::DidCreatePepperPlugin(content::RendererPpapiHost* host) { diff --git a/src/core/renderer/render_frame_observer_qt.h b/src/core/renderer/render_frame_observer_qt.h index 7abd17e96..ac098a961 100644 --- a/src/core/renderer/render_frame_observer_qt.h +++ b/src/core/renderer/render_frame_observer_qt.h @@ -63,7 +63,7 @@ public: #if BUILDFLAG(ENABLE_PLUGINS) void DidCreatePepperPlugin(content::RendererPpapiHost* host) override; #endif - void OnDestruct() override { } + void OnDestruct() override; void FrameDetached() override; bool isFrameDetached() const; diff --git a/src/core/renderer/render_view_observer_qt.cpp b/src/core/renderer/render_view_observer_qt.cpp index 676210688..4893a5188 100644 --- a/src/core/renderer/render_view_observer_qt.cpp +++ b/src/core/renderer/render_view_observer_qt.cpp @@ -83,6 +83,11 @@ void RenderViewObserverQt::onSetBackgroundColor(quint32 color) render_view()->GetWebFrameWidget()->SetBaseBackgroundColor(color); } +void RenderViewObserverQt::OnDestruct() +{ + delete this; +} + bool RenderViewObserverQt::OnMessageReceived(const IPC::Message& message) { bool handled = true; diff --git a/src/core/renderer/render_view_observer_qt.h b/src/core/renderer/render_view_observer_qt.h index 60b11c428..abb472f02 100644 --- a/src/core/renderer/render_view_observer_qt.h +++ b/src/core/renderer/render_view_observer_qt.h @@ -57,7 +57,7 @@ private: void onFetchDocumentInnerText(quint64 requestId); void onSetBackgroundColor(quint32 color); - void OnDestruct() override { } + void OnDestruct() override; bool OnMessageReceived(const IPC::Message& message) override; void Navigate(const GURL& url) override; diff --git a/src/core/renderer/user_resource_controller.cpp b/src/core/renderer/user_resource_controller.cpp index d2e70a226..d479c559b 100644 --- a/src/core/renderer/user_resource_controller.cpp +++ b/src/core/renderer/user_resource_controller.cpp @@ -43,6 +43,7 @@ #include "base/strings/pattern.h" #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_view.h" +#include "content/public/renderer/render_frame_observer.h" #include "content/public/renderer/render_view_observer.h" #include "extensions/common/url_pattern.h" #include "third_party/WebKit/public/web/WebDocument.h" @@ -97,16 +98,16 @@ static bool scriptMatchesURL(const UserScriptData &scriptData, const GURL &url) return true; } -class UserResourceController::RenderViewObserverHelper : public content::RenderViewObserver +class UserResourceController::RenderFrameObserverHelper : public content::RenderFrameObserver { public: - RenderViewObserverHelper(content::RenderView *); + RenderFrameObserverHelper(content::RenderFrame* render_frame); private: - // RenderViewObserver implementation. - void DidFinishDocumentLoad(blink::WebLocalFrame* frame) override; - void DidFinishLoad(blink::WebLocalFrame* frame) override; - void DidStartProvisionalLoad(blink::WebLocalFrame* frame) override; - void FrameDetached(blink::WebFrame* frame) override; + // RenderFrameObserver implementation. + void DidFinishDocumentLoad() override; + void DidFinishLoad() override; + void DidStartProvisionalLoad(blink::WebDataSource* data_source) override; + void FrameDetached() override; void OnDestruct() override; bool OnMessageReceived(const IPC::Message& message) override; @@ -115,10 +116,23 @@ private: void onScriptsCleared(); void runScripts(UserScriptData::InjectionPoint, blink::WebLocalFrame *); + + // Set of frames which are pending to get an AfterLoad invocation of runScripts, if they + // haven't gotten it already. QSet m_pendingFrames; }; -void UserResourceController::RenderViewObserverHelper::runScripts(UserScriptData::InjectionPoint p, blink::WebLocalFrame *frame) +// Used only for script cleanup on RenderView destruction. +class UserResourceController::RenderViewObserverHelper : public content::RenderViewObserver +{ +public: + RenderViewObserverHelper(content::RenderView* render_view); +private: + // RenderViewObserver implementation. + void OnDestruct() override; +}; + +void UserResourceController::RenderFrameObserverHelper::runScripts(UserScriptData::InjectionPoint p, blink::WebLocalFrame *frame) { if (p == UserScriptData::AfterLoad && !m_pendingFrames.remove(frame)) return; @@ -128,10 +142,11 @@ void UserResourceController::RenderViewObserverHelper::runScripts(UserScriptData void UserResourceController::runScripts(UserScriptData::InjectionPoint p, blink::WebLocalFrame *frame) { - content::RenderView *renderView = content::RenderView::FromWebView(frame->View()); - const bool isMainFrame = (frame == renderView->GetWebView()->MainFrame()); + content::RenderFrame *renderFrame = content::RenderFrame::FromWebFrame(frame); + content::RenderView *renderView = renderFrame->GetRenderView(); + const bool isMainFrame = renderFrame->IsMainFrame(); - QList scriptsToRun = m_viewUserScriptMap.value(globalScriptsIndex).toList(); + QList scriptsToRun = m_viewUserScriptMap.value(0).toList(); scriptsToRun.append(m_viewUserScriptMap.value(renderView).toList()); Q_FOREACH (uint64_t id, scriptsToRun) { @@ -159,67 +174,89 @@ void UserResourceController::RunScriptsAtDocumentEnd(content::RenderFrame *rende runScripts(UserScriptData::DocumentLoadFinished, render_frame->GetWebFrame()); } -UserResourceController::RenderViewObserverHelper::RenderViewObserverHelper(content::RenderView *renderView) - : content::RenderViewObserver(renderView) +UserResourceController::RenderFrameObserverHelper::RenderFrameObserverHelper(content::RenderFrame *render_frame) + : content::RenderFrameObserver(render_frame) { } -void UserResourceController::RenderViewObserverHelper::DidFinishDocumentLoad(blink::WebLocalFrame *frame) +UserResourceController::RenderViewObserverHelper::RenderViewObserverHelper(content::RenderView *render_view) + : content::RenderViewObserver(render_view) { +} + +void UserResourceController::RenderFrameObserverHelper::DidFinishDocumentLoad() +{ + blink::WebLocalFrame *frame = render_frame()->GetWebFrame(); m_pendingFrames.insert(frame); - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(FROM_HERE, base::Bind(&UserResourceController::RenderViewObserverHelper::runScripts, + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(FROM_HERE, base::Bind(&UserResourceController::RenderFrameObserverHelper::runScripts, base::Unretained(this), UserScriptData::AfterLoad, frame), base::TimeDelta::FromMilliseconds(afterLoadTimeout)); } -void UserResourceController::RenderViewObserverHelper::DidFinishLoad(blink::WebLocalFrame *frame) +void UserResourceController::RenderFrameObserverHelper::DidFinishLoad() { + blink::WebLocalFrame *frame = render_frame()->GetWebFrame(); + // DidFinishDocumentLoad always comes before this, so frame has already been marked as pending. - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, base::Bind(&UserResourceController::RenderViewObserverHelper::runScripts, + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, base::Bind(&UserResourceController::RenderFrameObserverHelper::runScripts, base::Unretained(this), UserScriptData::AfterLoad, frame)); } -void UserResourceController::RenderViewObserverHelper::DidStartProvisionalLoad(blink::WebLocalFrame *frame) +void UserResourceController::RenderFrameObserverHelper::DidStartProvisionalLoad(blink::WebDataSource *data_source) { + Q_UNUSED(data_source); + blink::WebLocalFrame *frame = render_frame()->GetWebFrame(); m_pendingFrames.remove(frame); } -void UserResourceController::RenderViewObserverHelper::FrameDetached(blink::WebFrame *frame) +void UserResourceController::RenderFrameObserverHelper::FrameDetached() { - if (frame->IsWebLocalFrame()) - m_pendingFrames.remove(frame->ToWebLocalFrame()); + blink::WebLocalFrame *frame = render_frame()->GetWebFrame(); + m_pendingFrames.remove(frame); +} + +void UserResourceController::RenderFrameObserverHelper::OnDestruct() +{ + // FIXME: Without this the instance will leak, but we can't delete it because the posted tasks + // could be executed after the instance is deleted. + //delete this; } void UserResourceController::RenderViewObserverHelper::OnDestruct() { + // Remove all scripts associated with the render view. UserResourceController::instance()->renderViewDestroyed(render_view()); + delete this; } -bool UserResourceController::RenderViewObserverHelper::OnMessageReceived(const IPC::Message &message) +bool UserResourceController::RenderFrameObserverHelper::OnMessageReceived(const IPC::Message &message) { bool handled = true; - IPC_BEGIN_MESSAGE_MAP(UserResourceController::RenderViewObserverHelper, message) - IPC_MESSAGE_HANDLER(RenderViewObserverHelper_AddScript, onUserScriptAdded) - IPC_MESSAGE_HANDLER(RenderViewObserverHelper_RemoveScript, onUserScriptRemoved) - IPC_MESSAGE_HANDLER(RenderViewObserverHelper_ClearScripts, onScriptsCleared) + IPC_BEGIN_MESSAGE_MAP(UserResourceController::RenderFrameObserverHelper, message) + IPC_MESSAGE_HANDLER(RenderFrameObserverHelper_AddScript, onUserScriptAdded) + IPC_MESSAGE_HANDLER(RenderFrameObserverHelper_RemoveScript, onUserScriptRemoved) + IPC_MESSAGE_HANDLER(RenderFrameObserverHelper_ClearScripts, onScriptsCleared) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; } -void UserResourceController::RenderViewObserverHelper::onUserScriptAdded(const UserScriptData &script) +void UserResourceController::RenderFrameObserverHelper::onUserScriptAdded(const UserScriptData &script) { - UserResourceController::instance()->addScriptForView(script, render_view()); + content::RenderView *view = render_frame()->GetRenderView(); + UserResourceController::instance()->addScriptForView(script, view); } -void UserResourceController::RenderViewObserverHelper::onUserScriptRemoved(const UserScriptData &script) +void UserResourceController::RenderFrameObserverHelper::onUserScriptRemoved(const UserScriptData &script) { - UserResourceController::instance()->removeScriptForView(script, render_view()); + content::RenderView *view = render_frame()->GetRenderView(); + UserResourceController::instance()->removeScriptForView(script, view); } -void UserResourceController::RenderViewObserverHelper::onScriptsCleared() +void UserResourceController::RenderFrameObserverHelper::onScriptsCleared() { - UserResourceController::instance()->clearScriptsForView(render_view()); + content::RenderView *view = render_frame()->GetRenderView(); + UserResourceController::instance()->clearScriptsForView(view); } UserResourceController *UserResourceController::instance() @@ -248,9 +285,16 @@ UserResourceController::UserResourceController() #endif // !defined(QT_NO_DEBUG) || defined(QT_FORCE_ASSERTS) } +void UserResourceController::renderFrameCreated(content::RenderFrame *renderFrame) +{ + // FIXME: Actually make this to be true. + // Will destroy itself when the RenderView is destroyed. + new RenderFrameObserverHelper(renderFrame); +} + void UserResourceController::renderViewCreated(content::RenderView *renderView) { - // Will destroy itself with their RenderView. + // Will destroy itself when the RenderView is destroyed. new RenderViewObserverHelper(renderView); } diff --git a/src/core/renderer/user_resource_controller.h b/src/core/renderer/user_resource_controller.h index 5d412fe40..50af24243 100644 --- a/src/core/renderer/user_resource_controller.h +++ b/src/core/renderer/user_resource_controller.h @@ -61,8 +61,9 @@ class UserResourceController : public content::RenderThreadObserver { public: static UserResourceController *instance(); UserResourceController(); + void renderFrameCreated(content::RenderFrame *); void renderViewCreated(content::RenderView *); - void renderViewDestroyed(content::RenderView *); + void renderViewDestroyed(content::RenderView *renderView); void addScriptForView(const UserScriptData &, content::RenderView *); void removeScriptForView(const UserScriptData &, content::RenderView *); void clearScriptsForView(content::RenderView *); @@ -73,6 +74,7 @@ public: private: Q_DISABLE_COPY(UserResourceController) + class RenderFrameObserverHelper; class RenderViewObserverHelper; // RenderProcessObserver implementation. @@ -89,7 +91,7 @@ private: ViewUserScriptMap m_viewUserScriptMap; QHash m_scripts; - friend class RenderViewObserverHelper; + friend class RenderFrameObserverHelper; }; #endif // USER_RESOURCE_CONTROLLER_H diff --git a/src/core/renderer/web_channel_ipc_transport.cpp b/src/core/renderer/web_channel_ipc_transport.cpp index c685cd465..cec8344b6 100644 --- a/src/core/renderer/web_channel_ipc_transport.cpp +++ b/src/core/renderer/web_channel_ipc_transport.cpp @@ -254,4 +254,9 @@ bool WebChannelIPCTransport::OnMessageReceived(const IPC::Message &message) return handled; } +void WebChannelIPCTransport::OnDestruct() +{ + delete this; +} + } // namespace diff --git a/src/core/renderer/web_channel_ipc_transport.h b/src/core/renderer/web_channel_ipc_transport.h index a2c7d5b4e..04041c6c7 100644 --- a/src/core/renderer/web_channel_ipc_transport.h +++ b/src/core/renderer/web_channel_ipc_transport.h @@ -71,7 +71,7 @@ private: // content::RenderViewObserver overrides: bool OnMessageReceived(const IPC::Message &message) override; - void OnDestruct() override { } + void OnDestruct() override; bool m_installed; uint m_installedWorldId; diff --git a/src/core/renderer_host/user_resource_controller_host.cpp b/src/core/renderer_host/user_resource_controller_host.cpp index 0a6decaf9..f90aebda6 100644 --- a/src/core/renderer_host/user_resource_controller_host.cpp +++ b/src/core/renderer_host/user_resource_controller_host.cpp @@ -47,6 +47,7 @@ #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host_observer.h" #include "content/public/browser/render_view_host.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" @@ -57,8 +58,9 @@ public: WebContentsObserverHelper(UserResourceControllerHost *, content::WebContents *); // WebContentsObserver overrides: - void RenderViewCreated(content::RenderViewHost *renderViewHost) override; - void RenderViewHostChanged(content::RenderViewHost *oldHost, content::RenderViewHost *newHost) override; + void RenderFrameCreated(content::RenderFrameHost *renderFrameHost) override; + void RenderFrameHostChanged(content::RenderFrameHost *oldHost, + content::RenderFrameHost *newHost) override; void WebContentsDestroyed() override; private: @@ -71,22 +73,26 @@ UserResourceControllerHost::WebContentsObserverHelper::WebContentsObserverHelper { } -void UserResourceControllerHost::WebContentsObserverHelper::RenderViewCreated(content::RenderViewHost *renderViewHost) +void UserResourceControllerHost::WebContentsObserverHelper::RenderFrameCreated( + content::RenderFrameHost *renderFrameHost) { content::WebContents *contents = web_contents(); Q_FOREACH (const UserScript &script, m_controllerHost->m_perContentsScripts.value(contents)) - renderViewHost->Send(new RenderViewObserverHelper_AddScript(renderViewHost->GetRoutingID(), script.data())); + renderFrameHost->Send(new RenderFrameObserverHelper_AddScript( + renderFrameHost->GetRoutingID(), script.data())); } -void UserResourceControllerHost::WebContentsObserverHelper::RenderViewHostChanged(content::RenderViewHost *oldHost, - content::RenderViewHost *newHost) +void UserResourceControllerHost::WebContentsObserverHelper::RenderFrameHostChanged( + content::RenderFrameHost *oldHost, + content::RenderFrameHost *newHost) { if (oldHost) - oldHost->Send(new RenderViewObserverHelper_ClearScripts(oldHost->GetRoutingID())); + oldHost->Send(new RenderFrameObserverHelper_ClearScripts(oldHost->GetRoutingID())); content::WebContents *contents = web_contents(); Q_FOREACH (const UserScript &script, m_controllerHost->m_perContentsScripts.value(contents)) - newHost->Send(new RenderViewObserverHelper_AddScript(newHost->GetRoutingID(), script.data())); + newHost->Send(new RenderFrameObserverHelper_AddScript(newHost->GetRoutingID(), + script.data())); } void UserResourceControllerHost::WebContentsObserverHelper::WebContentsDestroyed() @@ -119,7 +125,8 @@ void UserResourceControllerHost::addUserScript(const UserScript &script, WebCont if (script.isNull()) return; // Global scripts should be dispatched to all our render processes. - if (!adapter) { + const bool isProfileWideScript = !adapter; + if (isProfileWideScript) { if (!m_profileWideScripts.contains(script)) { m_profileWideScripts.append(script); Q_FOREACH (content::RenderProcessHost *renderer, m_observedProcesses) @@ -140,7 +147,9 @@ void UserResourceControllerHost::addUserScript(const UserScript &script, WebCont m_perContentsScripts.insert(contents, currentScripts); } } - contents->Send(new RenderViewObserverHelper_AddScript(contents->GetRenderViewHost()->GetRoutingID(), script.data())); + contents->Send(new RenderFrameObserverHelper_AddScript(contents->GetRenderViewHost()-> + GetMainFrame()->GetRoutingID(), + script.data())); } } @@ -149,7 +158,8 @@ bool UserResourceControllerHost::containsUserScript(const UserScript &script, We if (script.isNull()) return false; // Global scripts should be dispatched to all our render processes. - if (!adapter) + const bool isProfileWideScript = !adapter; + if (isProfileWideScript) return m_profileWideScripts.contains(script); return m_perContentsScripts.value(adapter->webContents()).contains(script); } @@ -158,7 +168,8 @@ bool UserResourceControllerHost::removeUserScript(const UserScript &script, WebC { if (script.isNull()) return false; - if (!adapter) { + const bool isProfileWideScript = !adapter; + if (isProfileWideScript) { QList::iterator it = std::find(m_profileWideScripts.begin(), m_profileWideScripts.end(), script); if (it == m_profileWideScripts.end()) @@ -174,7 +185,9 @@ bool UserResourceControllerHost::removeUserScript(const UserScript &script, WebC QList::iterator it = std::find(list.begin(), list.end(), script); if (it == list.end()) return false; - contents->Send(new RenderViewObserverHelper_RemoveScript(contents->GetRenderViewHost()->GetRoutingID(), (*it).data())); + contents->Send(new RenderFrameObserverHelper_RemoveScript(contents-> + GetMainFrame()->GetRoutingID(), + (*it).data())); list.erase(it); } return true; @@ -182,27 +195,31 @@ bool UserResourceControllerHost::removeUserScript(const UserScript &script, WebC void UserResourceControllerHost::clearAllScripts(WebContentsAdapter *adapter) { - if (!adapter) { + const bool isProfileWideScript = !adapter; + if (isProfileWideScript) { m_profileWideScripts.clear(); Q_FOREACH (content::RenderProcessHost *renderer, m_observedProcesses) renderer->Send(new UserResourceController_ClearScripts); } else { content::WebContents *contents = adapter->webContents(); m_perContentsScripts.remove(contents); - contents->Send(new RenderViewObserverHelper_ClearScripts(contents->GetRenderViewHost()->GetRoutingID())); + contents->Send(new RenderFrameObserverHelper_ClearScripts(contents-> + GetMainFrame()->GetRoutingID())); } } const QList UserResourceControllerHost::registeredScripts(WebContentsAdapter *adapter) const { - if (!adapter) + const bool isProfileWideScript = !adapter; + if (isProfileWideScript) return m_profileWideScripts; return m_perContentsScripts.value(adapter->webContents()); } void UserResourceControllerHost::reserve(WebContentsAdapter *adapter, int count) { - if (!adapter) + const bool isProfileWideScript = !adapter; + if (isProfileWideScript) m_profileWideScripts.reserve(count); else m_perContentsScripts[adapter->webContents()].reserve(count); diff --git a/src/core/url_request_context_getter_qt.cpp b/src/core/url_request_context_getter_qt.cpp index fe1758655..8a6717e91 100644 --- a/src/core/url_request_context_getter_qt.cpp +++ b/src/core/url_request_context_getter_qt.cpp @@ -189,9 +189,9 @@ void URLRequestContextGetterQt::cancelAllUrlRequests() Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); Q_ASSERT(m_urlRequestContext); - std::set* url_requests = m_urlRequestContext->url_requests(); - std::set::const_iterator it = url_requests->begin(); - std::set::const_iterator end = url_requests->end(); + const std::set& url_requests = m_urlRequestContext->url_requests(); + std::set::const_iterator it = url_requests.begin(); + std::set::const_iterator end = url_requests.end(); for ( ; it != end; ++it) { net::URLRequest* request = const_cast(*it); if (request) diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index e4e902bc5..6181c0b72 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -169,7 +169,7 @@ static QVariant fromJSValue(const base::Value *result) } case base::Value::Type::BINARY: { - QByteArray data(result->GetBuffer(), result->GetSize()); + QByteArray data(result->GetBlob().data(), result->GetBlob().size()); ret.setValue(data); break; } diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp index 341fd38f0..ad0e7ad6d 100644 --- a/src/core/web_contents_delegate_qt.cpp +++ b/src/core/web_contents_delegate_qt.cpp @@ -337,7 +337,7 @@ void WebContentsDelegateQt::DidUpdateFaviconURL(const std::vectorupdate(faviconCandidates); } -void WebContentsDelegateQt::WebContentsCreated(content::WebContents* /*source_contents*/, int /*opener_render_process_id*/, int /*opener_render_frame_id*/, const std::string& /*frame_name*/, const GURL& target_url, content::WebContents* new_contents) +void WebContentsDelegateQt::WebContentsCreated(content::WebContents* /*source_contents*/, int /*opener_render_process_id*/, int /*opener_render_frame_id*/, const std::string& /*frame_name*/, const GURL& target_url, content::WebContents* new_contents, const base::Optional& create_params) { this->m_initialTargetUrl = toQt(target_url); } @@ -536,6 +536,10 @@ void WebContentsDelegateQt::BeforeUnloadFired(content::WebContents *tab, bool pr m_viewClient->windowCloseRejected(); } +void WebContentsDelegateQt::BeforeUnloadFired(const base::TimeTicks &proceed_time) { + Q_UNUSED(proceed_time); +} + bool WebContentsDelegateQt::CheckMediaAccessPermission(content::WebContents *web_contents, const GURL& security_origin, content::MediaStreamType type) { switch (type) { @@ -555,4 +559,8 @@ FaviconManager *WebContentsDelegateQt::faviconManager() return m_faviconManager.data(); } +WebEngineSettings *WebContentsDelegateQt::webEngineSettings() const { + return m_viewClient->webEngineSettings(); +} + } // namespace QtWebEngineCore diff --git a/src/core/web_contents_delegate_qt.h b/src/core/web_contents_delegate_qt.h index 20c70ef21..2e37c498a 100644 --- a/src/core/web_contents_delegate_qt.h +++ b/src/core/web_contents_delegate_qt.h @@ -68,6 +68,7 @@ namespace content { namespace QtWebEngineCore { class WebContentsAdapterClient; +class WebEngineSettings; class SavePageInfo { @@ -104,7 +105,7 @@ public: void LoadProgressChanged(content::WebContents* source, double progress) override; void HandleKeyboardEvent(content::WebContents *source, const content::NativeWebKeyboardEvent &event) override; content::ColorChooser *OpenColorChooser(content::WebContents *source, SkColor color, const std::vector &suggestion) override; - void WebContentsCreated(content::WebContents* source_contents, int opener_render_process_id, int opener_render_frame_id, const std::string& frame_name, const GURL& target_url, content::WebContents* new_contents) override; + void WebContentsCreated(content::WebContents* source_contents, int opener_render_process_id, int opener_render_frame_id, const std::string& frame_name, const GURL& target_url, content::WebContents* new_contents, const base::Optional& create_params) override; content::JavaScriptDialogManager *GetJavaScriptDialogManager(content::WebContents *source) override; void EnterFullscreenModeForTab(content::WebContents* web_contents, const GURL& origin) override; void ExitFullscreenModeForTab(content::WebContents*) override; @@ -131,12 +132,12 @@ public: void DidFailLoad(content::RenderFrameHost *render_frame_host, const GURL &validated_url, int error_code, const base::string16 &error_description, bool was_ignored_by_handler) override; void DidFinishLoad(content::RenderFrameHost *render_frame_host, const GURL &validated_url) override; + void BeforeUnloadFired(const base::TimeTicks& proceed_time) override; void DidUpdateFaviconURL(const std::vector &candidates) override; void WasShown() override; void DidFirstVisuallyNonEmptyPaint() override; void ActivateContents(content::WebContents* contents) override; - void didFailLoad(const QUrl &url, int errorCode, const QString &errorDescription); void overrideWebPreferences(content::WebContents *, content::WebPreferences*); void allowCertificateError(const QSharedPointer &) ; @@ -147,6 +148,8 @@ public: void setSavePageInfo(const SavePageInfo &spi) { m_savePageInfo = spi; } const SavePageInfo &savePageInfo() { return m_savePageInfo; } + WebEngineSettings *webEngineSettings() const; + private: QWeakPointer createWindow(content::WebContents *new_contents, WindowOpenDisposition disposition, const gfx::Rect& initial_pos, bool user_gesture); void EmitLoadStarted(const QUrl &url, bool isErrorPage = false); diff --git a/src/core/web_engine_context.cpp b/src/core/web_engine_context.cpp index d88fd8035..4df4dbfae 100644 --- a/src/core/web_engine_context.cpp +++ b/src/core/web_engine_context.cpp @@ -61,6 +61,7 @@ #include "content/public/browser/browser_main_runner.h" #include "content/public/browser/plugin_service.h" #include "content/public/browser/render_frame_host.h" +#include "content/public/common/content_features.h" #include "content/public/common/content_paths.h" #include "content/public/common/content_switches.h" #include "content/public/common/main_function_params.h" @@ -196,7 +197,8 @@ void WebEngineContext::destroy() m_devtoolsServer->stop(); delete m_globalQObject; m_globalQObject = 0; - base::MessagePump::Delegate *delegate = m_runLoop->loop_; + base::MessagePump::Delegate *delegate = + static_cast(m_runLoop->delegate_); // Flush the UI message loop before quitting. while (delegate->DoWork()) { } GLContextHelper::destroy(); @@ -345,6 +347,13 @@ WebEngineContext::WebEngineContext() parsedCommandLine->AppendSwitch(switches::kDisableES3GLContext); #endif + // Needed to allow navigations within pages that were set using setHtml(). One example is + // tst_QWebEnginePage::acceptNavigationRequest. + // This is deprecated behavior, and will be removed in a future Chromium version, as per + // upstream Chromium commit ba52f56207a4b9d70b34880fbff2352e71a06422. + parsedCommandLine->AppendSwitchASCII(switches::kEnableFeatures, + features::kAllowContentInitiatedDataUrlNavigations.name); + if (useEmbeddedSwitches) { parsedCommandLine->AppendSwitchASCII(switches::kEnableFeatures, features::kOverlayScrollbar.name); if (!parsedCommandLine->HasSwitch(switches::kDisablePinch)) @@ -408,8 +417,7 @@ WebEngineContext::WebEngineContext() QSurfaceFormat globalSharedFormat = qt_gl_global_share_context()->format(); if (globalSharedFormat.profile() == QSurfaceFormat::CoreProfile) { #ifdef Q_OS_MACOS - // @TODO_FIXME_ADAPT_QT - // glType = gl::kGLImplementationCoreProfileName; + glType = gl::kGLImplementationCoreProfileName; #else qWarning("An OpenGL Core Profile was requested, but it is not supported " "on the current platform. Falling back to a non-Core profile. " @@ -439,7 +447,6 @@ WebEngineContext::WebEngineContext() mojo::edk::Init(); content::ContentMainParams contentMainParams(m_mainDelegate.get()); - contentMainParams.setup_signal_handlers = false; #if defined(OS_WIN) sandbox::SandboxInterfaceInfo sandbox_info = {0}; content::InitializeSandboxInfo(&sandbox_info); diff --git a/src/core/web_engine_settings.cpp b/src/core/web_engine_settings.cpp index 63c2aa519..4c944892a 100644 --- a/src/core/web_engine_settings.cpp +++ b/src/core/web_engine_settings.cpp @@ -106,7 +106,6 @@ static inline bool isTouchEventsAPIEnabled() { return touchEventsAPIEnabled; } - WebEngineSettings::WebEngineSettings(WebEngineSettings *_parentSettings) : m_adapter(0) , m_batchTimer(new BatchTimer(this)) @@ -317,7 +316,6 @@ void WebEngineSettings::applySettingsToWebPreferences(content::WebPreferences *p // Attributes mapping. prefs->loads_images_automatically = testAttribute(AutoLoadImages); prefs->javascript_enabled = testAttribute(JavascriptEnabled); - prefs->javascript_can_open_windows_automatically = testAttribute(JavascriptCanOpenWindows); prefs->javascript_can_access_clipboard = testAttribute(JavascriptCanAccessClipboard); prefs->tabs_to_links = testAttribute(LinksIncludedInFocusChain); prefs->local_storage_enabled = testAttribute(LocalStorageEnabled); @@ -361,6 +359,11 @@ void WebEngineSettings::scheduleApplyRecursively() } } +bool WebEngineSettings::getJavaScriptCanOpenWindowsAutomatically() +{ + return testAttribute(JavascriptCanOpenWindows); +} + void WebEngineSettings::setParentSettings(WebEngineSettings *_parentSettings) { if (parentSettings) diff --git a/src/core/web_engine_settings.h b/src/core/web_engine_settings.h index 1304d2ae9..639d314f3 100644 --- a/src/core/web_engine_settings.h +++ b/src/core/web_engine_settings.h @@ -134,6 +134,8 @@ public: void scheduleApplyRecursively(); + bool getJavaScriptCanOpenWindowsAutomatically(); + private: void doApply(); void applySettingsToWebPreferences(content::WebPreferences *); -- cgit v1.2.3