Index: chrome/browser/ui/webui/print_preview/hidden_print_preview.cc |
diff --git a/chrome/browser/ui/webui/print_preview/hidden_print_preview.cc b/chrome/browser/ui/webui/print_preview/hidden_print_preview.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7683ca69732ecaefcd4ac91410358b91533af8ca |
--- /dev/null |
+++ b/chrome/browser/ui/webui/print_preview/hidden_print_preview.cc |
@@ -0,0 +1,96 @@ |
+// Copyright (c) 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/ui/webui/print_preview/hidden_print_preview.h" |
+ |
+#include "chrome/browser/dom_distiller/tab_utils.h" |
+#include "chrome/browser/printing/print_preview_dialog_controller.h" |
+#include "chrome/browser/printing/print_preview_message_handler.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" |
+#include "components/dom_distiller/core/url_constants.h" |
+#include "components/dom_distiller/core/url_utils.h" |
+#include "components/printing/common/print_messages.h" |
+#include "content/public/browser/render_view_host.h" |
+ |
+using content::WebContents; |
+using content::RenderViewHost; |
+ |
+HiddenPrintPreview::HiddenPrintPreview( |
+ WebContents* target_web_contents, |
+ PrintPreviewUI* print_preview_ui, |
+ scoped_ptr<base::DictionaryValue> settings) |
+ : target_web_contents_(target_web_contents), |
+ settings_(settings.release()), |
+ print_preview_ui_(print_preview_ui) { |
+ StartRendering(); |
+} |
+ |
+HiddenPrintPreview::~HiddenPrintPreview() { |
+ if (!hidden_web_contents_) |
+ return; |
+ |
+ WebContents* contents = hidden_web_contents_->web_contents(); |
+ if (!contents) |
+ return; |
+ |
+ printing::PrintPreviewDialogController* dialog_controller = |
+ printing::PrintPreviewDialogController::GetInstance(); |
+ if (!dialog_controller) |
+ return; |
+ |
+ dialog_controller->RemoveProxyDialogForWebContents(contents); |
+} |
+ |
+void HiddenPrintPreview::StartRendering() { |
+ DCHECK(!hidden_web_contents_); |
+ Profile* profile = |
+ Profile::FromBrowserContext(target_web_contents_->GetBrowserContext()); |
+ content::SessionStorageNamespace* session_storage_namespace = |
+ target_web_contents_->GetController().GetDefaultSessionStorageNamespace(); |
+ hidden_web_contents_.reset(new HiddenWebContents(profile)); |
+ hidden_web_contents_->StartRendering( |
+ gfx::Size(1, 1), session_storage_namespace); |
+ hidden_web_contents_->AddObserver(this); |
+ |
+ WebContents* hidden_contents = hidden_web_contents_->web_contents(); |
+ DCHECK(hidden_contents); |
+ DistillAndView(target_web_contents_, hidden_contents); |
+} |
+ |
+void HiddenPrintPreview::SendPrintPreviewMessageIfNecessary() { |
+ WebContents* contents = hidden_web_contents_->web_contents(); |
+ if (!contents) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ |
+ printing::PrintPreviewDialogController* dialog_controller = |
+ printing::PrintPreviewDialogController::GetInstance(); |
+ if (!dialog_controller) { |
+ return; |
+ } |
+ dialog_controller->AddProxyDialogForWebContents( |
+ contents, target_web_contents_); |
+ |
+ DCHECK(settings_); |
+ RenderViewHost* rvh = contents->GetRenderViewHost(); |
+ rvh->Send(new PrintMsg_InitiatePrintPreview(rvh->GetRoutingID(), false)); |
+ rvh->Send(new PrintMsg_PrintPreview(rvh->GetRoutingID(), *settings_)); |
+} |
+ |
+content::WebContents* HiddenPrintPreview::GetHiddenWebContents() { |
+ return hidden_web_contents_->web_contents(); |
+} |
+ |
+void HiddenPrintPreview::OnFinishedLoad(HiddenWebContents* contents) { |
+ SendPrintPreviewMessageIfNecessary(); |
+} |
+ |
+void HiddenPrintPreview::OnFail(HiddenWebContents* contents) { |
+ if (contents && contents->rendering_has_been_cancelled()) { |
+ print_preview_ui_->OnPrintPreviewFailed(); |
+ } |
+} |
+ |