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

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

Issue 20990005: Web MIDI: implement permission infobar (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review #2 and #10 Created 7 years, 4 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/media/chrome_midi_permission_context.h"
6
7 #include "base/prefs/pref_service.h"
8 #include "chrome/browser/content_settings/host_content_settings_map.h"
9 #include "chrome/browser/content_settings/permission_queue_controller.h"
10 #include "chrome/browser/content_settings/permission_request_id.h"
11 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
12 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/tab_contents/tab_util.h"
14 #include "content/public/browser/browser_thread.h"
15 #include "content/public/browser/web_contents.h"
16
17 ChromeMIDIPermissionContext::ChromeMIDIPermissionContext(Profile* profile)
18 : profile_(profile),
19 shutting_down_(false) {
20 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
21 }
22
23 ChromeMIDIPermissionContext::~ChromeMIDIPermissionContext() {
24 DCHECK(!permission_queue_controller_);
25 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
26 }
27
28 void ChromeMIDIPermissionContext::Shutdown() {
29 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
30 permission_queue_controller_.reset();
31 shutting_down_ = true;
32 }
33
34 void ChromeMIDIPermissionContext::RequestMIDISysExPermission(
35 int render_process_id,
36 int render_view_id,
37 const GURL& requesting_frame,
38 const content::BrowserContext::MIDISysExPermissionCallback& callback) {
39 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
40 DCHECK(!shutting_down_);
41
42 // TODO(toyoshim): Support Extension's manifest declared permission.
43 // http://crbug.com/266338 .
44
45 content::WebContents* web_contents =
46 tab_util::GetWebContentsByID(render_process_id, render_view_id);
47
48 // The page doesn't exist any more.
49 if (!web_contents)
50 return;
51
52 const PermissionRequestID id(render_process_id, render_view_id, 0);
53
54 GURL embedder = web_contents->GetURL();
55 if (!requesting_frame.is_valid() || !embedder.is_valid()) {
56 LOG(WARNING) << "Attempt to use MIDI sysex from an invalid URL: "
57 << requesting_frame << "," << embedder
58 << " (Web MIDI is not supported in popups)";
59 PermissionDecided(id, requesting_frame, embedder, callback, false);
60 return;
61 }
62
63 DecidePermission(id, requesting_frame, embedder, callback);
64 }
65
66 void ChromeMIDIPermissionContext::DecidePermission(
67 const PermissionRequestID& id,
68 const GURL& requesting_frame,
69 const GURL& embedder,
70 const content::BrowserContext::MIDISysExPermissionCallback& callback) {
71 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
72
73 ContentSetting content_setting =
74 profile_->GetHostContentSettingsMap()->GetContentSetting(
75 requesting_frame,
76 embedder,
77 CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
78 std::string());
79 switch (content_setting) {
80 case CONTENT_SETTING_BLOCK:
81 PermissionDecided(id, requesting_frame, embedder, callback, false);
82 break;
83 case CONTENT_SETTING_ALLOW:
84 PermissionDecided(id, requesting_frame, embedder, callback, true);
85 break;
86 default:
87 GetQueueController()->CreateInfoBarRequest(
88 id, requesting_frame, embedder, base::Bind(
89 &ChromeMIDIPermissionContext::NotifyPermissionSet,
90 base::Unretained(this), id, requesting_frame, callback));
91 }
92 }
93
94 void ChromeMIDIPermissionContext::PermissionDecided(
95 const PermissionRequestID& id,
96 const GURL& requesting_frame,
97 const GURL& embedder,
98 const content::BrowserContext::MIDISysExPermissionCallback& callback,
99 bool allowed) {
100 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
101 NotifyPermissionSet(id, requesting_frame, callback, allowed);
102 }
103
104 void ChromeMIDIPermissionContext::NotifyPermissionSet(
105 const PermissionRequestID& id,
106 const GURL& requesting_frame,
107 const content::BrowserContext::MIDISysExPermissionCallback& callback,
108 bool allowed) {
109 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
110
111 TabSpecificContentSettings* content_settings =
112 TabSpecificContentSettings::Get(id.render_process_id(),
113 id.render_view_id());
114 if (content_settings) {
115 if (allowed)
116 content_settings->OnMIDISysExAccessed(requesting_frame);
117 else
118 content_settings->OnMIDISysExAccessBlocked(requesting_frame);
119 }
120
121 callback.Run(allowed);
122 }
123
124 PermissionQueueController* ChromeMIDIPermissionContext::GetQueueController() {
125 if (!permission_queue_controller_) {
126 permission_queue_controller_.reset(
127 new PermissionQueueController(profile_,
128 CONTENT_SETTINGS_TYPE_MIDI_SYSEX));
129 }
130 return permission_queue_controller_.get();
131 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698