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