Skip to content

Commit d590f2e

Browse files
authored
feat: enable pdf viewer (electron#21794)
1 parent 85f9c77 commit d590f2e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+1579
-210
lines changed

BUILD.gn

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -629,8 +629,6 @@ source_set("electron_lib") {
629629
deps += [ "//components/printing/common:mojo_interfaces" ]
630630
}
631631

632-
deps += [ "shell/common/extensions/api:extensions_features" ]
633-
deps += [ "shell/common/extensions/api" ]
634632
deps += [
635633
"//components/pref_registry",
636634
"//components/user_prefs",
@@ -642,12 +640,22 @@ source_set("electron_lib") {
642640
]
643641
if (enable_electron_extensions) {
644642
sources += filenames.lib_sources_extensions
643+
deps += [
644+
"shell/browser/extensions/api:api_registration",
645+
"shell/common/extensions/api",
646+
"shell/common/extensions/api:extensions_features",
647+
"//chrome/browser/resources:component_extension_resources",
648+
"//components/zoom",
649+
]
645650
}
646651

647652
if (enable_pdf) {
648653
# Printing depends on some //pdf code, so it needs to be built even if the
649654
# pdf viewer isn't enabled.
650-
deps += [ "//pdf" ]
655+
deps += [
656+
"//pdf",
657+
"//pdf:features",
658+
]
651659
}
652660
if (enable_pdf_viewer) {
653661
deps += [

buildflags/buildflags.gni

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ declare_args() {
1414

1515
enable_view_api = false
1616

17-
enable_pdf_viewer = false
17+
enable_pdf_viewer = true
1818

1919
enable_tts = true
2020

chromium_src/BUILD.gn

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,12 @@ static_library("chrome") {
232232

233233
if (enable_electron_extensions) {
234234
sources += [
235+
"//chrome/browser/extensions/chrome_url_request_util.cc",
236+
"//chrome/browser/extensions/chrome_url_request_util.h",
237+
"//chrome/browser/pdf/pdf_extension_util.cc",
238+
"//chrome/browser/pdf/pdf_extension_util.h",
239+
"//chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc",
240+
"//chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h",
235241
"//chrome/renderer/extensions/extension_hooks_delegate.cc",
236242
"//chrome/renderer/extensions/extension_hooks_delegate.h",
237243
"//chrome/renderer/extensions/tabs_hooks_delegate.cc",

electron_paks.gni

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,14 @@ template("electron_extra_paks") {
9292
}
9393
if (enable_electron_extensions) {
9494
sources += [
95+
"$root_gen_dir/chrome/component_extension_resources.pak",
9596
"$root_gen_dir/extensions/extensions_renderer_resources.pak",
9697
"$root_gen_dir/extensions/extensions_resources.pak",
9798
]
98-
deps += [ "//extensions:extensions_resources" ]
99+
deps += [
100+
"//chrome/browser/resources:component_extension_resources",
101+
"//extensions:extensions_resources",
102+
]
99103
}
100104
}
101105
}

electron_resources.grd

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
<part file="electron_strings.grdp" />
1818
</messages>
1919
<includes>
20-
<include name="IDR_CONTENT_SHELL_DEVTOOLS_DISCOVERY_PAGE" file="${target_gen_dir}\shell_devtools_discovery_page.html" use_base_dir="false" type="BINDATA" />
20+
<include name="IDR_CONTENT_SHELL_DEVTOOLS_DISCOVERY_PAGE" file="${target_gen_dir}/shell_devtools_discovery_page.html" use_base_dir="false" type="BINDATA" />
21+
<include name="IDR_PDF_MANIFEST" file="../chrome/browser/resources/pdf/manifest.json" type="BINDATA" />
2122
</includes>
2223
</release>
2324
</grit>

filenames.gni

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,8 @@ filenames = {
279279
"shell/browser/notifications/win/win32_notification.h",
280280
"shell/browser/notifications/win/windows_toast_notification.cc",
281281
"shell/browser/notifications/win/windows_toast_notification.h",
282+
"shell/browser/plugins/plugin_utils.cc",
283+
"shell/browser/plugins/plugin_utils.h",
282284
"shell/browser/pref_store_delegate.cc",
283285
"shell/browser/pref_store_delegate.h",
284286
"shell/browser/relauncher.cc",
@@ -594,14 +596,18 @@ filenames = {
594596
]
595597

596598
lib_sources_extensions = [
599+
"shell/browser/extensions/api/resources_private/resources_private_api.cc",
600+
"shell/browser/extensions/api/resources_private/resources_private_api.h",
597601
"shell/browser/extensions/api/runtime/electron_runtime_api_delegate.cc",
598602
"shell/browser/extensions/api/runtime/electron_runtime_api_delegate.h",
599603
"shell/browser/extensions/api/tabs/tabs_api.cc",
600604
"shell/browser/extensions/api/tabs/tabs_api.h",
601-
"shell/browser/extensions/electron_extensions_browser_client.cc",
602-
"shell/browser/extensions/electron_extensions_browser_client.h",
605+
"shell/browser/extensions/api/streams_private/streams_private_api.cc",
606+
"shell/browser/extensions/api/streams_private/streams_private_api.h",
603607
"shell/browser/extensions/electron_browser_context_keyed_service_factories.cc",
604608
"shell/browser/extensions/electron_browser_context_keyed_service_factories.h",
609+
"shell/browser/extensions/electron_component_extension_resource_manager.cc",
610+
"shell/browser/extensions/electron_component_extension_resource_manager.h",
605611
"shell/browser/extensions/electron_display_info_provider.cc",
606612
"shell/browser/extensions/electron_display_info_provider.h",
607613
"shell/browser/extensions/electron_extension_host_delegate.cc",
@@ -614,24 +620,26 @@ filenames = {
614620
"shell/browser/extensions/electron_extension_system_factory.h",
615621
"shell/browser/extensions/electron_extension_web_contents_observer.cc",
616622
"shell/browser/extensions/electron_extension_web_contents_observer.h",
617-
"shell/browser/extensions/electron_navigation_ui_data.cc",
618-
"shell/browser/extensions/electron_navigation_ui_data.h",
619-
"shell/browser/extensions/electron_process_manager_delegate.cc",
620-
"shell/browser/extensions/electron_process_manager_delegate.h",
621623
"shell/browser/extensions/electron_extensions_api_client.cc",
622624
"shell/browser/extensions/electron_extensions_api_client.h",
623625
"shell/browser/extensions/electron_extensions_browser_api_provider.cc",
624626
"shell/browser/extensions/electron_extensions_browser_api_provider.h",
627+
"shell/browser/extensions/electron_extensions_browser_client.cc",
628+
"shell/browser/extensions/electron_extensions_browser_client.h",
625629
"shell/browser/extensions/electron_messaging_delegate.cc",
626630
"shell/browser/extensions/electron_messaging_delegate.h",
631+
"shell/browser/extensions/electron_navigation_ui_data.cc",
632+
"shell/browser/extensions/electron_navigation_ui_data.h",
633+
"shell/browser/extensions/electron_process_manager_delegate.cc",
634+
"shell/browser/extensions/electron_process_manager_delegate.h",
627635
"shell/common/extensions/electron_extensions_api_provider.cc",
628636
"shell/common/extensions/electron_extensions_api_provider.h",
629637
"shell/common/extensions/electron_extensions_client.cc",
630638
"shell/common/extensions/electron_extensions_client.h",
631-
"shell/renderer/extensions/electron_extensions_renderer_client.cc",
632-
"shell/renderer/extensions/electron_extensions_renderer_client.h",
633639
"shell/renderer/extensions/electron_extensions_dispatcher_delegate.cc",
634640
"shell/renderer/extensions/electron_extensions_dispatcher_delegate.h",
641+
"shell/renderer/extensions/electron_extensions_renderer_client.cc",
642+
"shell/renderer/extensions/electron_extensions_renderer_client.h",
635643
]
636644

637645
app_sources = [

patches/chromium/.patches

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,5 @@ accessible_pane_view.patch
8282
fixme_grit_conflicts.patch
8383
fix_use_the_new_mediaplaypause_key_listener_for_internal_chrome.patch
8484
fix_use_native_window_button_positions_when_macos_locale_is_rtl.patch
85+
use_electron_resources_in_pdf_util.patch
86+
hack_plugin_response_interceptor_to_point_to_electron.patch
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Jeremy Apthorp <[email protected]>
3+
Date: Mon, 10 Feb 2020 11:52:23 -0800
4+
Subject: hack plugin response interceptor to point to electron
5+
6+
chrome's streams_private_api does prerender and other things and would
7+
require a largeish patch to get working, so just redirect it to our
8+
implementation instead.
9+
10+
diff --git a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
11+
index 1c9aeb8fa71d054159c2ccccccbe57aa474d417e..0bd6412f2c79f77f936720b1a0795b50ecefd26c 100644
12+
--- a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
13+
+++ b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
14+
@@ -8,8 +8,8 @@
15+
#include "base/feature_list.h"
16+
#include "base/guid.h"
17+
#include "base/task/post_task.h"
18+
-#include "chrome/browser/extensions/api/streams_private/streams_private_api.h"
19+
-#include "chrome/browser/plugins/plugin_utils.h"
20+
+#include "electron/shell/browser/extensions/api/streams_private/streams_private_api.h"
21+
+#include "electron/shell/browser/plugins/plugin_utils.h"
22+
#include "content/public/browser/browser_task_traits.h"
23+
#include "content/public/browser/browser_thread.h"
24+
#include "content/public/browser/download_utils.h"
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Jeremy Apthorp <[email protected]>
3+
Date: Mon, 10 Feb 2020 10:37:48 -0800
4+
Subject: use electron resources in pdf_util
5+
6+
Without this, the ID for IDR_PDF_MANIFEST will be wrong on linux
7+
and cause a DCHECK(), since the resource will be loaded as an empty
8+
string.
9+
10+
diff --git a/chrome/browser/pdf/pdf_extension_util.cc b/chrome/browser/pdf/pdf_extension_util.cc
11+
index 877d0ba2f48359243527ddebf1d91132b3d5c455..cd69de498c4968ade0ffabf45b72d4d63b70b10f 100644
12+
--- a/chrome/browser/pdf/pdf_extension_util.cc
13+
+++ b/chrome/browser/pdf/pdf_extension_util.cc
14+
@@ -6,7 +6,7 @@
15+
16+
#include "base/strings/string_util.h"
17+
#include "chrome/common/chrome_content_client.h"
18+
-#include "chrome/grit/browser_resources.h"
19+
+#include "electron/grit/electron_resources.h"
20+
#include "ui/base/resource/resource_bundle.h"
21+
22+
namespace pdf_extension_util {

shell/app/electron_content_client.cc

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,13 @@
3333
#endif // defined(WIDEVINE_CDM_AVAILABLE)
3434

3535
#if BUILDFLAG(ENABLE_PDF_VIEWER)
36-
#include "pdf/pdf.h" // nogncheck
37-
#include "pdf/pdf_ppapi.h" // nogncheck
38-
#include "shell/common/electron_constants.h" // nogncheck
39-
#endif // BUILDFLAG(ENABLE_PDF_VIEWER)
36+
#include "pdf/pdf.h" // nogncheck
37+
#include "pdf/pdf_ppapi.h" // nogncheck
38+
#include "shell/common/electron_constants.h"
39+
#endif // BUILDFLAG(ENABLE_PDF_VIEWER)
4040

4141
#if BUILDFLAG(ENABLE_PLUGINS)
42+
#include "content/public/browser/plugin_service.h"
4243
#include "content/public/common/pepper_plugin_info.h"
4344
#include "ppapi/shared_impl/ppapi_permissions.h"
4445
#endif // BUILDFLAG(ENABLE_PLUGINS)
@@ -155,7 +156,8 @@ void ComputeBuiltInPlugins(std::vector<content::PepperPluginInfo>* plugins) {
155156
pdf_info.is_out_of_process = true;
156157
pdf_info.name = "Chromium PDF Viewer";
157158
pdf_info.description = "Portable Document Format";
158-
pdf_info.path = base::FilePath(FILE_PATH_LITERAL("internal-pdf-viewer"));
159+
// This isn't a real file path; it's just used as a unique identifier.
160+
pdf_info.path = base::FilePath(kPdfPluginPath);
159161
content::WebPluginMimeType pdf_mime_type(kPdfPluginMimeType, "pdf",
160162
"Portable Document Format");
161163
pdf_info.mime_types.push_back(pdf_mime_type);
@@ -166,6 +168,21 @@ void ComputeBuiltInPlugins(std::vector<content::PepperPluginInfo>* plugins) {
166168
chrome_pdf::PPP_ShutdownModule;
167169
pdf_info.permissions = ppapi::PERMISSION_PDF | ppapi::PERMISSION_DEV;
168170
plugins->push_back(pdf_info);
171+
172+
// NB. in Chrome, this plugin isn't registered until the PDF extension is
173+
// loaded. However, in Electron, we load the PDF extension unconditionally
174+
// when it is enabled in the build, so we're OK to load the plugin eagerly
175+
// here.
176+
content::WebPluginInfo info;
177+
info.type = content::WebPluginInfo::PLUGIN_TYPE_BROWSER_PLUGIN;
178+
info.name = base::UTF8ToUTF16("Chromium PDF Viewer");
179+
// This isn't a real file path; it's just used as a unique identifier.
180+
info.path = base::FilePath::FromUTF8Unsafe(extension_misc::kPdfExtensionId);
181+
info.background_color = content::WebPluginInfo::kDefaultBackgroundColor;
182+
info.mime_types.emplace_back("application/pdf", "pdf",
183+
"Portable Document Format");
184+
content::PluginService::GetInstance()->RefreshPlugins();
185+
content::PluginService::GetInstance()->RegisterInternalPlugin(info, true);
169186
#endif // BUILDFLAG(ENABLE_PDF_VIEWER)
170187
}
171188
#endif // BUILDFLAG(ENABLE_PLUGINS)

0 commit comments

Comments
 (0)