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)); |