Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/printing/print_view_manager.h" | 5 #include "chrome/browser/printing/print_view_manager.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| 11 #include "base/metrics/histogram.h" | |
| 12 #include "chrome/browser/browser_process.h" | |
| 13 #include "chrome/browser/plugins/chrome_plugin_service_filter.h" | 11 #include "chrome/browser/plugins/chrome_plugin_service_filter.h" |
| 14 #include "chrome/browser/printing/print_job_manager.h" | |
| 15 #include "chrome/browser/printing/print_preview_dialog_controller.h" | 12 #include "chrome/browser/printing/print_preview_dialog_controller.h" |
| 16 #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" | 13 #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" |
| 17 #include "chrome/common/chrome_content_client.h" | 14 #include "chrome/common/chrome_content_client.h" |
| 18 #include "components/printing/common/print_messages.h" | 15 #include "components/printing/common/print_messages.h" |
| 19 #include "content/public/browser/browser_thread.h" | 16 #include "content/public/browser/browser_thread.h" |
| 20 #include "content/public/browser/plugin_service.h" | 17 #include "content/public/browser/plugin_service.h" |
| 21 #include "content/public/browser/render_frame_host.h" | 18 #include "content/public/browser/render_frame_host.h" |
| 22 #include "content/public/browser/render_process_host.h" | 19 #include "content/public/browser/render_process_host.h" |
| 23 #include "content/public/browser/web_contents.h" | 20 #include "content/public/browser/web_contents.h" |
| 24 #include "content/public/common/webplugininfo.h" | 21 #include "content/public/common/webplugininfo.h" |
| 25 | 22 |
| 26 using content::BrowserThread; | 23 using content::BrowserThread; |
| 27 | 24 |
| 28 DEFINE_WEB_CONTENTS_USER_DATA_KEY(printing::PrintViewManager); | 25 DEFINE_WEB_CONTENTS_USER_DATA_KEY(printing::PrintViewManager); |
| 29 | 26 |
| 30 namespace { | 27 namespace { |
| 31 | 28 |
| 32 // Keeps track of pending scripted print preview closures. | 29 // Keeps track of pending scripted print preview closures. |
| 33 // No locking, only access on the UI thread. | 30 // No locking, only access on the UI thread. |
| 34 typedef std::map<content::RenderProcessHost*, base::Closure> | 31 base::LazyInstance<std::map<content::RenderProcessHost*, base::Closure>> |
| 35 ScriptedPrintPreviewClosureMap; | |
| 36 static base::LazyInstance<ScriptedPrintPreviewClosureMap> | |
| 37 g_scripted_print_preview_closure_map = LAZY_INSTANCE_INITIALIZER; | 32 g_scripted_print_preview_closure_map = LAZY_INSTANCE_INITIALIZER; |
| 38 | 33 |
| 39 void EnableInternalPDFPluginForContents(int render_process_id, | 34 void EnableInternalPDFPluginForContents(int render_process_id, |
| 40 int render_frame_id) { | 35 int render_frame_id) { |
| 41 // Always enable the internal PDF plugin for the print preview page. | 36 // Always enable the internal PDF plugin for the print preview page. |
| 42 base::FilePath pdf_plugin_path = base::FilePath::FromUTF8Unsafe( | 37 base::FilePath pdf_plugin_path = base::FilePath::FromUTF8Unsafe( |
| 43 ChromeContentClient::kPDFPluginPath); | 38 ChromeContentClient::kPDFPluginPath); |
| 44 | 39 |
| 45 content::WebPluginInfo pdf_plugin; | 40 content::WebPluginInfo pdf_plugin; |
| 46 if (!content::PluginService::GetInstance()->GetPluginInfoByPath( | 41 if (!content::PluginService::GetInstance()->GetPluginInfoByPath( |
| 47 pdf_plugin_path, &pdf_plugin)) { | 42 pdf_plugin_path, &pdf_plugin)) { |
| 48 return; | 43 return; |
| 49 } | 44 } |
| 50 | 45 |
| 51 ChromePluginServiceFilter::GetInstance()->OverridePluginForFrame( | 46 ChromePluginServiceFilter::GetInstance()->OverridePluginForFrame( |
| 52 render_process_id, render_frame_id, GURL(), pdf_plugin); | 47 render_process_id, render_frame_id, GURL(), pdf_plugin); |
| 53 } | 48 } |
| 54 | 49 |
| 55 } // namespace | 50 } // namespace |
| 56 | 51 |
| 57 namespace printing { | 52 namespace printing { |
| 58 | 53 |
| 59 PrintViewManager::PrintViewManager(content::WebContents* web_contents) | 54 PrintViewManager::PrintViewManager(content::WebContents* web_contents) |
| 60 : PrintViewManagerBase(web_contents), | 55 : PrintViewManagerBase(web_contents), |
| 61 print_preview_state_(NOT_PREVIEWING), | 56 print_preview_state_(NOT_PREVIEWING), |
| 62 scripted_print_preview_rph_(NULL) { | 57 scripted_print_preview_rph_(nullptr) { |
| 63 if (PrintPreviewDialogController::IsPrintPreviewDialog(web_contents)) { | 58 if (PrintPreviewDialogController::IsPrintPreviewDialog(web_contents)) { |
| 64 EnableInternalPDFPluginForContents( | 59 EnableInternalPDFPluginForContents( |
| 65 web_contents->GetRenderProcessHost()->GetID(), | 60 web_contents->GetRenderProcessHost()->GetID(), |
| 66 web_contents->GetMainFrame()->GetRoutingID()); | 61 web_contents->GetMainFrame()->GetRoutingID()); |
| 67 } | 62 } |
| 68 } | 63 } |
| 69 | 64 |
| 70 PrintViewManager::~PrintViewManager() { | 65 PrintViewManager::~PrintViewManager() { |
| 71 DCHECK_EQ(NOT_PREVIEWING, print_preview_state_); | 66 DCHECK_EQ(NOT_PREVIEWING, print_preview_state_); |
| 72 } | 67 } |
| 73 | 68 |
| 74 #if defined(ENABLE_BASIC_PRINTING) | 69 #if defined(ENABLE_BASIC_PRINTING) |
| 75 bool PrintViewManager::PrintForSystemDialogNow( | 70 bool PrintViewManager::PrintForSystemDialogNow( |
| 76 const base::Closure& dialog_shown_callback) { | 71 const base::Closure& dialog_shown_callback) { |
| 77 DCHECK(!dialog_shown_callback.is_null()); | 72 DCHECK(!dialog_shown_callback.is_null()); |
| 78 DCHECK(on_print_dialog_shown_callback_.is_null()); | 73 DCHECK(on_print_dialog_shown_callback_.is_null()); |
| 79 on_print_dialog_shown_callback_ = dialog_shown_callback; | 74 on_print_dialog_shown_callback_ = dialog_shown_callback; |
| 80 return PrintNowInternal(new PrintMsg_PrintForSystemDialog(routing_id())); | 75 return PrintNowInternal(new PrintMsg_PrintForSystemDialog(routing_id())); |
| 81 } | 76 } |
| 82 | 77 |
| 83 bool PrintViewManager::BasicPrint() { | 78 bool PrintViewManager::BasicPrint() { |
| 84 PrintPreviewDialogController* dialog_controller = | 79 PrintPreviewDialogController* dialog_controller = |
| 85 PrintPreviewDialogController::GetInstance(); | 80 PrintPreviewDialogController::GetInstance(); |
| 86 if (!dialog_controller) | 81 if (!dialog_controller) |
| 87 return false; | 82 return false; |
| 83 | |
| 88 content::WebContents* print_preview_dialog = | 84 content::WebContents* print_preview_dialog = |
| 89 dialog_controller->GetPrintPreviewForContents(web_contents()); | 85 dialog_controller->GetPrintPreviewForContents(web_contents()); |
| 90 if (print_preview_dialog) { | 86 if (!print_preview_dialog) |
| 91 if (!print_preview_dialog->GetWebUI()) | |
| 92 return false; | |
| 93 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>( | |
| 94 print_preview_dialog->GetWebUI()->GetController()); | |
| 95 print_preview_ui->OnShowSystemDialog(); | |
| 96 return true; | |
| 97 } else { | |
| 98 return PrintNow(); | 87 return PrintNow(); |
| 99 } | 88 |
| 89 if (!print_preview_dialog->GetWebUI()) | |
| 90 return false; | |
| 91 | |
| 92 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>( | |
| 93 print_preview_dialog->GetWebUI()->GetController()); | |
| 94 print_preview_ui->OnShowSystemDialog(); | |
| 95 return true; | |
| 100 } | 96 } |
| 101 #endif // ENABLE_BASIC_PRINTING | 97 #endif // defined(ENABLE_BASIC_PRINTING) |
| 102 | 98 |
| 103 bool PrintViewManager::PrintPreviewNow(bool selection_only) { | 99 bool PrintViewManager::PrintPreviewNow(bool selection_only) { |
| 104 // Users can send print commands all they want and it is beyond | 100 // Users can send print commands all they want and it is beyond |
| 105 // PrintViewManager's control. Just ignore the extra commands. | 101 // PrintViewManager's control. Just ignore the extra commands. |
| 106 // See http://crbug.com/136842 for example. | 102 // See http://crbug.com/136842 for example. |
| 107 if (print_preview_state_ != NOT_PREVIEWING) | 103 if (print_preview_state_ != NOT_PREVIEWING) |
| 108 return false; | 104 return false; |
| 109 | 105 |
| 110 if (!PrintNowInternal(new PrintMsg_InitiatePrintPreview(routing_id(), | 106 if (!PrintNowInternal(new PrintMsg_InitiatePrintPreview(routing_id(), |
| 111 selection_only))) { | 107 selection_only))) { |
| 112 return false; | 108 return false; |
| 113 } | 109 } |
| 114 | 110 |
| 115 print_preview_state_ = USER_INITIATED_PREVIEW; | 111 print_preview_state_ = USER_INITIATED_PREVIEW; |
| 116 return true; | 112 return true; |
| 117 } | 113 } |
| 118 | 114 |
| 119 void PrintViewManager::PrintPreviewForWebNode() { | 115 void PrintViewManager::PrintPreviewForWebNode() { |
| 120 if (print_preview_state_ != NOT_PREVIEWING) | 116 if (print_preview_state_ != NOT_PREVIEWING) |
| 121 return; | 117 return; |
| 122 print_preview_state_ = USER_INITIATED_PREVIEW; | 118 print_preview_state_ = USER_INITIATED_PREVIEW; |
| 123 } | 119 } |
| 124 | 120 |
| 125 void PrintViewManager::PrintPreviewDone() { | 121 void PrintViewManager::PrintPreviewDone() { |
| 126 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 122 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 127 DCHECK_NE(NOT_PREVIEWING, print_preview_state_); | 123 DCHECK_NE(NOT_PREVIEWING, print_preview_state_); |
| 128 | 124 |
| 129 if (print_preview_state_ == SCRIPTED_PREVIEW) { | 125 if (print_preview_state_ == SCRIPTED_PREVIEW) { |
| 130 ScriptedPrintPreviewClosureMap& map = | 126 auto& map = g_scripted_print_preview_closure_map.Get(); |
| 131 g_scripted_print_preview_closure_map.Get(); | 127 auto it = map.find(scripted_print_preview_rph_); |
| 132 ScriptedPrintPreviewClosureMap::iterator it = | |
| 133 map.find(scripted_print_preview_rph_); | |
| 134 CHECK(it != map.end()); | 128 CHECK(it != map.end()); |
| 135 it->second.Run(); | 129 it->second.Run(); |
| 136 map.erase(scripted_print_preview_rph_); | 130 map.erase(it); |
| 137 scripted_print_preview_rph_ = NULL; | 131 scripted_print_preview_rph_ = nullptr; |
| 138 } | 132 } |
| 139 print_preview_state_ = NOT_PREVIEWING; | 133 print_preview_state_ = NOT_PREVIEWING; |
| 140 } | 134 } |
| 141 | 135 |
| 142 void PrintViewManager::RenderFrameCreated( | 136 void PrintViewManager::RenderFrameCreated( |
| 143 content::RenderFrameHost* render_frame_host) { | 137 content::RenderFrameHost* render_frame_host) { |
| 144 if (PrintPreviewDialogController::IsPrintPreviewDialog(web_contents())) { | 138 if (PrintPreviewDialogController::IsPrintPreviewDialog(web_contents())) { |
| 145 EnableInternalPDFPluginForContents(render_frame_host->GetProcess()->GetID(), | 139 EnableInternalPDFPluginForContents(render_frame_host->GetProcess()->GetID(), |
| 146 render_frame_host->GetRoutingID()); | 140 render_frame_host->GetRoutingID()); |
| 147 } | 141 } |
| 148 } | 142 } |
| 149 | 143 |
| 150 void PrintViewManager::RenderProcessGone(base::TerminationStatus status) { | 144 void PrintViewManager::RenderProcessGone(base::TerminationStatus status) { |
| 151 print_preview_state_ = NOT_PREVIEWING; | 145 print_preview_state_ = NOT_PREVIEWING; |
| 152 PrintViewManagerBase::RenderProcessGone(status); | 146 PrintViewManagerBase::RenderProcessGone(status); |
| 153 } | 147 } |
| 154 | 148 |
| 155 void PrintViewManager::OnDidShowPrintDialog() { | 149 void PrintViewManager::OnDidShowPrintDialog() { |
| 156 if (!on_print_dialog_shown_callback_.is_null()) | 150 if (!on_print_dialog_shown_callback_.is_null()) |
| 157 on_print_dialog_shown_callback_.Run(); | 151 on_print_dialog_shown_callback_.Run(); |
| 158 on_print_dialog_shown_callback_.Reset(); | 152 on_print_dialog_shown_callback_.Reset(); |
| 159 } | 153 } |
| 160 | 154 |
| 161 void PrintViewManager::OnSetupScriptedPrintPreview(IPC::Message* reply_msg) { | 155 void PrintViewManager::OnSetupScriptedPrintPreview(IPC::Message* reply_msg) { |
| 162 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 156 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 163 ScriptedPrintPreviewClosureMap& map = | 157 auto& map = g_scripted_print_preview_closure_map.Get(); |
| 164 g_scripted_print_preview_closure_map.Get(); | |
| 165 content::RenderProcessHost* rph = web_contents()->GetRenderProcessHost(); | 158 content::RenderProcessHost* rph = web_contents()->GetRenderProcessHost(); |
| 166 | 159 |
| 167 // This should always be 0 once we get modal window.print(). | 160 if (base::ContainsKey(map, rph)) { |
|
tommycli
2016/08/26 16:40:13
nit: no need for comment anymore?
Lei Zhang
2016/08/26 16:42:19
Are you referring to the old line 167 comment? Sli
tommycli
2016/08/26 16:42:59
yeah. okay cool
| |
| 168 if (map.count(rph) != 0) { | |
| 169 // Renderer already handling window.print() in another View. | 161 // Renderer already handling window.print() in another View. |
| 170 Send(reply_msg); | 162 Send(reply_msg); |
| 171 return; | 163 return; |
| 172 } | 164 } |
| 165 | |
| 173 if (print_preview_state_ != NOT_PREVIEWING) { | 166 if (print_preview_state_ != NOT_PREVIEWING) { |
| 174 // If a user initiated print dialog is already open, ignore the scripted | 167 // If a user initiated print dialog is already open, ignore the scripted |
| 175 // print message. | 168 // print message. |
| 176 DCHECK_EQ(USER_INITIATED_PREVIEW, print_preview_state_); | 169 DCHECK_EQ(USER_INITIATED_PREVIEW, print_preview_state_); |
| 177 Send(reply_msg); | 170 Send(reply_msg); |
| 178 return; | 171 return; |
| 179 } | 172 } |
| 180 | 173 |
| 181 PrintPreviewDialogController* dialog_controller = | 174 PrintPreviewDialogController* dialog_controller = |
| 182 PrintPreviewDialogController::GetInstance(); | 175 PrintPreviewDialogController::GetInstance(); |
| 183 if (!dialog_controller) { | 176 if (!dialog_controller) { |
| 184 Send(reply_msg); | 177 Send(reply_msg); |
| 185 return; | 178 return; |
| 186 } | 179 } |
| 187 | 180 |
| 188 print_preview_state_ = SCRIPTED_PREVIEW; | 181 print_preview_state_ = SCRIPTED_PREVIEW; |
| 189 base::Closure callback = | 182 map[rph] = base::Bind(&PrintViewManager::OnScriptedPrintPreviewReply, |
| 190 base::Bind(&PrintViewManager::OnScriptedPrintPreviewReply, | 183 base::Unretained(this), reply_msg); |
| 191 base::Unretained(this), | |
| 192 reply_msg); | |
| 193 map[rph] = callback; | |
| 194 scripted_print_preview_rph_ = rph; | 184 scripted_print_preview_rph_ = rph; |
| 195 } | 185 } |
| 196 | 186 |
| 197 void PrintViewManager::OnShowScriptedPrintPreview(bool source_is_modifiable) { | 187 void PrintViewManager::OnShowScriptedPrintPreview(bool source_is_modifiable) { |
| 198 PrintPreviewDialogController* dialog_controller = | 188 PrintPreviewDialogController* dialog_controller = |
| 199 PrintPreviewDialogController::GetInstance(); | 189 PrintPreviewDialogController::GetInstance(); |
| 200 if (!dialog_controller) { | 190 if (!dialog_controller) { |
| 201 PrintPreviewDone(); | 191 PrintPreviewDone(); |
| 202 return; | 192 return; |
| 203 } | 193 } |
| 194 | |
| 204 dialog_controller->PrintPreview(web_contents()); | 195 dialog_controller->PrintPreview(web_contents()); |
| 205 PrintHostMsg_RequestPrintPreview_Params params; | 196 PrintHostMsg_RequestPrintPreview_Params params; |
| 206 params.is_modifiable = source_is_modifiable; | 197 params.is_modifiable = source_is_modifiable; |
| 207 PrintPreviewUI::SetInitialParams( | 198 PrintPreviewUI::SetInitialParams( |
| 208 dialog_controller->GetPrintPreviewForContents(web_contents()), params); | 199 dialog_controller->GetPrintPreviewForContents(web_contents()), params); |
| 209 } | 200 } |
| 210 | 201 |
| 211 void PrintViewManager::OnScriptedPrintPreviewReply(IPC::Message* reply_msg) { | 202 void PrintViewManager::OnScriptedPrintPreviewReply(IPC::Message* reply_msg) { |
| 212 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 203 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 213 Send(reply_msg); | 204 Send(reply_msg); |
| 214 } | 205 } |
| 215 | 206 |
| 216 bool PrintViewManager::OnMessageReceived(const IPC::Message& message) { | 207 bool PrintViewManager::OnMessageReceived(const IPC::Message& message) { |
| 217 bool handled = true; | 208 bool handled = true; |
| 218 IPC_BEGIN_MESSAGE_MAP(PrintViewManager, message) | 209 IPC_BEGIN_MESSAGE_MAP(PrintViewManager, message) |
| 219 IPC_MESSAGE_HANDLER(PrintHostMsg_DidShowPrintDialog, OnDidShowPrintDialog) | 210 IPC_MESSAGE_HANDLER(PrintHostMsg_DidShowPrintDialog, OnDidShowPrintDialog) |
| 220 IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_SetupScriptedPrintPreview, | 211 IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_SetupScriptedPrintPreview, |
| 221 OnSetupScriptedPrintPreview) | 212 OnSetupScriptedPrintPreview) |
| 222 IPC_MESSAGE_HANDLER(PrintHostMsg_ShowScriptedPrintPreview, | 213 IPC_MESSAGE_HANDLER(PrintHostMsg_ShowScriptedPrintPreview, |
| 223 OnShowScriptedPrintPreview) | 214 OnShowScriptedPrintPreview) |
| 224 IPC_MESSAGE_UNHANDLED(handled = false) | 215 IPC_MESSAGE_UNHANDLED(handled = false) |
| 225 IPC_END_MESSAGE_MAP() | 216 IPC_END_MESSAGE_MAP() |
| 226 | 217 |
| 227 return handled ? true : PrintViewManagerBase::OnMessageReceived(message); | 218 return handled || PrintViewManagerBase::OnMessageReceived(message); |
| 228 } | 219 } |
| 229 | 220 |
| 230 } // namespace printing | 221 } // namespace printing |
| OLD | NEW |