Index: chrome/browser/printing/print_preview_dialog_controller.cc |
diff --git a/chrome/browser/printing/print_preview_dialog_controller.cc b/chrome/browser/printing/print_preview_dialog_controller.cc |
index 5088ffbe6ba5bddab3a74e4e6ad4d9deeae23189..89ec8fcc6143805e38dfa168cd06830473971698 100644 |
--- a/chrome/browser/printing/print_preview_dialog_controller.cc |
+++ b/chrome/browser/printing/print_preview_dialog_controller.cc |
@@ -74,7 +74,7 @@ void EnableInternalPDFPluginForContents(WebContents* preview_dialog) { |
// will look like. |
class PrintPreviewDialogDelegate : public WebDialogDelegate { |
public: |
- explicit PrintPreviewDialogDelegate(WebContents* initiator_tab); |
+ explicit PrintPreviewDialogDelegate(WebContents* initiator); |
virtual ~PrintPreviewDialogDelegate(); |
virtual ui::ModalType GetDialogModalType() const OVERRIDE; |
@@ -90,14 +90,13 @@ class PrintPreviewDialogDelegate : public WebDialogDelegate { |
virtual bool ShouldShowDialogTitle() const OVERRIDE; |
private: |
- WebContents* initiator_tab_; |
+ WebContents* initiator_; |
DISALLOW_COPY_AND_ASSIGN(PrintPreviewDialogDelegate); |
}; |
-PrintPreviewDialogDelegate::PrintPreviewDialogDelegate( |
- WebContents* initiator_tab) { |
- initiator_tab_ = initiator_tab; |
+PrintPreviewDialogDelegate::PrintPreviewDialogDelegate(WebContents* initiator) |
+ : initiator_(initiator) { |
} |
PrintPreviewDialogDelegate::~PrintPreviewDialogDelegate() { |
@@ -129,7 +128,7 @@ void PrintPreviewDialogDelegate::GetDialogSize(gfx::Size* size) const { |
const int kBorder = 25; |
const int kConstrainedWindowOverlap = 3; |
gfx::Rect rect; |
- initiator_tab_->GetView()->GetContainerBounds(&rect); |
+ initiator_->GetView()->GetContainerBounds(&rect); |
size->set_width(std::max(rect.width(), kMinDialogSize.width()) - 2 * kBorder); |
size->set_height(std::max(rect.height(), kMinDialogSize.height()) - kBorder + |
kConstrainedWindowOverlap); |
@@ -165,7 +164,7 @@ bool PrintPreviewDialogDelegate::ShouldShowDialogTitle() const { |
// renderer to the browser. |
class PrintPreviewWebContentDelegate : public WebDialogWebContentsDelegate { |
public: |
- PrintPreviewWebContentDelegate(Profile* profile, WebContents* initiator_tab); |
+ PrintPreviewWebContentDelegate(Profile* profile, WebContents* initiator); |
virtual ~PrintPreviewWebContentDelegate(); |
// Overridden from WebDialogWebContentsDelegate: |
@@ -181,9 +180,9 @@ class PrintPreviewWebContentDelegate : public WebDialogWebContentsDelegate { |
PrintPreviewWebContentDelegate::PrintPreviewWebContentDelegate( |
Profile* profile, |
- WebContents* initiator_tab) |
+ WebContents* initiator) |
: WebDialogWebContentsDelegate(profile, new ChromeWebContentsHandler), |
- tab_(initiator_tab) {} |
+ tab_(initiator) {} |
PrintPreviewWebContentDelegate::~PrintPreviewWebContentDelegate() {} |
@@ -216,28 +215,28 @@ PrintPreviewDialogController* PrintPreviewDialogController::GetInstance() { |
} |
// static |
-void PrintPreviewDialogController::PrintPreview(WebContents* initiator_tab) { |
- if (initiator_tab->ShowingInterstitialPage()) |
+void PrintPreviewDialogController::PrintPreview(WebContents* initiator) { |
+ if (initiator->ShowingInterstitialPage()) |
return; |
PrintPreviewDialogController* dialog_controller = GetInstance(); |
if (!dialog_controller) |
return; |
- if (!dialog_controller->GetOrCreatePreviewDialog(initiator_tab)) |
- PrintViewManager::FromWebContents(initiator_tab)->PrintPreviewDone(); |
+ if (!dialog_controller->GetOrCreatePreviewDialog(initiator)) |
+ PrintViewManager::FromWebContents(initiator)->PrintPreviewDone(); |
} |
WebContents* PrintPreviewDialogController::GetOrCreatePreviewDialog( |
- WebContents* initiator_tab) { |
- DCHECK(initiator_tab); |
+ WebContents* initiator) { |
+ DCHECK(initiator); |
- // Get the print preview dialog for |initiator_tab|. |
- WebContents* preview_dialog = GetPrintPreviewForContents(initiator_tab); |
+ // Get the print preview dialog for |initiator|. |
+ WebContents* preview_dialog = GetPrintPreviewForContents(initiator); |
if (!preview_dialog) |
- return CreatePrintPreviewDialog(initiator_tab); |
+ return CreatePrintPreviewDialog(initiator); |
- // Show the initiator tab holding the existing preview dialog. |
- initiator_tab->GetDelegate()->ActivateContents(initiator_tab); |
+ // Show the initiator holding the existing preview dialog. |
+ initiator->GetDelegate()->ActivateContents(initiator); |
return preview_dialog; |
} |
@@ -252,7 +251,7 @@ WebContents* PrintPreviewDialogController::GetPrintPreviewForContents( |
for (it = preview_dialog_map_.begin(); |
it != preview_dialog_map_.end(); |
++it) { |
- // If |contents| is an initiator tab. |
+ // If |contents| is an initiator. |
if (contents == it->second) { |
// Return the associated preview dialog. |
return it->first; |
@@ -261,7 +260,7 @@ WebContents* PrintPreviewDialogController::GetPrintPreviewForContents( |
return NULL; |
} |
-WebContents* PrintPreviewDialogController::GetInitiatorTab( |
+WebContents* PrintPreviewDialogController::GetInitiator( |
WebContents* preview_dialog) { |
PrintPreviewDialogMap::iterator it = preview_dialog_map_.find(preview_dialog); |
return (it != preview_dialog_map_.end()) ? it->second : NULL; |
@@ -297,13 +296,13 @@ bool PrintPreviewDialogController::IsPrintPreviewURL(const GURL& url) { |
url.host() == chrome::kChromeUIPrintHost); |
} |
-void PrintPreviewDialogController::EraseInitiatorTabInfo( |
+void PrintPreviewDialogController::EraseInitiatorInfo( |
WebContents* preview_dialog) { |
PrintPreviewDialogMap::iterator it = preview_dialog_map_.find(preview_dialog); |
if (it == preview_dialog_map_.end()) |
return; |
- RemoveObservers(it->second); |
+ RemoveObservers(it->second, INITIATOR); |
preview_dialog_map_[preview_dialog] = NULL; |
} |
@@ -313,17 +312,17 @@ void PrintPreviewDialogController::OnRendererProcessClosed( |
content::RenderProcessHost* rph) { |
// Store contents in a vector and deal with them after iterating through |
// |preview_dialog_map_| because RemoveFoo() can change |preview_dialog_map_|. |
- std::vector<WebContents*> closed_initiator_tabs; |
+ std::vector<WebContents*> closed_initiators; |
std::vector<WebContents*> closed_preview_dialogs; |
for (PrintPreviewDialogMap::iterator iter = preview_dialog_map_.begin(); |
iter != preview_dialog_map_.end(); ++iter) { |
WebContents* preview_dialog = iter->first; |
- WebContents* initiator_tab = iter->second; |
+ WebContents* initiator = iter->second; |
if (preview_dialog->GetRenderProcessHost() == rph) { |
closed_preview_dialogs.push_back(preview_dialog); |
- } else if (initiator_tab && |
- initiator_tab->GetRenderProcessHost() == rph) { |
- closed_initiator_tabs.push_back(initiator_tab); |
+ } else if (initiator && |
+ initiator->GetRenderProcessHost() == rph) { |
+ closed_initiators.push_back(initiator); |
} |
} |
@@ -335,8 +334,8 @@ void PrintPreviewDialogController::OnRendererProcessClosed( |
print_preview_ui->OnPrintPreviewDialogClosed(); |
} |
- for (size_t i = 0; i < closed_initiator_tabs.size(); ++i) |
- RemoveInitiatorTab(closed_initiator_tabs[i]); |
+ for (size_t i = 0; i < closed_initiators.size(); ++i) |
+ RemoveInitiator(closed_initiators[i]); |
} |
void PrintPreviewDialogController::OnWebContentsDestroyed( |
@@ -350,7 +349,7 @@ void PrintPreviewDialogController::OnWebContentsDestroyed( |
if (contents == preview_dialog) |
RemovePreviewDialog(contents); |
else |
- RemoveInitiatorTab(contents); |
+ RemoveInitiator(contents); |
} |
void PrintPreviewDialogController::OnNavEntryCommitted( |
@@ -361,42 +360,40 @@ void PrintPreviewDialogController::OnNavEntryCommitted( |
return; |
} |
- if (contents == preview_dialog) { |
- // Preview dialog navigated. |
- if (details) { |
- content::PageTransition transition_type = |
- details->entry->GetTransitionType(); |
- content::NavigationType nav_type = details->type; |
- |
- // New |preview_dialog| is created. Don't update/erase map entry. |
- if (waiting_for_new_preview_page_ && |
- transition_type == content::PAGE_TRANSITION_AUTO_TOPLEVEL && |
- nav_type == content::NAVIGATION_TYPE_NEW_PAGE) { |
- waiting_for_new_preview_page_ = false; |
- SaveInitiatorTabTitle(preview_dialog); |
- return; |
- } |
- |
- // Cloud print sign-in causes a reload. |
- if (!waiting_for_new_preview_page_ && |
- transition_type == content::PAGE_TRANSITION_RELOAD && |
- nav_type == content::NAVIGATION_TYPE_EXISTING_PAGE && |
- IsPrintPreviewURL(details->previous_url)) { |
- return; |
- } |
+ DCHECK_EQ(contents, preview_dialog); |
+ |
+ // Preview dialog navigated. |
+ if (details) { |
+ content::PageTransition transition_type = |
+ details->entry->GetTransitionType(); |
+ content::NavigationType nav_type = details->type; |
+ |
+ // New |preview_dialog| is created. Don't update/erase map entry. |
+ if (waiting_for_new_preview_page_ && |
+ transition_type == content::PAGE_TRANSITION_AUTO_TOPLEVEL && |
+ nav_type == content::NAVIGATION_TYPE_NEW_PAGE) { |
+ waiting_for_new_preview_page_ = false; |
+ SaveInitiatorTitle(preview_dialog); |
+ return; |
+ } |
+ |
+ // Cloud print sign-in causes a reload. |
+ if (!waiting_for_new_preview_page_ && |
+ transition_type == content::PAGE_TRANSITION_RELOAD && |
+ nav_type == content::NAVIGATION_TYPE_EXISTING_PAGE && |
+ IsPrintPreviewURL(details->previous_url)) { |
+ return; |
} |
- NOTREACHED(); |
- return; |
} |
- RemoveInitiatorTab(contents); |
+ NOTREACHED(); |
} |
WebContents* PrintPreviewDialogController::CreatePrintPreviewDialog( |
- WebContents* initiator_tab) { |
+ WebContents* initiator) { |
base::AutoReset<bool> auto_reset(&is_creating_print_preview_dialog_, true); |
Profile* profile = |
- Profile::FromBrowserContext(initiator_tab->GetBrowserContext()); |
+ Profile::FromBrowserContext(initiator->GetBrowserContext()); |
if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeFrame)) { |
// Chrome Frame only ever runs on the native desktop, so it is safe to |
// create the popup on the native desktop. |
@@ -412,45 +409,48 @@ WebContents* PrintPreviewDialogController::CreatePrintPreviewDialog( |
// |web_dialog_ui_delegate| deletes itself in |
// PrintPreviewDialogDelegate::OnDialogClosed(). |
WebDialogDelegate* web_dialog_delegate = |
- new PrintPreviewDialogDelegate(initiator_tab); |
+ new PrintPreviewDialogDelegate(initiator); |
// |web_dialog_delegate|'s owner is |constrained_delegate|. |
PrintPreviewWebContentDelegate* pp_wcd = |
- new PrintPreviewWebContentDelegate(profile, initiator_tab); |
+ new PrintPreviewWebContentDelegate(profile, initiator); |
ConstrainedWebDialogDelegate* constrained_delegate = |
CreateConstrainedWebDialog(profile, |
web_dialog_delegate, |
pp_wcd, |
- initiator_tab); |
+ initiator); |
WebContents* preview_dialog = constrained_delegate->GetWebContents(); |
EnableInternalPDFPluginForContents(preview_dialog); |
PrintViewManager::CreateForWebContents(preview_dialog); |
// Add an entry to the map. |
- preview_dialog_map_[preview_dialog] = initiator_tab; |
+ preview_dialog_map_[preview_dialog] = initiator; |
waiting_for_new_preview_page_ = true; |
- AddObservers(initiator_tab); |
- AddObservers(preview_dialog); |
+ AddObservers(initiator, INITIATOR); |
+ AddObservers(preview_dialog, PREVIEW_DIALOG); |
return preview_dialog; |
} |
-void PrintPreviewDialogController::SaveInitiatorTabTitle( |
+void PrintPreviewDialogController::SaveInitiatorTitle( |
WebContents* preview_dialog) { |
- WebContents* initiator_tab = GetInitiatorTab(preview_dialog); |
- if (initiator_tab && preview_dialog->GetWebUI()) { |
+ WebContents* initiator = GetInitiator(preview_dialog); |
+ if (initiator && preview_dialog->GetWebUI()) { |
PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>( |
preview_dialog->GetWebUI()->GetController()); |
- print_preview_ui->SetInitiatorTabTitle( |
- PrintViewManager::FromWebContents(initiator_tab)->RenderSourceName()); |
+ print_preview_ui->SetInitiatorTitle( |
+ PrintViewManager::FromWebContents(initiator)->RenderSourceName()); |
} |
} |
-void PrintPreviewDialogController::AddObservers(WebContents* contents) { |
+void PrintPreviewDialogController::AddObservers(WebContents* contents, |
+ ContentsType contents_type) { |
registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
content::Source<WebContents>(contents)); |
- registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
- content::Source<NavigationController>(&contents->GetController())); |
+ if (contents_type == PREVIEW_DIALOG) { |
+ registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
+ content::Source<NavigationController>(&contents->GetController())); |
+ } |
// Multiple sites may share the same RenderProcessHost, so check if this |
// notification has already been added. |
@@ -463,11 +463,14 @@ void PrintPreviewDialogController::AddObservers(WebContents* contents) { |
} |
} |
-void PrintPreviewDialogController::RemoveObservers(WebContents* contents) { |
+void PrintPreviewDialogController::RemoveObservers(WebContents* contents, |
+ ContentsType contents_type) { |
registrar_.Remove(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
content::Source<WebContents>(contents)); |
- registrar_.Remove(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
- content::Source<NavigationController>(&contents->GetController())); |
+ if (contents_type == PREVIEW_DIALOG) { |
+ registrar_.Remove(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
+ content::Source<NavigationController>(&contents->GetController())); |
+ } |
// Multiple sites may share the same RenderProcessHost, so check if this |
// notification has already been added. |
@@ -480,43 +483,43 @@ void PrintPreviewDialogController::RemoveObservers(WebContents* contents) { |
} |
} |
-void PrintPreviewDialogController::RemoveInitiatorTab( |
- WebContents* initiator_tab) { |
- WebContents* preview_dialog = GetPrintPreviewForContents(initiator_tab); |
+void PrintPreviewDialogController::RemoveInitiator( |
+ WebContents* initiator) { |
+ WebContents* preview_dialog = GetPrintPreviewForContents(initiator); |
DCHECK(preview_dialog); |
// Update the map entry first, so when the print preview dialog gets destroyed |
// and reaches RemovePreviewDialog(), it does not attempt to also remove the |
- // initiator tab's observers. |
+ // initiator's observers. |
preview_dialog_map_[preview_dialog] = NULL; |
- RemoveObservers(initiator_tab); |
+ RemoveObservers(initiator, INITIATOR); |
- PrintViewManager::FromWebContents(initiator_tab)->PrintPreviewDone(); |
+ PrintViewManager::FromWebContents(initiator)->PrintPreviewDone(); |
- // Initiator tab is closed. Close the print preview dialog too. |
+ // initiator is closed. Close the print preview dialog too. |
PrintPreviewUI* print_preview_ui = |
static_cast<PrintPreviewUI*>(preview_dialog->GetWebUI()->GetController()); |
if (print_preview_ui) |
- print_preview_ui->OnInitiatorTabClosed(); |
+ print_preview_ui->OnInitiatorClosed(); |
} |
void PrintPreviewDialogController::RemovePreviewDialog( |
WebContents* preview_dialog) { |
- // Remove the initiator tab's observers before erasing the mapping. |
- WebContents* initiator_tab = GetInitiatorTab(preview_dialog); |
- if (initiator_tab) { |
- RemoveObservers(initiator_tab); |
- PrintViewManager::FromWebContents(initiator_tab)->PrintPreviewDone(); |
+ // Remove the initiator's observers before erasing the mapping. |
+ WebContents* initiator = GetInitiator(preview_dialog); |
+ if (initiator) { |
+ RemoveObservers(initiator, INITIATOR); |
+ PrintViewManager::FromWebContents(initiator)->PrintPreviewDone(); |
} |
// Print preview WebContents is destroyed. Notify |PrintPreviewUI| to abort |
- // the initiator tab preview request. |
+ // the initiator preview request. |
PrintPreviewUI* print_preview_ui = |
static_cast<PrintPreviewUI*>(preview_dialog->GetWebUI()->GetController()); |
if (print_preview_ui) |
print_preview_ui->OnPrintPreviewDialogDestroyed(); |
preview_dialog_map_.erase(preview_dialog); |
- RemoveObservers(preview_dialog); |
+ RemoveObservers(preview_dialog, PREVIEW_DIALOG); |
} |
} // namespace printing |