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

Side by Side Diff: components/web_modal/web_contents_modal_dialog_manager.cc

Issue 17500003: Close web contents modal dialogs on content load start (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/web_modal/web_contents_modal_dialog_manager.h" 5 #include "components/web_modal/web_contents_modal_dialog_manager.h"
6 6
7 #include "components/web_modal/web_contents_modal_dialog_manager_delegate.h" 7 #include "components/web_modal/web_contents_modal_dialog_manager_delegate.h"
8 #include "content/public/browser/navigation_details.h" 8 #include "content/public/browser/navigation_details.h"
9 #include "content/public/browser/navigation_entry.h" 9 #include "content/public/browser/navigation_entry.h"
10 #include "content/public/browser/notification_details.h" 10 #include "content/public/browser/notification_details.h"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 !closing_all_dialogs_) 67 !closing_all_dialogs_)
68 native_manager_->ShowDialog(child_dialogs_.front()); 68 native_manager_->ShowDialog(child_dialogs_.front());
69 69
70 BlockWebContentsInteraction(!child_dialogs_.empty()); 70 BlockWebContentsInteraction(!child_dialogs_.empty());
71 } 71 }
72 72
73 void WebContentsModalDialogManager::Observe( 73 void WebContentsModalDialogManager::Observe(
74 int type, 74 int type,
75 const content::NotificationSource& source, 75 const content::NotificationSource& source,
76 const content::NotificationDetails& details) { 76 const content::NotificationDetails& details) {
77 DCHECK(type == content::NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED); 77 if (type == content::NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED) {
78 if (child_dialogs_.empty())
79 return;
78 80
79 if (child_dialogs_.empty()) 81 bool visible = *content::Details<bool>(details).ptr();
80 return; 82 if (visible)
81 83 native_manager_->ShowDialog(child_dialogs_.front());
82 bool visible = *content::Details<bool>(details).ptr(); 84 else
83 if (visible) 85 native_manager_->HideDialog(child_dialogs_.front());
84 native_manager_->ShowDialog(child_dialogs_.front()); 86 } else if (type == content::NOTIFICATION_LOAD_START) {
85 else 87 if (!child_dialogs_.empty())
86 native_manager_->HideDialog(child_dialogs_.front()); 88 native_manager_->CloseDialog(child_dialogs_.front());
89 }
87 } 90 }
88 91
89 WebContentsModalDialogManager::WebContentsModalDialogManager( 92 WebContentsModalDialogManager::WebContentsModalDialogManager(
90 content::WebContents* web_contents) 93 content::WebContents* web_contents)
91 : content::WebContentsObserver(web_contents), 94 : content::WebContentsObserver(web_contents),
92 delegate_(NULL), 95 delegate_(NULL),
93 native_manager_(CreateNativeManager(this)), 96 native_manager_(CreateNativeManager(this)),
94 closing_all_dialogs_(false) { 97 closing_all_dialogs_(false) {
95 DCHECK(native_manager_); 98 DCHECK(native_manager_);
99 content::NavigationController* controller =
100 &GetWebContents()->GetController();
101 registrar_.Add(this,
102 content::NOTIFICATION_LOAD_START,
103 content::Source<content::NavigationController>(controller));
96 registrar_.Add(this, 104 registrar_.Add(this,
97 content::NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED, 105 content::NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED,
98 content::Source<content::WebContents>(web_contents)); 106 content::Source<content::WebContents>(web_contents));
99 } 107 }
100 108
101 void WebContentsModalDialogManager::BlockWebContentsInteraction(bool blocked) { 109 void WebContentsModalDialogManager::BlockWebContentsInteraction(bool blocked) {
102 WebContents* contents = web_contents(); 110 WebContents* contents = web_contents();
103 if (!contents) { 111 if (!contents) {
104 // The WebContents has already disconnected. 112 // The WebContents has already disconnected.
105 return; 113 return;
(...skipping 10 matching lines...) Expand all
116 void WebContentsModalDialogManager::CloseAllDialogs() { 124 void WebContentsModalDialogManager::CloseAllDialogs() {
117 closing_all_dialogs_ = true; 125 closing_all_dialogs_ = true;
118 126
119 // Clear out any dialogs since we are leaving this page entirely. 127 // Clear out any dialogs since we are leaving this page entirely.
120 while (!child_dialogs_.empty()) 128 while (!child_dialogs_.empty())
121 native_manager_->CloseDialog(child_dialogs_.front()); 129 native_manager_->CloseDialog(child_dialogs_.front());
122 130
123 closing_all_dialogs_ = false; 131 closing_all_dialogs_ = false;
124 } 132 }
125 133
126 void WebContentsModalDialogManager::DidNavigateMainFrame(
127 const content::LoadCommittedDetails& details,
128 const content::FrameNavigateParams& params) {
129 // Close constrained windows if necessary.
130 if (!net::registry_controlled_domains::SameDomainOrHost(
131 details.previous_url, details.entry->GetURL(),
132 net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES))
133 CloseAllDialogs();
134 }
135
136 void WebContentsModalDialogManager::DidGetIgnoredUIEvent() { 134 void WebContentsModalDialogManager::DidGetIgnoredUIEvent() {
137 if (!child_dialogs_.empty()) 135 if (!child_dialogs_.empty())
138 native_manager_->FocusDialog(child_dialogs_.front()); 136 native_manager_->FocusDialog(child_dialogs_.front());
139 } 137 }
140 138
141 void WebContentsModalDialogManager::WebContentsDestroyed(WebContents* tab) { 139 void WebContentsModalDialogManager::WebContentsDestroyed(WebContents* tab) {
142 // First cleanly close all child dialogs. 140 // First cleanly close all child dialogs.
143 // TODO(mpcomplete): handle case if MaybeCloseChildWindows() already asked 141 // TODO(mpcomplete): handle case if MaybeCloseChildWindows() already asked
144 // some of these to close. CloseAllDialogs is async, so it might get called 142 // some of these to close. CloseAllDialogs is async, so it might get called
145 // twice before it runs. 143 // twice before it runs.
146 CloseAllDialogs(); 144 CloseAllDialogs();
147 } 145 }
148 146
149 } // namespace web_modal 147 } // namespace web_modal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698