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_; |
| 45 const PermissionRequestID id_; |
| 46 GURL requesting_frame_; |
| 47 std::string display_languages_; |
| 48 const content::BrowserContext::MidiSysExPermissionCallback& callback_; |
| 49 |
| 50 DISALLOW_COPY_AND_ASSIGN(MidiPermissionRequest); |
| 51 }; |
| 52 |
| 53 MidiPermissionRequest::MidiPermissionRequest( |
| 54 ChromeMidiPermissionContext* context, |
| 55 const PermissionRequestID& id, |
| 56 const GURL& requesting_frame, |
| 57 const std::string& display_languages, |
| 58 const content::BrowserContext::MidiSysExPermissionCallback& callback) |
| 59 : context_(context), |
| 60 id_(id), |
| 61 requesting_frame_(requesting_frame), |
| 62 display_languages_(display_languages), |
| 63 callback_(callback) {} |
| 64 |
| 65 MidiPermissionRequest::~MidiPermissionRequest() {} |
| 66 |
| 67 base::string16 MidiPermissionRequest::GetMessageText() const { |
| 68 return l10n_util::GetStringFUTF16( |
| 69 IDS_MIDI_SYSEX_INFOBAR_QUESTION, |
| 70 net::FormatUrl(requesting_frame_.GetOrigin(), display_languages_)); |
| 71 } |
| 72 |
| 73 base::string16 MidiPermissionRequest::GetMessageTextFragment() const { |
| 74 return l10n_util::GetStringUTF16(IDS_MIDI_SYSEX_PERMISSION_FRAGMENT); |
| 75 } |
| 76 |
| 77 base::string16 MidiPermissionRequest::GetAlternateAcceptButtonText() const { |
| 78 return l10n_util::GetStringUTF16(IDS_MIDI_SYSEX_ALLOW_BUTTON); |
| 79 } |
| 80 |
| 81 base::string16 MidiPermissionRequest::GetAlternateDenyButtonText() const { |
| 82 return l10n_util::GetStringUTF16(IDS_MIDI_SYSEX_DENY_BUTTON); |
| 83 } |
| 84 |
| 85 void MidiPermissionRequest::PermissionGranted() { |
| 86 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, true); |
| 87 } |
| 88 |
| 89 void MidiPermissionRequest::PermissionDenied() { |
| 90 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, false); |
| 91 } |
| 92 |
| 93 void MidiPermissionRequest::Cancelled() { |
| 94 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, false); |
| 95 } |
| 96 |
| 97 void MidiPermissionRequest::RequestFinished() { |
| 98 delete this; |
| 99 } |
16 | 100 |
17 ChromeMidiPermissionContext::ChromeMidiPermissionContext(Profile* profile) | 101 ChromeMidiPermissionContext::ChromeMidiPermissionContext(Profile* profile) |
18 : profile_(profile), | 102 : profile_(profile), |
19 shutting_down_(false) { | 103 shutting_down_(false) { |
20 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 104 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
21 } | 105 } |
22 | 106 |
23 ChromeMidiPermissionContext::~ChromeMidiPermissionContext() { | 107 ChromeMidiPermissionContext::~ChromeMidiPermissionContext() { |
24 DCHECK(!permission_queue_controller_); | 108 DCHECK(!permission_queue_controller_); |
25 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 109 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. | 142 // Any user's action will not be stored to content settings data base. |
59 if ((!requesting_frame.is_valid() && !requesting_frame.is_empty()) || | 143 if ((!requesting_frame.is_valid() && !requesting_frame.is_empty()) || |
60 !embedder.is_valid()) { | 144 !embedder.is_valid()) { |
61 LOG(WARNING) << "Attempt to use MIDI sysex from an invalid URL: " | 145 LOG(WARNING) << "Attempt to use MIDI sysex from an invalid URL: " |
62 << requesting_frame << "," << embedder | 146 << requesting_frame << "," << embedder |
63 << " (Web MIDI is not supported in popups)"; | 147 << " (Web MIDI is not supported in popups)"; |
64 PermissionDecided(id, requesting_frame, embedder, callback, false); | 148 PermissionDecided(id, requesting_frame, embedder, callback, false); |
65 return; | 149 return; |
66 } | 150 } |
67 | 151 |
68 DecidePermission(id, requesting_frame, embedder, callback); | 152 DecidePermission(web_contents, id, requesting_frame, embedder, callback); |
69 } | 153 } |
70 | 154 |
71 void ChromeMidiPermissionContext::CancelMidiSysExPermissionRequest( | 155 void ChromeMidiPermissionContext::CancelMidiSysExPermissionRequest( |
72 int render_process_id, | 156 int render_process_id, |
73 int render_view_id, | 157 int render_view_id, |
74 int bridge_id, | 158 int bridge_id, |
75 const GURL& requesting_frame) { | 159 const GURL& requesting_frame) { |
76 CancelPendingInfobarRequest( | 160 CancelPendingInfobarRequest( |
77 PermissionRequestID(render_process_id, render_view_id, bridge_id, 0)); | 161 PermissionRequestID(render_process_id, render_view_id, bridge_id, 0)); |
78 } | 162 } |
79 | 163 |
80 void ChromeMidiPermissionContext::DecidePermission( | 164 void ChromeMidiPermissionContext::DecidePermission( |
| 165 content::WebContents* web_contents, |
81 const PermissionRequestID& id, | 166 const PermissionRequestID& id, |
82 const GURL& requesting_frame, | 167 const GURL& requesting_frame, |
83 const GURL& embedder, | 168 const GURL& embedder, |
84 const content::BrowserContext::MidiSysExPermissionCallback& callback) { | 169 const content::BrowserContext::MidiSysExPermissionCallback& callback) { |
85 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 170 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
86 | 171 |
87 ContentSetting content_setting = | 172 ContentSetting content_setting = |
88 profile_->GetHostContentSettingsMap()->GetContentSetting( | 173 profile_->GetHostContentSettingsMap()->GetContentSetting( |
89 requesting_frame, | 174 requesting_frame, |
90 embedder, | 175 embedder, |
91 CONTENT_SETTINGS_TYPE_MIDI_SYSEX, | 176 CONTENT_SETTINGS_TYPE_MIDI_SYSEX, |
92 std::string()); | 177 std::string()); |
93 switch (content_setting) { | 178 switch (content_setting) { |
94 case CONTENT_SETTING_BLOCK: | 179 case CONTENT_SETTING_BLOCK: |
95 PermissionDecided(id, requesting_frame, embedder, callback, false); | 180 PermissionDecided(id, requesting_frame, embedder, callback, false); |
96 break; | 181 break; |
97 case CONTENT_SETTING_ALLOW: | 182 case CONTENT_SETTING_ALLOW: |
98 PermissionDecided(id, requesting_frame, embedder, callback, true); | 183 PermissionDecided(id, requesting_frame, embedder, callback, true); |
99 break; | 184 break; |
100 default: | 185 default: |
| 186 if (PermissionBubbleManager::Enabled()) { |
| 187 PermissionBubbleManager* bubble_manager = |
| 188 PermissionBubbleManager::FromWebContents(web_contents); |
| 189 bubble_manager->AddRequest(new MidiPermissionRequest( |
| 190 this, id, requesting_frame, |
| 191 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages), |
| 192 callback)); |
| 193 return; |
| 194 } |
| 195 |
| 196 // TODO(gbillock): Delete this and the infobar delegate when |
| 197 // we're using only bubbles. crbug.com/337458 |
101 GetQueueController()->CreateInfoBarRequest( | 198 GetQueueController()->CreateInfoBarRequest( |
102 id, requesting_frame, embedder, base::Bind( | 199 id, requesting_frame, embedder, base::Bind( |
103 &ChromeMidiPermissionContext::NotifyPermissionSet, | 200 &ChromeMidiPermissionContext::NotifyPermissionSet, |
104 base::Unretained(this), id, requesting_frame, callback)); | 201 base::Unretained(this), id, requesting_frame, callback)); |
105 } | 202 } |
106 } | 203 } |
107 | 204 |
108 void ChromeMidiPermissionContext::PermissionDecided( | 205 void ChromeMidiPermissionContext::PermissionDecided( |
109 const PermissionRequestID& id, | 206 const PermissionRequestID& id, |
110 const GURL& requesting_frame, | 207 const GURL& requesting_frame, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); | 239 CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); |
143 } | 240 } |
144 return permission_queue_controller_.get(); | 241 return permission_queue_controller_.get(); |
145 } | 242 } |
146 | 243 |
147 void ChromeMidiPermissionContext::CancelPendingInfobarRequest( | 244 void ChromeMidiPermissionContext::CancelPendingInfobarRequest( |
148 const PermissionRequestID& id) { | 245 const PermissionRequestID& id) { |
149 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 246 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
150 if (shutting_down_) | 247 if (shutting_down_) |
151 return; | 248 return; |
| 249 // TODO(gbillock): Add support for cancellation to permission bubbles. |
152 GetQueueController()->CancelInfoBarRequest(id); | 250 GetQueueController()->CancelInfoBarRequest(id); |
153 } | 251 } |
OLD | NEW |