| 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..927c82a9e1aa08ecede15ba85be3d995fe27e5d6 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() {
|
| - context_->NotifyPermissionSet(id_, requesting_frame_, callback_, false);
|
| }
|
|
|
| void MidiPermissionRequest::RequestFinished() {
|
| - delete this;
|
| + is_finished_ = true;
|
| + // Deletes 'this'.
|
| + context_->RequestFinished(this);
|
| }
|
|
|
| ChromeMidiPermissionContext::ChromeMidiPermissionContext(Profile* profile)
|
| @@ -116,6 +121,7 @@ ChromeMidiPermissionContext::ChromeMidiPermissionContext(Profile* profile)
|
|
|
| ChromeMidiPermissionContext::~ChromeMidiPermissionContext() {
|
| DCHECK(!permission_queue_controller_);
|
| + DCHECK(pending_requests_.empty());
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| }
|
|
|
| @@ -200,10 +206,16 @@ void ChromeMidiPermissionContext::DecidePermission(
|
| PermissionBubbleManager* bubble_manager =
|
| PermissionBubbleManager::FromWebContents(web_contents);
|
| if (bubble_manager) {
|
| - bubble_manager->AddRequest(new MidiPermissionRequest(
|
| - this, id, requesting_frame, user_gesture,
|
| - profile_->GetPrefs()->GetString(prefs::kAcceptLanguages),
|
| - callback));
|
| + scoped_ptr<MidiPermissionRequest> request_ptr(
|
| + new MidiPermissionRequest(
|
| + this, id, requesting_frame, user_gesture,
|
| + profile_->GetPrefs()->GetString(prefs::kAcceptLanguages),
|
| + callback));
|
| + MidiPermissionRequest* request = request_ptr.get();
|
| + bool inserted = pending_requests_.add(
|
| + id.ToString(), request_ptr.Pass()).second;
|
| + DCHECK(inserted) << "Duplicate id " << id.ToString();
|
| + bubble_manager->AddRequest(request);
|
| }
|
| return;
|
| }
|
| @@ -256,11 +268,36 @@ PermissionQueueController* ChromeMidiPermissionContext::GetQueueController() {
|
| return permission_queue_controller_.get();
|
| }
|
|
|
| +void ChromeMidiPermissionContext::RequestFinished(
|
| + MidiPermissionRequest* request) {
|
| + base::ScopedPtrHashMap<std::string, MidiPermissionRequest>::iterator it;
|
| + for (it = pending_requests_.begin(); it != pending_requests_.end(); it++) {
|
| + if (it->second == request) {
|
| + pending_requests_.take_and_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()) {
|
| + MidiPermissionRequest* cancelling = pending_requests_.get(id.ToString());
|
| + 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);
|
| }
|
|
|