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

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

Issue 156173002: [MIDI] Add a permission bubble client for MIDI system control. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 6 years, 10 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/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"
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"
15 #include "chrome/browser/ui/website_settings/permission_bubble_request.h"
16 #include "chrome/common/pref_names.h"
14 #include "content/public/browser/browser_thread.h" 17 #include "content/public/browser/browser_thread.h"
15 #include "content/public/browser/web_contents.h" 18 #include "content/public/browser/web_contents.h"
19 #include "grit/generated_resources.h"
20 #include "net/base/net_util.h"
21 #include "ui/base/l10n/l10n_util.h"
22
23 class MidiPermissionRequest : public PermissionBubbleRequest {
24 public:
25 MidiPermissionRequest(
26 ChromeMidiPermissionContext* context,
27 const PermissionRequestID& id,
28 const GURL& requesting_frame,
29 const std::string& display_languages,
30 const content::BrowserContext::MidiSysExPermissionCallback& callback);
31 virtual ~MidiPermissionRequest();
32
33 // PermissionBubbleDelegate:
34 virtual base::string16 GetMessageText() const OVERRIDE;
35 virtual base::string16 GetMessageTextFragment() const OVERRIDE;
36 virtual base::string16 GetAlternateAcceptButtonText() const OVERRIDE;
37 virtual base::string16 GetAlternateDenyButtonText() const OVERRIDE;
38 virtual void PermissionGranted() OVERRIDE;
39 virtual void PermissionDenied() OVERRIDE;
40 virtual void Cancelled() OVERRIDE;
41 virtual void RequestFinished() OVERRIDE;
42
43 private:
44 ChromeMidiPermissionContext* context_;
Ami GONE FROM CHROMIUM 2014/02/06 19:51:17 This is a raw pointer; what guarantees it remains
Greg Billock 2014/02/07 18:20:55 The permission context is a profile keyed service,
45 const PermissionRequestID id_;
46 GURL requesting_frame_;
47 int contents_unique_id_;
Ami GONE FROM CHROMIUM 2014/02/06 19:51:17 unused (why didn't your compiler tell you this?)
Greg Billock 2014/02/07 18:20:55 not sure. Removing.
48 std::string display_languages_;
49 const content::BrowserContext::MidiSysExPermissionCallback& callback_;
50
51 DISALLOW_COPY_AND_ASSIGN(MidiPermissionRequest);
52 };
53
54 MidiPermissionRequest::MidiPermissionRequest(
55 ChromeMidiPermissionContext* context,
56 const PermissionRequestID& id,
57 const GURL& requesting_frame,
58 const std::string& display_languages,
59 const content::BrowserContext::MidiSysExPermissionCallback& callback)
60 : context_(context),
61 id_(id),
62 requesting_frame_(requesting_frame),
63 display_languages_(display_languages),
64 callback_(callback) {}
65
66 MidiPermissionRequest::~MidiPermissionRequest() {}
67
68 base::string16 MidiPermissionRequest::GetMessageText() const {
69 return l10n_util::GetStringFUTF16(
70 IDS_MIDI_SYSEX_INFOBAR_QUESTION,
71 net::FormatUrl(requesting_frame_.GetOrigin(), display_languages_));
72 }
73
74 base::string16 MidiPermissionRequest::GetMessageTextFragment() const {
75 return l10n_util::GetStringUTF16(IDS_MIDI_SYSEX_PERMISSION_FRAGMENT);
76 }
77
78 base::string16 MidiPermissionRequest::GetAlternateAcceptButtonText() const {
79 return l10n_util::GetStringUTF16(IDS_MIDI_SYSEX_ALLOW_BUTTON);
80 }
81
82 base::string16 MidiPermissionRequest::GetAlternateDenyButtonText() const {
83 return l10n_util::GetStringUTF16(IDS_MIDI_SYSEX_DENY_BUTTON);
Ami GONE FROM CHROMIUM 2014/02/06 19:51:17 This seems pretty stock. I wonder if PermissionBu
Greg Billock 2014/02/07 18:20:55 That's an option. The interface is pure right now,
Ami GONE FROM CHROMIUM 2014/02/07 18:25:34 Yeah, nice for job security for the guy who re-imp
Greg Billock 2014/02/10 23:57:10 :-) We have eight of them. I guess that's perhaps
84 }
85
86 void MidiPermissionRequest::PermissionGranted() {
87 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, true);
88 }
89
90 void MidiPermissionRequest::PermissionDenied() {
91 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, false);
92 }
93
94 void MidiPermissionRequest::Cancelled() {
95 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, false);
96 }
97
98 void MidiPermissionRequest::RequestFinished() {
99 delete this;
100 }
16 101
17 ChromeMidiPermissionContext::ChromeMidiPermissionContext(Profile* profile) 102 ChromeMidiPermissionContext::ChromeMidiPermissionContext(Profile* profile)
18 : profile_(profile), 103 : profile_(profile),
19 shutting_down_(false) { 104 shutting_down_(false) {
20 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 105 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
21 } 106 }
22 107
23 ChromeMidiPermissionContext::~ChromeMidiPermissionContext() { 108 ChromeMidiPermissionContext::~ChromeMidiPermissionContext() {
24 DCHECK(!permission_queue_controller_); 109 DCHECK(!permission_queue_controller_);
25 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 110 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 // Any user's action will not be stored to content settings data base. 143 // Any user's action will not be stored to content settings data base.
59 if ((!requesting_frame.is_valid() && !requesting_frame.is_empty()) || 144 if ((!requesting_frame.is_valid() && !requesting_frame.is_empty()) ||
60 !embedder.is_valid()) { 145 !embedder.is_valid()) {
61 LOG(WARNING) << "Attempt to use MIDI sysex from an invalid URL: " 146 LOG(WARNING) << "Attempt to use MIDI sysex from an invalid URL: "
62 << requesting_frame << "," << embedder 147 << requesting_frame << "," << embedder
63 << " (Web MIDI is not supported in popups)"; 148 << " (Web MIDI is not supported in popups)";
64 PermissionDecided(id, requesting_frame, embedder, callback, false); 149 PermissionDecided(id, requesting_frame, embedder, callback, false);
65 return; 150 return;
66 } 151 }
67 152
68 DecidePermission(id, requesting_frame, embedder, callback); 153 DecidePermission(web_contents, id, requesting_frame, embedder, callback);
69 } 154 }
70 155
71 void ChromeMidiPermissionContext::CancelMidiSysExPermissionRequest( 156 void ChromeMidiPermissionContext::CancelMidiSysExPermissionRequest(
72 int render_process_id, 157 int render_process_id,
73 int render_view_id, 158 int render_view_id,
74 int bridge_id, 159 int bridge_id,
75 const GURL& requesting_frame) { 160 const GURL& requesting_frame) {
76 CancelPendingInfobarRequest( 161 CancelPendingInfobarRequest(
77 PermissionRequestID(render_process_id, render_view_id, bridge_id, 0)); 162 PermissionRequestID(render_process_id, render_view_id, bridge_id, 0));
78 } 163 }
79 164
80 void ChromeMidiPermissionContext::DecidePermission( 165 void ChromeMidiPermissionContext::DecidePermission(
166 content::WebContents* web_contents,
81 const PermissionRequestID& id, 167 const PermissionRequestID& id,
82 const GURL& requesting_frame, 168 const GURL& requesting_frame,
83 const GURL& embedder, 169 const GURL& embedder,
84 const content::BrowserContext::MidiSysExPermissionCallback& callback) { 170 const content::BrowserContext::MidiSysExPermissionCallback& callback) {
85 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 171 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
86 172
87 ContentSetting content_setting = 173 ContentSetting content_setting =
88 profile_->GetHostContentSettingsMap()->GetContentSetting( 174 profile_->GetHostContentSettingsMap()->GetContentSetting(
89 requesting_frame, 175 requesting_frame,
90 embedder, 176 embedder,
91 CONTENT_SETTINGS_TYPE_MIDI_SYSEX, 177 CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
92 std::string()); 178 std::string());
93 switch (content_setting) { 179 switch (content_setting) {
94 case CONTENT_SETTING_BLOCK: 180 case CONTENT_SETTING_BLOCK:
95 PermissionDecided(id, requesting_frame, embedder, callback, false); 181 PermissionDecided(id, requesting_frame, embedder, callback, false);
96 break; 182 break;
97 case CONTENT_SETTING_ALLOW: 183 case CONTENT_SETTING_ALLOW:
98 PermissionDecided(id, requesting_frame, embedder, callback, true); 184 PermissionDecided(id, requesting_frame, embedder, callback, true);
99 break; 185 break;
100 default: 186 default:
187 if (PermissionBubbleManager::Enabled()) {
Ami GONE FROM CHROMIUM 2014/02/06 19:51:17 Can any code be deleted once this is always-on? (p
Greg Billock 2014/02/07 18:20:55 Will do. I have a bug tracking this.
188 PermissionBubbleManager* bubble_manager =
189 PermissionBubbleManager::FromWebContents(web_contents);
190 bubble_manager->AddRequest(new MidiPermissionRequest(
191 this, id, requesting_frame,
192 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages),
193 callback));
194 return;
195 }
196
101 GetQueueController()->CreateInfoBarRequest( 197 GetQueueController()->CreateInfoBarRequest(
102 id, requesting_frame, embedder, base::Bind( 198 id, requesting_frame, embedder, base::Bind(
103 &ChromeMidiPermissionContext::NotifyPermissionSet, 199 &ChromeMidiPermissionContext::NotifyPermissionSet,
104 base::Unretained(this), id, requesting_frame, callback)); 200 base::Unretained(this), id, requesting_frame, callback));
105 } 201 }
106 } 202 }
107 203
108 void ChromeMidiPermissionContext::PermissionDecided( 204 void ChromeMidiPermissionContext::PermissionDecided(
109 const PermissionRequestID& id, 205 const PermissionRequestID& id,
110 const GURL& requesting_frame, 206 const GURL& requesting_frame,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); 238 CONTENT_SETTINGS_TYPE_MIDI_SYSEX));
143 } 239 }
144 return permission_queue_controller_.get(); 240 return permission_queue_controller_.get();
145 } 241 }
146 242
147 void ChromeMidiPermissionContext::CancelPendingInfobarRequest( 243 void ChromeMidiPermissionContext::CancelPendingInfobarRequest(
148 const PermissionRequestID& id) { 244 const PermissionRequestID& id) {
149 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 245 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
150 if (shutting_down_) 246 if (shutting_down_)
151 return; 247 return;
248 // TODO(gbillock): Add support for cancellation to permission bubbles.
Ami GONE FROM CHROMIUM 2014/02/06 19:51:17 What is the usability impact of this lack?
Greg Billock 2014/02/07 18:20:55 Still investigating, but looks minimal, and will g
152 GetQueueController()->CancelInfoBarRequest(id); 249 GetQueueController()->CancelInfoBarRequest(id);
153 } 250 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698