OLD | NEW |
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/api/infobars/confirm_infobar_delegate.h" | |
8 #include "chrome/browser/content_settings/host_content_settings_map.h" | 7 #include "chrome/browser/content_settings/host_content_settings_map.h" |
9 #include "chrome/browser/google/google_util.h" | 8 #include "chrome/browser/geolocation/geolocation_confirm_infobar_delegate.h" |
10 #include "chrome/browser/infobars/infobar.h" | 9 #include "chrome/browser/infobars/infobar.h" |
11 #include "chrome/browser/infobars/infobar_tab_helper.h" | 10 #include "chrome/browser/infobars/infobar_tab_helper.h" |
12 #include "chrome/browser/prefs/pref_service.h" | 11 #include "chrome/browser/prefs/pref_service.h" |
13 #include "chrome/browser/profiles/profile.h" | 12 #include "chrome/browser/profiles/profile.h" |
14 #include "chrome/browser/tab_contents/tab_util.h" | 13 #include "chrome/browser/tab_contents/tab_util.h" |
15 #include "chrome/common/chrome_notification_types.h" | 14 #include "chrome/common/chrome_notification_types.h" |
16 #include "chrome/common/content_settings.h" | 15 #include "chrome/common/content_settings.h" |
17 #include "chrome/common/pref_names.h" | 16 #include "chrome/common/pref_names.h" |
18 #include "content/public/browser/browser_thread.h" | 17 #include "content/public/browser/browser_thread.h" |
19 #include "content/public/browser/navigation_details.h" | |
20 #include "content/public/browser/navigation_entry.h" | |
21 #include "content/public/browser/notification_details.h" | 18 #include "content/public/browser/notification_details.h" |
22 #include "content/public/browser/notification_source.h" | 19 #include "content/public/browser/notification_source.h" |
23 #include "content/public/browser/notification_types.h" | 20 #include "content/public/browser/notification_types.h" |
24 #include "content/public/browser/web_contents.h" | 21 #include "content/public/browser/web_contents.h" |
25 #include "grit/generated_resources.h" | |
26 #include "grit/locale_settings.h" | |
27 #include "grit/theme_resources.h" | |
28 #include "net/base/net_util.h" | |
29 #include "ui/base/resource/resource_bundle.h" | |
30 #include "ui/base/l10n/l10n_util.h" | |
31 | 22 |
32 using content::BrowserThread; | 23 using content::BrowserThread; |
33 using content::NavigationEntry; | |
34 using content::OpenURLParams; | |
35 using content::Referrer; | |
36 using content::WebContents; | 24 using content::WebContents; |
37 | 25 |
38 // GeolocationConfirmInfoBarDelegate ------------------------------------------ | |
39 | |
40 namespace { | |
41 | |
42 class GeolocationConfirmInfoBarDelegate : public ConfirmInfoBarDelegate { | |
43 public: | |
44 GeolocationConfirmInfoBarDelegate( | |
45 InfoBarTabHelper* infobar_helper, | |
46 GeolocationInfoBarQueueController* controller, | |
47 int render_process_id, | |
48 int render_view_id, | |
49 int bridge_id, | |
50 const GURL& requesting_frame_url, | |
51 const std::string& display_languages); | |
52 | |
53 int render_process_id() const { return render_process_id_; } | |
54 int render_view_id() const { return render_view_id_; } | |
55 | |
56 private: | |
57 | |
58 // ConfirmInfoBarDelegate: | |
59 virtual gfx::Image* GetIcon() const OVERRIDE; | |
60 virtual Type GetInfoBarType() const OVERRIDE; | |
61 virtual string16 GetMessageText() const OVERRIDE; | |
62 virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE; | |
63 virtual bool Accept() OVERRIDE; | |
64 virtual bool Cancel() OVERRIDE; | |
65 virtual string16 GetLinkText() const OVERRIDE; | |
66 virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE; | |
67 | |
68 GeolocationInfoBarQueueController* controller_; | |
69 int render_process_id_; | |
70 int render_view_id_; | |
71 int bridge_id_; | |
72 | |
73 GURL requesting_frame_url_; | |
74 std::string display_languages_; | |
75 | |
76 DISALLOW_IMPLICIT_CONSTRUCTORS(GeolocationConfirmInfoBarDelegate); | |
77 }; | |
78 | |
79 GeolocationConfirmInfoBarDelegate::GeolocationConfirmInfoBarDelegate( | |
80 InfoBarTabHelper* infobar_helper, | |
81 GeolocationInfoBarQueueController* controller, | |
82 int render_process_id, | |
83 int render_view_id, | |
84 int bridge_id, | |
85 const GURL& requesting_frame_url, | |
86 const std::string& display_languages) | |
87 : ConfirmInfoBarDelegate(infobar_helper), | |
88 controller_(controller), | |
89 render_process_id_(render_process_id), | |
90 render_view_id_(render_view_id), | |
91 bridge_id_(bridge_id), | |
92 requesting_frame_url_(requesting_frame_url), | |
93 display_languages_(display_languages) { | |
94 const NavigationEntry* committed_entry = | |
95 infobar_helper->GetWebContents()->GetController().GetLastCommittedEntry(); | |
96 set_contents_unique_id(committed_entry ? committed_entry->GetUniqueID() : 0); | |
97 } | |
98 | |
99 gfx::Image* GeolocationConfirmInfoBarDelegate::GetIcon() const { | |
100 return &ResourceBundle::GetSharedInstance().GetNativeImageNamed( | |
101 IDR_GEOLOCATION_INFOBAR_ICON); | |
102 } | |
103 | |
104 InfoBarDelegate::Type | |
105 GeolocationConfirmInfoBarDelegate::GetInfoBarType() const { | |
106 return PAGE_ACTION_TYPE; | |
107 } | |
108 | |
109 string16 GeolocationConfirmInfoBarDelegate::GetMessageText() const { | |
110 return l10n_util::GetStringFUTF16(IDS_GEOLOCATION_INFOBAR_QUESTION, | |
111 net::FormatUrl(requesting_frame_url_.GetOrigin(), display_languages_)); | |
112 } | |
113 | |
114 string16 GeolocationConfirmInfoBarDelegate::GetButtonLabel( | |
115 InfoBarButton button) const { | |
116 return l10n_util::GetStringUTF16((button == BUTTON_OK) ? | |
117 IDS_GEOLOCATION_ALLOW_BUTTON : IDS_GEOLOCATION_DENY_BUTTON); | |
118 } | |
119 | |
120 bool GeolocationConfirmInfoBarDelegate::Accept() { | |
121 controller_->OnPermissionSet(render_process_id_, render_view_id_, bridge_id_, | |
122 requesting_frame_url_, owner()->GetWebContents()->GetURL(), true); | |
123 return true; | |
124 } | |
125 | |
126 bool GeolocationConfirmInfoBarDelegate::Cancel() { | |
127 controller_->OnPermissionSet(render_process_id_, render_view_id_, bridge_id_, | |
128 requesting_frame_url_, owner()->GetWebContents()->GetURL(), | |
129 false); | |
130 return true; | |
131 } | |
132 | |
133 string16 GeolocationConfirmInfoBarDelegate::GetLinkText() const { | |
134 return l10n_util::GetStringUTF16(IDS_LEARN_MORE); | |
135 } | |
136 | |
137 bool GeolocationConfirmInfoBarDelegate::LinkClicked( | |
138 WindowOpenDisposition disposition) { | |
139 const char kGeolocationLearnMoreUrl[] = | |
140 #if defined(OS_CHROMEOS) | |
141 "https://www.google.com/support/chromeos/bin/answer.py?answer=142065"; | |
142 #else | |
143 "https://www.google.com/support/chrome/bin/answer.py?answer=142065"; | |
144 #endif | |
145 | |
146 OpenURLParams params( | |
147 google_util::AppendGoogleLocaleParam(GURL(kGeolocationLearnMoreUrl)), | |
148 Referrer(), | |
149 (disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition, | |
150 content::PAGE_TRANSITION_LINK, false); | |
151 owner()->GetWebContents()->OpenURL(params); | |
152 return false; // Do not dismiss the info bar. | |
153 } | |
154 | |
155 } // namespace | |
156 | |
157 | |
158 // GeolocationInfoBarQueueController::PendingInfoBarRequest ------------------- | 26 // GeolocationInfoBarQueueController::PendingInfoBarRequest ------------------- |
159 | 27 |
160 struct GeolocationInfoBarQueueController::PendingInfoBarRequest { | 28 struct GeolocationInfoBarQueueController::PendingInfoBarRequest { |
161 public: | 29 public: |
162 PendingInfoBarRequest(int render_process_id, | 30 PendingInfoBarRequest(int render_process_id, |
163 int render_view_id, | 31 int render_view_id, |
164 int bridge_id, | 32 int bridge_id, |
165 const GURL& requesting_frame, | 33 const GURL& requesting_frame, |
166 const GURL& embedder, | 34 const GURL& embedder, |
167 base::Callback<void(bool)> callback); | 35 PermissionDecidedCallback callback); |
168 | 36 |
169 bool IsForTab(int p_render_process_id, int p_render_view_id) const; | 37 bool IsForTab(int p_render_process_id, int p_render_view_id) const; |
170 bool IsForPair(const GURL& p_requesting_frame, | 38 bool IsForPair(const GURL& p_requesting_frame, |
171 const GURL& p_embedder) const; | 39 const GURL& p_embedder) const; |
172 bool Equals(int p_render_process_id, | 40 bool Equals(int p_render_process_id, |
173 int p_render_view_id, | 41 int p_render_view_id, |
174 int p_bridge_id) const; | 42 int p_bridge_id) const; |
175 | 43 |
176 int render_process_id; | 44 int render_process_id; |
177 int render_view_id; | 45 int render_view_id; |
178 int bridge_id; | 46 int bridge_id; |
179 GURL requesting_frame; | 47 GURL requesting_frame; |
180 GURL embedder; | 48 GURL embedder; |
181 base::Callback<void(bool)> callback; | 49 PermissionDecidedCallback callback; |
182 GeolocationConfirmInfoBarDelegate* infobar_delegate; | 50 GeolocationConfirmInfoBarDelegate* infobar_delegate; |
183 }; | 51 }; |
184 | 52 |
185 GeolocationInfoBarQueueController::PendingInfoBarRequest::PendingInfoBarRequest( | 53 GeolocationInfoBarQueueController::PendingInfoBarRequest::PendingInfoBarRequest( |
186 int render_process_id, | 54 int render_process_id, |
187 int render_view_id, | 55 int render_view_id, |
188 int bridge_id, | 56 int bridge_id, |
189 const GURL& requesting_frame, | 57 const GURL& requesting_frame, |
190 const GURL& embedder, | 58 const GURL& embedder, |
191 base::Callback<void(bool)> callback) | 59 PermissionDecidedCallback callback) |
192 : render_process_id(render_process_id), | 60 : render_process_id(render_process_id), |
193 render_view_id(render_view_id), | 61 render_view_id(render_view_id), |
194 bridge_id(bridge_id), | 62 bridge_id(bridge_id), |
195 requesting_frame(requesting_frame), | 63 requesting_frame(requesting_frame), |
196 embedder(embedder), | 64 embedder(embedder), |
197 callback(callback), | 65 callback(callback), |
198 infobar_delegate(NULL) { | 66 infobar_delegate(NULL) { |
199 } | 67 } |
200 | 68 |
201 bool GeolocationInfoBarQueueController::PendingInfoBarRequest::IsForTab( | 69 bool GeolocationInfoBarQueueController::PendingInfoBarRequest::IsForTab( |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 } | 114 } |
247 | 115 |
248 bool GeolocationInfoBarQueueController::RequestEquals::operator()( | 116 bool GeolocationInfoBarQueueController::RequestEquals::operator()( |
249 const PendingInfoBarRequest& request) const { | 117 const PendingInfoBarRequest& request) const { |
250 return request.Equals(render_process_id_, render_view_id_, bridge_id_); | 118 return request.Equals(render_process_id_, render_view_id_, bridge_id_); |
251 } | 119 } |
252 | 120 |
253 // GeolocationInfoBarQueueController ------------------------------------------ | 121 // GeolocationInfoBarQueueController ------------------------------------------ |
254 | 122 |
255 GeolocationInfoBarQueueController::GeolocationInfoBarQueueController( | 123 GeolocationInfoBarQueueController::GeolocationInfoBarQueueController( |
256 NotifyPermissionSetCallback notify_permission_set_callback, | |
257 Profile* profile) | 124 Profile* profile) |
258 : notify_permission_set_callback_(notify_permission_set_callback), | 125 : profile_(profile) { |
259 profile_(profile) { | |
260 } | 126 } |
261 | 127 |
262 GeolocationInfoBarQueueController::~GeolocationInfoBarQueueController() { | 128 GeolocationInfoBarQueueController::~GeolocationInfoBarQueueController() { |
263 } | 129 } |
264 | 130 |
265 void GeolocationInfoBarQueueController::CreateInfoBarRequest( | 131 void GeolocationInfoBarQueueController::CreateInfoBarRequest( |
266 int render_process_id, | 132 int render_process_id, |
267 int render_view_id, | 133 int render_view_id, |
268 int bridge_id, | 134 int bridge_id, |
269 const GURL& requesting_frame, | 135 const GURL& requesting_frame, |
270 const GURL& embedder, | 136 const GURL& embedder, |
271 base::Callback<void(bool)> callback) { | 137 PermissionDecidedCallback callback) { |
272 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 138 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
273 | 139 |
274 // We shouldn't get duplicate requests. | 140 // We shouldn't get duplicate requests. |
275 DCHECK(std::find_if(pending_infobar_requests_.begin(), | 141 DCHECK(std::find_if(pending_infobar_requests_.begin(), |
276 pending_infobar_requests_.end(), | 142 pending_infobar_requests_.end(), |
277 RequestEquals(render_process_id, render_view_id, bridge_id)) == | 143 RequestEquals(render_process_id, render_view_id, bridge_id)) == |
278 pending_infobar_requests_.end()); | 144 pending_infobar_requests_.end()); |
279 | 145 |
280 InfoBarTabHelper* helper = GetInfoBarHelper(render_process_id, | 146 InfoBarTabHelper* helper = GetInfoBarHelper(render_process_id, |
281 render_view_id); | 147 render_view_id); |
(...skipping 30 matching lines...) Expand all Loading... |
312 render_view_id); | 178 render_view_id); |
313 helper->RemoveInfoBar(delegate); | 179 helper->RemoveInfoBar(delegate); |
314 } | 180 } |
315 | 181 |
316 void GeolocationInfoBarQueueController::OnPermissionSet( | 182 void GeolocationInfoBarQueueController::OnPermissionSet( |
317 int render_process_id, | 183 int render_process_id, |
318 int render_view_id, | 184 int render_view_id, |
319 int bridge_id, | 185 int bridge_id, |
320 const GURL& requesting_frame, | 186 const GURL& requesting_frame, |
321 const GURL& embedder, | 187 const GURL& embedder, |
| 188 bool update_content_setting, |
322 bool allowed) { | 189 bool allowed) { |
323 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 190 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
324 | 191 if (update_content_setting) { |
325 ContentSetting content_setting = | 192 ContentSetting content_setting = |
326 allowed ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; | 193 allowed ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; |
327 profile_->GetHostContentSettingsMap()->SetContentSetting( | 194 profile_->GetHostContentSettingsMap()->SetContentSetting( |
328 ContentSettingsPattern::FromURLNoWildcard(requesting_frame.GetOrigin()), | 195 ContentSettingsPattern::FromURLNoWildcard(requesting_frame.GetOrigin()), |
329 ContentSettingsPattern::FromURLNoWildcard(embedder.GetOrigin()), | 196 ContentSettingsPattern::FromURLNoWildcard(embedder.GetOrigin()), |
330 CONTENT_SETTINGS_TYPE_GEOLOCATION, | 197 CONTENT_SETTINGS_TYPE_GEOLOCATION, |
331 std::string(), | 198 std::string(), |
332 content_setting); | 199 content_setting); |
333 | 200 } |
334 // Cancel this request first, then notify listeners. TODO(pkasting): Why | 201 // Cancel this request first, then notify listeners. TODO(pkasting): Why |
335 // is this order important? | 202 // is this order important? |
336 PendingInfoBarRequests requests_to_notify; | 203 PendingInfoBarRequests requests_to_notify; |
337 PendingInfoBarRequests infobars_to_remove; | 204 PendingInfoBarRequests infobars_to_remove; |
338 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); | 205 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); |
339 i != pending_infobar_requests_.end(); ) { | 206 i != pending_infobar_requests_.end(); ) { |
340 if (i->IsForPair(requesting_frame, embedder)) { | 207 if (i->IsForPair(requesting_frame, embedder)) { |
341 requests_to_notify.push_back(*i); | 208 requests_to_notify.push_back(*i); |
342 if (i->Equals(render_process_id, render_view_id, bridge_id)) { | 209 if (i->Equals(render_process_id, render_view_id, bridge_id)) { |
343 // The delegate that called us is i, and it's currently in either | 210 // The delegate that called us is i, and it's currently in either |
(...skipping 19 matching lines...) Expand all Loading... |
363 for (PendingInfoBarRequests::iterator i = infobars_to_remove.begin(); | 230 for (PendingInfoBarRequests::iterator i = infobars_to_remove.begin(); |
364 i != infobars_to_remove.end(); ++i ) { | 231 i != infobars_to_remove.end(); ++i ) { |
365 InfoBarTabHelper* helper = GetInfoBarHelper(i->render_process_id, | 232 InfoBarTabHelper* helper = GetInfoBarHelper(i->render_process_id, |
366 i->render_view_id); | 233 i->render_view_id); |
367 helper->RemoveInfoBar(i->infobar_delegate); | 234 helper->RemoveInfoBar(i->infobar_delegate); |
368 } | 235 } |
369 | 236 |
370 // Send out the permission notifications. | 237 // Send out the permission notifications. |
371 for (PendingInfoBarRequests::iterator i = requests_to_notify.begin(); | 238 for (PendingInfoBarRequests::iterator i = requests_to_notify.begin(); |
372 i != requests_to_notify.end(); ++i ) { | 239 i != requests_to_notify.end(); ++i ) { |
373 notify_permission_set_callback_.Run( | 240 i->callback.Run(allowed); |
374 i->render_process_id, i->render_view_id, | |
375 i->bridge_id, i->requesting_frame, | |
376 i->callback, allowed); | |
377 } | 241 } |
378 } | 242 } |
379 | 243 |
380 void GeolocationInfoBarQueueController::Observe( | 244 void GeolocationInfoBarQueueController::Observe( |
381 int type, | 245 int type, |
382 const content::NotificationSource& source, | 246 const content::NotificationSource& source, |
383 const content::NotificationDetails& details) { | 247 const content::NotificationDetails& details) { |
384 DCHECK_EQ(chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, type); | 248 DCHECK_EQ(chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, type); |
385 // We will receive this notification for all infobar closures, so we need to | 249 // We will receive this notification for all infobar closures, so we need to |
386 // check whether this is the geolocation infobar we're tracking. Note that the | 250 // check whether this is the geolocation infobar we're tracking. Note that the |
(...skipping 14 matching lines...) Expand all Loading... |
401 content::Source<InfoBarTabHelper>(source).ptr(); | 265 content::Source<InfoBarTabHelper>(source).ptr(); |
402 int render_process_id = i->render_process_id; | 266 int render_process_id = i->render_process_id; |
403 int render_view_id = i->render_view_id; | 267 int render_view_id = i->render_view_id; |
404 pending_infobar_requests_.erase(i); | 268 pending_infobar_requests_.erase(i); |
405 ShowQueuedInfoBar(render_process_id, render_view_id, helper); | 269 ShowQueuedInfoBar(render_process_id, render_view_id, helper); |
406 return; | 270 return; |
407 } | 271 } |
408 } | 272 } |
409 } | 273 } |
410 | 274 |
| 275 GeolocationConfirmInfoBarDelegate* |
| 276 GeolocationInfoBarQueueController::CreateInfoBarDelegate( |
| 277 InfoBarTabHelper* infobar_helper, |
| 278 GeolocationInfoBarQueueController* controller, |
| 279 int render_process_id, |
| 280 int render_view_id, |
| 281 int bridge_id, |
| 282 const GURL& requesting_frame_url, |
| 283 const std::string& display_languages) { |
| 284 return new GeolocationConfirmInfoBarDelegate(infobar_helper, |
| 285 controller, |
| 286 render_process_id, |
| 287 render_view_id, |
| 288 bridge_id, |
| 289 requesting_frame_url, |
| 290 display_languages); |
| 291 } |
| 292 |
411 void GeolocationInfoBarQueueController::ShowQueuedInfoBar( | 293 void GeolocationInfoBarQueueController::ShowQueuedInfoBar( |
412 int render_process_id, | 294 int render_process_id, |
413 int render_view_id, | 295 int render_view_id, |
414 InfoBarTabHelper* helper) { | 296 InfoBarTabHelper* helper) { |
415 DCHECK(helper); | 297 DCHECK(helper); |
416 DCHECK(!AlreadyShowingInfoBar(render_process_id, render_view_id)); | 298 DCHECK(!AlreadyShowingInfoBar(render_process_id, render_view_id)); |
417 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); | 299 for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); |
418 i != pending_infobar_requests_.end(); ++i) { | 300 i != pending_infobar_requests_.end(); ++i) { |
419 if (i->IsForTab(render_process_id, render_view_id) && | 301 if (i->IsForTab(render_process_id, render_view_id) && |
420 !i->infobar_delegate) { | 302 !i->infobar_delegate) { |
421 RegisterForInfoBarNotifications(helper); | 303 RegisterForInfoBarNotifications(helper); |
422 i->infobar_delegate = new GeolocationConfirmInfoBarDelegate( | 304 i->infobar_delegate = CreateInfoBarDelegate( |
423 helper, this, render_process_id, | 305 helper, this, render_process_id, |
424 render_view_id, i->bridge_id, i->requesting_frame, | 306 render_view_id, i->bridge_id, i->requesting_frame, |
425 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); | 307 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); |
426 helper->AddInfoBar(i->infobar_delegate); | 308 helper->AddInfoBar(i->infobar_delegate); |
427 return; | 309 return; |
428 } | 310 } |
429 } | 311 } |
430 UnregisterForInfoBarNotifications(helper); | 312 UnregisterForInfoBarNotifications(helper); |
431 } | 313 } |
432 | 314 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
475 void GeolocationInfoBarQueueController::UnregisterForInfoBarNotifications( | 357 void GeolocationInfoBarQueueController::UnregisterForInfoBarNotifications( |
476 InfoBarTabHelper* helper) { | 358 InfoBarTabHelper* helper) { |
477 if (registrar_.IsRegistered( | 359 if (registrar_.IsRegistered( |
478 this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, | 360 this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, |
479 content::Source<InfoBarTabHelper>(helper))) { | 361 content::Source<InfoBarTabHelper>(helper))) { |
480 registrar_.Remove(this, | 362 registrar_.Remove(this, |
481 chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, | 363 chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, |
482 content::Source<InfoBarTabHelper>(helper)); | 364 content::Source<InfoBarTabHelper>(helper)); |
483 } | 365 } |
484 } | 366 } |
OLD | NEW |