| Index: chrome/browser/printing/background_printing_manager.cc
|
| ===================================================================
|
| --- chrome/browser/printing/background_printing_manager.cc (revision 110058)
|
| +++ chrome/browser/printing/background_printing_manager.cc (working copy)
|
| @@ -66,6 +66,8 @@
|
| content::Source<RenderProcessHost>(rph));
|
| }
|
|
|
| + RemoveFromTabStrip(preview_tab);
|
| +
|
| // Activate the initiator tab.
|
| PrintPreviewTabController* tab_controller =
|
| PrintPreviewTabController::GetInstance();
|
| @@ -79,6 +81,45 @@
|
| initiator_tab->tab_contents())->Activate();
|
| }
|
|
|
| +bool BackgroundPrintingManager::OwnInitiatorTab(
|
| + TabContentsWrapper* initiator_tab) {
|
| + DCHECK(CalledOnValidThread());
|
| + DCHECK(!PrintPreviewTabController::IsPrintPreviewTab(initiator_tab));
|
| + bool has_initiator_tab = false;
|
| + for (TabContentsWrapperMap::iterator it = map_.begin(); it != map_.end();
|
| + ++it) {
|
| + if (it->second == initiator_tab) {
|
| + has_initiator_tab = true;
|
| + break;
|
| + }
|
| + }
|
| + CHECK(!has_initiator_tab);
|
| +
|
| + PrintPreviewTabController* tab_controller =
|
| + PrintPreviewTabController::GetInstance();
|
| + if (!tab_controller)
|
| + return false;
|
| + TabContentsWrapper* preview_tab =
|
| + tab_controller->GetPrintPreviewForTab(initiator_tab);
|
| + if (!preview_tab)
|
| + return false;
|
| +
|
| + map_[preview_tab] = initiator_tab;
|
| +
|
| + // OwnPrintPreviewTab() may have already added this notification.
|
| + TabContents* preview_contents = preview_tab->tab_contents();
|
| + if (!registrar_.IsRegistered(
|
| + this,
|
| + content::NOTIFICATION_TAB_CONTENTS_DESTROYED,
|
| + content::Source<TabContents>(preview_contents))) {
|
| + registrar_.Add(this, content::NOTIFICATION_TAB_CONTENTS_DESTROYED,
|
| + content::Source<TabContents>(preview_contents));
|
| + }
|
| +
|
| + RemoveFromTabStrip(initiator_tab);
|
| + return true;
|
| +}
|
| +
|
| void BackgroundPrintingManager::Observe(
|
| int type,
|
| const content::NotificationSource& source,
|
| @@ -129,15 +170,26 @@
|
|
|
| void BackgroundPrintingManager::OnTabContentsDestroyed(
|
| TabContentsWrapper* preview_tab) {
|
| + bool is_owned_printing_tab = HasPrintPreviewTab(preview_tab);
|
| + bool is_preview_tab_for_owned_initator_tab =
|
| + (map_.find(preview_tab) != map_.end());
|
| + DCHECK(is_owned_printing_tab || is_preview_tab_for_owned_initator_tab);
|
| +
|
| // Always need to remove this notification since the tab is gone.
|
| registrar_.Remove(this, content::NOTIFICATION_TAB_CONTENTS_DESTROYED,
|
| content::Source<TabContents>(preview_tab->tab_contents()));
|
|
|
| - if (!HasPrintPreviewTab(preview_tab)) {
|
| - NOTREACHED();
|
| - return;
|
| + // Delete the associated initiator tab if one exists.
|
| + if (is_preview_tab_for_owned_initator_tab) {
|
| + TabContentsWrapper* initiator_tab = map_[preview_tab];
|
| + map_.erase(preview_tab);
|
| + MessageLoop::current()->DeleteSoon(FROM_HERE, initiator_tab);
|
| }
|
|
|
| + // If |preview_tab| is not owned, then we are done.
|
| + if (!is_owned_printing_tab)
|
| + return;
|
| +
|
| // Remove NOTIFICATION_RENDERER_PROCESS_CLOSED if |preview_tab| is the last
|
| // TabContents associated with |rph|.
|
| bool shared_rph = HasSharedRenderProcessHost(printing_tabs_, preview_tab) ||
|
| @@ -160,6 +212,18 @@
|
| }
|
| }
|
|
|
| +void BackgroundPrintingManager::RemoveFromTabStrip(TabContentsWrapper* tab) {
|
| + Browser* browser = BrowserList::FindBrowserWithID(
|
| + tab->restore_tab_helper()->window_id().id());
|
| + DCHECK(browser);
|
| +
|
| + TabStripModel* tabstrip = browser->tabstrip_model();
|
| + int index = tabstrip->GetIndexOfTabContents(tab);
|
| + if (index == TabStripModel::kNoTab)
|
| + return;
|
| + tabstrip->DetachTabContentsAt(index);
|
| +}
|
| +
|
| void BackgroundPrintingManager::DeletePreviewTab(TabContentsWrapper* tab) {
|
| registrar_.Remove(this, chrome::NOTIFICATION_PRINT_JOB_RELEASED,
|
| content::Source<TabContentsWrapper>(tab));
|
|
|