| 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 |