Chromium Code Reviews| Index: chrome/browser/media/chrome_midi_permission_context.cc |
| diff --git a/chrome/browser/media/chrome_midi_permission_context.cc b/chrome/browser/media/chrome_midi_permission_context.cc |
| index 223609ad9425d865a03c714459a49fe40b143e86..b0b7beb6b3f5d3cfc55dd9eabcb5f323bd6a4109 100644 |
| --- a/chrome/browser/media/chrome_midi_permission_context.cc |
| +++ b/chrome/browser/media/chrome_midi_permission_context.cc |
| @@ -50,6 +50,7 @@ class MidiPermissionRequest : public PermissionBubbleRequest { |
| bool user_gesture_; |
| std::string display_languages_; |
| const content::BrowserContext::MidiSysExPermissionCallback& callback_; |
| + bool is_finished_; |
| DISALLOW_COPY_AND_ASSIGN(MidiPermissionRequest); |
| }; |
| @@ -66,9 +67,12 @@ MidiPermissionRequest::MidiPermissionRequest( |
| requesting_frame_(requesting_frame), |
| user_gesture_(user_gesture), |
| display_languages_(display_languages), |
| - callback_(callback) {} |
| + callback_(callback), |
| + is_finished_(false) {} |
| -MidiPermissionRequest::~MidiPermissionRequest() {} |
| +MidiPermissionRequest::~MidiPermissionRequest() { |
| + DCHECK(is_finished_); |
| +} |
| int MidiPermissionRequest::GetIconID() const { |
| return IDR_ALLOWED_MIDI_SYSEX; |
| @@ -101,11 +105,12 @@ void MidiPermissionRequest::PermissionDenied() { |
| } |
| void MidiPermissionRequest::Cancelled() { |
|
Ami GONE FROM CHROMIUM
2014/05/21 20:15:13
// This is called if the info-bar is dismissed. P
Greg Billock
2014/05/21 22:46:42
Yeah, me too. That's why I put in initially that c
Ami GONE FROM CHROMIUM
2014/05/21 23:47:34
Shouldn't you find out before reverting the behavi
Greg Billock
2014/05/22 01:50:00
This (the change in behavior) is flagged off curre
|
| - context_->NotifyPermissionSet(id_, requesting_frame_, callback_, false); |
| } |
| void MidiPermissionRequest::RequestFinished() { |
| - delete this; |
| + is_finished_ = true; |
| + // Deletes 'this'. |
| + context_->RequestFinished(this); |
| } |
| ChromeMidiPermissionContext::ChromeMidiPermissionContext(Profile* profile) |
| @@ -200,10 +205,14 @@ void ChromeMidiPermissionContext::DecidePermission( |
| PermissionBubbleManager* bubble_manager = |
| PermissionBubbleManager::FromWebContents(web_contents); |
| if (bubble_manager) { |
| - bubble_manager->AddRequest(new MidiPermissionRequest( |
| + MidiPermissionRequest* request = new MidiPermissionRequest( |
| this, id, requesting_frame, user_gesture, |
| profile_->GetPrefs()->GetString(prefs::kAcceptLanguages), |
| - callback)); |
| + callback); |
| + bool inserted = pending_requests_.insert( |
| + make_pair(id.ToString(), request)).second; |
| + DCHECK(inserted) << "Duplicate id " << id.ToString(); |
| + bubble_manager->AddRequest(request); |
| } |
| return; |
| } |
| @@ -256,11 +265,41 @@ PermissionQueueController* ChromeMidiPermissionContext::GetQueueController() { |
| return permission_queue_controller_.get(); |
| } |
| +void ChromeMidiPermissionContext::RequestFinished( |
| + MidiPermissionRequest* request) { |
| + std::map<std::string, MidiPermissionRequest*>::iterator it; |
| + for (it = pending_requests_.begin(); it != pending_requests_.end(); it++) { |
| + if (it->second == request) { |
| + delete it->second; |
| + pending_requests_.erase(it); |
| + return; |
| + } |
| + } |
| + |
| + NOTREACHED() << "Missing request"; |
| +} |
| + |
| void ChromeMidiPermissionContext::CancelPendingInfobarRequest( |
| const PermissionRequestID& id) { |
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| if (shutting_down_) |
| return; |
| - // TODO(gbillock): Add support for cancellation to permission bubbles. |
| + |
| + if (PermissionBubbleManager::Enabled()) { |
| + std::map<std::string, MidiPermissionRequest*>::iterator it = |
| + pending_requests_.find(id.ToString()); |
| + MidiPermissionRequest* cancelling = |
| + (it != pending_requests_.end()) ? it->second : NULL; |
| + |
| + content::WebContents* web_contents = tab_util::GetWebContentsByID( |
| + id.render_process_id(), id.render_view_id()); |
| + if (cancelling != NULL && web_contents != NULL && |
| + PermissionBubbleManager::FromWebContents(web_contents) != NULL) { |
| + PermissionBubbleManager::FromWebContents(web_contents)-> |
| + CancelRequest(cancelling); |
| + } |
| + return; |
| + } |
| + |
| GetQueueController()->CancelInfoBarRequest(id); |
| } |