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..c393dabab32f8bdf60a7f489f24a66eaff261dba |
--- /dev/null |
+++ b/chrome/browser/ui/webui/print_preview/hidden_print_preview.cc |
@@ -0,0 +1,97 @@ |
+// Copyright (c) 2014 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/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) |
+ : target_web_contents_(target_web_contents), |
+ print_preview_ui_(print_preview_ui) { |
+ const GURL& last_committed_url = target_web_contents->GetLastCommittedURL(); |
+ GURL url = dom_distiller::url_utils::GetPrintPreviewDistillerViewUrlFromUrl( |
+ dom_distiller::kDomDistillerScheme, last_committed_url); |
+ StartRendering(url); |
+} |
+ |
+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(const GURL& url) { |
+ 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, url)); |
+ hidden_web_contents_->StartRendering( |
+ gfx::Size(1, 1), session_storage_namespace); |
+ hidden_web_contents_->AddObserver(this); |
+} |
+ |
+void HiddenPrintPreview::SetSettings( |
+ scoped_ptr<base::DictionaryValue> settings) { |
+ settings_.reset(settings.release()); |
+ if (hidden_web_contents_ && hidden_web_contents_->has_finished_loading()) |
+ SendPrintPreviewMessageIfNecessary(); |
+} |
+ |
+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_); |
+ |
+ if (!settings_) |
+ return; |
+ |
+ RenderViewHost* rvh = contents->GetRenderViewHost(); |
+ rvh->Send(new PrintMsg_InitiatePrintPreview(rvh->GetRoutingID(), false)); |
+ rvh->Send(new PrintMsg_PrintPreview(rvh->GetRoutingID(), *settings_)); |
+} |
+ |
+void HiddenPrintPreview::OnFinishedLoad(HiddenWebContents* contents) { |
+ SendPrintPreviewMessageIfNecessary(); |
+} |
+ |
+void HiddenPrintPreview::OnFail(HiddenWebContents* contents) { |
+ if (contents && contents->rendering_has_been_cancelled()) { |
+ print_preview_ui_->OnPrintPreviewFailed(); |
+ } |
+} |
+ |