Index: chrome/browser/permissions/permission_queue_controller.cc |
diff --git a/chrome/browser/permissions/permission_queue_controller.cc b/chrome/browser/permissions/permission_queue_controller.cc |
index 0cc6d40dc1ef55f0ad47dde586b40e8537365cd1..6c74d980eb3de3e035f79338223d9e9f8ed222fd 100644 |
--- a/chrome/browser/permissions/permission_queue_controller.cc |
+++ b/chrome/browser/permissions/permission_queue_controller.cc |
@@ -11,6 +11,7 @@ |
#include "chrome/browser/media/midi_permission_infobar_delegate.h" |
#include "chrome/browser/notifications/notification_permission_infobar_delegate.h" |
#include "chrome/browser/permissions/permission_context_uma_util.h" |
+#include "chrome/browser/permissions/permission_request_id.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/storage/durable_storage_permission_infobar_delegate.h" |
#include "chrome/browser/tab_contents/tab_util.h" |
@@ -113,35 +114,45 @@ void PermissionQueueController::PendingInfobarRequest::RunCallback( |
void PermissionQueueController::PendingInfobarRequest::CreateInfoBar( |
PermissionQueueController* controller, |
const std::string& display_languages) { |
+ // Controller can be Unretained because the lifetime of the infobar |
+ // is tied to that of the queue controller. Before QueueController |
+ // is destroyed, all requests will be cancelled and so all delegates |
+ // will be destroyed. |
+ PermissionInfobarDelegate::PermissionSetCallback callback = |
+ base::Bind(&PermissionQueueController::OnPermissionSet, |
+ base::Unretained(controller), |
+ id_, |
+ requesting_frame_, |
+ embedder_); |
switch (type_) { |
case CONTENT_SETTINGS_TYPE_GEOLOCATION: |
infobar_ = GeolocationInfoBarDelegate::Create( |
- GetInfoBarService(id_), controller, id_, requesting_frame_, |
- display_languages); |
+ GetInfoBarService(id_), requesting_frame_, |
+ display_languages, callback); |
break; |
#if defined(ENABLE_NOTIFICATIONS) |
case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: |
infobar_ = NotificationPermissionInfobarDelegate::Create( |
- GetInfoBarService(id_), controller, id_, requesting_frame_, |
- display_languages); |
+ GetInfoBarService(id_), requesting_frame_, |
+ display_languages, callback); |
break; |
#endif // ENABLE_NOTIFICATIONS |
case CONTENT_SETTINGS_TYPE_MIDI_SYSEX: |
infobar_ = MidiPermissionInfoBarDelegate::Create( |
- GetInfoBarService(id_), controller, id_, requesting_frame_, |
- display_languages, type_); |
+ GetInfoBarService(id_), requesting_frame_, |
+ display_languages, type_, callback); |
break; |
#if defined(OS_ANDROID) || defined(OS_CHROMEOS) |
case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER: |
infobar_ = ProtectedMediaIdentifierInfoBarDelegate::Create( |
- GetInfoBarService(id_), controller, id_, requesting_frame_, |
- display_languages); |
+ GetInfoBarService(id_), requesting_frame_, |
+ display_languages, callback); |
break; |
#endif |
case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE: |
infobar_ = DurableStoragePermissionInfoBarDelegate::Create( |
- GetInfoBarService(id_), controller, id_, requesting_frame_, |
- display_languages, type_); |
+ GetInfoBarService(id_), requesting_frame_, |
+ display_languages, type_, callback); |
break; |
default: |
NOTREACHED(); |