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" |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |