diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-05-20 09:47:09 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-06-07 11:15:42 +0000 |
commit | 189d4fd8fad9e3c776873be51938cd31a42b6177 (patch) | |
tree | 6497caeff5e383937996768766ab3bb2081a40b2 /chromium/headless/lib/browser | |
parent | 8bc75099d364490b22f43a7ce366b366c08f4164 (diff) | |
download | qtwebengine-chromium-189d4fd8fad9e3c776873be51938cd31a42b6177.tar.gz |
BASELINE: Update Chromium to 90.0.4430.221
Change-Id: Iff4d9d18d2fcf1a576f3b1f453010f744a232920
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/headless/lib/browser')
21 files changed, 342 insertions, 106 deletions
diff --git a/chromium/headless/lib/browser/DEPS b/chromium/headless/lib/browser/DEPS index 2884f436d9c..8cb7f76c6e6 100644 --- a/chromium/headless/lib/browser/DEPS +++ b/chromium/headless/lib/browser/DEPS @@ -7,13 +7,23 @@ include_rules = [ "+components/security_state", "+components/viz", "+printing", + "+services/cert_verifier/public/mojom", "+services/network", "+storage/browser/quota", "+storage/common/quota", "+third_party/skia/include", "+third_party/blink/public/mojom/quota", + "+third_party/blink/public/mojom/badging", "+third_party/blink/public/common/renderer_preferences/renderer_preferences.h", "+ui/aura", "+ui/compositor", "+ui/events/keycodes/dom", ] +specific_include_rules = { + "headless_browser_main_parts.h": [ + "+components/prefs", + ], + "headless_browser_main_parts.cc": [ + "+components/prefs", + ], +} diff --git a/chromium/headless/lib/browser/headless_browser_context_impl.cc b/chromium/headless/lib/browser/headless_browser_context_impl.cc index 39ea5936ec6..d1d630b0172 100644 --- a/chromium/headless/lib/browser/headless_browser_context_impl.cc +++ b/chromium/headless/lib/browser/headless_browser_context_impl.cc @@ -293,7 +293,7 @@ void HeadlessBrowserContextImpl::ConfigureNetworkContextParams( bool in_memory, const base::FilePath& relative_partition_path, ::network::mojom::NetworkContextParams* network_context_params, - ::network::mojom::CertVerifierCreationParams* + ::cert_verifier::mojom::CertVerifierCreationParams* cert_verifier_creation_params) { request_context_manager_->ConfigureNetworkContextParams( in_memory, relative_partition_path, network_context_params, diff --git a/chromium/headless/lib/browser/headless_browser_context_impl.h b/chromium/headless/lib/browser/headless_browser_context_impl.h index a16612a7aad..fcb28e214bd 100644 --- a/chromium/headless/lib/browser/headless_browser_context_impl.h +++ b/chromium/headless/lib/browser/headless_browser_context_impl.h @@ -104,7 +104,7 @@ class HEADLESS_EXPORT HeadlessBrowserContextImpl final bool in_memory, const base::FilePath& relative_partition_path, ::network::mojom::NetworkContextParams* network_context_params, - ::network::mojom::CertVerifierCreationParams* + ::cert_verifier::mojom::CertVerifierCreationParams* cert_verifier_creation_params); private: diff --git a/chromium/headless/lib/browser/headless_browser_impl.cc b/chromium/headless/lib/browser/headless_browser_impl.cc index 5c2270330b9..95c433e6cce 100644 --- a/chromium/headless/lib/browser/headless_browser_impl.cc +++ b/chromium/headless/lib/browser/headless_browser_impl.cc @@ -23,7 +23,6 @@ #include "headless/lib/browser/headless_browser_main_parts.h" #include "headless/lib/browser/headless_devtools_agent_host_client.h" #include "headless/lib/browser/headless_web_contents_impl.h" -#include "headless/lib/headless_content_main_delegate.h" #include "net/http/http_util.h" #include "services/network/public/cpp/network_switches.h" #include "ui/events/devices/device_data_manager.h" diff --git a/chromium/headless/lib/browser/headless_browser_main_parts.cc b/chromium/headless/lib/browser/headless_browser_main_parts.cc index 39cfaf1e670..06c4754c6b0 100644 --- a/chromium/headless/lib/browser/headless_browser_main_parts.cc +++ b/chromium/headless/lib/browser/headless_browser_main_parts.cc @@ -4,13 +4,29 @@ #include "headless/lib/browser/headless_browser_main_parts.h" +#include "headless/app/headless_shell_switches.h" #include "headless/lib/browser/headless_browser_context_impl.h" #include "headless/lib/browser/headless_browser_impl.h" #include "headless/lib/browser/headless_devtools.h" #include "headless/lib/browser/headless_screen.h" +#if defined(HEADLESS_USE_PREFS) +#include "components/os_crypt/os_crypt.h" +#include "components/prefs/json_pref_store.h" +#include "components/prefs/pref_service_factory.h" +#endif + namespace headless { +namespace { + +#if defined(HEADLESS_USE_PREFS) +const base::FilePath::CharType kLocalStateFilename[] = + FILE_PATH_LITERAL("Local State"); +#endif + +} // namespace + HeadlessBrowserMainParts::HeadlessBrowserMainParts( const content::MainFunctionParams& parameters, HeadlessBrowserImpl* browser) @@ -19,8 +35,11 @@ HeadlessBrowserMainParts::HeadlessBrowserMainParts( HeadlessBrowserMainParts::~HeadlessBrowserMainParts() = default; void HeadlessBrowserMainParts::PreMainMessageLoopRun() { +#if defined(HEADLESS_USE_PREFS) + CreatePrefService(); +#endif if (browser_->options()->DevtoolsServerEnabled()) { - StartLocalDevToolsHttpHandler(browser_->options()); + StartLocalDevToolsHttpHandler(browser_); devtools_http_handler_started_ = true; } browser_->PlatformInitialize(); @@ -47,6 +66,10 @@ void HeadlessBrowserMainParts::PostMainMessageLoopRun() { StopLocalDevToolsHttpHandler(); devtools_http_handler_started_ = false; } +#if defined(HEADLESS_USE_PREFS) + if (local_state_) + local_state_->CommitPendingWrite(); +#endif } void HeadlessBrowserMainParts::QuitMainMessageLoop() { @@ -54,4 +77,37 @@ void HeadlessBrowserMainParts::QuitMainMessageLoop() { std::move(quit_main_message_loop_).Run(); } +#if defined(HEADLESS_USE_PREFS) +void HeadlessBrowserMainParts::CreatePrefService() { + if (browser_->options()->user_data_dir.empty()) { + LOG(WARNING) << "Cannot create Pref Service with no user data dir."; + return; + } + + base::FilePath local_state_file = + browser_->options()->user_data_dir.Append(kLocalStateFilename); + auto pref_store = base::MakeRefCounted<JsonPrefStore>(local_state_file); + auto result = pref_store->ReadPrefs(); + CHECK(result == JsonPrefStore::PREF_READ_ERROR_NONE || + result == JsonPrefStore::PREF_READ_ERROR_NO_FILE); + + auto pref_registry = base::MakeRefCounted<PrefRegistrySimple>(); +#if defined(OS_WIN) + OSCrypt::RegisterLocalPrefs(pref_registry.get()); +#endif + + PrefServiceFactory factory; + factory.set_user_prefs(pref_store); + local_state_ = factory.Create(std::move(pref_registry)); + +#if defined(OS_WIN) + if (!base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDisableCookieEncryption)) { + if (!OSCrypt::Init(local_state_.get())) + LOG(ERROR) << "Failed to initialize OSCrypt"; + } +#endif +} +#endif // defined(HEADLESS_USE_PREFS) + } // namespace headless diff --git a/chromium/headless/lib/browser/headless_browser_main_parts.h b/chromium/headless/lib/browser/headless_browser_main_parts.h index 1bc219297de..e1a531c9717 100644 --- a/chromium/headless/lib/browser/headless_browser_main_parts.h +++ b/chromium/headless/lib/browser/headless_browser_main_parts.h @@ -13,6 +13,11 @@ #include "content/public/common/main_function_params.h" #include "headless/public/headless_browser.h" +#if defined(HEADLESS_USE_PREFS) +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/pref_service.h" +#endif + namespace headless { class HeadlessBrowserImpl; @@ -38,9 +43,17 @@ class HeadlessBrowserMainParts : public content::BrowserMainParts { void QuitMainMessageLoop(); private: +#if defined(HEADLESS_USE_PREFS) + void CreatePrefService(); +#endif + const content::MainFunctionParams parameters_; // For running browser tests. HeadlessBrowserImpl* browser_; // Not owned. +#if defined(HEADLESS_USE_PREFS) + std::unique_ptr<PrefService> local_state_; +#endif + bool run_message_loop_ = true; bool devtools_http_handler_started_ = false; base::OnceClosure quit_main_message_loop_; diff --git a/chromium/headless/lib/browser/headless_browser_main_parts_linux.cc b/chromium/headless/lib/browser/headless_browser_main_parts_linux.cc index 129b6745001..9f1e4b1e0d7 100644 --- a/chromium/headless/lib/browser/headless_browser_main_parts_linux.cc +++ b/chromium/headless/lib/browser/headless_browser_main_parts_linux.cc @@ -5,12 +5,13 @@ #include "headless/lib/browser/headless_browser_main_parts.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "device/bluetooth/dbus/bluez_dbus_manager.h" namespace headless { void HeadlessBrowserMainParts::PostMainMessageLoopStart() { -#if defined(USE_DBUS) && !defined(OS_CHROMEOS) +#if defined(USE_DBUS) && !BUILDFLAG(IS_CHROMEOS_ASH) bluez::BluezDBusManager::Initialize(/*system_bus=*/nullptr); #endif } diff --git a/chromium/headless/lib/browser/headless_clipboard.cc b/chromium/headless/lib/browser/headless_clipboard.cc index c9acecda6f1..62949fe4930 100644 --- a/chromium/headless/lib/browser/headless_clipboard.cc +++ b/chromium/headless/lib/browser/headless_clipboard.cc @@ -19,6 +19,12 @@ HeadlessClipboard::~HeadlessClipboard() = default; void HeadlessClipboard::OnPreShutdown() {} +// DataTransferEndpoint is not used on this platform. +ui::DataTransferEndpoint* HeadlessClipboard::GetSource( + ui::ClipboardBuffer buffer) const { + return nullptr; +} + uint64_t HeadlessClipboard::GetSequenceNumber( ui::ClipboardBuffer buffer) const { return GetStore(buffer).sequence_number; @@ -160,6 +166,14 @@ void HeadlessClipboard::ReadCustomData(ui::ClipboardBuffer clipboard_buffer, // |data_dst| is not used. It's only passed to be consistent with other // platforms. +void HeadlessClipboard::ReadFilenames(ui::ClipboardBuffer buffer, + const ui::DataTransferEndpoint* data_dst, + std::vector<ui::FileInfo>* result) const { + *result = GetStore(buffer).filenames; +} + +// |data_dst| is not used. It's only passed to be consistent with other +// platforms. void HeadlessClipboard::ReadBookmark(const ui::DataTransferEndpoint* data_dst, base::string16* title, std::string* url) const { @@ -243,6 +257,10 @@ void HeadlessClipboard::WriteRTF(const char* rtf_data, size_t data_len) { std::string(rtf_data, data_len); } +void HeadlessClipboard::WriteFilenames(std::vector<ui::FileInfo> filenames) { + GetDefaultStore().filenames = std::move(filenames); +} + void HeadlessClipboard::WriteBookmark(const char* title_data, size_t title_len, const char* url_data, diff --git a/chromium/headless/lib/browser/headless_clipboard.h b/chromium/headless/lib/browser/headless_clipboard.h index f3f2f98d10f..e616a68def3 100644 --- a/chromium/headless/lib/browser/headless_clipboard.h +++ b/chromium/headless/lib/browser/headless_clipboard.h @@ -25,6 +25,8 @@ class HeadlessClipboard : public ui::Clipboard { private: // Clipboard overrides. void OnPreShutdown() override; + ui::DataTransferEndpoint* GetSource( + ui::ClipboardBuffer buffer) const override; uint64_t GetSequenceNumber(ui::ClipboardBuffer buffer) const override; bool IsFormatAvailable( const ui::ClipboardFormatType& format, @@ -62,6 +64,9 @@ class HeadlessClipboard : public ui::Clipboard { const base::string16& type, const ui::DataTransferEndpoint* data_dst, base::string16* result) const override; + void ReadFilenames(ui::ClipboardBuffer buffer, + const ui::DataTransferEndpoint* data_dst, + std::vector<ui::FileInfo>* result) const override; void ReadBookmark(const ui::DataTransferEndpoint* data_dst, base::string16* title, std::string* url) const override; @@ -86,6 +91,7 @@ class HeadlessClipboard : public ui::Clipboard { size_t url_len) override; void WriteSvg(const char* markup_data, size_t markup_len) override; void WriteRTF(const char* rtf_data, size_t data_len) override; + void WriteFilenames(std::vector<ui::FileInfo> filenames) override; void WriteBookmark(const char* title_data, size_t title_len, const char* url_data, @@ -106,6 +112,7 @@ class HeadlessClipboard : public ui::Clipboard { std::string url_title; std::string html_src_url; SkBitmap image; + std::vector<ui::FileInfo> filenames; }; // The non-const versions increment the sequence number as a side effect. diff --git a/chromium/headless/lib/browser/headless_content_browser_client.cc b/chromium/headless/lib/browser/headless_content_browser_client.cc index 8aee01518c8..cb06a3eaffd 100644 --- a/chromium/headless/lib/browser/headless_content_browser_client.cc +++ b/chromium/headless/lib/browser/headless_content_browser_client.cc @@ -20,9 +20,11 @@ #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/client_certificate_delegate.h" +#include "content/public/browser/content_browser_client.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/storage_partition.h" +#include "content/public/browser/web_contents.h" #include "content/public/common/content_switches.h" #include "headless/app/headless_shell_switches.h" #include "headless/lib/browser/headless_browser_context_impl.h" @@ -31,6 +33,9 @@ #include "headless/lib/browser/headless_devtools_manager_delegate.h" #include "headless/lib/browser/headless_quota_permission_context.h" #include "headless/lib/headless_macros.h" +#include "mojo/public/cpp/bindings/binder_map.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver_set.h" #include "net/base/url_util.h" #include "net/ssl/client_cert_identity.h" #include "printing/buildflags/buildflags.h" @@ -109,6 +114,32 @@ int GetCrashSignalFD(const base::CommandLine& command_line, } // namespace +// Implements a stub BadgeService. This implementation does nothing, but is +// required because inbound Mojo messages which do not have a registered +// handler are considered an error, and the render process is terminated. +// See https://crbug.com/1090429 +class HeadlessContentBrowserClient::StubBadgeService + : public blink::mojom::BadgeService { + public: + StubBadgeService() = default; + StubBadgeService(const StubBadgeService&) = delete; + StubBadgeService& operator=(const StubBadgeService&) = delete; + ~StubBadgeService() override = default; + + void Bind(mojo::PendingReceiver<blink::mojom::BadgeService> receiver) { + receivers_.Add(this, std::move(receiver)); + } + + void Reset() {} + + // blink::mojom::BadgeService: + void SetBadge(blink::mojom::BadgeValuePtr value) override {} + void ClearBadge() override {} + + private: + mojo::ReceiverSet<blink::mojom::BadgeService> receivers_; +}; + HeadlessContentBrowserClient::HeadlessContentBrowserClient( HeadlessBrowserImpl* browser) : browser_(browser), @@ -129,16 +160,23 @@ HeadlessContentBrowserClient::CreateBrowserMainParts( } void HeadlessContentBrowserClient::OverrideWebkitPrefs( - content::RenderViewHost* render_view_host, + content::WebContents* web_contents, blink::web_pref::WebPreferences* prefs) { - auto* browser_context = HeadlessBrowserContextImpl::From( - render_view_host->GetProcess()->GetBrowserContext()); + auto* browser_context = + HeadlessBrowserContextImpl::From(web_contents->GetBrowserContext()); base::RepeatingCallback<void(blink::web_pref::WebPreferences*)> callback = browser_context->options()->override_web_preferences_callback(); if (callback) callback.Run(prefs); } +void HeadlessContentBrowserClient::RegisterBrowserInterfaceBindersForFrame( + content::RenderFrameHost* render_frame_host, + mojo::BinderMapWithContext<content::RenderFrameHost*>* map) { + map->Add<blink::mojom::BadgeService>(base::BindRepeating( + &HeadlessContentBrowserClient::BindBadgeService, base::Unretained(this))); +} + content::DevToolsManagerDelegate* HeadlessContentBrowserClient::GetDevToolsManagerDelegate() { return new HeadlessDevToolsManagerDelegate(browser_->GetWeakPtr()); @@ -305,7 +343,7 @@ void HeadlessContentBrowserClient::ConfigureNetworkContextParams( bool in_memory, const base::FilePath& relative_partition_path, ::network::mojom::NetworkContextParams* network_context_params, - ::network::mojom::CertVerifierCreationParams* + ::cert_verifier::mojom::CertVerifierCreationParams* cert_verifier_creation_params) { HeadlessBrowserContextImpl::From(context)->ConfigureNetworkContextParams( in_memory, relative_partition_path, network_context_params, @@ -320,4 +358,20 @@ std::string HeadlessContentBrowserClient::GetUserAgent() { return browser_->options()->user_agent; } +void HeadlessContentBrowserClient::BindBadgeService( + content::RenderFrameHost* render_frame_host, + mojo::PendingReceiver<blink::mojom::BadgeService> receiver) { + if (!stub_badge_service_) + stub_badge_service_ = std::make_unique<StubBadgeService>(); + + stub_badge_service_->Bind(std::move(receiver)); +} + +bool HeadlessContentBrowserClient::CanAcceptUntrustedExchangesIfNeeded() { + // We require --user-data-dir flag too so that no dangerous changes are made + // in the user's regular profile. + return base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kUserDataDir); +} + } // namespace headless diff --git a/chromium/headless/lib/browser/headless_content_browser_client.h b/chromium/headless/lib/browser/headless_content_browser_client.h index c59a2ac4006..6573d227dee 100644 --- a/chromium/headless/lib/browser/headless_content_browser_client.h +++ b/chromium/headless/lib/browser/headless_content_browser_client.h @@ -8,7 +8,9 @@ #include <memory> #include "content/public/browser/content_browser_client.h" +#include "content/public/browser/render_frame_host.h" #include "headless/public/headless_browser.h" +#include "third_party/blink/public/mojom/badging/badging.mojom.h" namespace headless { @@ -22,8 +24,11 @@ class HeadlessContentBrowserClient : public content::ContentBrowserClient { // content::ContentBrowserClient implementation: std::unique_ptr<content::BrowserMainParts> CreateBrowserMainParts( const content::MainFunctionParams&) override; - void OverrideWebkitPrefs(content::RenderViewHost* render_view_host, + void OverrideWebkitPrefs(content::WebContents* web_contents, blink::web_pref::WebPreferences* prefs) override; + void RegisterBrowserInterfaceBindersForFrame( + content::RenderFrameHost* render_frame_host, + mojo::BinderMapWithContext<content::RenderFrameHost*>* map) override; content::DevToolsManagerDelegate* GetDevToolsManagerDelegate() override; scoped_refptr<content::QuotaPermissionContext> CreateQuotaPermissionContext() override; @@ -60,19 +65,29 @@ class HeadlessContentBrowserClient : public content::ContentBrowserClient { bool in_memory, const base::FilePath& relative_partition_path, ::network::mojom::NetworkContextParams* network_context_params, - ::network::mojom::CertVerifierCreationParams* + ::cert_verifier::mojom::CertVerifierCreationParams* cert_verifier_creation_params) override; std::string GetProduct() override; std::string GetUserAgent() override; + bool CanAcceptUntrustedExchangesIfNeeded() override; + private: + class StubBadgeService; + + void BindBadgeService( + content::RenderFrameHost* render_frame_host, + mojo::PendingReceiver<blink::mojom::BadgeService> receiver); + HeadlessBrowserImpl* browser_; // Not owned. // We store the callback here because we may call it from the I/O thread. HeadlessBrowser::Options::AppendCommandLineFlagsCallback append_command_line_flags_callback_; + std::unique_ptr<StubBadgeService> stub_badge_service_; + DISALLOW_COPY_AND_ASSIGN(HeadlessContentBrowserClient); }; diff --git a/chromium/headless/lib/browser/headless_devtools.cc b/chromium/headless/lib/browser/headless_devtools.cc index 81912056d40..5a37c61c781 100644 --- a/chromium/headless/lib/browser/headless_devtools.cc +++ b/chromium/headless/lib/browser/headless_devtools.cc @@ -9,6 +9,8 @@ #include "base/files/file_path.h" #include "base/memory/ptr_util.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" #include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/devtools_socket_factory.h" #include "content/public/browser/navigation_entry.h" @@ -124,11 +126,20 @@ class DummyTCPServerSocketFactory : public content::DevToolsSocketFactory { DISALLOW_COPY_AND_ASSIGN(DummyTCPServerSocketFactory); }; #endif // defined(OS_POSIX) + +void PostTaskToCloseBrowser(base::WeakPtr<HeadlessBrowserImpl> browser) { + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&HeadlessBrowserImpl::Shutdown, browser)); +} + } // namespace -void StartLocalDevToolsHttpHandler(HeadlessBrowser::Options* options) { - if (options->devtools_pipe_enabled) - content::DevToolsAgentHost::StartRemoteDebuggingPipeHandler(); +void StartLocalDevToolsHttpHandler(HeadlessBrowserImpl* browser) { + HeadlessBrowser::Options* options = browser->options(); + if (options->devtools_pipe_enabled) { + content::DevToolsAgentHost::StartRemoteDebuggingPipeHandler( + base::BindOnce(&PostTaskToCloseBrowser, browser->GetWeakPtr())); + } if (options->devtools_endpoint.IsEmpty()) return; diff --git a/chromium/headless/lib/browser/headless_devtools.h b/chromium/headless/lib/browser/headless_devtools.h index eccdd088806..ba29e439632 100644 --- a/chromium/headless/lib/browser/headless_devtools.h +++ b/chromium/headless/lib/browser/headless_devtools.h @@ -7,13 +7,13 @@ #include <memory> -#include "headless/public/headless_browser.h" +#include "headless/lib/browser/headless_browser_impl.h" namespace headless { // Starts a DevTools HTTP handler on the loopback interface on the port // configured by HeadlessBrowser::Options. -void StartLocalDevToolsHttpHandler(HeadlessBrowser::Options* options); +void StartLocalDevToolsHttpHandler(HeadlessBrowserImpl* browser); void StopLocalDevToolsHttpHandler(); } // namespace headless diff --git a/chromium/headless/lib/browser/headless_permission_manager.cc b/chromium/headless/lib/browser/headless_permission_manager.cc index 5d4d609fc0c..359ecdc4b72 100644 --- a/chromium/headless/lib/browser/headless_permission_manager.cc +++ b/chromium/headless/lib/browser/headless_permission_manager.cc @@ -71,15 +71,16 @@ HeadlessPermissionManager::GetPermissionStatusForFrame( return blink::mojom::PermissionStatus::ASK; } -int HeadlessPermissionManager::SubscribePermissionStatusChange( +HeadlessPermissionManager::SubscriptionId +HeadlessPermissionManager::SubscribePermissionStatusChange( content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) { - return content::PermissionController::kNoPendingOperation; + return SubscriptionId(); } void HeadlessPermissionManager::UnsubscribePermissionStatusChange( - int subscription_id) {} + SubscriptionId subscription_id) {} } // namespace headless diff --git a/chromium/headless/lib/browser/headless_permission_manager.h b/chromium/headless/lib/browser/headless_permission_manager.h index 4b83309ab3a..ac30670cb38 100644 --- a/chromium/headless/lib/browser/headless_permission_manager.h +++ b/chromium/headless/lib/browser/headless_permission_manager.h @@ -46,13 +46,14 @@ class HeadlessPermissionManager : public content::PermissionControllerDelegate { content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin) override; - int SubscribePermissionStatusChange( + SubscriptionId SubscribePermissionStatusChange( content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) override; - void UnsubscribePermissionStatusChange(int subscription_id) override; + void UnsubscribePermissionStatusChange( + SubscriptionId subscription_id) override; private: content::BrowserContext* browser_context_; diff --git a/chromium/headless/lib/browser/headless_print_manager.cc b/chromium/headless/lib/browser/headless_print_manager.cc index 67ffbad89c4..6620bf1ba1a 100644 --- a/chromium/headless/lib/browser/headless_print_manager.cc +++ b/chromium/headless/lib/browser/headless_print_manager.cc @@ -16,14 +16,25 @@ #include "base/strings/utf_string_conversions.h" #include "components/printing/browser/print_manager_utils.h" #include "components/printing/common/print.mojom.h" -#include "components/printing/common/print_messages.h" #include "content/public/browser/render_view_host.h" #include "printing/mojom/print.mojom.h" #include "printing/print_job_constants.h" #include "printing/units.h" +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) +#include "mojo/public/cpp/bindings/message.h" +#endif namespace headless { +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) +namespace { + +constexpr char kInvalidPathForCheckForCancel[] = + "Invalid path for CheckForCancel"; + +} // namespace +#endif + HeadlessPrintSettings::HeadlessPrintSettings() : prefer_css_page_size(false), landscape(false), @@ -186,32 +197,6 @@ HeadlessPrintManager::GetPrintParamsFromSettings( return print_params; } -bool HeadlessPrintManager::OnMessageReceived( - const IPC::Message& message, - content::RenderFrameHost* render_frame_host) { - if (!printing_rfh_ && message.type() == PrintHostMsg_ScriptedPrint::ID) { - std::string type; - switch (message.type()) { - case PrintHostMsg_ScriptedPrint::ID: - type = "ScriptedPrint"; - break; - default: - type = "Unknown"; - break; - } - DLOG(ERROR) - << "Unexpected message received before GetPDFContents is called: " - << type; - - // TODO: consider propagating the error back to the caller, rather than - // effectively dropping the request. - render_frame_host->Send(IPC::SyncMessage::GenerateReply(&message)); - return true; - } - - return PrintManager::OnMessageReceived(message, render_frame_host); -} - void HeadlessPrintManager::GetDefaultPrintSettings( GetDefaultPrintSettingsCallback callback) { if (!printing_rfh_) { @@ -223,27 +208,32 @@ void HeadlessPrintManager::GetDefaultPrintSettings( std::move(callback).Run(print_params_->params->Clone()); } -void HeadlessPrintManager::OnScriptedPrint( - content::RenderFrameHost* render_frame_host, - const printing::mojom::ScriptedPrintParams& params, - IPC::Message* reply_msg) { +void HeadlessPrintManager::ScriptedPrint( + printing::mojom::ScriptedPrintParamsPtr params, + ScriptedPrintCallback callback) { PageRangeStatus status = PageRangeTextToPages(page_ranges_text_, ignore_invalid_page_ranges_, - params.expected_pages_count, &print_params_->pages); - // Intentionally using |printing_rfh_| instead of |render_frame_host| - // parameter. + params->expected_pages_count, &print_params_->pages); + + auto default_param = printing::mojom::PrintPagesParams::New(); + default_param->params = printing::mojom::PrintParams::New(); + if (!printing_rfh_) { + DLOG(ERROR) << "Unexpected message received before GetPDFContents is " + "called: ScriptedPrint"; + std::move(callback).Run(std::move(default_param)); + return; + } switch (status) { case SYNTAX_ERROR: - printing_rfh_->Send(reply_msg); ReleaseJob(PAGE_RANGE_SYNTAX_ERROR); + std::move(callback).Run(std::move(default_param)); return; case LIMIT_ERROR: - printing_rfh_->Send(reply_msg); ReleaseJob(PAGE_COUNT_EXCEEDED); + std::move(callback).Run(std::move(default_param)); return; case PRINT_NO_ERROR: - PrintHostMsg_ScriptedPrint::WriteReplyParams(reply_msg, *print_params_); - printing_rfh_->Send(reply_msg); + std::move(callback).Run(print_params_->Clone()); return; default: NOTREACHED(); @@ -259,22 +249,33 @@ void HeadlessPrintManager::PrintingFailed(int32_t cookie) { ReleaseJob(PRINTING_FAILED); } -void HeadlessPrintManager::OnDidPrintDocument( - content::RenderFrameHost* render_frame_host, - const printing::mojom::DidPrintDocumentParams& params, - std::unique_ptr<DelayedFrameDispatchHelper> helper) { - auto& content = *params.content; +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) +void HeadlessPrintManager::CheckForCancel(int32_t preview_ui_id, + int32_t request_id, + CheckForCancelCallback callback) { + // CheckForCancel should never be called on HeadlessPrintManager, since this + // is only triggered by Print Preview. + mojo::ReportBadMessage(kInvalidPathForCheckForCancel); +} +#endif + +void HeadlessPrintManager::DidPrintDocument( + printing::mojom::DidPrintDocumentParamsPtr params, + DidPrintDocumentCallback callback) { + auto& content = *params->content; if (!content.metafile_data_region.IsValid()) { ReleaseJob(INVALID_MEMORY_HANDLE); + std::move(callback).Run(false); return; } base::ReadOnlySharedMemoryMapping map = content.metafile_data_region.Map(); if (!map.IsValid()) { ReleaseJob(METAFILE_MAP_ERROR); + std::move(callback).Run(false); return; } data_ = std::string(static_cast<const char*>(map.memory()), map.size()); - helper->SendCompleted(); + std::move(callback).Run(true); ReleaseJob(PRINT_SUCCESS); } diff --git a/chromium/headless/lib/browser/headless_print_manager.h b/chromium/headless/lib/browser/headless_print_manager.h index ce2236dd111..f593ec2c790 100644 --- a/chromium/headless/lib/browser/headless_print_manager.h +++ b/chromium/headless/lib/browser/headless_print_manager.h @@ -90,24 +90,21 @@ class HeadlessPrintManager printing::mojom::PrintPagesParamsPtr GetPrintParamsFromSettings( const HeadlessPrintSettings& settings); - // content::WebContentsObserver implementation. - bool OnMessageReceived(const IPC::Message& message, - content::RenderFrameHost* render_frame_host) override; - - // printing::PrintManager: - void OnDidPrintDocument( - content::RenderFrameHost* render_frame_host, - const printing::mojom::DidPrintDocumentParams& params, - std::unique_ptr<DelayedFrameDispatchHelper> helper) override; - void OnScriptedPrint(content::RenderFrameHost* render_frame_host, - const printing::mojom::ScriptedPrintParams& params, - IPC::Message* reply_msg) override; // printing::mojom::PrintManagerHost: + void DidPrintDocument(printing::mojom::DidPrintDocumentParamsPtr params, + DidPrintDocumentCallback callback) override; void GetDefaultPrintSettings( GetDefaultPrintSettingsCallback callback) override; + void ScriptedPrint(printing::mojom::ScriptedPrintParamsPtr params, + ScriptedPrintCallback callback) override; void ShowInvalidPrinterSettingsError() override; void PrintingFailed(int32_t cookie) override; +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) + void CheckForCancel(int32_t preview_ui_id, + int32_t request_id, + CheckForCancelCallback callback) override; +#endif void Reset(); void ReleaseJob(PrintResult result); diff --git a/chromium/headless/lib/browser/headless_request_context_manager.cc b/chromium/headless/lib/browser/headless_request_context_manager.cc index 4148c584f49..4ac0070c86b 100644 --- a/chromium/headless/lib/browser/headless_request_context_manager.cc +++ b/chromium/headless/lib/browser/headless_request_context_manager.cc @@ -8,6 +8,7 @@ #include "base/task/post_task.h" #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/network_service_instance.h" #include "content/public/browser/resource_context.h" @@ -16,17 +17,25 @@ #include "mojo/public/cpp/bindings/receiver.h" #include "net/http/http_auth_preferences.h" #include "net/proxy_resolution/configured_proxy_resolution_service.h" +#include "services/cert_verifier/public/mojom/cert_verifier_service_factory.mojom.h" #include "services/network/network_service.h" #include "services/network/public/cpp/features.h" #include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/network_service.mojom.h" #include "services/network/url_request_context_builder_mojo.h" +#if defined(HEADLESS_USE_PREFS) +#include "components/os_crypt/os_crypt.h" +#include "content/public/common/network_service_util.h" +#endif + namespace headless { namespace { -#if defined(OS_LINUX) && !defined(OS_CHROMEOS) +// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch +// of lacros-chrome is complete. +#if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) constexpr char kProductName[] = "HeadlessChrome"; #endif @@ -56,13 +65,15 @@ net::NetworkTrafficAnnotationTag GetProxyConfigTrafficAnnotationTag() { return traffic_annotation; } -#if defined(OS_LINUX) && !defined(OS_CHROMEOS) -::network::mojom::CryptConfigPtr BuildCryptConfigOnce( - const base::FilePath& user_data_path) { +void SetCryptConfigOnce(const base::FilePath& user_data_path) { static bool done_once = false; if (done_once) - return nullptr; + return; done_once = true; + +// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch +// of lacros-chrome is complete. +#if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) ::network::mojom::CryptConfigPtr config = ::network::mojom::CryptConfig::New(); config->store = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( @@ -70,9 +81,17 @@ net::NetworkTrafficAnnotationTag GetProxyConfigTrafficAnnotationTag() { config->product_name = kProductName; config->should_use_preference = false; config->user_data_path = user_data_path; - return config; -} + content::GetNetworkService()->SetCryptConfig(std::move(config)); +#elif defined(OS_WIN) && defined(HEADLESS_USE_PREFS) + // The OSCrypt keys are process bound, so if network service is out of + // process, send it the required key if it is available. + if (content::IsOutOfProcessNetworkService() && + OSCrypt::IsEncryptionAvailable()) { + content::GetNetworkService()->SetEncryptionKey( + OSCrypt::GetRawEncryptionKey()); + } #endif +} } // namespace @@ -174,9 +193,9 @@ HeadlessRequestContextManager::CreateSystemContext( ::network::mojom::NetworkContextParamsPtr network_context_params = ::network::mojom::NetworkContextParams::New(); - ::network::mojom::CertVerifierCreationParamsPtr + ::cert_verifier::mojom::CertVerifierCreationParamsPtr cert_verifier_creation_params = - ::network::mojom::CertVerifierCreationParams::New(); + ::cert_verifier::mojom::CertVerifierCreationParams::New(); manager->ConfigureNetworkContextParamsInternal( network_context_params.get(), cert_verifier_creation_params.get()); network_context_params->cert_verifier_params = @@ -192,9 +211,8 @@ HeadlessRequestContextManager::HeadlessRequestContextManager( const HeadlessBrowserContextOptions* options, base::FilePath user_data_path) : -// On Windows, Cookie encryption requires access to local_state prefs, which are -// unavailable. -#if defined(OS_WIN) +// On Windows, Cookie encryption requires access to local_state prefs. +#if defined(OS_WIN) && !defined(HEADLESS_USE_PREFS) cookie_encryption_enabled_(false), #else cookie_encryption_enabled_( @@ -218,11 +236,8 @@ HeadlessRequestContextManager::HeadlessRequestContextManager( base::ThreadTaskRunnerHandle::Get()); } } -#if defined(OS_LINUX) && !defined(OS_CHROMEOS) - auto crypt_config = BuildCryptConfigOnce(user_data_path_); - if (crypt_config) - content::GetNetworkService()->SetCryptConfig(std::move(crypt_config)); -#endif + + SetCryptConfigOnce(user_data_path_); } HeadlessRequestContextManager::~HeadlessRequestContextManager() { @@ -235,7 +250,7 @@ void HeadlessRequestContextManager::ConfigureNetworkContextParams( bool in_memory, const base::FilePath& relative_partition_path, ::network::mojom::NetworkContextParams* network_context_params, - ::network::mojom::CertVerifierCreationParams* + ::cert_verifier::mojom::CertVerifierCreationParams* cert_verifier_creation_params) { ConfigureNetworkContextParamsInternal(network_context_params, cert_verifier_creation_params); @@ -243,7 +258,7 @@ void HeadlessRequestContextManager::ConfigureNetworkContextParams( void HeadlessRequestContextManager::ConfigureNetworkContextParamsInternal( ::network::mojom::NetworkContextParams* context_params, - ::network::mojom::CertVerifierCreationParams* + ::cert_verifier::mojom::CertVerifierCreationParams* cert_verifier_creation_params) { context_params->user_agent = user_agent_; context_params->accept_language = accept_language_; diff --git a/chromium/headless/lib/browser/headless_request_context_manager.h b/chromium/headless/lib/browser/headless_request_context_manager.h index cfc49194954..39da6471650 100644 --- a/chromium/headless/lib/browser/headless_request_context_manager.h +++ b/chromium/headless/lib/browser/headless_request_context_manager.h @@ -12,6 +12,7 @@ #include "content/public/browser/browser_context.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" +#include "services/cert_verifier/public/mojom/cert_verifier_service_factory.mojom-forward.h" #include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/network_service.mojom.h" @@ -39,7 +40,7 @@ class HeadlessRequestContextManager { bool in_memory, const base::FilePath& relative_partition_path, ::network::mojom::NetworkContextParams* network_context_params, - ::network::mojom::CertVerifierCreationParams* + ::cert_verifier::mojom::CertVerifierCreationParams* cert_verifier_creation_params); content::ResourceContext* GetResourceContext() { @@ -49,7 +50,7 @@ class HeadlessRequestContextManager { private: void ConfigureNetworkContextParamsInternal( ::network::mojom::NetworkContextParams* network_context_params, - ::network::mojom::CertVerifierCreationParams* + ::cert_verifier::mojom::CertVerifierCreationParams* cert_verifier_creation_params); const bool cookie_encryption_enabled_; diff --git a/chromium/headless/lib/browser/headless_web_contents_impl.cc b/chromium/headless/lib/browser/headless_web_contents_impl.cc index b3e8582ca50..4fdbf1c7030 100644 --- a/chromium/headless/lib/browser/headless_web_contents_impl.cc +++ b/chromium/headless/lib/browser/headless_web_contents_impl.cc @@ -10,6 +10,7 @@ #include <vector> #include "base/bind.h" +#include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/memory/weak_ptr.h" #include "base/stl_util.h" @@ -17,6 +18,8 @@ #include "base/threading/sequenced_task_runner_handle.h" #include "base/trace_event/trace_event.h" #include "base/values.h" +#include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "components/security_state/content/content_utils.h" #include "components/security_state/core/security_state.h" #include "content/public/browser/browser_thread.h" @@ -29,6 +32,7 @@ #include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host.h" #include "content/public/browser/render_widget_host_view.h" +#include "content/public/browser/renderer_preferences_util.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_delegate.h" #include "content/public/common/bindings_policy.h" @@ -42,6 +46,8 @@ #include "printing/buildflags/buildflags.h" #include "third_party/blink/public/common/renderer_preferences/renderer_preferences.h" #include "third_party/skia/include/core/SkBitmap.h" +#include "third_party/skia/include/core/SkColor.h" +#include "ui/base/ui_base_features.h" #include "ui/compositor/compositor.h" #include "ui/gfx/switches.h" @@ -51,6 +57,28 @@ namespace headless { +namespace { + +void UpdatePrefsFromSystemSettings(blink::RendererPreferences* prefs) { +#if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || defined(OS_WIN) + content::UpdateFontRendererPreferencesFromSystemSettings(prefs); +#endif + + // The values were copied from chrome/browser/renderer_preferences_util.cc. +#if defined(USE_AURA) + prefs->focus_ring_color = SkColorSetRGB(0x4D, 0x90, 0xFE); +#endif + if (::features::IsFormControlsRefreshEnabled()) { +#if defined(OS_MAC) + prefs->focus_ring_color = SkColorSetRGB(0x00, 0x5F, 0xCC); +#else + prefs->focus_ring_color = SkColorSetRGB(0x10, 0x10, 0x10); +#endif + } +} + +} // namespace + // static HeadlessWebContentsImpl* HeadlessWebContentsImpl::From( HeadlessWebContents* web_contents) { @@ -177,6 +205,13 @@ class HeadlessWebContentsImpl::Delegate : public content::WebContentsDelegate { ->block_new_web_contents(); } + void RequestToLockMouse(content::WebContents* web_contents, + bool user_gesture, + bool last_unlocked_by_target) override { + web_contents->GotResponseToLockMouseRequest( + blink::mojom::PointerLockResult::kSuccess); + } + private: HeadlessBrowserImpl* browser() { return headless_web_contents_->browser(); } @@ -285,16 +320,17 @@ HeadlessWebContentsImpl::HeadlessWebContentsImpl( std::unique_ptr<content::WebContents> web_contents, HeadlessBrowserContextImpl* browser_context) : content::WebContentsObserver(web_contents.get()), + browser_context_(browser_context), + render_process_host_(web_contents->GetMainFrame()->GetProcess()), web_contents_delegate_(new HeadlessWebContentsImpl::Delegate(this)), web_contents_(std::move(web_contents)), agent_host_( - content::DevToolsAgentHost::GetOrCreateFor(web_contents_.get())), - browser_context_(browser_context), - render_process_host_(web_contents_->GetMainFrame()->GetProcess()) { + content::DevToolsAgentHost::GetOrCreateFor(web_contents_.get())) { #if BUILDFLAG(ENABLE_PRINTING) HeadlessPrintManager::CreateForWebContents(web_contents_.get()); // TODO(weili): Add support for printing OOPIFs. #endif + UpdatePrefsFromSystemSettings(web_contents_->GetMutableRendererPrefs()); web_contents_->GetMutableRendererPrefs()->accept_languages = browser_context->options()->accept_language(); web_contents_->GetMutableRendererPrefs()->hinting = diff --git a/chromium/headless/lib/browser/headless_web_contents_impl.h b/chromium/headless/lib/browser/headless_web_contents_impl.h index 3281913ede2..ee3d0fe094d 100644 --- a/chromium/headless/lib/browser/headless_web_contents_impl.h +++ b/chromium/headless/lib/browser/headless_web_contents_impl.h @@ -141,6 +141,11 @@ class HEADLESS_EXPORT HeadlessWebContentsImpl viz::BeginFrameArgs::kStartingFrameNumber; bool begin_frame_control_enabled_ = false; + HeadlessBrowserContextImpl* browser_context_; // Not owned. + // TODO(alexclarke): With OOPIF there may be more than one renderer, we need + // to fix this. See crbug.com/715924 + content::RenderProcessHost* render_process_host_; // Not owned. + class Delegate; std::unique_ptr<Delegate> web_contents_delegate_; std::unique_ptr<HeadlessWindowTreeHost> window_tree_host_; @@ -151,11 +156,6 @@ class HEADLESS_EXPORT HeadlessWebContentsImpl bool devtools_target_ready_notification_sent_ = false; bool render_process_exited_ = false; - HeadlessBrowserContextImpl* browser_context_; // Not owned. - // TODO(alexclarke): With OOPIF there may be more than one renderer, we need - // to fix this. See crbug.com/715924 - content::RenderProcessHost* render_process_host_; // Not owned. - base::ObserverList<HeadlessWebContents::Observer>::Unchecked observers_; class PendingFrame; |