From 84d81df878cbb69b555b937928ab20c9bfa6827b Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Wed, 22 Sep 2021 14:17:28 -0400 Subject: [PATCH] fix: prevent navigator.fonts.query() from crashing (#30984) * fix: prevent navigator.fonts.query() from crashing * refactor: use base::PostTask instead * Update .patches Co-authored-by: Shelley Vohr Co-authored-by: Cheng Zhao --- filenames.gni | 2 + shell/browser/electron_browser_client.cc | 6 +++ shell/browser/electron_browser_client.h | 4 ++ .../font/electron_font_access_delegate.cc | 42 +++++++++++++++++++ .../font/electron_font_access_delegate.h | 28 +++++++++++++ 5 files changed, 82 insertions(+) create mode 100644 shell/browser/font/electron_font_access_delegate.cc create mode 100644 shell/browser/font/electron_font_access_delegate.h diff --git a/filenames.gni b/filenames.gni index 1c760719b359f..3482596307e8d 100644 --- a/filenames.gni +++ b/filenames.gni @@ -385,6 +385,8 @@ filenames = { "shell/browser/file_select_helper.cc", "shell/browser/file_select_helper.h", "shell/browser/file_select_helper_mac.mm", + "shell/browser/font/electron_font_access_delegate.cc", + "shell/browser/font/electron_font_access_delegate.h", "shell/browser/font_defaults.cc", "shell/browser/font_defaults.h", "shell/browser/javascript_environment.cc", diff --git a/shell/browser/electron_browser_client.cc b/shell/browser/electron_browser_client.cc index 8f9544f27147a..0ad8709b79b7b 100644 --- a/shell/browser/electron_browser_client.cc +++ b/shell/browser/electron_browser_client.cc @@ -1601,6 +1601,12 @@ content::BluetoothDelegate* ElectronBrowserClient::GetBluetoothDelegate() { return bluetooth_delegate_.get(); } +content::FontAccessDelegate* ElectronBrowserClient::GetFontAccessDelegate() { + if (!font_access_delegate_) + font_access_delegate_ = std::make_unique(); + return font_access_delegate_.get(); +} + void BindBadgeServiceForServiceWorker( const content::ServiceWorkerVersionBaseInfo& info, mojo::PendingReceiver receiver) { diff --git a/shell/browser/electron_browser_client.h b/shell/browser/electron_browser_client.h index f14339cc1a771..ccd4b6d706423 100644 --- a/shell/browser/electron_browser_client.h +++ b/shell/browser/electron_browser_client.h @@ -20,6 +20,7 @@ #include "net/ssl/client_cert_identity.h" #include "services/metrics/public/cpp/ukm_source_id.h" #include "shell/browser/bluetooth/electron_bluetooth_delegate.h" +#include "shell/browser/font/electron_font_access_delegate.h" #include "shell/browser/serial/electron_serial_delegate.h" #include "third_party/blink/public/mojom/badging/badging.mojom-forward.h" @@ -87,6 +88,8 @@ class ElectronBrowserClient : public content::ContentBrowserClient, content::SerialDelegate* GetSerialDelegate() override; + content::FontAccessDelegate* GetFontAccessDelegate() override; + content::BluetoothDelegate* GetBluetoothDelegate() override; device::GeolocationManager* GetGeolocationManager() override; @@ -301,6 +304,7 @@ class ElectronBrowserClient : public content::ContentBrowserClient, std::unique_ptr serial_delegate_; std::unique_ptr bluetooth_delegate_; + std::unique_ptr font_access_delegate_; #if defined(OS_MAC) ElectronBrowserMainParts* browser_main_parts_ = nullptr; diff --git a/shell/browser/font/electron_font_access_delegate.cc b/shell/browser/font/electron_font_access_delegate.cc new file mode 100644 index 0000000000000..05e0b1d88cbca --- /dev/null +++ b/shell/browser/font/electron_font_access_delegate.cc @@ -0,0 +1,42 @@ +// Copyright (c) 2021 Microsoft, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#include + +#include "shell/browser/font/electron_font_access_delegate.h" + +#include "base/task/post_task.h" +#include "chrome/browser/browser_process.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/font_access_chooser.h" +#include "content/public/browser/render_frame_host.h" + +class ElectronFontAccessChooser : public content::FontAccessChooser { + public: + explicit ElectronFontAccessChooser(base::OnceClosure close_callback) { + base::PostTask( + FROM_HERE, {content::BrowserThread::UI}, + base::BindOnce( + [](base::OnceClosure closure) { std::move(closure).Run(); }, + std::move(close_callback))); + } + ~ElectronFontAccessChooser() override = default; +}; + +ElectronFontAccessDelegate::ElectronFontAccessDelegate() = default; +ElectronFontAccessDelegate::~ElectronFontAccessDelegate() = default; + +std::unique_ptr +ElectronFontAccessDelegate::RunChooser( + content::RenderFrameHost* frame, + const std::vector& selection, + content::FontAccessChooser::Callback callback) { + // TODO(codebytere) : implement with proper permissions model. + return std::make_unique(base::BindOnce( + [](content::FontAccessChooser::Callback callback) { + std::move(callback).Run( + blink::mojom::FontEnumerationStatus::kUnimplemented, {}); + }, + std::move(callback))); +} diff --git a/shell/browser/font/electron_font_access_delegate.h b/shell/browser/font/electron_font_access_delegate.h new file mode 100644 index 0000000000000..1f15da275cbd5 --- /dev/null +++ b/shell/browser/font/electron_font_access_delegate.h @@ -0,0 +1,28 @@ +// Copyright (c) 2021 Microsoft, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#ifndef SHELL_BROWSER_FONT_ELECTRON_FONT_ACCESS_DELEGATE_H_ +#define SHELL_BROWSER_FONT_ELECTRON_FONT_ACCESS_DELEGATE_H_ + +#include +#include +#include + +#include "content/public/browser/font_access_chooser.h" +#include "content/public/browser/font_access_delegate.h" + +class ElectronFontAccessDelegate : public content::FontAccessDelegate { + public: + ElectronFontAccessDelegate(); + ~ElectronFontAccessDelegate() override; + + std::unique_ptr RunChooser( + content::RenderFrameHost* frame, + const std::vector& selection, + content::FontAccessChooser::Callback callback) override; + + DISALLOW_COPY_AND_ASSIGN(ElectronFontAccessDelegate); +}; + +#endif // SHELL_BROWSER_FONT_ELECTRON_FONT_ACCESS_DELEGATE_H_