| Index: chrome/browser/printing/background_printing_manager.cc
|
| diff --git a/chrome/browser/printing/background_printing_manager.cc b/chrome/browser/printing/background_printing_manager.cc
|
| index 478f1800322ba789d40d1dc73bac41381d37fae8..cac28fc66ae56cdc203cf0da13cb1b7cfc50580e 100644
|
| --- a/chrome/browser/printing/background_printing_manager.cc
|
| +++ b/chrome/browser/printing/background_printing_manager.cc
|
| @@ -29,37 +29,64 @@ BackgroundPrintingManager::~BackgroundPrintingManager() {
|
| // TODO(thestig) handle this case better.
|
| }
|
|
|
| -void BackgroundPrintingManager::OwnTabContents(TabContentsWrapper* contents) {
|
| - DCHECK(CalledOnValidThread());
|
| +void BackgroundPrintingManager::OwnPreviewTabContents(
|
| + TabContentsWrapper* content) {
|
| DCHECK(printing::PrintPreviewTabController::IsPrintPreviewTab(
|
| - contents->tab_contents()));
|
| - CHECK(printing_contents_.find(contents) == printing_contents_.end());
|
| -
|
| - printing_contents_.insert(contents);
|
| -
|
| - registrar_.Add(this, chrome::NOTIFICATION_PRINT_JOB_RELEASED,
|
| - Source<TabContentsWrapper>(contents));
|
| - registrar_.Add(this, content::NOTIFICATION_TAB_CONTENTS_DESTROYED,
|
| - Source<TabContents>(contents->tab_contents()));
|
| + content->tab_contents()));
|
| + CHECK(printing_contents_.find(content) == printing_contents_.end());
|
|
|
| - // Detach |contents| from its tab strip.
|
| - Browser* browser = BrowserList::FindBrowserWithID(
|
| - contents->restore_tab_helper()->window_id().id());
|
| - DCHECK(browser);
|
| + // Find the initiator tab.
|
| + TabContents* initiator_tab = NULL;
|
| + TabContentsWrapper* initiator_tab_wrapper = NULL;
|
| + printing::PrintPreviewTabController* tab_controller =
|
| + printing::PrintPreviewTabController::GetInstance();
|
| + if (tab_controller)
|
| + initiator_tab = tab_controller->GetInitiatorTab(content->tab_contents());
|
| + if (initiator_tab)
|
| + initiator_tab_wrapper =
|
| + TabContentsWrapper::GetCurrentWrapperForContents(initiator_tab);
|
| + if (initiator_tab_wrapper &&
|
| + !ReleaseInitiatorTabContents(initiator_tab_wrapper)) {
|
| + OwnTabContents(content, content);
|
| +
|
| + // Activate the initiator tab.
|
| + if (initiator_tab)
|
| + static_cast<RenderViewHostDelegate*>(initiator_tab)->Activate();
|
| + } else {
|
| + OwnTabContents(content, NULL);
|
| + }
|
| +}
|
|
|
| - TabStripModel* tabstrip = browser->tabstrip_model();
|
| - tabstrip->DetachTabContentsAt(tabstrip->GetIndexOfTabContents(contents));
|
| +bool BackgroundPrintingManager::OwnInitiatorTabContents(
|
| + TabContentsWrapper* content) {
|
| + DCHECK(!printing::PrintPreviewTabController::IsPrintPreviewTab(
|
| + content->tab_contents()));
|
|
|
| - // Activate the initiator tab.
|
| printing::PrintPreviewTabController* tab_controller =
|
| printing::PrintPreviewTabController::GetInstance();
|
| - if (!tab_controller)
|
| - return;
|
| - TabContents* initiator_tab = tab_controller->GetInitiatorTab(
|
| - contents->tab_contents());
|
| - if (!initiator_tab)
|
| - return;
|
| - static_cast<RenderViewHostDelegate*>(initiator_tab)->Activate();
|
| + TabContents* preview_tab =
|
| + tab_controller->GetPrintPreviewForTab(content->tab_contents());
|
| + if (!preview_tab)
|
| + return false;
|
| + TabContentsWrapper* preview_contents =
|
| + TabContentsWrapper::GetCurrentWrapperForContents(preview_tab);
|
| +
|
| + OwnTabContents(content, preview_contents);
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool BackgroundPrintingManager::ReleaseInitiatorTabContents(
|
| + TabContentsWrapper* content) {
|
| + DLOG(INFO) << __FUNCTION__;
|
| +
|
| + if (printing_contents_.find(content) == printing_contents_.end())
|
| + return false;
|
| +
|
| + printing_contents_.erase(content);
|
| + DLOG(INFO) << "deleting initiator: " << (void*) content;
|
| + MessageLoop::current()->DeleteSoon(FROM_HERE, content);
|
| + return true;
|
| }
|
|
|
| void BackgroundPrintingManager::Observe(int type,
|
| @@ -67,6 +94,7 @@ void BackgroundPrintingManager::Observe(int type,
|
| const NotificationDetails& details) {
|
| switch (type) {
|
| case chrome::NOTIFICATION_PRINT_JOB_RELEASED: {
|
| + DLOG(INFO) << "NOTIFICATION_PRINT_JOB_RELEASED";
|
| TabContentsWrapper* tab = Source<TabContentsWrapper>(source).ptr();
|
| registrar_.Remove(this, chrome::NOTIFICATION_PRINT_JOB_RELEASED,
|
| Source<TabContentsWrapper>(tab));
|
| @@ -74,9 +102,26 @@ void BackgroundPrintingManager::Observe(int type,
|
| // This might be happening in the middle of a RenderViewGone() loop.
|
| // Deleting |contents| later so the RenderViewGone() loop can finish.
|
| MessageLoop::current()->DeleteSoon(FROM_HERE, tab);
|
| +
|
| + printing::PrintPreviewTabController* tab_controller =
|
| + printing::PrintPreviewTabController::GetInstance();
|
| + if (!tab_controller) {
|
| + DLOG(INFO) << "!tab_controller";
|
| + break;
|
| + }
|
| + TabContents* initiator_tab = tab_controller->GetInitiatorTab(
|
| + tab->tab_contents());
|
| + if (!initiator_tab) {
|
| + DLOG(INFO) << "!initiator_tab";
|
| + break;
|
| + }
|
| + TabContentsWrapper* initiator_wrapper =
|
| + TabContentsWrapper::GetCurrentWrapperForContents(initiator_tab);
|
| + ReleaseInitiatorTabContents(initiator_wrapper);
|
| break;
|
| }
|
| case content::NOTIFICATION_TAB_CONTENTS_DESTROYED: {
|
| + DLOG(INFO) << "NOTIFICATION_TAB_CONTENTS_DESTROYED";
|
| TabContentsWrapper* tab =
|
| TabContentsWrapper::GetCurrentWrapperForContents(
|
| Source<TabContents>(source).ptr());
|
| @@ -88,6 +133,22 @@ void BackgroundPrintingManager::Observe(int type,
|
| registrar_.Remove(this, content::NOTIFICATION_TAB_CONTENTS_DESTROYED,
|
| Source<TabContents>(tab->tab_contents()));
|
| printing_contents_.erase(tab);
|
| + printing::PrintPreviewTabController* tab_controller =
|
| + printing::PrintPreviewTabController::GetInstance();
|
| + if (!tab_controller) {
|
| + DLOG(INFO) << "!tab_controller";
|
| + break;
|
| + }
|
| + TabContents* initiator_tab = tab_controller->GetInitiatorTab(
|
| + tab->tab_contents());
|
| + if (!initiator_tab) {
|
| + DLOG(INFO) << "!initiator_tab";
|
| + break;
|
| + }
|
| + TabContentsWrapper* initiator_wrapper =
|
| + TabContentsWrapper::GetCurrentWrapperForContents(initiator_tab);
|
| + DLOG(INFO) << (void*)initiator_wrapper;
|
| + ReleaseInitiatorTabContents(initiator_wrapper);
|
| break;
|
| }
|
| default: {
|
| @@ -97,6 +158,33 @@ void BackgroundPrintingManager::Observe(int type,
|
| }
|
| }
|
|
|
| +void BackgroundPrintingManager::OwnTabContents(
|
| + TabContentsWrapper* contents, TabContentsWrapper* source_contents) {
|
| + DCHECK(CalledOnValidThread());
|
| + DCHECK(!source_contents ||
|
| + printing::PrintPreviewTabController::IsPrintPreviewTab(
|
| + source_contents->tab_contents()));
|
| + CHECK(printing_contents_.find(contents) == printing_contents_.end());
|
| +
|
| + printing_contents_.insert(contents);
|
| +
|
| + if (source_contents) {
|
| + // TODO(scr) delete non-preview tab if print is deleted or finishes.
|
| + registrar_.Add(this, chrome::NOTIFICATION_PRINT_JOB_RELEASED,
|
| + Source<TabContentsWrapper>(source_contents));
|
| + registrar_.Add(this, content::NOTIFICATION_TAB_CONTENTS_DESTROYED,
|
| + Source<TabContents>(source_contents->tab_contents()));
|
| + }
|
| +
|
| + // Detach |contents| from its tab strip.
|
| + Browser* browser = BrowserList::FindBrowserWithID(
|
| + contents->restore_tab_helper()->window_id().id());
|
| + DCHECK(browser);
|
| +
|
| + TabStripModel* tabstrip = browser->tabstrip_model();
|
| + tabstrip->DetachTabContentsAt(tabstrip->GetIndexOfTabContents(contents));
|
| +}
|
| +
|
| std::set<TabContentsWrapper*>::const_iterator
|
| BackgroundPrintingManager::begin() {
|
| return printing_contents_.begin();
|
|
|