| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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_preview_tab_controller.h" | 5 #include "chrome/browser/printing/print_preview_tab_controller.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 #include "content/public/browser/notification_details.h" | 34 #include "content/public/browser/notification_details.h" |
| 35 #include "content/public/browser/notification_source.h" | 35 #include "content/public/browser/notification_source.h" |
| 36 #include "content/public/browser/notification_types.h" | 36 #include "content/public/browser/notification_types.h" |
| 37 #include "webkit/plugins/webplugininfo.h" | 37 #include "webkit/plugins/webplugininfo.h" |
| 38 | 38 |
| 39 namespace { | 39 namespace { |
| 40 | 40 |
| 41 void EnableInternalPDFPluginForTab(TabContentsWrapper* preview_tab) { | 41 void EnableInternalPDFPluginForTab(TabContentsWrapper* preview_tab) { |
| 42 // Always enable the internal PDF plugin for the print preview page. | 42 // Always enable the internal PDF plugin for the print preview page. |
| 43 ChromePluginServiceFilter::GetInstance()->OverridePluginForTab( | 43 ChromePluginServiceFilter::GetInstance()->OverridePluginForTab( |
| 44 preview_tab->render_view_host()->process()->id(), | 44 preview_tab->render_view_host()->process()->GetID(), |
| 45 preview_tab->render_view_host()->routing_id(), | 45 preview_tab->render_view_host()->routing_id(), |
| 46 GURL(), | 46 GURL(), |
| 47 ASCIIToUTF16(chrome::ChromeContentClient::kPDFPluginName)); | 47 ASCIIToUTF16(chrome::ChromeContentClient::kPDFPluginName)); |
| 48 } | 48 } |
| 49 | 49 |
| 50 class PrintPreviewTabDelegate : public HtmlDialogUIDelegate { | 50 class PrintPreviewTabDelegate : public HtmlDialogUIDelegate { |
| 51 public: | 51 public: |
| 52 explicit PrintPreviewTabDelegate(TabContentsWrapper* initiator_tab); | 52 explicit PrintPreviewTabDelegate(TabContentsWrapper* initiator_tab); |
| 53 virtual ~PrintPreviewTabDelegate(); | 53 virtual ~PrintPreviewTabDelegate(); |
| 54 | 54 |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 } | 189 } |
| 190 return NULL; | 190 return NULL; |
| 191 } | 191 } |
| 192 | 192 |
| 193 void PrintPreviewTabController::Observe( | 193 void PrintPreviewTabController::Observe( |
| 194 int type, | 194 int type, |
| 195 const content::NotificationSource& source, | 195 const content::NotificationSource& source, |
| 196 const content::NotificationDetails& details) { | 196 const content::NotificationDetails& details) { |
| 197 switch (type) { | 197 switch (type) { |
| 198 case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: { | 198 case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: { |
| 199 OnRendererProcessClosed(content::Source<RenderProcessHost>(source).ptr()); | 199 OnRendererProcessClosed( |
| 200 content::Source<content::RenderProcessHost>(source).ptr()); |
| 200 break; | 201 break; |
| 201 } | 202 } |
| 202 case content::NOTIFICATION_TAB_CONTENTS_DESTROYED: { | 203 case content::NOTIFICATION_TAB_CONTENTS_DESTROYED: { |
| 203 TabContents* tab = content::Source<TabContents>(source).ptr(); | 204 TabContents* tab = content::Source<TabContents>(source).ptr(); |
| 204 TabContentsWrapper* wrapper = | 205 TabContentsWrapper* wrapper = |
| 205 TabContentsWrapper::GetCurrentWrapperForContents(tab); | 206 TabContentsWrapper::GetCurrentWrapperForContents(tab); |
| 206 OnTabContentsDestroyed(wrapper); | 207 OnTabContentsDestroyed(wrapper); |
| 207 break; | 208 break; |
| 208 } | 209 } |
| 209 case content::NOTIFICATION_NAV_ENTRY_COMMITTED: { | 210 case content::NOTIFICATION_NAV_ENTRY_COMMITTED: { |
| 210 NavigationController* controller = | 211 NavigationController* controller = |
| 211 content::Source<NavigationController>(source).ptr(); | 212 content::Source<NavigationController>(source).ptr(); |
| 212 TabContentsWrapper* wrapper = | 213 TabContentsWrapper* wrapper = |
| 213 TabContentsWrapper::GetCurrentWrapperForContents( | 214 TabContentsWrapper::GetCurrentWrapperForContents( |
| 214 controller->tab_contents()); | 215 controller->tab_contents()); |
| 215 content::LoadCommittedDetails* load_details = | 216 content::LoadCommittedDetails* load_details = |
| 216 content::Details<content::LoadCommittedDetails>(details).ptr(); | 217 content::Details<content::LoadCommittedDetails>(details).ptr(); |
| 217 OnNavEntryCommitted(wrapper, load_details); | 218 OnNavEntryCommitted(wrapper, load_details); |
| 218 break; | 219 break; |
| 219 } | 220 } |
| 220 default: { | 221 default: { |
| 221 NOTREACHED(); | 222 NOTREACHED(); |
| 222 break; | 223 break; |
| 223 } | 224 } |
| 224 } | 225 } |
| 225 } | 226 } |
| 226 | 227 |
| 227 void PrintPreviewTabController::OnRendererProcessClosed( | 228 void PrintPreviewTabController::OnRendererProcessClosed( |
| 228 RenderProcessHost* rph) { | 229 content::RenderProcessHost* rph) { |
| 229 // Store tabs in a vector and deal with them after iterating through | 230 // Store tabs in a vector and deal with them after iterating through |
| 230 // |preview_tab_map_| because RemoveFooTab() can change |preview_tab_map_|. | 231 // |preview_tab_map_| because RemoveFooTab() can change |preview_tab_map_|. |
| 231 std::vector<TabContentsWrapper*> closed_initiator_tabs; | 232 std::vector<TabContentsWrapper*> closed_initiator_tabs; |
| 232 std::vector<TabContentsWrapper*> closed_preview_tabs; | 233 std::vector<TabContentsWrapper*> closed_preview_tabs; |
| 233 for (PrintPreviewTabMap::iterator iter = preview_tab_map_.begin(); | 234 for (PrintPreviewTabMap::iterator iter = preview_tab_map_.begin(); |
| 234 iter != preview_tab_map_.end(); ++iter) { | 235 iter != preview_tab_map_.end(); ++iter) { |
| 235 TabContentsWrapper* preview_tab = iter->first; | 236 TabContentsWrapper* preview_tab = iter->first; |
| 236 TabContentsWrapper* initiator_tab = iter->second; | 237 TabContentsWrapper* initiator_tab = iter->second; |
| 237 if (preview_tab->render_view_host()->process() == rph) { | 238 if (preview_tab->render_view_host()->process() == rph) { |
| 238 closed_preview_tabs.push_back(preview_tab); | 239 closed_preview_tabs.push_back(preview_tab); |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 397 void PrintPreviewTabController::AddObservers(TabContentsWrapper* tab) { | 398 void PrintPreviewTabController::AddObservers(TabContentsWrapper* tab) { |
| 398 TabContents* contents = tab->tab_contents(); | 399 TabContents* contents = tab->tab_contents(); |
| 399 registrar_.Add(this, content::NOTIFICATION_TAB_CONTENTS_DESTROYED, | 400 registrar_.Add(this, content::NOTIFICATION_TAB_CONTENTS_DESTROYED, |
| 400 content::Source<TabContents>(contents)); | 401 content::Source<TabContents>(contents)); |
| 401 registrar_.Add( | 402 registrar_.Add( |
| 402 this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 403 this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
| 403 content::Source<NavigationController>(&contents->controller())); | 404 content::Source<NavigationController>(&contents->controller())); |
| 404 | 405 |
| 405 // Multiple sites may share the same RenderProcessHost, so check if this | 406 // Multiple sites may share the same RenderProcessHost, so check if this |
| 406 // notification has already been added. | 407 // notification has already been added. |
| 407 RenderProcessHost* rph = tab->render_view_host()->process(); | 408 content::RenderProcessHost* rph = tab->render_view_host()->process(); |
| 408 if (!registrar_.IsRegistered(this, | 409 if (!registrar_.IsRegistered(this, |
| 409 content::NOTIFICATION_RENDERER_PROCESS_CLOSED, | 410 content::NOTIFICATION_RENDERER_PROCESS_CLOSED, |
| 410 content::Source<RenderProcessHost>(rph))) { | 411 content::Source<content::RenderProcessHost>( |
| 412 rph))) { |
| 411 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, | 413 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, |
| 412 content::Source<RenderProcessHost>(rph)); | 414 content::Source<content::RenderProcessHost>(rph)); |
| 413 } | 415 } |
| 414 } | 416 } |
| 415 | 417 |
| 416 void PrintPreviewTabController::RemoveObservers(TabContentsWrapper* tab) { | 418 void PrintPreviewTabController::RemoveObservers(TabContentsWrapper* tab) { |
| 417 TabContents* contents = tab->tab_contents(); | 419 TabContents* contents = tab->tab_contents(); |
| 418 registrar_.Remove(this, content::NOTIFICATION_TAB_CONTENTS_DESTROYED, | 420 registrar_.Remove(this, content::NOTIFICATION_TAB_CONTENTS_DESTROYED, |
| 419 content::Source<TabContents>(contents)); | 421 content::Source<TabContents>(contents)); |
| 420 registrar_.Remove( | 422 registrar_.Remove( |
| 421 this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 423 this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
| 422 content::Source<NavigationController>(&contents->controller())); | 424 content::Source<NavigationController>(&contents->controller())); |
| 423 | 425 |
| 424 // Multiple sites may share the same RenderProcessHost, so check if this | 426 // Multiple sites may share the same RenderProcessHost, so check if this |
| 425 // notification has already been added. | 427 // notification has already been added. |
| 426 RenderProcessHost* rph = tab->render_view_host()->process(); | 428 content::RenderProcessHost* rph = tab->render_view_host()->process(); |
| 427 if (registrar_.IsRegistered(this, | 429 if (registrar_.IsRegistered(this, |
| 428 content::NOTIFICATION_RENDERER_PROCESS_CLOSED, | 430 content::NOTIFICATION_RENDERER_PROCESS_CLOSED, |
| 429 content::Source<RenderProcessHost>(rph))) { | 431 content::Source<content::RenderProcessHost>( |
| 432 rph))) { |
| 430 registrar_.Remove(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, | 433 registrar_.Remove(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, |
| 431 content::Source<RenderProcessHost>(rph)); | 434 content::Source<content::RenderProcessHost>(rph)); |
| 432 } | 435 } |
| 433 } | 436 } |
| 434 | 437 |
| 435 void PrintPreviewTabController::RemoveInitiatorTab( | 438 void PrintPreviewTabController::RemoveInitiatorTab( |
| 436 TabContentsWrapper* initiator_tab) { | 439 TabContentsWrapper* initiator_tab) { |
| 437 TabContentsWrapper* preview_tab = GetPrintPreviewForTab(initiator_tab); | 440 TabContentsWrapper* preview_tab = GetPrintPreviewForTab(initiator_tab); |
| 438 DCHECK(preview_tab); | 441 DCHECK(preview_tab); |
| 439 // Update the map entry first, so when the print preview tab gets destroyed | 442 // Update the map entry first, so when the print preview tab gets destroyed |
| 440 // and reaches RemovePreviewTab(), it does not attempt to also remove the | 443 // and reaches RemovePreviewTab(), it does not attempt to also remove the |
| 441 // initiator tab's observers. | 444 // initiator tab's observers. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 461 PrintPreviewUI* print_preview_ui = | 464 PrintPreviewUI* print_preview_ui = |
| 462 static_cast<PrintPreviewUI*>(preview_tab->web_ui()); | 465 static_cast<PrintPreviewUI*>(preview_tab->web_ui()); |
| 463 if (print_preview_ui) | 466 if (print_preview_ui) |
| 464 print_preview_ui->OnTabDestroyed(); | 467 print_preview_ui->OnTabDestroyed(); |
| 465 | 468 |
| 466 preview_tab_map_.erase(preview_tab); | 469 preview_tab_map_.erase(preview_tab); |
| 467 RemoveObservers(preview_tab); | 470 RemoveObservers(preview_tab); |
| 468 } | 471 } |
| 469 | 472 |
| 470 } // namespace printing | 473 } // namespace printing |
| OLD | NEW |