Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Unified Diff: chrome/browser/printing/print_preview_dialog_controller.cc

Issue 17500003: Close web contents modal dialogs on content load start (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Bonus patchset: initiator tab -> initiator Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 b9413a0f7cee7f60dc6784884c23ffe8f572b8e8..485a89801399655e0a3fe549b35a22bf52cbdf8d 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,14 @@ 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;
+ WebContents* initiator) {
+ initiator_ = initiator;
Lei Zhang 2013/06/29 00:24:18 Just put this in the initializer list? I don't kno
Mike Wittman 2013/07/01 17:16:12 Done.
}
PrintPreviewDialogDelegate::~PrintPreviewDialogDelegate() {
@@ -129,7 +129,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 +165,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 +181,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 +216,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 +252,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 +261,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 +297,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 +313,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 +335,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 +350,7 @@ void PrintPreviewDialogController::OnWebContentsDestroyed(
if (contents == preview_dialog)
RemovePreviewDialog(contents);
else
- RemoveInitiatorTab(contents);
+ RemoveInitiator(contents);
}
void PrintPreviewDialogController::OnNavEntryCommitted(
@@ -361,42 +361,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 +410,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 +464,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 +484,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

Powered by Google App Engine
This is Rietveld 408576698