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

Side by Side Diff: chrome/browser/geolocation/geolocation_infobar_queue_controller.cc

Issue 11269002: Introduce GeolocationPermissionRequestID, a wrapper struct to contain the (render process ID, rende… (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 2 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 "chrome/browser/geolocation/geolocation_infobar_queue_controller.h" 5 #include "chrome/browser/geolocation/geolocation_infobar_queue_controller.h"
6 6
7 #include "chrome/browser/content_settings/host_content_settings_map.h" 7 #include "chrome/browser/content_settings/host_content_settings_map.h"
8 #include "chrome/browser/geolocation/geolocation_confirm_infobar_delegate.h" 8 #include "chrome/browser/geolocation/geolocation_confirm_infobar_delegate.h"
9 #include "chrome/browser/geolocation/geolocation_confirm_infobar_delegate_factor y.h" 9 #include "chrome/browser/geolocation/geolocation_confirm_infobar_delegate_factor y.h"
10 #include "chrome/browser/infobars/infobar.h" 10 #include "chrome/browser/infobars/infobar.h"
11 #include "chrome/browser/infobars/infobar_tab_helper.h" 11 #include "chrome/browser/infobars/infobar_tab_helper.h"
12 #include "chrome/browser/prefs/pref_service.h" 12 #include "chrome/browser/prefs/pref_service.h"
13 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/tab_contents/tab_util.h" 14 #include "chrome/browser/tab_contents/tab_util.h"
15 #include "chrome/common/chrome_notification_types.h" 15 #include "chrome/common/chrome_notification_types.h"
16 #include "chrome/common/content_settings.h" 16 #include "chrome/common/content_settings.h"
17 #include "chrome/common/pref_names.h" 17 #include "chrome/common/pref_names.h"
18 #include "content/public/browser/browser_thread.h" 18 #include "content/public/browser/browser_thread.h"
19 #include "content/public/browser/geolocation.h"
19 #include "content/public/browser/notification_details.h" 20 #include "content/public/browser/notification_details.h"
20 #include "content/public/browser/notification_source.h" 21 #include "content/public/browser/notification_source.h"
21 #include "content/public/browser/notification_types.h" 22 #include "content/public/browser/notification_types.h"
22 #include "content/public/browser/web_contents.h" 23 #include "content/public/browser/web_contents.h"
23 24
24 using content::BrowserThread; 25 using content::BrowserThread;
25 using content::WebContents; 26 using content::WebContents;
26 27
27 // GeolocationInfoBarQueueController::PendingInfoBarRequest ------------------- 28 // GeolocationInfoBarQueueController::PendingInfoBarRequest -------------------
28 29
29 struct GeolocationInfoBarQueueController::PendingInfoBarRequest { 30 struct GeolocationInfoBarQueueController::PendingInfoBarRequest {
30 public: 31 public:
31 PendingInfoBarRequest(int render_process_id, 32 PendingInfoBarRequest(const content::GeolocationPermissionRequestID& id,
32 int render_view_id,
33 int bridge_id,
34 const GURL& requesting_frame, 33 const GURL& requesting_frame,
35 const GURL& embedder, 34 const GURL& embedder,
36 PermissionDecidedCallback callback); 35 PermissionDecidedCallback callback);
37 36
38 bool IsForTab(int p_render_process_id, int p_render_view_id) const;
39 bool IsForPair(const GURL& p_requesting_frame, 37 bool IsForPair(const GURL& p_requesting_frame,
40 const GURL& p_embedder) const; 38 const GURL& p_embedder) const;
41 bool Equals(int p_render_process_id,
42 int p_render_view_id,
43 int p_bridge_id) const;
44 39
45 int render_process_id; 40 content::GeolocationPermissionRequestID id;
46 int render_view_id;
47 int bridge_id;
48 GURL requesting_frame; 41 GURL requesting_frame;
49 GURL embedder; 42 GURL embedder;
50 PermissionDecidedCallback callback; 43 PermissionDecidedCallback callback;
51 GeolocationConfirmInfoBarDelegate* infobar_delegate; 44 GeolocationConfirmInfoBarDelegate* infobar_delegate;
52 }; 45 };
53 46
54 GeolocationInfoBarQueueController::PendingInfoBarRequest::PendingInfoBarRequest( 47 GeolocationInfoBarQueueController::PendingInfoBarRequest::PendingInfoBarRequest(
55 int render_process_id, 48 const content::GeolocationPermissionRequestID& id,
56 int render_view_id,
57 int bridge_id,
58 const GURL& requesting_frame, 49 const GURL& requesting_frame,
59 const GURL& embedder, 50 const GURL& embedder,
60 PermissionDecidedCallback callback) 51 PermissionDecidedCallback callback)
61 : render_process_id(render_process_id), 52 : id(id),
62 render_view_id(render_view_id),
63 bridge_id(bridge_id),
64 requesting_frame(requesting_frame), 53 requesting_frame(requesting_frame),
65 embedder(embedder), 54 embedder(embedder),
66 callback(callback), 55 callback(callback),
67 infobar_delegate(NULL) { 56 infobar_delegate(NULL) {
68 } 57 }
69 58
70 bool GeolocationInfoBarQueueController::PendingInfoBarRequest::IsForTab(
71 int p_render_process_id,
72 int p_render_view_id) const {
73 return (render_process_id == p_render_process_id) &&
74 (render_view_id == p_render_view_id);
75 }
76
77 bool GeolocationInfoBarQueueController::PendingInfoBarRequest::IsForPair( 59 bool GeolocationInfoBarQueueController::PendingInfoBarRequest::IsForPair(
78 const GURL& p_requesting_frame, 60 const GURL& p_requesting_frame,
79 const GURL& p_embedder) const { 61 const GURL& p_embedder) const {
80 return (requesting_frame == p_requesting_frame) && (embedder == p_embedder); 62 return (requesting_frame == p_requesting_frame) && (embedder == p_embedder);
81 } 63 }
82 64
83 bool GeolocationInfoBarQueueController::PendingInfoBarRequest::Equals(
84 int p_render_process_id,
85 int p_render_view_id,
86 int p_bridge_id) const {
87 return IsForTab(p_render_process_id, p_render_view_id) &&
88 (bridge_id == p_bridge_id);
89 }
90
91
92 // GeolocationInfoBarQueueController::RequestEquals ---------------------------
93
94 // Useful predicate for checking PendingInfoBarRequest equality.
95 class GeolocationInfoBarQueueController::RequestEquals
96 : public std::unary_function<PendingInfoBarRequest, bool> {
97 public:
98 RequestEquals(int render_process_id, int render_view_id, int bridge_id);
99
100 bool operator()(const PendingInfoBarRequest& request) const;
101
102 private:
103 int render_process_id_;
104 int render_view_id_;
105 int bridge_id_;
106 };
107
108 GeolocationInfoBarQueueController::RequestEquals::RequestEquals(
109 int render_process_id,
110 int render_view_id,
111 int bridge_id)
112 : render_process_id_(render_process_id),
113 render_view_id_(render_view_id),
114 bridge_id_(bridge_id) {
115 }
116
117 bool GeolocationInfoBarQueueController::RequestEquals::operator()(
118 const PendingInfoBarRequest& request) const {
119 return request.Equals(render_process_id_, render_view_id_, bridge_id_);
120 }
121 65
122 // GeolocationInfoBarQueueController ------------------------------------------ 66 // GeolocationInfoBarQueueController ------------------------------------------
123 67
124 GeolocationInfoBarQueueController::GeolocationInfoBarQueueController( 68 GeolocationInfoBarQueueController::GeolocationInfoBarQueueController(
125 Profile* profile) 69 Profile* profile)
126 : profile_(profile) { 70 : profile_(profile) {
127 } 71 }
128 72
129 GeolocationInfoBarQueueController::~GeolocationInfoBarQueueController() { 73 GeolocationInfoBarQueueController::~GeolocationInfoBarQueueController() {
130 } 74 }
131 75
132 void GeolocationInfoBarQueueController::CreateInfoBarRequest( 76 void GeolocationInfoBarQueueController::CreateInfoBarRequest(
133 int render_process_id, 77 const content::GeolocationPermissionRequestID& id,
134 int render_view_id,
135 int bridge_id,
136 const GURL& requesting_frame, 78 const GURL& requesting_frame,
137 const GURL& embedder, 79 const GURL& embedder,
138 PermissionDecidedCallback callback) { 80 PermissionDecidedCallback callback) {
139 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 81 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
140 82
141 // We shouldn't get duplicate requests. 83 // We shouldn't get duplicate requests.
142 DCHECK(std::find_if(pending_infobar_requests_.begin(), 84 for (PendingInfoBarRequests::const_iterator i(
143 pending_infobar_requests_.end(), 85 pending_infobar_requests_.begin());
144 RequestEquals(render_process_id, render_view_id, bridge_id)) == 86 i != pending_infobar_requests_.end(); ++i)
145 pending_infobar_requests_.end()); 87 DCHECK(!i->id.Equals(id));
146 88
147 InfoBarTabHelper* helper = GetInfoBarHelper(render_process_id, 89 pending_infobar_requests_.push_back(PendingInfoBarRequest(
148 render_view_id); 90 id, requesting_frame, embedder, callback));
149 if (!helper) { 91 if (!AlreadyShowingInfoBarForTab(id) && !ShowQueuedInfoBarForTab(id)) {
150 // We won't be able to create any infobars, shortcut and remove any pending 92 // We can only get here if there's no InfoBarTabHelper.
151 // requests. 93 ClearPendingInfoBarRequestsForTab(id);
152 ClearPendingInfoBarRequestsForTab(render_process_id, render_view_id);
153 return;
154 } 94 }
155 pending_infobar_requests_.push_back(PendingInfoBarRequest(render_process_id,
156 render_view_id, bridge_id, requesting_frame, embedder, callback));
157 if (!AlreadyShowingInfoBar(render_process_id, render_view_id))
158 ShowQueuedInfoBar(render_process_id, render_view_id, helper);
159 } 95 }
160 96
161 void GeolocationInfoBarQueueController::CancelInfoBarRequest( 97 void GeolocationInfoBarQueueController::CancelInfoBarRequest(
162 int render_process_id, 98 const content::GeolocationPermissionRequestID& id) {
163 int render_view_id,
164 int bridge_id) {
165 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 99 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
166 100
167 PendingInfoBarRequests::iterator i = std::find_if( 101 for (PendingInfoBarRequests::iterator i(pending_infobar_requests_.begin());
168 pending_infobar_requests_.begin(), pending_infobar_requests_.end(), 102 i != pending_infobar_requests_.end(); ++i) {
169 RequestEquals(render_process_id, render_view_id, bridge_id)); 103 if (i->id.Equals(id)) {
170 // TODO(pkasting): Can this conditional become a DCHECK()? 104 if (i->infobar_delegate)
171 if (i == pending_infobar_requests_.end()) 105 GetInfoBarHelper(id)->RemoveInfoBar(i->infobar_delegate);
172 return; 106 else
173 InfoBarDelegate* delegate = i->infobar_delegate; 107 pending_infobar_requests_.erase(i);
174 if (!delegate) { 108 return;
175 pending_infobar_requests_.erase(i); 109 }
176 return;
177 } 110 }
178 InfoBarTabHelper* helper = GetInfoBarHelper(render_process_id,
179 render_view_id);
180 helper->RemoveInfoBar(delegate);
181 } 111 }
182 112
183 void GeolocationInfoBarQueueController::OnPermissionSet( 113 void GeolocationInfoBarQueueController::OnPermissionSet(
184 int render_process_id, 114 const content::GeolocationPermissionRequestID& id,
185 int render_view_id,
186 int bridge_id,
187 const GURL& requesting_frame, 115 const GURL& requesting_frame,
188 const GURL& embedder, 116 const GURL& embedder,
189 bool update_content_setting, 117 bool update_content_setting,
190 bool allowed) { 118 bool allowed) {
191 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 119 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
120
192 if (update_content_setting) { 121 if (update_content_setting) {
193 ContentSetting content_setting = 122 ContentSetting content_setting =
194 allowed ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; 123 allowed ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK;
195 profile_->GetHostContentSettingsMap()->SetContentSetting( 124 profile_->GetHostContentSettingsMap()->SetContentSetting(
196 ContentSettingsPattern::FromURLNoWildcard(requesting_frame.GetOrigin()), 125 ContentSettingsPattern::FromURLNoWildcard(requesting_frame.GetOrigin()),
197 ContentSettingsPattern::FromURLNoWildcard(embedder.GetOrigin()), 126 ContentSettingsPattern::FromURLNoWildcard(embedder.GetOrigin()),
198 CONTENT_SETTINGS_TYPE_GEOLOCATION, 127 CONTENT_SETTINGS_TYPE_GEOLOCATION,
199 std::string(), 128 std::string(),
200 content_setting); 129 content_setting);
201 } 130 }
131
202 // Cancel this request first, then notify listeners. TODO(pkasting): Why 132 // Cancel this request first, then notify listeners. TODO(pkasting): Why
203 // is this order important? 133 // is this order important?
204 PendingInfoBarRequests requests_to_notify; 134 PendingInfoBarRequests requests_to_notify;
205 PendingInfoBarRequests infobars_to_remove; 135 PendingInfoBarRequests infobars_to_remove;
206 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); 136 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin();
207 i != pending_infobar_requests_.end(); ) { 137 i != pending_infobar_requests_.end(); ) {
208 if (i->IsForPair(requesting_frame, embedder)) { 138 if (i->IsForPair(requesting_frame, embedder)) {
209 requests_to_notify.push_back(*i); 139 requests_to_notify.push_back(*i);
210 if (i->Equals(render_process_id, render_view_id, bridge_id)) { 140 if (i->id.Equals(id)) {
211 // The delegate that called us is i, and it's currently in either 141 // The delegate that called us is i, and it's currently in either
212 // Accept() or Cancel(). This means that the owning InfoBar will call 142 // Accept() or Cancel(). This means that the owning InfoBar will call
213 // RemoveInfoBar() later on, and that will trigger a notification we're 143 // RemoveInfoBar() later on, and that will trigger a notification we're
214 // observing. 144 // observing.
215 ++i; 145 ++i;
216 } else if (i->infobar_delegate) { 146 } else if (i->infobar_delegate) {
217 // This InfoBar is for the same frame/embedder pair, but in a different 147 // This InfoBar is for the same frame/embedder pair, but in a different
218 // tab. We should remove it now that we've got an answer for it. 148 // tab. We should remove it now that we've got an answer for it.
219 infobars_to_remove.push_back(*i); 149 infobars_to_remove.push_back(*i);
220 ++i; 150 ++i;
221 } else { 151 } else {
222 // We haven't created an InfoBar yet, just remove the pending request. 152 // We haven't created an InfoBar yet, just remove the pending request.
223 i = pending_infobar_requests_.erase(i); 153 i = pending_infobar_requests_.erase(i);
224 } 154 }
225 } else { 155 } else {
226 ++i; 156 ++i;
227 } 157 }
228 } 158 }
229 159
230 // Remove all InfoBars for the same |requesting_frame| and |embedder|. 160 // Remove all InfoBars for the same |requesting_frame| and |embedder|.
231 for (PendingInfoBarRequests::iterator i = infobars_to_remove.begin(); 161 for (PendingInfoBarRequests::iterator i = infobars_to_remove.begin();
232 i != infobars_to_remove.end(); ++i ) { 162 i != infobars_to_remove.end(); ++i )
233 InfoBarTabHelper* helper = GetInfoBarHelper(i->render_process_id, 163 GetInfoBarHelper(i->id)->RemoveInfoBar(i->infobar_delegate);
234 i->render_view_id);
235 helper->RemoveInfoBar(i->infobar_delegate);
236 }
237 164
238 // Send out the permission notifications. 165 // Send out the permission notifications.
239 for (PendingInfoBarRequests::iterator i = requests_to_notify.begin(); 166 for (PendingInfoBarRequests::iterator i = requests_to_notify.begin();
240 i != requests_to_notify.end(); ++i ) { 167 i != requests_to_notify.end(); ++i)
241 i->callback.Run(allowed); 168 i->callback.Run(allowed);
242 }
243 } 169 }
244 170
245 void GeolocationInfoBarQueueController::Observe( 171 void GeolocationInfoBarQueueController::Observe(
246 int type, 172 int type,
247 const content::NotificationSource& source, 173 const content::NotificationSource& source,
248 const content::NotificationDetails& details) { 174 const content::NotificationDetails& details) {
249 DCHECK_EQ(chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, type); 175 DCHECK_EQ(chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, type);
250 // We will receive this notification for all infobar closures, so we need to 176 // We will receive this notification for all infobar closures, so we need to
251 // check whether this is the geolocation infobar we're tracking. Note that the 177 // check whether this is the geolocation infobar we're tracking. Note that the
252 // InfoBarContainer (if any) may have received this notification before us and 178 // InfoBarContainer (if any) may have received this notification before us and
253 // caused the delegate to be deleted, so it's not safe to dereference the 179 // caused the delegate to be deleted, so it's not safe to dereference the
254 // contents of the delegate. The address of the delegate, however, is OK to 180 // contents of the delegate. The address of the delegate, however, is OK to
255 // use to find the PendingInfoBarRequest to remove because 181 // use to find the PendingInfoBarRequest to remove because
256 // pending_infobar_requests_ will not have received any new entries between 182 // pending_infobar_requests_ will not have received any new entries between
257 // the NotificationService's call to InfoBarContainer::Observe and this 183 // the NotificationService's call to InfoBarContainer::Observe and this
258 // method. 184 // method.
259 InfoBarDelegate* delegate = 185 InfoBarDelegate* delegate =
260 content::Details<InfoBarRemovedDetails>(details)->first; 186 content::Details<InfoBarRemovedDetails>(details)->first;
261 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); 187 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin();
262 i != pending_infobar_requests_.end(); ++i) { 188 i != pending_infobar_requests_.end(); ++i) {
263 GeolocationConfirmInfoBarDelegate* confirm_delegate = i->infobar_delegate; 189 GeolocationConfirmInfoBarDelegate* confirm_delegate = i->infobar_delegate;
264 if (confirm_delegate == delegate) { 190 if (confirm_delegate == delegate) {
265 InfoBarTabHelper* helper = 191 content::GeolocationPermissionRequestID id = i->id;
266 content::Source<InfoBarTabHelper>(source).ptr();
267 int render_process_id = i->render_process_id;
268 int render_view_id = i->render_view_id;
269 pending_infobar_requests_.erase(i); 192 pending_infobar_requests_.erase(i);
270 ShowQueuedInfoBar(render_process_id, render_view_id, helper); 193 DCHECK_EQ(content::Source<InfoBarTabHelper>(source).ptr(),
194 GetInfoBarHelper(id));
195 ShowQueuedInfoBarForTab(id);
271 return; 196 return;
272 } 197 }
273 } 198 }
274 } 199 }
275 200
276 GeolocationConfirmInfoBarDelegate* 201 GeolocationConfirmInfoBarDelegate*
277 GeolocationInfoBarQueueController::CreateInfoBarDelegate( 202 GeolocationInfoBarQueueController::CreateInfoBarDelegate(
278 InfoBarTabHelper* infobar_helper, 203 InfoBarTabHelper* infobar_helper,
279 GeolocationInfoBarQueueController* controller, 204 GeolocationInfoBarQueueController* controller,
280 int render_process_id, 205 const content::GeolocationPermissionRequestID& id,
281 int render_view_id, 206 const GURL& requesting_frame_url,
282 int bridge_id, 207 const std::string& display_languages) {
283 const GURL& requesting_frame_url,
284 const std::string& display_languages) {
285 return GeolocationConfirmInfoBarDelegateFactory::Create( 208 return GeolocationConfirmInfoBarDelegateFactory::Create(
286 infobar_helper, controller, render_process_id, render_view_id, bridge_id, 209 infobar_helper, controller, id, requesting_frame_url, display_languages);
287 requesting_frame_url, display_languages);
288 } 210 }
289 211
290 void GeolocationInfoBarQueueController::ShowQueuedInfoBar( 212 bool GeolocationInfoBarQueueController::AlreadyShowingInfoBarForTab(
291 int render_process_id, 213 const content::GeolocationPermissionRequestID& id) {
292 int render_view_id,
293 InfoBarTabHelper* helper) {
294 DCHECK(helper);
295 DCHECK(!AlreadyShowingInfoBar(render_process_id, render_view_id));
296 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); 214 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin();
297 i != pending_infobar_requests_.end(); ++i) { 215 i != pending_infobar_requests_.end(); ++i) {
298 if (i->IsForTab(render_process_id, render_view_id) && 216 if (i->id.IsForSameTabAs(id) && i->infobar_delegate)
299 !i->infobar_delegate) { 217 return true;
218 }
219 return false;
220 }
221
222 bool GeolocationInfoBarQueueController::ShowQueuedInfoBarForTab(
223 const content::GeolocationPermissionRequestID& id) {
224 DCHECK(!AlreadyShowingInfoBarForTab(id));
225
226 InfoBarTabHelper* helper = GetInfoBarHelper(id);
227 if (!helper)
228 return false;
229
230 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin();
231 i != pending_infobar_requests_.end(); ++i) {
232 if (i->id.IsForSameTabAs(id) && !i->infobar_delegate) {
300 RegisterForInfoBarNotifications(helper); 233 RegisterForInfoBarNotifications(helper);
301 i->infobar_delegate = CreateInfoBarDelegate( 234 i->infobar_delegate = CreateInfoBarDelegate(
302 helper, this, render_process_id, 235 helper, this, i->id, i->requesting_frame,
303 render_view_id, i->bridge_id, i->requesting_frame,
304 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); 236 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages));
305 helper->AddInfoBar(i->infobar_delegate); 237 helper->AddInfoBar(i->infobar_delegate);
306 return; 238 return true;
307 } 239 }
308 } 240 }
241
309 UnregisterForInfoBarNotifications(helper); 242 UnregisterForInfoBarNotifications(helper);
243 return false;
310 } 244 }
311 245
312 void GeolocationInfoBarQueueController::ClearPendingInfoBarRequestsForTab( 246 void GeolocationInfoBarQueueController::ClearPendingInfoBarRequestsForTab(
313 int render_process_id, 247 const content::GeolocationPermissionRequestID& id) {
314 int render_view_id) {
315 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); 248 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin();
316 i != pending_infobar_requests_.end(); ) { 249 i != pending_infobar_requests_.end(); ) {
317 if (i->IsForTab(render_process_id, render_view_id)) 250 if (i->id.IsForSameTabAs(id))
318 i = pending_infobar_requests_.erase(i); 251 i = pending_infobar_requests_.erase(i);
319 else 252 else
320 ++i; 253 ++i;
321 } 254 }
322 } 255 }
323 256
324 InfoBarTabHelper* GeolocationInfoBarQueueController::GetInfoBarHelper( 257 InfoBarTabHelper* GeolocationInfoBarQueueController::GetInfoBarHelper(
John Knottenbelt 2012/10/24 10:59:10 Can this be a non-member function local to this fi
Peter Kasting 2012/10/24 19:50:48 I think so. Will change.
325 int render_process_id, 258 const content::GeolocationPermissionRequestID& id) {
326 int render_view_id) {
327 WebContents* web_contents = 259 WebContents* web_contents =
328 tab_util::GetWebContentsByID(render_process_id, render_view_id); 260 tab_util::GetWebContentsByID(id.render_process_id, id.render_view_id);
329 return web_contents ? InfoBarTabHelper::FromWebContents(web_contents) : NULL; 261 return web_contents ? InfoBarTabHelper::FromWebContents(web_contents) : NULL;
330 } 262 }
331 263
332 bool GeolocationInfoBarQueueController::AlreadyShowingInfoBar(
333 int render_process_id,
334 int render_view_id) {
335 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin();
336 i != pending_infobar_requests_.end(); ++i) {
337 if (i->IsForTab(render_process_id, render_view_id) && i->infobar_delegate)
338 return true;
339 }
340 return false;
341 }
342
343 void GeolocationInfoBarQueueController::RegisterForInfoBarNotifications( 264 void GeolocationInfoBarQueueController::RegisterForInfoBarNotifications(
344 InfoBarTabHelper* helper) { 265 InfoBarTabHelper* helper) {
345 if (!registrar_.IsRegistered( 266 if (!registrar_.IsRegistered(
346 this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, 267 this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
347 content::Source<InfoBarTabHelper>(helper))) { 268 content::Source<InfoBarTabHelper>(helper))) {
348 registrar_.Add(this, 269 registrar_.Add(this,
349 chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, 270 chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
350 content::Source<InfoBarTabHelper>(helper)); 271 content::Source<InfoBarTabHelper>(helper));
351 } 272 }
352 } 273 }
353 274
354 void GeolocationInfoBarQueueController::UnregisterForInfoBarNotifications( 275 void GeolocationInfoBarQueueController::UnregisterForInfoBarNotifications(
355 InfoBarTabHelper* helper) { 276 InfoBarTabHelper* helper) {
356 if (registrar_.IsRegistered( 277 if (registrar_.IsRegistered(
357 this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, 278 this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
358 content::Source<InfoBarTabHelper>(helper))) { 279 content::Source<InfoBarTabHelper>(helper))) {
359 registrar_.Remove(this, 280 registrar_.Remove(this,
360 chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, 281 chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
361 content::Source<InfoBarTabHelper>(helper)); 282 content::Source<InfoBarTabHelper>(helper));
362 } 283 }
363 } 284 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698