Repository: electron/electron
Pull request: test: add -pdf-ready-to-print event to WebContents for testing

Backport of #43436

See that PR for details.


Notes: none

Changed files:
filename: BUILD.gn
patch: @@ -744,6 +744,7 @@ source_set("electron_lib") {
       "//components/pdf/common:util",
       "//components/pdf/renderer",
       "//pdf",
+      "//pdf:content_restriction",
     ]
     sources += [
       "shell/browser/electron_pdf_document_helper_client.cc",

filename: shell/browser/api/electron_api_web_contents.cc
patch: @@ -3739,6 +3739,10 @@ void WebContents::OnInputEvent(const blink::WebInputEvent& event) {
   Emit("input-event", event);
 }
 
+void WebContents::PDFReadyToPrint() {
+  Emit("-pdf-ready-to-print");
+}
+
 void WebContents::RunJavaScriptDialog(content::WebContents* web_contents,
                                       content::RenderFrameHost* rfh,
                                       content::JavaScriptDialogType dialog_type,

filename: shell/browser/api/electron_api_web_contents.h
patch: @@ -478,6 +478,8 @@ class WebContents : public ExclusiveAccessContext,
 
   void SetBackgroundColor(std::optional<SkColor> color);
 
+  void PDFReadyToPrint();
+
   SkRegion* draggable_region() {
     return force_non_draggable_ ? nullptr : draggable_region_.get();
   }

filename: shell/browser/electron_pdf_document_helper_client.cc
patch: @@ -5,17 +5,29 @@
 #include "shell/browser/electron_pdf_document_helper_client.h"
 
 #include "content/public/browser/web_contents.h"
+#include "pdf/content_restriction.h"
+#include "shell/browser/api/electron_api_web_contents.h"
 
 ElectronPDFDocumentHelperClient::ElectronPDFDocumentHelperClient() = default;
 ElectronPDFDocumentHelperClient::~ElectronPDFDocumentHelperClient() = default;
 
 void ElectronPDFDocumentHelperClient::UpdateContentRestrictions(
     content::RenderFrameHost* render_frame_host,
-    int content_restrictions) {}
-void ElectronPDFDocumentHelperClient::OnPDFHasUnsupportedFeature(
-    content::WebContents* contents) {}
-void ElectronPDFDocumentHelperClient::OnSaveURL(
-    content::WebContents* contents) {}
-void ElectronPDFDocumentHelperClient::SetPluginCanSave(
-    content::RenderFrameHost* render_frame_host,
-    bool can_save) {}
+    int content_restrictions) {
+  // UpdateContentRestrictions potentially gets called twice from
+  // pdf/pdf_view_web_plugin.cc.  The first time it is potentially called is
+  // when loading starts and it is called with a restriction on printing.  The
+  // second time it is called is when loading is finished and if printing is
+  // allowed there won't be a printing restriction passed, so we can use this
+  // second call to notify that the pdf document is ready to print.
+  if (!(content_restrictions & chrome_pdf::kContentRestrictionPrint)) {
+    content::WebContents* web_contents =
+        content::WebContents::FromRenderFrameHost(render_frame_host);
+    electron::api::WebContents* api_web_contents =
+        electron::api::WebContents::From(
+            web_contents->GetOutermostWebContents());
+    if (api_web_contents) {
+      api_web_contents->PDFReadyToPrint();
+    }
+  }
+}

filename: shell/browser/electron_pdf_document_helper_client.h
patch: @@ -19,10 +19,10 @@ class ElectronPDFDocumentHelperClient : public pdf::PDFDocumentHelperClient {
   // pdf::PDFDocumentHelperClient
   void UpdateContentRestrictions(content::RenderFrameHost* render_frame_host,
                                  int content_restrictions) override;
-  void OnPDFHasUnsupportedFeature(content::WebContents* contents) override;
-  void OnSaveURL(content::WebContents* contents) override;
+  void OnPDFHasUnsupportedFeature(content::WebContents* contents) override {}
+  void OnSaveURL(content::WebContents* contents) override {}
   void SetPluginCanSave(content::RenderFrameHost* render_frame_host,
-                        bool can_save) override;
+                        bool can_save) override {}
 };
 
 #endif  // ELECTRON_SHELL_BROWSER_ELECTRON_PDF_DOCUMENT_HELPER_CLIENT_H_