  
    if (!cookie) {
 diff --git a/chrome/browser/printing/print_view_manager_base.h b/chrome/browser/printing/print_view_manager_base.h
-index 5771a3ebd76145c6cf8a2ccc33abc886802ed59f..1562d6331a9cafd530db42c436e878bac427566d 100644
+index 5771a3ebd76145c6cf8a2ccc33abc886802ed59f..fb3af5e3f57f868fd00716f76f70aa63c4cb99c9 100644
 --- a/chrome/browser/printing/print_view_manager_base.h
 +++ b/chrome/browser/printing/print_view_manager_base.h
 @@ -37,6 +37,8 @@ namespace printing {

                ? PdfRenderSettings::Mode::POSTSCRIPT_LEVEL3_WITH_TYPE42_FONTS
                : PdfRenderSettings::Mode::POSTSCRIPT_LEVEL3;
   }
@@ -504,6 +510,20 @@ void PrintJob::OnPageDone(PrintedPage* page) {
 }
 #endif  // defined(OS_WIN)
 
+void PrintJob::OnUserInitCancelled() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  // Make sure a `Cancel()` is broadcast.
+  auto details = base::MakeRefCounted<JobEventDetails>(JobEventDetails::USER_INIT_CANCELED,
+                                                       0, nullptr);
+  content::NotificationService::current()->Notify(
+      chrome::NOTIFICATION_PRINT_JOB_EVENT, content::Source<PrintJob>(this),
+      content::Details<JobEventDetails>(details.get()));
+
+  for (auto& observer : observers_) {
+    observer.OnUserInitCancelled();
+  }
+}
+
 void PrintJob::OnFailed() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
diff --git a/chrome/browser/printing/print_job.h b/chrome/browser/printing/print_job.h
index e19f62354edb8acad722c6680296b7d2f55f51fe..b5539171655d78634ee89faf3516d23ce5718353 100644
--- a/chrome/browser/printing/print_job.h
+++ b/chrome/browser/printing/print_job.h
@@ -53,6 +53,7 @@ class PrintJob : public base::RefCountedThreadSafe<PrintJob> {
    public:
     virtual void OnDocDone(int job_id, PrintedDocument* document) {}
     virtual void OnJobDone() {}
+    virtual void OnUserInitCancelled() {}
     virtual void OnFailed() {}
   };
 
@@ -100,6 +101,9 @@ class PrintJob : public base::RefCountedThreadSafe<PrintJob> {
   // Called when the document is done printing.
   virtual void OnDocDone(int job_id, PrintedDocument* document);
 
+  // Called if the user cancels the print job.
+  virtual void OnUserInitCancelled();
+
   // Called if the document fails to print.
   virtual void OnFailed();
 
@@ -257,6 +261,9 @@ class JobEventDetails : public base::RefCountedThreadSafe<JobEventDetails> {
  public:
   // Event type.
   enum Type {

   if (!weak_this)
     return false;
 
@@ -944,6 +981,13 @@ void PrintViewManagerBase::ReleasePrintJob() {
   content::RenderFrameHost* rfh = printing_rfh_;
   printing_rfh_ = nullptr;
 
+  if (!callback_.is_null()) {
+    std::string cb_str = "";
+    if (!printing_succeeded_)
+      cb_str = printing_canceled_ ? "canceled" : "failed";
+    std::move(callback_).Run(printing_succeeded_, cb_str);
+  }
+
   if (!print_job_)
     return;
 
@@ -989,7 +1033,7 @@ bool PrintViewManagerBase::RunInnerMessageLoop() {
 }
 
 bool PrintViewManagerBase::OpportunisticallyCreatePrintJob(int cookie) {
