diff options
Diffstat (limited to 'chrome/browser/printing/background_printing_manager.cc')
-rw-r--r-- | chrome/browser/printing/background_printing_manager.cc | 70 |
1 files changed, 67 insertions, 3 deletions
diff --git a/chrome/browser/printing/background_printing_manager.cc b/chrome/browser/printing/background_printing_manager.cc index 3310e12..fc69730 100644 --- a/chrome/browser/printing/background_printing_manager.cc +++ b/chrome/browser/printing/background_printing_manager.cc @@ -66,6 +66,8 @@ void BackgroundPrintingManager::OwnPrintPreviewTab( content::Source<RenderProcessHost>(rph)); } + RemoveFromTabStrip(preview_tab); + // Activate the initiator tab. PrintPreviewTabController* tab_controller = PrintPreviewTabController::GetInstance(); @@ -79,6 +81,45 @@ void BackgroundPrintingManager::OwnPrintPreviewTab( 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::OnPrintJobReleased( 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::OnTabContentsDestroyed( } } +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)); |