OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/media/chrome_midi_permission_context.h" | 5 #include "chrome/browser/media/chrome_midi_permission_context.h" |
6 | 6 |
7 #include "base/prefs/pref_service.h" | 7 #include "base/prefs/pref_service.h" |
8 #include "chrome/browser/content_settings/host_content_settings_map.h" | 8 #include "chrome/browser/content_settings/host_content_settings_map.h" |
9 #include "chrome/browser/content_settings/permission_queue_controller.h" | 9 #include "chrome/browser/content_settings/permission_queue_controller.h" |
10 #include "chrome/browser/content_settings/permission_request_id.h" | 10 #include "chrome/browser/content_settings/permission_request_id.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 virtual void Cancelled() OVERRIDE; | 43 virtual void Cancelled() OVERRIDE; |
44 virtual void RequestFinished() OVERRIDE; | 44 virtual void RequestFinished() OVERRIDE; |
45 | 45 |
46 private: | 46 private: |
47 ChromeMidiPermissionContext* context_; | 47 ChromeMidiPermissionContext* context_; |
48 const PermissionRequestID id_; | 48 const PermissionRequestID id_; |
49 GURL requesting_frame_; | 49 GURL requesting_frame_; |
50 bool user_gesture_; | 50 bool user_gesture_; |
51 std::string display_languages_; | 51 std::string display_languages_; |
52 const content::BrowserContext::MidiSysExPermissionCallback& callback_; | 52 const content::BrowserContext::MidiSysExPermissionCallback& callback_; |
| 53 bool is_finished_; |
53 | 54 |
54 DISALLOW_COPY_AND_ASSIGN(MidiPermissionRequest); | 55 DISALLOW_COPY_AND_ASSIGN(MidiPermissionRequest); |
55 }; | 56 }; |
56 | 57 |
57 MidiPermissionRequest::MidiPermissionRequest( | 58 MidiPermissionRequest::MidiPermissionRequest( |
58 ChromeMidiPermissionContext* context, | 59 ChromeMidiPermissionContext* context, |
59 const PermissionRequestID& id, | 60 const PermissionRequestID& id, |
60 const GURL& requesting_frame, | 61 const GURL& requesting_frame, |
61 bool user_gesture, | 62 bool user_gesture, |
62 const std::string& display_languages, | 63 const std::string& display_languages, |
63 const content::BrowserContext::MidiSysExPermissionCallback& callback) | 64 const content::BrowserContext::MidiSysExPermissionCallback& callback) |
64 : context_(context), | 65 : context_(context), |
65 id_(id), | 66 id_(id), |
66 requesting_frame_(requesting_frame), | 67 requesting_frame_(requesting_frame), |
67 user_gesture_(user_gesture), | 68 user_gesture_(user_gesture), |
68 display_languages_(display_languages), | 69 display_languages_(display_languages), |
69 callback_(callback) {} | 70 callback_(callback), |
| 71 is_finished_(false) {} |
70 | 72 |
71 MidiPermissionRequest::~MidiPermissionRequest() {} | 73 MidiPermissionRequest::~MidiPermissionRequest() { |
| 74 DCHECK(is_finished_); |
| 75 } |
72 | 76 |
73 int MidiPermissionRequest::GetIconID() const { | 77 int MidiPermissionRequest::GetIconID() const { |
74 return IDR_ALLOWED_MIDI_SYSEX; | 78 return IDR_ALLOWED_MIDI_SYSEX; |
75 } | 79 } |
76 | 80 |
77 base::string16 MidiPermissionRequest::GetMessageText() const { | 81 base::string16 MidiPermissionRequest::GetMessageText() const { |
78 return l10n_util::GetStringFUTF16( | 82 return l10n_util::GetStringFUTF16( |
79 IDS_MIDI_SYSEX_INFOBAR_QUESTION, | 83 IDS_MIDI_SYSEX_INFOBAR_QUESTION, |
80 net::FormatUrl(requesting_frame_.GetOrigin(), display_languages_)); | 84 net::FormatUrl(requesting_frame_.GetOrigin(), display_languages_)); |
81 } | 85 } |
(...skipping 12 matching lines...) Expand all Loading... |
94 | 98 |
95 void MidiPermissionRequest::PermissionGranted() { | 99 void MidiPermissionRequest::PermissionGranted() { |
96 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, true); | 100 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, true); |
97 } | 101 } |
98 | 102 |
99 void MidiPermissionRequest::PermissionDenied() { | 103 void MidiPermissionRequest::PermissionDenied() { |
100 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, false); | 104 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, false); |
101 } | 105 } |
102 | 106 |
103 void MidiPermissionRequest::Cancelled() { | 107 void MidiPermissionRequest::Cancelled() { |
104 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, false); | |
105 } | 108 } |
106 | 109 |
107 void MidiPermissionRequest::RequestFinished() { | 110 void MidiPermissionRequest::RequestFinished() { |
108 delete this; | 111 is_finished_ = true; |
| 112 // Deletes 'this'. |
| 113 context_->RequestFinished(this); |
109 } | 114 } |
110 | 115 |
111 ChromeMidiPermissionContext::ChromeMidiPermissionContext(Profile* profile) | 116 ChromeMidiPermissionContext::ChromeMidiPermissionContext(Profile* profile) |
112 : profile_(profile), | 117 : profile_(profile), |
113 shutting_down_(false) { | 118 shutting_down_(false) { |
114 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 119 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
115 } | 120 } |
116 | 121 |
117 ChromeMidiPermissionContext::~ChromeMidiPermissionContext() { | 122 ChromeMidiPermissionContext::~ChromeMidiPermissionContext() { |
118 DCHECK(!permission_queue_controller_); | 123 DCHECK(!permission_queue_controller_); |
| 124 DCHECK(pending_requests_.empty()); |
119 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 125 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
120 } | 126 } |
121 | 127 |
122 void ChromeMidiPermissionContext::Shutdown() { | 128 void ChromeMidiPermissionContext::Shutdown() { |
123 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 129 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
124 permission_queue_controller_.reset(); | 130 permission_queue_controller_.reset(); |
125 shutting_down_ = true; | 131 shutting_down_ = true; |
126 } | 132 } |
127 | 133 |
128 void ChromeMidiPermissionContext::RequestMidiSysExPermission( | 134 void ChromeMidiPermissionContext::RequestMidiSysExPermission( |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 PermissionDecided(id, requesting_frame, embedder, callback, false); | 199 PermissionDecided(id, requesting_frame, embedder, callback, false); |
194 break; | 200 break; |
195 case CONTENT_SETTING_ALLOW: | 201 case CONTENT_SETTING_ALLOW: |
196 PermissionDecided(id, requesting_frame, embedder, callback, true); | 202 PermissionDecided(id, requesting_frame, embedder, callback, true); |
197 break; | 203 break; |
198 default: | 204 default: |
199 if (PermissionBubbleManager::Enabled()) { | 205 if (PermissionBubbleManager::Enabled()) { |
200 PermissionBubbleManager* bubble_manager = | 206 PermissionBubbleManager* bubble_manager = |
201 PermissionBubbleManager::FromWebContents(web_contents); | 207 PermissionBubbleManager::FromWebContents(web_contents); |
202 if (bubble_manager) { | 208 if (bubble_manager) { |
203 bubble_manager->AddRequest(new MidiPermissionRequest( | 209 scoped_ptr<MidiPermissionRequest> request_ptr( |
204 this, id, requesting_frame, user_gesture, | 210 new MidiPermissionRequest( |
205 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages), | 211 this, id, requesting_frame, user_gesture, |
206 callback)); | 212 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages), |
| 213 callback)); |
| 214 MidiPermissionRequest* request = request_ptr.get(); |
| 215 bool inserted = pending_requests_.add( |
| 216 id.ToString(), request_ptr.Pass()).second; |
| 217 DCHECK(inserted) << "Duplicate id " << id.ToString(); |
| 218 bubble_manager->AddRequest(request); |
207 } | 219 } |
208 return; | 220 return; |
209 } | 221 } |
210 | 222 |
211 // TODO(gbillock): Delete this and the infobar delegate when | 223 // TODO(gbillock): Delete this and the infobar delegate when |
212 // we're using only bubbles. crbug.com/337458 | 224 // we're using only bubbles. crbug.com/337458 |
213 GetQueueController()->CreateInfoBarRequest( | 225 GetQueueController()->CreateInfoBarRequest( |
214 id, requesting_frame, embedder, std::string(), base::Bind( | 226 id, requesting_frame, embedder, std::string(), base::Bind( |
215 &ChromeMidiPermissionContext::NotifyPermissionSet, | 227 &ChromeMidiPermissionContext::NotifyPermissionSet, |
216 base::Unretained(this), id, requesting_frame, callback)); | 228 base::Unretained(this), id, requesting_frame, callback)); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 | 261 |
250 PermissionQueueController* ChromeMidiPermissionContext::GetQueueController() { | 262 PermissionQueueController* ChromeMidiPermissionContext::GetQueueController() { |
251 if (!permission_queue_controller_) { | 263 if (!permission_queue_controller_) { |
252 permission_queue_controller_.reset( | 264 permission_queue_controller_.reset( |
253 new PermissionQueueController(profile_, | 265 new PermissionQueueController(profile_, |
254 CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); | 266 CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); |
255 } | 267 } |
256 return permission_queue_controller_.get(); | 268 return permission_queue_controller_.get(); |
257 } | 269 } |
258 | 270 |
| 271 void ChromeMidiPermissionContext::RequestFinished( |
| 272 MidiPermissionRequest* request) { |
| 273 base::ScopedPtrHashMap<std::string, MidiPermissionRequest>::iterator it; |
| 274 for (it = pending_requests_.begin(); it != pending_requests_.end(); it++) { |
| 275 if (it->second == request) { |
| 276 pending_requests_.take_and_erase(it); |
| 277 return; |
| 278 } |
| 279 } |
| 280 |
| 281 NOTREACHED() << "Missing request"; |
| 282 } |
| 283 |
259 void ChromeMidiPermissionContext::CancelPendingInfobarRequest( | 284 void ChromeMidiPermissionContext::CancelPendingInfobarRequest( |
260 const PermissionRequestID& id) { | 285 const PermissionRequestID& id) { |
261 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 286 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
262 if (shutting_down_) | 287 if (shutting_down_) |
263 return; | 288 return; |
264 // TODO(gbillock): Add support for cancellation to permission bubbles. | 289 |
| 290 if (PermissionBubbleManager::Enabled()) { |
| 291 MidiPermissionRequest* cancelling = pending_requests_.get(id.ToString()); |
| 292 content::WebContents* web_contents = tab_util::GetWebContentsByID( |
| 293 id.render_process_id(), id.render_view_id()); |
| 294 if (cancelling != NULL && web_contents != NULL && |
| 295 PermissionBubbleManager::FromWebContents(web_contents) != NULL) { |
| 296 PermissionBubbleManager::FromWebContents(web_contents)-> |
| 297 CancelRequest(cancelling); |
| 298 } |
| 299 return; |
| 300 } |
| 301 |
265 GetQueueController()->CancelInfoBarRequest(id); | 302 GetQueueController()->CancelInfoBarRequest(id); |
266 } | 303 } |
OLD | NEW |