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" | 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/web_contents.h" | 18 #include "content/public/browser/web_contents.h" |
19 #include "grit/generated_resources.h" | 19 #include "grit/generated_resources.h" |
20 #include "grit/theme_resources.h" | 20 #include "grit/theme_resources.h" |
21 #include "net/base/net_util.h" | 21 #include "net/base/net_util.h" |
22 #include "ui/base/l10n/l10n_util.h" | 22 #include "ui/base/l10n/l10n_util.h" |
23 | 23 |
24 class MidiPermissionRequest : public PermissionBubbleRequest { | 24 class MidiPermissionRequest : public PermissionBubbleRequest { |
25 public: | 25 public: |
26 MidiPermissionRequest( | 26 MidiPermissionRequest( |
27 ChromeMidiPermissionContext* context, | 27 ChromeMidiPermissionContext* context, |
28 const PermissionRequestID& id, | 28 const PermissionRequestID& id, |
29 const GURL& requesting_frame, | 29 const GURL& requesting_frame, |
| 30 bool user_gesture, |
30 const std::string& display_languages, | 31 const std::string& display_languages, |
31 const content::BrowserContext::MidiSysExPermissionCallback& callback); | 32 const content::BrowserContext::MidiSysExPermissionCallback& callback); |
32 virtual ~MidiPermissionRequest(); | 33 virtual ~MidiPermissionRequest(); |
33 | 34 |
34 // PermissionBubbleDelegate: | 35 // PermissionBubbleDelegate: |
35 virtual int GetIconID() const OVERRIDE; | 36 virtual int GetIconID() const OVERRIDE; |
36 virtual base::string16 GetMessageText() const OVERRIDE; | 37 virtual base::string16 GetMessageText() const OVERRIDE; |
37 virtual base::string16 GetMessageTextFragment() const OVERRIDE; | 38 virtual base::string16 GetMessageTextFragment() const OVERRIDE; |
38 virtual bool HasUserGesture() const OVERRIDE; | 39 virtual bool HasUserGesture() const OVERRIDE; |
39 virtual GURL GetRequestingHostname() const OVERRIDE; | 40 virtual GURL GetRequestingHostname() const OVERRIDE; |
40 virtual void PermissionGranted() OVERRIDE; | 41 virtual void PermissionGranted() OVERRIDE; |
41 virtual void PermissionDenied() OVERRIDE; | 42 virtual void PermissionDenied() OVERRIDE; |
42 virtual void Cancelled() OVERRIDE; | 43 virtual void Cancelled() OVERRIDE; |
43 virtual void RequestFinished() OVERRIDE; | 44 virtual void RequestFinished() OVERRIDE; |
44 | 45 |
45 private: | 46 private: |
46 ChromeMidiPermissionContext* context_; | 47 ChromeMidiPermissionContext* context_; |
47 const PermissionRequestID id_; | 48 const PermissionRequestID id_; |
48 GURL requesting_frame_; | 49 GURL requesting_frame_; |
| 50 bool user_gesture_; |
49 std::string display_languages_; | 51 std::string display_languages_; |
50 const content::BrowserContext::MidiSysExPermissionCallback& callback_; | 52 const content::BrowserContext::MidiSysExPermissionCallback& callback_; |
51 | 53 |
52 DISALLOW_COPY_AND_ASSIGN(MidiPermissionRequest); | 54 DISALLOW_COPY_AND_ASSIGN(MidiPermissionRequest); |
53 }; | 55 }; |
54 | 56 |
55 MidiPermissionRequest::MidiPermissionRequest( | 57 MidiPermissionRequest::MidiPermissionRequest( |
56 ChromeMidiPermissionContext* context, | 58 ChromeMidiPermissionContext* context, |
57 const PermissionRequestID& id, | 59 const PermissionRequestID& id, |
58 const GURL& requesting_frame, | 60 const GURL& requesting_frame, |
| 61 bool user_gesture, |
59 const std::string& display_languages, | 62 const std::string& display_languages, |
60 const content::BrowserContext::MidiSysExPermissionCallback& callback) | 63 const content::BrowserContext::MidiSysExPermissionCallback& callback) |
61 : context_(context), | 64 : context_(context), |
62 id_(id), | 65 id_(id), |
63 requesting_frame_(requesting_frame), | 66 requesting_frame_(requesting_frame), |
| 67 user_gesture_(user_gesture), |
64 display_languages_(display_languages), | 68 display_languages_(display_languages), |
65 callback_(callback) {} | 69 callback_(callback) {} |
66 | 70 |
67 MidiPermissionRequest::~MidiPermissionRequest() {} | 71 MidiPermissionRequest::~MidiPermissionRequest() {} |
68 | 72 |
69 int MidiPermissionRequest::GetIconID() const { | 73 int MidiPermissionRequest::GetIconID() const { |
70 return IDR_ALLOWED_MIDI_SYSEX; | 74 return IDR_ALLOWED_MIDI_SYSEX; |
71 } | 75 } |
72 | 76 |
73 base::string16 MidiPermissionRequest::GetMessageText() const { | 77 base::string16 MidiPermissionRequest::GetMessageText() const { |
74 return l10n_util::GetStringFUTF16( | 78 return l10n_util::GetStringFUTF16( |
75 IDS_MIDI_SYSEX_INFOBAR_QUESTION, | 79 IDS_MIDI_SYSEX_INFOBAR_QUESTION, |
76 net::FormatUrl(requesting_frame_.GetOrigin(), display_languages_)); | 80 net::FormatUrl(requesting_frame_.GetOrigin(), display_languages_)); |
77 } | 81 } |
78 | 82 |
79 base::string16 MidiPermissionRequest::GetMessageTextFragment() const { | 83 base::string16 MidiPermissionRequest::GetMessageTextFragment() const { |
80 return l10n_util::GetStringUTF16(IDS_MIDI_SYSEX_PERMISSION_FRAGMENT); | 84 return l10n_util::GetStringUTF16(IDS_MIDI_SYSEX_PERMISSION_FRAGMENT); |
81 } | 85 } |
82 | 86 |
83 bool MidiPermissionRequest::HasUserGesture() const { | 87 bool MidiPermissionRequest::HasUserGesture() const { |
84 // TODO(gbillock): plumb through. | 88 return user_gesture_; |
85 return false; | |
86 } | 89 } |
87 | 90 |
88 GURL MidiPermissionRequest::GetRequestingHostname() const { | 91 GURL MidiPermissionRequest::GetRequestingHostname() const { |
89 return requesting_frame_; | 92 return requesting_frame_; |
90 } | 93 } |
91 | 94 |
92 void MidiPermissionRequest::PermissionGranted() { | 95 void MidiPermissionRequest::PermissionGranted() { |
93 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, true); | 96 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, true); |
94 } | 97 } |
95 | 98 |
(...skipping 24 matching lines...) Expand all Loading... |
120 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 123 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
121 permission_queue_controller_.reset(); | 124 permission_queue_controller_.reset(); |
122 shutting_down_ = true; | 125 shutting_down_ = true; |
123 } | 126 } |
124 | 127 |
125 void ChromeMidiPermissionContext::RequestMidiSysExPermission( | 128 void ChromeMidiPermissionContext::RequestMidiSysExPermission( |
126 int render_process_id, | 129 int render_process_id, |
127 int render_view_id, | 130 int render_view_id, |
128 int bridge_id, | 131 int bridge_id, |
129 const GURL& requesting_frame, | 132 const GURL& requesting_frame, |
| 133 bool user_gesture, |
130 const content::BrowserContext::MidiSysExPermissionCallback& callback) { | 134 const content::BrowserContext::MidiSysExPermissionCallback& callback) { |
131 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 135 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
132 DCHECK(!shutting_down_); | 136 DCHECK(!shutting_down_); |
133 | 137 |
134 // TODO(toyoshim): Support Extension's manifest declared permission. | 138 // TODO(toyoshim): Support Extension's manifest declared permission. |
135 // See http://crbug.com/266338. | 139 // See http://crbug.com/266338. |
136 | 140 |
137 content::WebContents* web_contents = | 141 content::WebContents* web_contents = |
138 tab_util::GetWebContentsByID(render_process_id, render_view_id); | 142 tab_util::GetWebContentsByID(render_process_id, render_view_id); |
139 | 143 |
140 // The page doesn't exist any more. | 144 // The page doesn't exist any more. |
141 if (!web_contents) | 145 if (!web_contents) |
142 return; | 146 return; |
143 | 147 |
144 const PermissionRequestID id(render_process_id, render_view_id, bridge_id, 0); | 148 const PermissionRequestID id(render_process_id, render_view_id, bridge_id, 0); |
145 | 149 |
146 GURL embedder = web_contents->GetURL(); | 150 GURL embedder = web_contents->GetURL(); |
147 // |requesting_frame| can be empty and invalid when the frame is a local | 151 // |requesting_frame| can be empty and invalid when the frame is a local |
148 // file. Here local files should be granted to show an infobar. | 152 // file. Here local files should be granted to show an infobar. |
149 // Any user's action will not be stored to content settings data base. | 153 // Any user's action will not be stored to content settings data base. |
150 if ((!requesting_frame.is_valid() && !requesting_frame.is_empty()) || | 154 if ((!requesting_frame.is_valid() && !requesting_frame.is_empty()) || |
151 !embedder.is_valid()) { | 155 !embedder.is_valid()) { |
152 LOG(WARNING) << "Attempt to use MIDI sysex from an invalid URL: " | 156 LOG(WARNING) << "Attempt to use MIDI sysex from an invalid URL: " |
153 << requesting_frame << "," << embedder | 157 << requesting_frame << "," << embedder |
154 << " (Web MIDI is not supported in popups)"; | 158 << " (Web MIDI is not supported in popups)"; |
155 PermissionDecided(id, requesting_frame, embedder, callback, false); | 159 PermissionDecided(id, requesting_frame, embedder, callback, false); |
156 return; | 160 return; |
157 } | 161 } |
158 | 162 |
159 DecidePermission(web_contents, id, requesting_frame, embedder, callback); | 163 DecidePermission(web_contents, id, requesting_frame, embedder, user_gesture, |
| 164 callback); |
160 } | 165 } |
161 | 166 |
162 void ChromeMidiPermissionContext::CancelMidiSysExPermissionRequest( | 167 void ChromeMidiPermissionContext::CancelMidiSysExPermissionRequest( |
163 int render_process_id, | 168 int render_process_id, |
164 int render_view_id, | 169 int render_view_id, |
165 int bridge_id, | 170 int bridge_id, |
166 const GURL& requesting_frame) { | 171 const GURL& requesting_frame) { |
167 CancelPendingInfobarRequest( | 172 CancelPendingInfobarRequest( |
168 PermissionRequestID(render_process_id, render_view_id, bridge_id, 0)); | 173 PermissionRequestID(render_process_id, render_view_id, bridge_id, 0)); |
169 } | 174 } |
170 | 175 |
171 void ChromeMidiPermissionContext::DecidePermission( | 176 void ChromeMidiPermissionContext::DecidePermission( |
172 content::WebContents* web_contents, | 177 content::WebContents* web_contents, |
173 const PermissionRequestID& id, | 178 const PermissionRequestID& id, |
174 const GURL& requesting_frame, | 179 const GURL& requesting_frame, |
175 const GURL& embedder, | 180 const GURL& embedder, |
| 181 bool user_gesture, |
176 const content::BrowserContext::MidiSysExPermissionCallback& callback) { | 182 const content::BrowserContext::MidiSysExPermissionCallback& callback) { |
177 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 183 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
178 | 184 |
179 ContentSetting content_setting = | 185 ContentSetting content_setting = |
180 profile_->GetHostContentSettingsMap()->GetContentSetting( | 186 profile_->GetHostContentSettingsMap()->GetContentSetting( |
181 requesting_frame, | 187 requesting_frame, |
182 embedder, | 188 embedder, |
183 CONTENT_SETTINGS_TYPE_MIDI_SYSEX, | 189 CONTENT_SETTINGS_TYPE_MIDI_SYSEX, |
184 std::string()); | 190 std::string()); |
185 switch (content_setting) { | 191 switch (content_setting) { |
186 case CONTENT_SETTING_BLOCK: | 192 case CONTENT_SETTING_BLOCK: |
187 PermissionDecided(id, requesting_frame, embedder, callback, false); | 193 PermissionDecided(id, requesting_frame, embedder, callback, false); |
188 break; | 194 break; |
189 case CONTENT_SETTING_ALLOW: | 195 case CONTENT_SETTING_ALLOW: |
190 PermissionDecided(id, requesting_frame, embedder, callback, true); | 196 PermissionDecided(id, requesting_frame, embedder, callback, true); |
191 break; | 197 break; |
192 default: | 198 default: |
193 if (PermissionBubbleManager::Enabled()) { | 199 if (PermissionBubbleManager::Enabled()) { |
194 PermissionBubbleManager* bubble_manager = | 200 PermissionBubbleManager* bubble_manager = |
195 PermissionBubbleManager::FromWebContents(web_contents); | 201 PermissionBubbleManager::FromWebContents(web_contents); |
196 bubble_manager->AddRequest(new MidiPermissionRequest( | 202 bubble_manager->AddRequest(new MidiPermissionRequest( |
197 this, id, requesting_frame, | 203 this, id, requesting_frame, user_gesture, |
198 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages), | 204 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages), |
199 callback)); | 205 callback)); |
200 return; | 206 return; |
201 } | 207 } |
202 | 208 |
203 // TODO(gbillock): Delete this and the infobar delegate when | 209 // TODO(gbillock): Delete this and the infobar delegate when |
204 // we're using only bubbles. crbug.com/337458 | 210 // we're using only bubbles. crbug.com/337458 |
205 GetQueueController()->CreateInfoBarRequest( | 211 GetQueueController()->CreateInfoBarRequest( |
206 id, requesting_frame, embedder, std::string(), base::Bind( | 212 id, requesting_frame, embedder, std::string(), base::Bind( |
207 &ChromeMidiPermissionContext::NotifyPermissionSet, | 213 &ChromeMidiPermissionContext::NotifyPermissionSet, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 } | 255 } |
250 | 256 |
251 void ChromeMidiPermissionContext::CancelPendingInfobarRequest( | 257 void ChromeMidiPermissionContext::CancelPendingInfobarRequest( |
252 const PermissionRequestID& id) { | 258 const PermissionRequestID& id) { |
253 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 259 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
254 if (shutting_down_) | 260 if (shutting_down_) |
255 return; | 261 return; |
256 // TODO(gbillock): Add support for cancellation to permission bubbles. | 262 // TODO(gbillock): Add support for cancellation to permission bubbles. |
257 GetQueueController()->CancelInfoBarRequest(id); | 263 GetQueueController()->CancelInfoBarRequest(id); |
258 } | 264 } |
OLD | NEW |