Chromium Code Reviews| Index: chrome/browser/geolocation/chrome_geolocation_permission_context.cc |
| diff --git a/chrome/browser/geolocation/chrome_geolocation_permission_context.cc b/chrome/browser/geolocation/chrome_geolocation_permission_context.cc |
| index 1943ed53ec4e70b1856321589ad4841f5385d78b..258d0d0c5211828780e3b6e6a986777aa2fba7dd 100644 |
| --- a/chrome/browser/geolocation/chrome_geolocation_permission_context.cc |
| +++ b/chrome/browser/geolocation/chrome_geolocation_permission_context.cc |
| @@ -14,6 +14,7 @@ |
| #include "chrome/browser/content_settings/tab_specific_content_settings.h" |
| #include "chrome/browser/extensions/extension_service.h" |
| #include "chrome/browser/google/google_util.h" |
| +#include "chrome/browser/infobars/infobar.h" |
| #include "chrome/browser/infobars/infobar_tab_helper.h" |
| #include "chrome/browser/prefs/pref_service.h" |
| #include "chrome/browser/profiles/profile.h" |
| @@ -21,11 +22,13 @@ |
| #include "chrome/browser/tab_contents/tab_util.h" |
| #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| #include "chrome/common/extensions/extension.h" |
| +#include "chrome/common/chrome_notification_types.h" |
|
tfarina
2012/02/28 23:20:58
nit: sort, should be before extension.h
John Knottenbelt
2012/03/01 10:10:49
Done.
|
| #include "chrome/common/pref_names.h" |
| #include "content/browser/renderer_host/render_view_host.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/navigation_details.h" |
| #include "content/public/browser/navigation_entry.h" |
| +#include "content/public/browser/notification_details.h" |
| #include "content/public/browser/notification_registrar.h" |
| #include "content/public/browser/notification_source.h" |
| #include "content/public/browser/notification_types.h" |
| @@ -77,12 +80,6 @@ class GeolocationInfoBarQueueController : content::NotificationObserver { |
| int render_view_id, |
| int bridge_id); |
| - // Called by the InfoBarDelegate to notify it's closed. It'll display a new |
| - // InfoBar if there's any request pending for this tab. |
| - void OnInfoBarClosed(int render_process_id, |
| - int render_view_id, |
| - int bridge_id); |
| - |
| // Called by the InfoBarDelegate to notify permission has been set. |
| // It'll notify and dismiss any other pending InfoBar request for the same |
| // |requesting_frame| and embedder. |
| @@ -104,6 +101,12 @@ class GeolocationInfoBarQueueController : content::NotificationObserver { |
| typedef std::vector<PendingInfoBarRequest> PendingInfoBarRequests; |
| + // Called by Observe in response to NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED. |
| + // It'll display a new InfoBar if there's any request pending for this tab. |
| + void OnInfoBarClosed(int render_process_id, |
| + int render_view_id, |
| + int bridge_id); |
| + |
| // Shows the first pending infobar for this tab. |
| void ShowQueuedInfoBar(int render_process_id, int render_view_id); |
| @@ -134,8 +137,10 @@ class GeolocationConfirmInfoBarDelegate : public ConfirmInfoBarDelegate { |
| const GURL& requesting_frame_url, |
| const std::string& display_languages); |
| + int render_process_id() const { return render_process_id_; } |
| + int render_view_id() const { return render_view_id_; } |
| + |
| private: |
| - virtual ~GeolocationConfirmInfoBarDelegate(); |
| // ConfirmInfoBarDelegate: |
| virtual bool ShouldExpire( |
| @@ -184,11 +189,6 @@ GeolocationConfirmInfoBarDelegate::GeolocationConfirmInfoBarDelegate( |
| committed_entry->GetUniqueID() : 0; |
| } |
| -GeolocationConfirmInfoBarDelegate::~GeolocationConfirmInfoBarDelegate() { |
| - controller_->OnInfoBarClosed(render_process_id_, render_view_id_, |
| - bridge_id_); |
| -} |
| - |
| bool GeolocationConfirmInfoBarDelegate::ShouldExpire( |
| const content::LoadCommittedDetails& details) const { |
| if (details.did_replace_entry || !details.is_navigation_to_different_page()) |
| @@ -464,19 +464,13 @@ void GeolocationInfoBarQueueController::OnPermissionSet( |
| void GeolocationInfoBarQueueController::Observe( |
| int type, const content::NotificationSource& source, |
|
Peter Kasting
2012/02/28 19:34:59
Nit: While here, one arg per line
John Knottenbelt
2012/03/01 10:10:49
Done.
|
| const content::NotificationDetails& details) { |
| - registrar_.Remove(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
|
bulach
2012/02/28 17:20:34
as we chatted, I think we also need this one..
thi
Peter Kasting
2012/02/28 19:34:59
No, we don't want to keep this.
If the web conten
bulach
2012/02/29 11:29:29
thanks for the details, and sorry I wasn't clear.
Peter Kasting
2012/02/29 20:47:54
The pending requests should be cleared as well, be
bulach
2012/03/01 11:19:32
got it, thanks for the clarification.
|
| + registrar_.Remove(this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, |
|
Peter Kasting
2012/02/28 19:34:59
This code will be reached when any infobar is remo
|
| source); |
| - WebContents* web_contents = content::Source<WebContents>(source).ptr(); |
| - for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); |
| - i != pending_infobar_requests_.end();) { |
| - if (i->infobar_delegate == NULL && |
| - web_contents == tab_util::GetWebContentsByID(i->render_process_id, |
| - i->render_view_id)) { |
| - i = pending_infobar_requests_.erase(i); |
| - } else { |
| - ++i; |
| - } |
| - } |
| + InfoBarRemovedDetails* removed_details = |
| + content::Details<InfoBarRemovedDetails>(details).ptr(); |
| + GeolocationConfirmInfoBarDelegate* delegate = |
| + static_cast<GeolocationConfirmInfoBarDelegate*>(removed_details->first); |
| + ShowQueuedInfoBar(delegate->render_process_id(), delegate->render_view_id()); |
| } |
| void GeolocationInfoBarQueueController::ShowQueuedInfoBar(int render_process_id, |
| @@ -494,15 +488,18 @@ void GeolocationInfoBarQueueController::ShowQueuedInfoBar(int render_process_id, |
| continue; |
| } |
| + InfoBarTabHelper *helper = wrapper->infobar_tab_helper(); |
|
bulach
2012/02/28 17:20:34
nit: s/r *helper/r* helper/
John Knottenbelt
2012/03/01 10:10:49
Done.
|
| + |
| if (!i->infobar_delegate) { |
| if (!registrar_.IsRegistered( |
|
Peter Kasting
2012/02/28 19:34:59
If infobars are disabled, you'll add a listener fo
|
| - this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
| - content::Source<WebContents>(tab_contents))) { |
| - registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
| - content::Source<WebContents>(tab_contents)); |
|
bulach
2012/02/28 17:20:34
as above, we may need to keep this too..
|
| + this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, |
| + content::Source<InfoBarTabHelper>(helper))) { |
| + registrar_.Add( |
| + this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, |
| + content::Source<InfoBarTabHelper>(helper)); |
| } |
| i->infobar_delegate = new GeolocationConfirmInfoBarDelegate( |
| - wrapper->infobar_tab_helper(), this, render_process_id, |
| + helper, this, render_process_id, |
| render_view_id, i->bridge_id, i->requesting_frame, |
| profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); |
| wrapper->infobar_tab_helper()->AddInfoBar(i->infobar_delegate); |