Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Side by Side Diff: chrome/browser/media/midi_permission_context.cc

Issue 335993002: Convert MIDI permission requests to use WebContents in preparation for switching the code to using … (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/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"
11 #include "chrome/browser/content_settings/tab_specific_content_settings.h" 11 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
12 #include "chrome/browser/profiles/profile.h" 12 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/tab_contents/tab_util.h" 13 #include "chrome/browser/tab_contents/tab_util.h"
14 #include "chrome/browser/ui/website_settings/permission_bubble_manager.h" 14 #include "chrome/browser/ui/website_settings/permission_bubble_manager.h"
15 #include "chrome/browser/ui/website_settings/permission_bubble_request.h" 15 #include "chrome/browser/ui/website_settings/permission_bubble_request.h"
16 #include "chrome/common/pref_names.h" 16 #include "chrome/common/pref_names.h"
17 #include "content/public/browser/browser_thread.h" 17 #include "content/public/browser/browser_thread.h"
18 #include "content/public/browser/render_process_host.h"
19 #include "content/public/browser/render_view_host.h"
18 #include "content/public/browser/web_contents.h" 20 #include "content/public/browser/web_contents.h"
19 #include "grit/generated_resources.h" 21 #include "grit/generated_resources.h"
20 #include "grit/theme_resources.h" 22 #include "grit/theme_resources.h"
21 #include "net/base/net_util.h" 23 #include "net/base/net_util.h"
22 #include "ui/base/l10n/l10n_util.h" 24 #include "ui/base/l10n/l10n_util.h"
23 25
24 class MidiPermissionRequest : public PermissionBubbleRequest { 26 class MidiPermissionRequest : public PermissionBubbleRequest {
25 public: 27 public:
26 MidiPermissionRequest( 28 MidiPermissionRequest(
27 ChromeMidiPermissionContext* context, 29 MidiPermissionContext* context,
28 const PermissionRequestID& id, 30 const PermissionRequestID& id,
29 const GURL& requesting_frame, 31 const GURL& requesting_frame,
30 bool user_gesture, 32 bool user_gesture,
31 const std::string& display_languages, 33 const std::string& display_languages,
32 const content::BrowserContext::MidiSysExPermissionCallback& callback); 34 const base::Callback<void(bool)>& callback);
33 virtual ~MidiPermissionRequest(); 35 virtual ~MidiPermissionRequest();
34 36
35 // PermissionBubbleDelegate: 37 // PermissionBubbleDelegate:
36 virtual int GetIconID() const OVERRIDE; 38 virtual int GetIconID() const OVERRIDE;
37 virtual base::string16 GetMessageText() const OVERRIDE; 39 virtual base::string16 GetMessageText() const OVERRIDE;
38 virtual base::string16 GetMessageTextFragment() const OVERRIDE; 40 virtual base::string16 GetMessageTextFragment() const OVERRIDE;
39 virtual bool HasUserGesture() const OVERRIDE; 41 virtual bool HasUserGesture() const OVERRIDE;
40 virtual GURL GetRequestingHostname() const OVERRIDE; 42 virtual GURL GetRequestingHostname() const OVERRIDE;
41 virtual void PermissionGranted() OVERRIDE; 43 virtual void PermissionGranted() OVERRIDE;
42 virtual void PermissionDenied() OVERRIDE; 44 virtual void PermissionDenied() OVERRIDE;
43 virtual void Cancelled() OVERRIDE; 45 virtual void Cancelled() OVERRIDE;
44 virtual void RequestFinished() OVERRIDE; 46 virtual void RequestFinished() OVERRIDE;
45 47
46 private: 48 private:
47 ChromeMidiPermissionContext* context_; 49 MidiPermissionContext* context_;
48 const PermissionRequestID id_; 50 const PermissionRequestID id_;
49 GURL requesting_frame_; 51 GURL requesting_frame_;
50 bool user_gesture_; 52 bool user_gesture_;
51 std::string display_languages_; 53 std::string display_languages_;
52 const content::BrowserContext::MidiSysExPermissionCallback& callback_; 54 const base::Callback<void(bool)>& callback_;
53 bool is_finished_; 55 bool is_finished_;
54 56
55 DISALLOW_COPY_AND_ASSIGN(MidiPermissionRequest); 57 DISALLOW_COPY_AND_ASSIGN(MidiPermissionRequest);
56 }; 58 };
57 59
58 MidiPermissionRequest::MidiPermissionRequest( 60 MidiPermissionRequest::MidiPermissionRequest(
59 ChromeMidiPermissionContext* context, 61 MidiPermissionContext* context,
60 const PermissionRequestID& id, 62 const PermissionRequestID& id,
61 const GURL& requesting_frame, 63 const GURL& requesting_frame,
62 bool user_gesture, 64 bool user_gesture,
63 const std::string& display_languages, 65 const std::string& display_languages,
64 const content::BrowserContext::MidiSysExPermissionCallback& callback) 66 const base::Callback<void(bool)>& callback)
65 : context_(context), 67 : context_(context),
66 id_(id), 68 id_(id),
67 requesting_frame_(requesting_frame), 69 requesting_frame_(requesting_frame),
68 user_gesture_(user_gesture), 70 user_gesture_(user_gesture),
69 display_languages_(display_languages), 71 display_languages_(display_languages),
70 callback_(callback), 72 callback_(callback),
71 is_finished_(false) {} 73 is_finished_(false) {}
72 74
73 MidiPermissionRequest::~MidiPermissionRequest() { 75 MidiPermissionRequest::~MidiPermissionRequest() {
74 DCHECK(is_finished_); 76 DCHECK(is_finished_);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 108
107 void MidiPermissionRequest::Cancelled() { 109 void MidiPermissionRequest::Cancelled() {
108 } 110 }
109 111
110 void MidiPermissionRequest::RequestFinished() { 112 void MidiPermissionRequest::RequestFinished() {
111 is_finished_ = true; 113 is_finished_ = true;
112 // Deletes 'this'. 114 // Deletes 'this'.
113 context_->RequestFinished(this); 115 context_->RequestFinished(this);
114 } 116 }
115 117
116 ChromeMidiPermissionContext::ChromeMidiPermissionContext(Profile* profile) 118 MidiPermissionContext::MidiPermissionContext(Profile* profile)
117 : profile_(profile), 119 : profile_(profile),
118 shutting_down_(false) { 120 shutting_down_(false),
121 weak_factory_(this) {
119 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 122 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
120 } 123 }
121 124
122 ChromeMidiPermissionContext::~ChromeMidiPermissionContext() { 125 MidiPermissionContext::~MidiPermissionContext() {
123 DCHECK(!permission_queue_controller_); 126 DCHECK(!permission_queue_controller_);
124 DCHECK(pending_requests_.empty()); 127 DCHECK(pending_requests_.empty());
125 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 128 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
126 } 129 }
127 130
128 void ChromeMidiPermissionContext::Shutdown() { 131 void MidiPermissionContext::Shutdown() {
129 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 132 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
130 permission_queue_controller_.reset(); 133 permission_queue_controller_.reset();
131 shutting_down_ = true; 134 shutting_down_ = true;
132 } 135 }
133 136
134 void ChromeMidiPermissionContext::RequestMidiSysExPermission( 137 void MidiPermissionContext::RequestMidiSysExPermission(
135 int render_process_id, 138 content::WebContents* web_contents,
136 int render_view_id,
137 int bridge_id, 139 int bridge_id,
138 const GURL& requesting_frame, 140 const GURL& requesting_frame,
139 bool user_gesture, 141 bool user_gesture,
140 const content::BrowserContext::MidiSysExPermissionCallback& callback) { 142 const base::Callback<void(bool)>& result_callback,
143 base::Closure* cancel_callback) {
141 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 144 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
142 DCHECK(!shutting_down_); 145 DCHECK(!shutting_down_);
143 146
144 // TODO(toyoshim): Support Extension's manifest declared permission. 147 // TODO(toyoshim): Support Extension's manifest declared permission.
145 // See http://crbug.com/266338. 148 // See http://crbug.com/266338.
146 149
147 content::WebContents* web_contents = 150 int render_process_id = web_contents->GetRenderProcessHost()->GetID();
148 tab_util::GetWebContentsByID(render_process_id, render_view_id); 151 int render_view_id = web_contents->GetRenderViewHost()->GetRoutingID();
149 152 if (cancel_callback) {
150 // The page doesn't exist any more. 153 *cancel_callback = base::Bind(
151 if (!web_contents) 154 &MidiPermissionContext::CancelMidiSysExPermissionRequest,
152 return; 155 weak_factory_.GetWeakPtr(), render_process_id, render_view_id,
156 bridge_id);
157 }
153 158
154 const PermissionRequestID id( 159 const PermissionRequestID id(
155 render_process_id, render_view_id, bridge_id, GURL()); 160 render_process_id, render_view_id, bridge_id, GURL());
156 161
157 GURL embedder = web_contents->GetURL(); 162 GURL embedder = web_contents->GetURL();
158 // |requesting_frame| can be empty and invalid when the frame is a local 163 // |requesting_frame| can be empty and invalid when the frame is a local
159 // file. Here local files should be granted to show an infobar. 164 // file. Here local files should be granted to show an infobar.
160 // Any user's action will not be stored to content settings data base. 165 // Any user's action will not be stored to content settings data base.
161 if ((!requesting_frame.is_valid() && !requesting_frame.is_empty()) || 166 if ((!requesting_frame.is_valid() && !requesting_frame.is_empty()) ||
162 !embedder.is_valid()) { 167 !embedder.is_valid()) {
163 LOG(WARNING) << "Attempt to use MIDI sysex from an invalid URL: " 168 LOG(WARNING) << "Attempt to use MIDI sysex from an invalid URL: "
164 << requesting_frame << "," << embedder 169 << requesting_frame << "," << embedder
165 << " (Web MIDI is not supported in popups)"; 170 << " (Web MIDI is not supported in popups)";
166 PermissionDecided(id, requesting_frame, embedder, callback, false); 171 PermissionDecided(id, requesting_frame, embedder, result_callback, false);
167 return; 172 return;
168 } 173 }
169 174
170 DecidePermission(web_contents, id, requesting_frame, embedder, user_gesture, 175 DecidePermission(web_contents, id, requesting_frame, embedder, user_gesture,
171 callback); 176 result_callback);
172 } 177 }
173 178
174 void ChromeMidiPermissionContext::CancelMidiSysExPermissionRequest( 179 void MidiPermissionContext::CancelMidiSysExPermissionRequest(
175 int render_process_id, 180 int render_process_id,
176 int render_view_id, 181 int render_view_id,
177 int bridge_id, 182 int bridge_id) {
178 const GURL& requesting_frame) {
179 CancelPendingInfobarRequest( 183 CancelPendingInfobarRequest(
180 PermissionRequestID( 184 PermissionRequestID(
181 render_process_id, render_view_id, bridge_id, GURL())); 185 render_process_id, render_view_id, bridge_id, GURL()));
182 } 186 }
183 187
184 void ChromeMidiPermissionContext::DecidePermission( 188 void MidiPermissionContext::DecidePermission(
185 content::WebContents* web_contents, 189 content::WebContents* web_contents,
186 const PermissionRequestID& id, 190 const PermissionRequestID& id,
187 const GURL& requesting_frame, 191 const GURL& requesting_frame,
188 const GURL& embedder, 192 const GURL& embedder,
189 bool user_gesture, 193 bool user_gesture,
190 const content::BrowserContext::MidiSysExPermissionCallback& callback) { 194 const base::Callback<void(bool)>& callback) {
191 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 195 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
192 196
193 ContentSetting content_setting = 197 ContentSetting content_setting =
194 profile_->GetHostContentSettingsMap()->GetContentSetting( 198 profile_->GetHostContentSettingsMap()->GetContentSetting(
195 requesting_frame, 199 requesting_frame,
196 embedder, 200 embedder,
197 CONTENT_SETTINGS_TYPE_MIDI_SYSEX, 201 CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
198 std::string()); 202 std::string());
199 switch (content_setting) { 203 switch (content_setting) {
200 case CONTENT_SETTING_BLOCK: 204 case CONTENT_SETTING_BLOCK:
(...skipping 18 matching lines...) Expand all
219 DCHECK(inserted) << "Duplicate id " << id.ToString(); 223 DCHECK(inserted) << "Duplicate id " << id.ToString();
220 bubble_manager->AddRequest(request); 224 bubble_manager->AddRequest(request);
221 } 225 }
222 return; 226 return;
223 } 227 }
224 228
225 // TODO(gbillock): Delete this and the infobar delegate when 229 // TODO(gbillock): Delete this and the infobar delegate when
226 // we're using only bubbles. crbug.com/337458 230 // we're using only bubbles. crbug.com/337458
227 GetQueueController()->CreateInfoBarRequest( 231 GetQueueController()->CreateInfoBarRequest(
228 id, requesting_frame, embedder, std::string(), base::Bind( 232 id, requesting_frame, embedder, std::string(), base::Bind(
229 &ChromeMidiPermissionContext::NotifyPermissionSet, 233 &MidiPermissionContext::NotifyPermissionSet,
230 base::Unretained(this), id, requesting_frame, callback)); 234 base::Unretained(this), id, requesting_frame, callback));
231 } 235 }
232 } 236 }
233 237
234 void ChromeMidiPermissionContext::PermissionDecided( 238 void MidiPermissionContext::PermissionDecided(
235 const PermissionRequestID& id, 239 const PermissionRequestID& id,
236 const GURL& requesting_frame, 240 const GURL& requesting_frame,
237 const GURL& embedder, 241 const GURL& embedder,
238 const content::BrowserContext::MidiSysExPermissionCallback& callback, 242 const base::Callback<void(bool)>& callback,
239 bool allowed) { 243 bool allowed) {
240 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 244 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
241 NotifyPermissionSet(id, requesting_frame, callback, allowed); 245 NotifyPermissionSet(id, requesting_frame, callback, allowed);
242 } 246 }
243 247
244 void ChromeMidiPermissionContext::NotifyPermissionSet( 248 void MidiPermissionContext::NotifyPermissionSet(
245 const PermissionRequestID& id, 249 const PermissionRequestID& id,
246 const GURL& requesting_frame, 250 const GURL& requesting_frame,
247 const content::BrowserContext::MidiSysExPermissionCallback& callback, 251 const base::Callback<void(bool)>& callback,
248 bool allowed) { 252 bool allowed) {
249 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 253 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
250 254
251 TabSpecificContentSettings* content_settings = 255 TabSpecificContentSettings* content_settings =
252 TabSpecificContentSettings::Get(id.render_process_id(), 256 TabSpecificContentSettings::Get(id.render_process_id(),
253 id.render_view_id()); 257 id.render_view_id());
254 if (content_settings) { 258 if (content_settings) {
255 if (allowed) 259 if (allowed)
256 content_settings->OnMidiSysExAccessed(requesting_frame); 260 content_settings->OnMidiSysExAccessed(requesting_frame);
257 else 261 else
258 content_settings->OnMidiSysExAccessBlocked(requesting_frame); 262 content_settings->OnMidiSysExAccessBlocked(requesting_frame);
259 } 263 }
260 264
261 callback.Run(allowed); 265 callback.Run(allowed);
262 } 266 }
263 267
264 PermissionQueueController* ChromeMidiPermissionContext::GetQueueController() { 268 PermissionQueueController* MidiPermissionContext::GetQueueController() {
265 if (!permission_queue_controller_) { 269 if (!permission_queue_controller_) {
266 permission_queue_controller_.reset( 270 permission_queue_controller_.reset(
267 new PermissionQueueController(profile_, 271 new PermissionQueueController(profile_,
268 CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); 272 CONTENT_SETTINGS_TYPE_MIDI_SYSEX));
269 } 273 }
270 return permission_queue_controller_.get(); 274 return permission_queue_controller_.get();
271 } 275 }
272 276
273 void ChromeMidiPermissionContext::RequestFinished( 277 void MidiPermissionContext::RequestFinished(
274 MidiPermissionRequest* request) { 278 MidiPermissionRequest* request) {
275 base::ScopedPtrHashMap<std::string, MidiPermissionRequest>::iterator it; 279 base::ScopedPtrHashMap<std::string, MidiPermissionRequest>::iterator it;
276 for (it = pending_requests_.begin(); it != pending_requests_.end(); it++) { 280 for (it = pending_requests_.begin(); it != pending_requests_.end(); it++) {
277 if (it->second == request) { 281 if (it->second == request) {
278 pending_requests_.take_and_erase(it); 282 pending_requests_.take_and_erase(it);
279 return; 283 return;
280 } 284 }
281 } 285 }
282 286
283 NOTREACHED() << "Missing request"; 287 NOTREACHED() << "Missing request";
284 } 288 }
285 289
286 void ChromeMidiPermissionContext::CancelPendingInfobarRequest( 290 void MidiPermissionContext::CancelPendingInfobarRequest(
287 const PermissionRequestID& id) { 291 const PermissionRequestID& id) {
288 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 292 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
289 if (shutting_down_) 293 if (shutting_down_)
290 return; 294 return;
291 295
292 if (PermissionBubbleManager::Enabled()) { 296 if (PermissionBubbleManager::Enabled()) {
293 MidiPermissionRequest* cancelling = pending_requests_.get(id.ToString()); 297 MidiPermissionRequest* cancelling = pending_requests_.get(id.ToString());
294 content::WebContents* web_contents = tab_util::GetWebContentsByID( 298 content::WebContents* web_contents = tab_util::GetWebContentsByID(
295 id.render_process_id(), id.render_view_id()); 299 id.render_process_id(), id.render_view_id());
296 if (cancelling != NULL && web_contents != NULL && 300 if (cancelling != NULL && web_contents != NULL &&
297 PermissionBubbleManager::FromWebContents(web_contents) != NULL) { 301 PermissionBubbleManager::FromWebContents(web_contents) != NULL) {
298 PermissionBubbleManager::FromWebContents(web_contents)-> 302 PermissionBubbleManager::FromWebContents(web_contents)->
299 CancelRequest(cancelling); 303 CancelRequest(cancelling);
300 } 304 }
301 return; 305 return;
302 } 306 }
303 307
304 GetQueueController()->CancelInfoBarRequest(id); 308 GetQueueController()->CancelInfoBarRequest(id);
305 } 309 }
OLDNEW
« no previous file with comments | « chrome/browser/media/midi_permission_context.h ('k') | chrome/browser/media/midi_permission_context_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698