From 717b952afc29bdcb70b7fb7b58e43a517229cea8 Mon Sep 17 00:00:00 2001 From: Jeremy Rose Date: Thu, 7 Apr 2022 15:12:59 -0700 Subject: [PATCH 1/6] fix: backport unseasoned pdf support to 18.x --- BUILD.gn | 4 ++ chromium_src/BUILD.gn | 4 ++ shell/browser/electron_browser_client.cc | 40 +++++++++++++ shell/browser/electron_browser_client.h | 6 ++ shell/renderer/renderer_client_base.cc | 76 +++++++++++++++++++++++- shell/renderer/renderer_client_base.h | 3 + 6 files changed, 131 insertions(+), 2 deletions(-) diff --git a/BUILD.gn b/BUILD.gn index f3ce86f6b408e..f42445e0eb2c0 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -363,6 +363,10 @@ source_set("electron_lib") { "//components/network_session_configurator/common", "//components/omnibox/browser:buildflags", "//components/os_crypt", + "//components/pdf/browser", + "//components/pdf/browser:interceptors", + "//components/pdf/common", + "//components/pdf/renderer", "//components/pref_registry", "//components/prefs", "//components/security_state/content", diff --git a/chromium_src/BUILD.gn b/chromium_src/BUILD.gn index 4c048a63aef2e..dc7252582df3e 100644 --- a/chromium_src/BUILD.gn +++ b/chromium_src/BUILD.gn @@ -298,12 +298,16 @@ static_library("chrome") { if (enable_pdf_viewer) { sources += [ + "//chrome/browser/pdf/chrome_pdf_stream_delegate.cc", + "//chrome/browser/pdf/chrome_pdf_stream_delegate.h", "//chrome/browser/pdf/pdf_extension_util.cc", "//chrome/browser/pdf/pdf_extension_util.h", "//chrome/browser/pdf/pdf_frame_util.cc", "//chrome/browser/pdf/pdf_frame_util.h", "//chrome/renderer/pepper/chrome_pdf_print_client.cc", "//chrome/renderer/pepper/chrome_pdf_print_client.h", + "//chrome/browser/plugins/pdf_iframe_navigation_throttle.cc", + "//chrome/browser/plugins/pdf_iframe_navigation_throttle.h", ] } } diff --git a/shell/browser/electron_browser_client.cc b/shell/browser/electron_browser_client.cc index 5c051c5ded390..75448bac1e156 100644 --- a/shell/browser/electron_browser_client.cc +++ b/shell/browser/electron_browser_client.cc @@ -26,11 +26,16 @@ #include "base/strings/utf_string_conversions.h" #include "base/task/post_task.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/pdf/chrome_pdf_stream_delegate.h" +#include "chrome/browser/plugins/pdf_iframe_navigation_throttle.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_version.h" #include "components/net_log/chrome_net_log.h" #include "components/network_hints/common/network_hints.mojom.h" +#include "components/pdf/browser/pdf_navigation_throttle.h" +#include "components/pdf/browser/pdf_url_loader_request_interceptor.h" +#include "components/pdf/common/internal_plugin_helpers.h" #include "content/browser/keyboard_lock/keyboard_lock_service_impl.h" // nogncheck #include "content/browser/site_instance_impl.h" // nogncheck #include "content/public/browser/browser_main_runner.h" @@ -1048,6 +1053,18 @@ ElectronBrowserClient::CreateThrottlesForNavigation( std::make_unique(handle)); #endif +#if BUILDFLAG(ENABLE_PDF_VIEWER) + std::unique_ptr pdf_iframe_throttle = + PDFIFrameNavigationThrottle::MaybeCreateThrottleFor(handle); + if (pdf_iframe_throttle) + throttles.push_back(std::move(pdf_iframe_throttle)); + std::unique_ptr pdf_throttle = + pdf::PdfNavigationThrottle::MaybeCreateThrottleFor( + handle, std::make_unique()); + if (pdf_throttle) + throttles.push_back(std::move(pdf_throttle)); +#endif + return throttles; } @@ -1452,6 +1469,26 @@ bool ElectronBrowserClient::WillCreateURLLoaderFactory( return true; } +std::vector> +ElectronBrowserClient::WillCreateURLLoaderRequestInterceptors( + content::NavigationUIData* navigation_ui_data, + int frame_tree_node_id, + const scoped_refptr& + network_loader_factory) { + std::vector> + interceptors; +#if BUILDFLAG(ENABLE_PDF_VIEWER) + { + std::unique_ptr pdf_interceptor = + pdf::PdfURLLoaderRequestInterceptor::MaybeCreateInterceptor( + frame_tree_node_id, std::make_unique()); + if (pdf_interceptor) + interceptors.push_back(std::move(pdf_interceptor)); + } +#endif + return interceptors; +} + void ElectronBrowserClient::OverrideURLLoaderFactoryParams( content::BrowserContext* browser_context, const url::Origin& origin, @@ -1725,6 +1762,9 @@ ElectronBrowserClient::GetPluginMimeTypesWithExternalHandlers( auto map = PluginUtils::GetMimeTypeToExtensionIdMap(browser_context); for (const auto& pair : map) mime_types.insert(pair.first); +#endif +#if BUILDFLAG(ENABLE_PDF_VIEWER) + mime_types.insert(pdf::kInternalPluginMimeType); #endif return mime_types; } diff --git a/shell/browser/electron_browser_client.h b/shell/browser/electron_browser_client.h index 730fc07e687e8..c0b9827d4cf24 100644 --- a/shell/browser/electron_browser_client.h +++ b/shell/browser/electron_browser_client.h @@ -227,6 +227,12 @@ class ElectronBrowserClient : public content::ContentBrowserClient, bool* bypass_redirect_checks, bool* disable_secure_dns, network::mojom::URLLoaderFactoryOverridePtr* factory_override) override; + std::vector> + WillCreateURLLoaderRequestInterceptors( + content::NavigationUIData* navigation_ui_data, + int frame_tree_node_id, + const scoped_refptr& + network_loader_factory) override; bool ShouldTreatURLSchemeAsFirstPartyWhenTopLevel( base::StringPiece scheme, bool is_embedded_origin_secure) override; diff --git a/shell/renderer/renderer_client_base.cc b/shell/renderer/renderer_client_base.cc index 98f79468c5445..526578e9afbef 100644 --- a/shell/renderer/renderer_client_base.cc +++ b/shell/renderer/renderer_client_base.cc @@ -12,7 +12,10 @@ #include "base/command_line.h" #include "base/strings/string_split.h" #include "base/strings/stringprintf.h" +#include "chrome/common/pdf_util.h" #include "components/network_hints/renderer/web_prescient_networking_impl.h" +#include "components/pdf/renderer/internal_plugin_renderer_helpers.h" +#include "components/pdf/renderer/pdf_internal_plugin_delegate.h" #include "content/common/buildflags.h" #include "content/public/common/content_constants.h" #include "content/public/common/content_switches.h" @@ -311,14 +314,47 @@ void RendererClientBase::DidClearWindowObject( render_frame->GetWebFrame()->ExecuteScript(blink::WebScriptSource("void 0")); } +class ChromePdfInternalPluginDelegate final + : public pdf::PdfInternalPluginDelegate { + public: + ChromePdfInternalPluginDelegate() = default; + ChromePdfInternalPluginDelegate(const ChromePdfInternalPluginDelegate&) = + delete; + ChromePdfInternalPluginDelegate& operator=( + const ChromePdfInternalPluginDelegate&) = delete; + ~ChromePdfInternalPluginDelegate() override = default; + + // `pdf::PdfInternalPluginDelegate`: + bool IsAllowedOrigin(const url::Origin& origin) const override { + return origin.scheme() == extensions::kExtensionScheme && + origin.host() == extension_misc::kPdfExtensionId; + } +}; + bool RendererClientBase::OverrideCreatePlugin( content::RenderFrame* render_frame, const blink::WebPluginParams& params, blink::WebPlugin** plugin) { - if (params.mime_type.Utf8() == content::kBrowserPluginMimeType || #if BUILDFLAG(ENABLE_PDF_VIEWER) - params.mime_type.Utf8() == kPdfPluginMimeType || + if (params.mime_type.Utf8() == kPdfPluginMimeType) { + + content::WebPluginInfo info; + info.type = content::WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS; + const char16_t kPDFExtensionPluginName[] = u"Chromium PDF Viewer"; + info.name = kPDFExtensionPluginName; + info.path = base::FilePath::FromUTF8Unsafe("internal-pdf-viewer"); + info.background_color = content::WebPluginInfo::kDefaultBackgroundColor; + info.mime_types.emplace_back("application/x-google-chrome-pdf", "pdf", + "Portable Document Format"); + *plugin = pdf::CreateInternalPlugin( + info, std::move(params), render_frame, + std::make_unique()); + return true; + } #endif // BUILDFLAG(ENABLE_PDF_VIEWER) + + if (params.mime_type.Utf8() == content::kBrowserPluginMimeType || + params.mime_type.Utf8() == kPdfPluginMimeType || render_frame->GetBlinkPreferences().enable_plugins) return false; @@ -355,6 +391,27 @@ bool RendererClientBase::IsPluginHandledExternally( #if BUILDFLAG(ENABLE_PDF_VIEWER) DCHECK(plugin_element.HasHTMLTagName("object") || plugin_element.HasHTMLTagName("embed")); + if (mime_type == "application/x-google-chrome-pdf") { + if (IsPdfInternalPluginAllowedOrigin( + render_frame->GetWebFrame()->GetSecurityOrigin())) { + return true; + } + + content::WebPluginInfo info; + info.type = content::WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS; + const char16_t kPDFExtensionPluginName[] = u"Chromium PDF Viewer"; + info.name = kPDFExtensionPluginName; + info.path = base::FilePath::FromUTF8Unsafe("internal-pdf-viewer"); + info.background_color = content::WebPluginInfo::kDefaultBackgroundColor; + info.mime_types.emplace_back("application/x-google-chrome-pdf", "pdf", + "Portable Document Format"); + return extensions::MimeHandlerViewContainerManager::Get( + content::RenderFrame::FromWebFrame( + plugin_element.GetDocument().GetFrame()), + true /* create_if_does_not_exist */) + ->CreateFrameContainer(plugin_element, original_url, mime_type, info); + } + // TODO(nornagon): this info should be shared with the data in // electron_content_client.cc / ComputeBuiltInPlugins. content::WebPluginInfo info; @@ -381,6 +438,21 @@ bool RendererClientBase::IsOriginIsolatedPepperPlugin( return true; } +v8::Local RendererClientBase::GetScriptableObject( + const blink::WebElement& plugin_element, + v8::Isolate* isolate) { + // If there is a MimeHandlerView that can provide the scriptable object then + // MaybeCreateMimeHandlerView must have been called before and a container + // manager should exist. + auto* container_manager = extensions::MimeHandlerViewContainerManager::Get( + content::RenderFrame::FromWebFrame( + plugin_element.GetDocument().GetFrame()), + false /* create_if_does_not_exist */); + if (container_manager) + return container_manager->GetScriptableObject(plugin_element, isolate); + return v8::Local(); +} + std::unique_ptr RendererClientBase::CreatePrescientNetworking( content::RenderFrame* render_frame) { diff --git a/shell/renderer/renderer_client_base.h b/shell/renderer/renderer_client_base.h index d830c6db5f88f..84acea819e8c6 100644 --- a/shell/renderer/renderer_client_base.h +++ b/shell/renderer/renderer_client_base.h @@ -112,6 +112,9 @@ class RendererClientBase : public content::ContentRendererClient const GURL& original_url, const std::string& mime_type) override; bool IsOriginIsolatedPepperPlugin(const base::FilePath& plugin_path) override; + v8::Local GetScriptableObject( + const blink::WebElement& plugin_element, + v8::Isolate* isolate) override; void RunScriptsAtDocumentStart(content::RenderFrame* render_frame) override; void RunScriptsAtDocumentEnd(content::RenderFrame* render_frame) override; From 86281c0bc3e235c1de5be903601408716fc35c50 Mon Sep 17 00:00:00 2001 From: Jeremy Rose Date: Thu, 7 Apr 2022 15:16:57 -0700 Subject: [PATCH 2/6] lint --- shell/renderer/renderer_client_base.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/shell/renderer/renderer_client_base.cc b/shell/renderer/renderer_client_base.cc index 526578e9afbef..cb9546f3fb3ef 100644 --- a/shell/renderer/renderer_client_base.cc +++ b/shell/renderer/renderer_client_base.cc @@ -337,7 +337,6 @@ bool RendererClientBase::OverrideCreatePlugin( blink::WebPlugin** plugin) { #if BUILDFLAG(ENABLE_PDF_VIEWER) if (params.mime_type.Utf8() == kPdfPluginMimeType) { - content::WebPluginInfo info; info.type = content::WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS; const char16_t kPDFExtensionPluginName[] = u"Chromium PDF Viewer"; From 3f63d28d62155e0f893ab3cc6690490ef484831c Mon Sep 17 00:00:00 2001 From: Jeremy Rose Date: Mon, 11 Apr 2022 09:40:27 -0700 Subject: [PATCH 3/6] gn format --- chromium_src/BUILD.gn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chromium_src/BUILD.gn b/chromium_src/BUILD.gn index dc7252582df3e..1ab069af39c5b 100644 --- a/chromium_src/BUILD.gn +++ b/chromium_src/BUILD.gn @@ -304,10 +304,10 @@ static_library("chrome") { "//chrome/browser/pdf/pdf_extension_util.h", "//chrome/browser/pdf/pdf_frame_util.cc", "//chrome/browser/pdf/pdf_frame_util.h", - "//chrome/renderer/pepper/chrome_pdf_print_client.cc", - "//chrome/renderer/pepper/chrome_pdf_print_client.h", "//chrome/browser/plugins/pdf_iframe_navigation_throttle.cc", "//chrome/browser/plugins/pdf_iframe_navigation_throttle.h", + "//chrome/renderer/pepper/chrome_pdf_print_client.cc", + "//chrome/renderer/pepper/chrome_pdf_print_client.h", ] } } From 0b1fe48338d7eac75b7d3344c395309a13211af2 Mon Sep 17 00:00:00 2001 From: Jeremy Rose Date: Mon, 11 Apr 2022 09:51:49 -0700 Subject: [PATCH 4/6] cherry-pick #33513 --- BUILD.gn | 6 +- chromium_src/BUILD.gn | 19 ++--- shell/app/electron_content_client.cc | 13 ++-- shell/browser/electron_api_ipc_handler_impl.h | 1 + shell/browser/electron_browser_client.cc | 11 +-- ...ectron_web_contents_utility_handler_impl.h | 1 + shell/common/electron_constants.cc | 3 +- shell/common/electron_constants.h | 4 +- shell/renderer/renderer_client_base.cc | 70 +++++++++---------- 9 files changed, 63 insertions(+), 65 deletions(-) diff --git a/BUILD.gn b/BUILD.gn index f42445e0eb2c0..d5ac6987873cd 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -363,10 +363,6 @@ source_set("electron_lib") { "//components/network_session_configurator/common", "//components/omnibox/browser:buildflags", "//components/os_crypt", - "//components/pdf/browser", - "//components/pdf/browser:interceptors", - "//components/pdf/common", - "//components/pdf/renderer", "//components/pref_registry", "//components/prefs", "//components/security_state/content", @@ -698,6 +694,8 @@ source_set("electron_lib") { deps += [ "//chrome/browser/resources/pdf:resources", "//components/pdf/browser", + "//components/pdf/browser:interceptors", + "//components/pdf/common", "//components/pdf/renderer", "//pdf:pdf_ppapi", ] diff --git a/chromium_src/BUILD.gn b/chromium_src/BUILD.gn index 1ab069af39c5b..1efaf4a673c03 100644 --- a/chromium_src/BUILD.gn +++ b/chromium_src/BUILD.gn @@ -309,6 +309,10 @@ static_library("chrome") { "//chrome/renderer/pepper/chrome_pdf_print_client.cc", "//chrome/renderer/pepper/chrome_pdf_print_client.h", ] + deps += [ + "//components/pdf/browser", + "//components/pdf/renderer", + ] } } @@ -336,15 +340,6 @@ source_set("plugins") { "//chrome/browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.cc", "//chrome/browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.h", ] - deps += [ - "//media:media_buildflags", - "//ppapi/buildflags", - "//ppapi/proxy:ipc", - "//services/device/public/mojom", - ] - if (enable_pdf_viewer) { - deps += [ "//components/pdf/browser" ] - } # renderer side sources += [ @@ -355,16 +350,16 @@ source_set("plugins") { "//chrome/renderer/pepper/pepper_shared_memory_message_filter.cc", "//chrome/renderer/pepper/pepper_shared_memory_message_filter.h", ] - if (enable_pdf_viewer) { - deps += [ "//components/pdf/renderer" ] - } + deps += [ "//components/strings", "//media:media_buildflags", + "//ppapi/buildflags", "//ppapi/host", "//ppapi/proxy", "//ppapi/proxy:ipc", "//ppapi/shared_impl", + "//services/device/public/mojom", "//skia", ] } diff --git a/shell/app/electron_content_client.cc b/shell/app/electron_content_client.cc index 14e0c0c372833..81382f253e18a 100644 --- a/shell/app/electron_content_client.cc +++ b/shell/app/electron_content_client.cc @@ -34,7 +34,9 @@ #endif // defined(WIDEVINE_CDM_AVAILABLE) #if BUILDFLAG(ENABLE_PDF_VIEWER) -#include "pdf/pdf.h" // nogncheck +#include "chrome/common/pdf_util.h" +#include "components/pdf/common/internal_plugin_helpers.h" +#include "pdf/pdf.h" // nogncheck #include "pdf/pdf_ppapi.h" // nogncheck #include "shell/common/electron_constants.h" #endif // BUILDFLAG(ENABLE_PDF_VIEWER) @@ -107,11 +109,11 @@ void ComputeBuiltInPlugins(std::vector* plugins) { content::PepperPluginInfo pdf_info; pdf_info.is_internal = true; pdf_info.is_out_of_process = true; - pdf_info.name = "Chromium PDF Viewer"; + pdf_info.name = kPDFInternalPluginName; pdf_info.description = "Portable Document Format"; // This isn't a real file path; it's just used as a unique identifier. pdf_info.path = base::FilePath(kPdfPluginPath); - content::WebPluginMimeType pdf_mime_type(kPdfPluginMimeType, "pdf", + content::WebPluginMimeType pdf_mime_type(pdf::kInternalPluginMimeType, "pdf", "Portable Document Format"); pdf_info.mime_types.push_back(pdf_mime_type); pdf_info.internal_entry_points.get_interface = chrome_pdf::PPP_GetInterface; @@ -128,12 +130,11 @@ void ComputeBuiltInPlugins(std::vector* plugins) { // here. content::WebPluginInfo info; info.type = content::WebPluginInfo::PLUGIN_TYPE_BROWSER_PLUGIN; - info.name = u"Chromium PDF Viewer"; + info.name = base::ASCIIToUTF16(kPDFExtensionPluginName); // This isn't a real file path; it's just used as a unique identifier. info.path = base::FilePath::FromUTF8Unsafe(extension_misc::kPdfExtensionId); info.background_color = content::WebPluginInfo::kDefaultBackgroundColor; - info.mime_types.emplace_back("application/pdf", "pdf", - "Portable Document Format"); + info.mime_types.emplace_back(kPDFMimeType, "pdf", "Portable Document Format"); content::PluginService::GetInstance()->RefreshPlugins(); content::PluginService::GetInstance()->RegisterInternalPlugin(info, true); #endif // BUILDFLAG(ENABLE_PDF_VIEWER) diff --git a/shell/browser/electron_api_ipc_handler_impl.h b/shell/browser/electron_api_ipc_handler_impl.h index 7cddf88bedc4a..222f42bed1be6 100644 --- a/shell/browser/electron_api_ipc_handler_impl.h +++ b/shell/browser/electron_api_ipc_handler_impl.h @@ -11,6 +11,7 @@ #include "base/memory/weak_ptr.h" #include "content/public/browser/web_contents_observer.h" #include "electron/shell/common/api/api.mojom.h" +#include "mojo/public/cpp/bindings/associated_receiver.h" #include "shell/browser/api/electron_api_web_contents.h" namespace content { diff --git a/shell/browser/electron_browser_client.cc b/shell/browser/electron_browser_client.cc index 75448bac1e156..e4818fee6af51 100644 --- a/shell/browser/electron_browser_client.cc +++ b/shell/browser/electron_browser_client.cc @@ -26,16 +26,11 @@ #include "base/strings/utf_string_conversions.h" #include "base/task/post_task.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/pdf/chrome_pdf_stream_delegate.h" -#include "chrome/browser/plugins/pdf_iframe_navigation_throttle.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_version.h" #include "components/net_log/chrome_net_log.h" #include "components/network_hints/common/network_hints.mojom.h" -#include "components/pdf/browser/pdf_navigation_throttle.h" -#include "components/pdf/browser/pdf_url_loader_request_interceptor.h" -#include "components/pdf/common/internal_plugin_helpers.h" #include "content/browser/keyboard_lock/keyboard_lock_service_impl.h" // nogncheck #include "content/browser/site_instance_impl.h" // nogncheck #include "content/public/browser/browser_main_runner.h" @@ -51,6 +46,7 @@ #include "content/public/browser/site_instance.h" #include "content/public/browser/tts_controller.h" #include "content/public/browser/tts_platform.h" +#include "content/public/browser/url_loader_request_interceptor.h" #include "content/public/common/content_descriptors.h" #include "content/public/common/content_paths.h" #include "content/public/common/content_switches.h" @@ -209,7 +205,12 @@ #endif #if BUILDFLAG(ENABLE_PDF_VIEWER) +#include "chrome/browser/pdf/chrome_pdf_stream_delegate.h" +#include "chrome/browser/plugins/pdf_iframe_navigation_throttle.h" // nogncheck +#include "components/pdf/browser/pdf_navigation_throttle.h" +#include "components/pdf/browser/pdf_url_loader_request_interceptor.h" #include "components/pdf/browser/pdf_web_contents_helper.h" // nogncheck +#include "components/pdf/common/internal_plugin_helpers.h" #endif using content::BrowserThread; diff --git a/shell/browser/electron_web_contents_utility_handler_impl.h b/shell/browser/electron_web_contents_utility_handler_impl.h index 30a9baa40f835..819c818fcae54 100644 --- a/shell/browser/electron_web_contents_utility_handler_impl.h +++ b/shell/browser/electron_web_contents_utility_handler_impl.h @@ -11,6 +11,7 @@ #include "base/memory/weak_ptr.h" #include "content/public/browser/web_contents_observer.h" #include "electron/shell/common/api/api.mojom.h" +#include "mojo/public/cpp/bindings/associated_receiver.h" #include "shell/browser/api/electron_api_web_contents.h" namespace content { diff --git a/shell/common/electron_constants.cc b/shell/common/electron_constants.cc index 5d53425a3fc52..3d6eda0e9eea8 100644 --- a/shell/common/electron_constants.cc +++ b/shell/common/electron_constants.cc @@ -30,7 +30,8 @@ const char kRunAsNode[] = "ELECTRON_RUN_AS_NODE"; #endif #if BUILDFLAG(ENABLE_PDF_VIEWER) -const char kPdfPluginMimeType[] = "application/x-google-chrome-pdf"; +const char kPDFExtensionPluginName[] = "Chromium PDF Viewer"; +const char kPDFInternalPluginName[] = "Chromium PDF Plugin"; const base::FilePath::CharType kPdfPluginPath[] = FILE_PATH_LITERAL("internal-pdf-viewer"); #endif // BUILDFLAG(ENABLE_PDF_VIEWER) diff --git a/shell/common/electron_constants.h b/shell/common/electron_constants.h index b91b70e683632..4218b3e47ffc7 100644 --- a/shell/common/electron_constants.h +++ b/shell/common/electron_constants.h @@ -30,8 +30,8 @@ extern const char kRunAsNode[]; #endif #if BUILDFLAG(ENABLE_PDF_VIEWER) -// The MIME type used for the PDF plugin. -extern const char kPdfPluginMimeType[]; +extern const char kPDFExtensionPluginName[]; +extern const char kPDFInternalPluginName[]; extern const base::FilePath::CharType kPdfPluginPath[]; #endif // BUILDFLAG(ENABLE_PDF_VIEWER) diff --git a/shell/renderer/renderer_client_base.cc b/shell/renderer/renderer_client_base.cc index cb9546f3fb3ef..6a36fc06274ef 100644 --- a/shell/renderer/renderer_client_base.cc +++ b/shell/renderer/renderer_client_base.cc @@ -12,10 +12,7 @@ #include "base/command_line.h" #include "base/strings/string_split.h" #include "base/strings/stringprintf.h" -#include "chrome/common/pdf_util.h" #include "components/network_hints/renderer/web_prescient_networking_impl.h" -#include "components/pdf/renderer/internal_plugin_renderer_helpers.h" -#include "components/pdf/renderer/pdf_internal_plugin_delegate.h" #include "content/common/buildflags.h" #include "content/public/common/content_constants.h" #include "content/public/common/content_switches.h" @@ -65,6 +62,10 @@ #endif #if BUILDFLAG(ENABLE_PDF_VIEWER) +#include "chrome/common/pdf_util.h" +#include "components/pdf/common/internal_plugin_helpers.h" +#include "components/pdf/renderer/internal_plugin_renderer_helpers.h" +#include "components/pdf/renderer/pdf_internal_plugin_delegate.h" #include "shell/common/electron_constants.h" #endif // BUILDFLAG(ENABLE_PDF_VIEWER) @@ -108,6 +109,25 @@ std::vector ParseSchemesCLISwitch(base::CommandLine* command_line, base::SPLIT_WANT_NONEMPTY); } +#if BUILDFLAG(ENABLE_PDF_VIEWER) +class ChromePdfInternalPluginDelegate final + : public pdf::PdfInternalPluginDelegate { + public: + ChromePdfInternalPluginDelegate() = default; + ChromePdfInternalPluginDelegate(const ChromePdfInternalPluginDelegate&) = + delete; + ChromePdfInternalPluginDelegate& operator=( + const ChromePdfInternalPluginDelegate&) = delete; + ~ChromePdfInternalPluginDelegate() override = default; + + // `pdf::PdfInternalPluginDelegate`: + bool IsAllowedOrigin(const url::Origin& origin) const override { + return origin.scheme() == extensions::kExtensionScheme && + origin.host() == extension_misc::kPdfExtensionId; + } +}; +#endif // BUILDFLAG(ENABLE_PDF_VIEWER) + // static RendererClientBase* g_renderer_client_base = nullptr; @@ -314,36 +334,18 @@ void RendererClientBase::DidClearWindowObject( render_frame->GetWebFrame()->ExecuteScript(blink::WebScriptSource("void 0")); } -class ChromePdfInternalPluginDelegate final - : public pdf::PdfInternalPluginDelegate { - public: - ChromePdfInternalPluginDelegate() = default; - ChromePdfInternalPluginDelegate(const ChromePdfInternalPluginDelegate&) = - delete; - ChromePdfInternalPluginDelegate& operator=( - const ChromePdfInternalPluginDelegate&) = delete; - ~ChromePdfInternalPluginDelegate() override = default; - - // `pdf::PdfInternalPluginDelegate`: - bool IsAllowedOrigin(const url::Origin& origin) const override { - return origin.scheme() == extensions::kExtensionScheme && - origin.host() == extension_misc::kPdfExtensionId; - } -}; - bool RendererClientBase::OverrideCreatePlugin( content::RenderFrame* render_frame, const blink::WebPluginParams& params, blink::WebPlugin** plugin) { #if BUILDFLAG(ENABLE_PDF_VIEWER) - if (params.mime_type.Utf8() == kPdfPluginMimeType) { + if (params.mime_type.Utf8() == pdf::kInternalPluginMimeType) { content::WebPluginInfo info; info.type = content::WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS; - const char16_t kPDFExtensionPluginName[] = u"Chromium PDF Viewer"; - info.name = kPDFExtensionPluginName; - info.path = base::FilePath::FromUTF8Unsafe("internal-pdf-viewer"); + info.name = base::ASCIIToUTF16(kPDFInternalPluginName); + info.path = base::FilePath(kPdfPluginPath); info.background_color = content::WebPluginInfo::kDefaultBackgroundColor; - info.mime_types.emplace_back("application/x-google-chrome-pdf", "pdf", + info.mime_types.emplace_back(pdf::kInternalPluginMimeType, "pdf", "Portable Document Format"); *plugin = pdf::CreateInternalPlugin( info, std::move(params), render_frame, @@ -353,7 +355,6 @@ bool RendererClientBase::OverrideCreatePlugin( #endif // BUILDFLAG(ENABLE_PDF_VIEWER) if (params.mime_type.Utf8() == content::kBrowserPluginMimeType || - params.mime_type.Utf8() == kPdfPluginMimeType || render_frame->GetBlinkPreferences().enable_plugins) return false; @@ -390,7 +391,7 @@ bool RendererClientBase::IsPluginHandledExternally( #if BUILDFLAG(ENABLE_PDF_VIEWER) DCHECK(plugin_element.HasHTMLTagName("object") || plugin_element.HasHTMLTagName("embed")); - if (mime_type == "application/x-google-chrome-pdf") { + if (mime_type == pdf::kInternalPluginMimeType) { if (IsPdfInternalPluginAllowedOrigin( render_frame->GetWebFrame()->GetSecurityOrigin())) { return true; @@ -398,11 +399,10 @@ bool RendererClientBase::IsPluginHandledExternally( content::WebPluginInfo info; info.type = content::WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS; - const char16_t kPDFExtensionPluginName[] = u"Chromium PDF Viewer"; - info.name = kPDFExtensionPluginName; - info.path = base::FilePath::FromUTF8Unsafe("internal-pdf-viewer"); + info.name = base::ASCIIToUTF16(kPDFInternalPluginName); + info.path = base::FilePath(kPdfPluginPath); info.background_color = content::WebPluginInfo::kDefaultBackgroundColor; - info.mime_types.emplace_back("application/x-google-chrome-pdf", "pdf", + info.mime_types.emplace_back(pdf::kInternalPluginMimeType, "pdf", "Portable Document Format"); return extensions::MimeHandlerViewContainerManager::Get( content::RenderFrame::FromWebFrame( @@ -415,12 +415,10 @@ bool RendererClientBase::IsPluginHandledExternally( // electron_content_client.cc / ComputeBuiltInPlugins. content::WebPluginInfo info; info.type = content::WebPluginInfo::PLUGIN_TYPE_BROWSER_PLUGIN; - const char16_t kPDFExtensionPluginName[] = u"Chromium PDF Viewer"; - info.name = kPDFExtensionPluginName; + info.name = base::ASCIIToUTF16(kPDFExtensionPluginName); info.path = base::FilePath::FromUTF8Unsafe(extension_misc::kPdfExtensionId); info.background_color = content::WebPluginInfo::kDefaultBackgroundColor; - info.mime_types.emplace_back("application/pdf", "pdf", - "Portable Document Format"); + info.mime_types.emplace_back(kPDFMimeType, "pdf", "Portable Document Format"); return extensions::MimeHandlerViewContainerManager::Get( content::RenderFrame::FromWebFrame( plugin_element.GetDocument().GetFrame()), @@ -440,6 +438,7 @@ bool RendererClientBase::IsOriginIsolatedPepperPlugin( v8::Local RendererClientBase::GetScriptableObject( const blink::WebElement& plugin_element, v8::Isolate* isolate) { +#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS) // If there is a MimeHandlerView that can provide the scriptable object then // MaybeCreateMimeHandlerView must have been called before and a container // manager should exist. @@ -449,6 +448,7 @@ v8::Local RendererClientBase::GetScriptableObject( false /* create_if_does_not_exist */); if (container_manager) return container_manager->GetScriptableObject(plugin_element, isolate); +#endif return v8::Local(); } From b736f441e2ad50b612de7988cafc60b3456dbe85 Mon Sep 17 00:00:00 2001 From: Jeremy Rose Date: Mon, 11 Apr 2022 10:08:09 -0700 Subject: [PATCH 5/6] lint --- shell/app/electron_content_client.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/app/electron_content_client.cc b/shell/app/electron_content_client.cc index 81382f253e18a..767c4ea2a0ba1 100644 --- a/shell/app/electron_content_client.cc +++ b/shell/app/electron_content_client.cc @@ -36,7 +36,7 @@ #if BUILDFLAG(ENABLE_PDF_VIEWER) #include "chrome/common/pdf_util.h" #include "components/pdf/common/internal_plugin_helpers.h" -#include "pdf/pdf.h" // nogncheck +#include "pdf/pdf.h" // nogncheck #include "pdf/pdf_ppapi.h" // nogncheck #include "shell/common/electron_constants.h" #endif // BUILDFLAG(ENABLE_PDF_VIEWER) From 5825d8024e5b39efc78b7ec3bed789f04d223cf1 Mon Sep 17 00:00:00 2001 From: Jeremy Rose Date: Mon, 11 Apr 2022 16:41:27 -0700 Subject: [PATCH 6/6] add missing dep in gn --- chromium_src/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/chromium_src/BUILD.gn b/chromium_src/BUILD.gn index 1efaf4a673c03..b49dde05fb9ed 100644 --- a/chromium_src/BUILD.gn +++ b/chromium_src/BUILD.gn @@ -361,6 +361,7 @@ source_set("plugins") { "//ppapi/shared_impl", "//services/device/public/mojom", "//skia", + "//storage/browser", ] }