Chromium Code Reviews| Index: chrome/browser/content_settings/permission_queue_controller.cc |
| diff --git a/chrome/browser/content_settings/permission_queue_controller.cc b/chrome/browser/content_settings/permission_queue_controller.cc |
| index 480f6a78cdd460252c6a04cc7b1bb79d7297c399..5ec64f78662b9093167d2f40472e7ea1d7849378 100644 |
| --- a/chrome/browser/content_settings/permission_queue_controller.cc |
| +++ b/chrome/browser/content_settings/permission_queue_controller.cc |
| @@ -50,8 +50,8 @@ class PermissionQueueController::PendingInfoBarRequest { |
| const PermissionRequestID& id() const { return id_; } |
| const GURL& requesting_frame() const { return requesting_frame_; } |
| - bool has_infobar() const { return !!infobar_; } |
| - InfoBar* infobar() { return infobar_; } |
| + bool has_infobar() const { return !!info_bar_; } |
|
ddorwin
2014/01/07 19:07:14
Why the change to a two-part name? See comment bel
Kibeom Kim (inactive)
2014/01/07 19:31:24
(previous comments: https://codereview.chromium.or
|
| + InfoBar* infobar() { return info_bar_; } |
| void RunCallback(bool allowed); |
| void CreateInfoBar(PermissionQueueController* controller, |
| @@ -63,7 +63,7 @@ class PermissionQueueController::PendingInfoBarRequest { |
| GURL requesting_frame_; |
| GURL embedder_; |
| PermissionDecidedCallback callback_; |
| - InfoBar* infobar_; |
| + InfoBar* info_bar_; |
| // Purposefully do not disable copying, as this is stored in STL containers. |
| }; |
| @@ -79,7 +79,7 @@ PermissionQueueController::PendingInfoBarRequest::PendingInfoBarRequest( |
| requesting_frame_(requesting_frame), |
| embedder_(embedder), |
| callback_(callback), |
| - infobar_(NULL) { |
| + info_bar_(NULL) { |
| } |
| PermissionQueueController::PendingInfoBarRequest::~PendingInfoBarRequest() { |
| @@ -104,18 +104,18 @@ void PermissionQueueController::PendingInfoBarRequest::CreateInfoBar( |
| // http://crbug.com/266743 |
| switch (type_) { |
| case CONTENT_SETTINGS_TYPE_GEOLOCATION: |
| - infobar_ = GeolocationInfoBarDelegate::Create( |
| + info_bar_ = GeolocationInfoBarDelegate::Create( |
| GetInfoBarService(id_), controller, id_, requesting_frame_, |
| display_languages); |
| break; |
| case CONTENT_SETTINGS_TYPE_MIDI_SYSEX: |
| - infobar_ = MIDIPermissionInfoBarDelegate::Create( |
| + info_bar_ = MIDIPermissionInfoBarDelegate::Create( |
| GetInfoBarService(id_), controller, id_, requesting_frame_, |
| display_languages); |
| break; |
| #if defined(OS_ANDROID) |
| case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER: |
| - infobar_ = ProtectedMediaIdentifierInfoBarDelegate::Create( |
| + info_bar_ = ProtectedMediaIdentifierInfoBarDelegate::Create( |
| GetInfoBarService(id_), controller, id_, requesting_frame_, |
| display_languages); |
| break; |
| @@ -137,8 +137,8 @@ PermissionQueueController::PermissionQueueController(Profile* profile, |
| PermissionQueueController::~PermissionQueueController() { |
| // Cancel all outstanding requests. |
| in_shutdown_ = true; |
| - while (!pending_infobar_requests_.empty()) |
| - CancelInfoBarRequest(pending_infobar_requests_.front().id()); |
| + while (!pending_info_bar_requests_.empty()) |
| + CancelInfoBarRequest(pending_info_bar_requests_.front().id()); |
| } |
| void PermissionQueueController::CreateInfoBarRequest( |
| @@ -150,11 +150,11 @@ void PermissionQueueController::CreateInfoBarRequest( |
| // We shouldn't get duplicate requests. |
| for (PendingInfoBarRequests::const_iterator i( |
| - pending_infobar_requests_.begin()); |
| - i != pending_infobar_requests_.end(); ++i) |
| + pending_info_bar_requests_.begin()); |
| + i != pending_info_bar_requests_.end(); ++i) |
| DCHECK(!i->id().Equals(id)); |
| - pending_infobar_requests_.push_back(PendingInfoBarRequest( |
| + pending_info_bar_requests_.push_back(PendingInfoBarRequest( |
| type_, id, requesting_frame, embedder, callback)); |
| if (!AlreadyShowingInfoBarForTab(id)) |
| ShowQueuedInfoBarForTab(id); |
| @@ -164,18 +164,47 @@ void PermissionQueueController::CancelInfoBarRequest( |
| const PermissionRequestID& id) { |
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| - for (PendingInfoBarRequests::iterator i(pending_infobar_requests_.begin()); |
| - i != pending_infobar_requests_.end(); ++i) { |
| + for (PendingInfoBarRequests::iterator i(pending_info_bar_requests_.begin()); |
| + i != pending_info_bar_requests_.end(); ++i) { |
| if (i->id().Equals(id)) { |
| if (i->has_infobar()) |
| GetInfoBarService(id)->RemoveInfoBar(i->infobar()); |
| else |
| - pending_infobar_requests_.erase(i); |
| + pending_info_bar_requests_.erase(i); |
| return; |
| } |
| } |
| } |
| +void PermissionQueueController::CancelInfoBarRequests(int group_id) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + |
| + // If we remove an info bar in the following loop, the next pending info bar |
|
ddorwin
2014/01/07 19:07:14
nit: "info bar" is inconsistent with description a
Kibeom Kim (inactive)
2014/01/07 19:31:24
Done.
|
| + // will be shown. Therefore, we erase all the pending info bars first and |
| + // remove an info bar later. |
| + PendingInfoBarRequests info_bar_requests_to_cancel; |
| + for (PendingInfoBarRequests::iterator i = pending_info_bar_requests_.begin(); |
| + i != pending_info_bar_requests_.end();) { |
| + if (i->id().group_id() == group_id) { |
| + if (i->has_infobar()) { |
| + // |i| will be erased from |pending_info_bar_requests_| |
| + // in |PermissionQueueController::Observe| when the info bar is removed. |
| + info_bar_requests_to_cancel.push_back(*i); |
| + ++i; |
| + } else { |
| + i = pending_info_bar_requests_.erase(i); |
| + } |
| + } else { |
| + ++i; |
| + } |
| + } |
| + |
| + for (PendingInfoBarRequests::iterator i = info_bar_requests_to_cancel.begin(); |
| + i != info_bar_requests_to_cancel.end(); |
| + ++i) |
|
markusheintz_
2014/01/07 12:22:45
nit: I know there exist several opinions on this,
Kibeom Kim (inactive)
2014/01/07 19:31:24
Done.
|
| + GetInfoBarService(i->id())->RemoveInfoBar(i->infobar()); |
| +} |
| + |
| void PermissionQueueController::OnPermissionSet( |
| const PermissionRequestID& id, |
| const GURL& requesting_frame, |
| @@ -190,9 +219,9 @@ void PermissionQueueController::OnPermissionSet( |
| // Cancel this request first, then notify listeners. TODO(pkasting): Why |
| // is this order important? |
| PendingInfoBarRequests requests_to_notify; |
| - PendingInfoBarRequests infobars_to_remove; |
| - for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); |
| - i != pending_infobar_requests_.end(); ) { |
| + PendingInfoBarRequests info_bars_to_remove; |
| + for (PendingInfoBarRequests::iterator i = pending_info_bar_requests_.begin(); |
| + i != pending_info_bar_requests_.end(); ) { |
| if (i->IsForPair(requesting_frame, embedder)) { |
| requests_to_notify.push_back(*i); |
| if (i->id().Equals(id)) { |
| @@ -204,11 +233,11 @@ void PermissionQueueController::OnPermissionSet( |
| } else if (i->has_infobar()) { |
| // This infobar is for the same frame/embedder pair, but in a different |
| // tab. We should remove it now that we've got an answer for it. |
| - infobars_to_remove.push_back(*i); |
| + info_bars_to_remove.push_back(*i); |
| ++i; |
| } else { |
| // We haven't created an infobar yet, just remove the pending request. |
| - i = pending_infobar_requests_.erase(i); |
| + i = pending_info_bar_requests_.erase(i); |
| } |
| } else { |
| ++i; |
| @@ -216,8 +245,8 @@ void PermissionQueueController::OnPermissionSet( |
| } |
| // Remove all infobars for the same |requesting_frame| and |embedder|. |
| - for (PendingInfoBarRequests::iterator i = infobars_to_remove.begin(); |
| - i != infobars_to_remove.end(); ++i) |
| + for (PendingInfoBarRequests::iterator i = info_bars_to_remove.begin(); |
| + i != info_bars_to_remove.end(); ++i) |
| GetInfoBarService(i->id())->RemoveInfoBar(i->infobar()); |
| // Send out the permission notifications. |
| @@ -240,12 +269,12 @@ void PermissionQueueController::Observe( |
| // pending_infobar_requests_ will not have received any new entries between |
| // the NotificationService's call to InfoBarContainer::Observe and this |
| // method. |
| - InfoBar* infobar = content::Details<InfoBar::RemovedDetails>(details)->first; |
| - for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); |
| - i != pending_infobar_requests_.end(); ++i) { |
| - if (i->infobar() == infobar) { |
| + InfoBar* info_bar = content::Details<InfoBar::RemovedDetails>(details)->first; |
| + for (PendingInfoBarRequests::iterator i = pending_info_bar_requests_.begin(); |
| + i != pending_info_bar_requests_.end(); ++i) { |
| + if (i->infobar() == info_bar) { |
| PermissionRequestID id(i->id()); |
| - pending_infobar_requests_.erase(i); |
| + pending_info_bar_requests_.erase(i); |
| ShowQueuedInfoBarForTab(id); |
| return; |
| } |
| @@ -255,8 +284,8 @@ void PermissionQueueController::Observe( |
| bool PermissionQueueController::AlreadyShowingInfoBarForTab( |
| const PermissionRequestID& id) const { |
| for (PendingInfoBarRequests::const_iterator i( |
| - pending_infobar_requests_.begin()); |
| - i != pending_infobar_requests_.end(); ++i) { |
| + pending_info_bar_requests_.begin()); |
| + i != pending_info_bar_requests_.end(); ++i) { |
| if (i->id().IsForSameTabAs(id) && i->has_infobar()) |
| return true; |
| } |
| @@ -276,32 +305,32 @@ void PermissionQueueController::ShowQueuedInfoBarForTab( |
| // |
| // Similarly, if we're being destroyed, we should also avoid showing further |
| // infobars. |
| - InfoBarService* infobar_service = GetInfoBarService(id); |
| - if (!infobar_service || in_shutdown_) { |
| + InfoBarService* info_bar_service = GetInfoBarService(id); |
| + if (!info_bar_service || in_shutdown_) { |
| ClearPendingInfoBarRequestsForTab(id); |
| return; |
| } |
| - for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); |
| - i != pending_infobar_requests_.end(); ++i) { |
| + for (PendingInfoBarRequests::iterator i = pending_info_bar_requests_.begin(); |
| + i != pending_info_bar_requests_.end(); ++i) { |
| if (i->id().IsForSameTabAs(id) && !i->has_infobar()) { |
| - RegisterForInfoBarNotifications(infobar_service); |
| + RegisterForInfoBarNotifications(info_bar_service); |
| i->CreateInfoBar( |
| this, profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); |
| return; |
| } |
| } |
| - UnregisterForInfoBarNotifications(infobar_service); |
| + UnregisterForInfoBarNotifications(info_bar_service); |
| } |
| void PermissionQueueController::ClearPendingInfoBarRequestsForTab( |
| const PermissionRequestID& id) { |
| - for (PendingInfoBarRequests::iterator i = pending_infobar_requests_.begin(); |
| - i != pending_infobar_requests_.end(); ) { |
| + for (PendingInfoBarRequests::iterator i = pending_info_bar_requests_.begin(); |
| + i != pending_info_bar_requests_.end(); ) { |
| if (i->id().IsForSameTabAs(id)) { |
| DCHECK(!i->has_infobar()); |
| - i = pending_infobar_requests_.erase(i); |
| + i = pending_info_bar_requests_.erase(i); |
| } else { |
| ++i; |
| } |
| @@ -309,24 +338,24 @@ void PermissionQueueController::ClearPendingInfoBarRequestsForTab( |
| } |
| void PermissionQueueController::RegisterForInfoBarNotifications( |
| - InfoBarService* infobar_service) { |
| + InfoBarService* info_bar_service) { |
| if (!registrar_.IsRegistered( |
| this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, |
| - content::Source<InfoBarService>(infobar_service))) { |
| + content::Source<InfoBarService>(info_bar_service))) { |
| registrar_.Add(this, |
| chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, |
| - content::Source<InfoBarService>(infobar_service)); |
| + content::Source<InfoBarService>(info_bar_service)); |
| } |
| } |
| void PermissionQueueController::UnregisterForInfoBarNotifications( |
| - InfoBarService* infobar_service) { |
| + InfoBarService* info_bar_service) { |
| if (registrar_.IsRegistered( |
| this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, |
| - content::Source<InfoBarService>(infobar_service))) { |
| + content::Source<InfoBarService>(info_bar_service))) { |
| registrar_.Remove(this, |
| chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, |
| - content::Source<InfoBarService>(infobar_service)); |
| + content::Source<InfoBarService>(info_bar_service)); |
| } |
| } |