| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/geolocation/chrome_geolocation_permission_context.h" | 5 #include "chrome/browser/geolocation/chrome_geolocation_permission_context.h" |
| 6 | 6 |
| 7 #include <functional> | 7 #include <functional> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 | 34 |
| 35 using extensions::APIPermission; | 35 using extensions::APIPermission; |
| 36 using extensions::ExtensionRegistry; | 36 using extensions::ExtensionRegistry; |
| 37 | 37 |
| 38 class GeolocationPermissionRequest : public PermissionBubbleRequest { | 38 class GeolocationPermissionRequest : public PermissionBubbleRequest { |
| 39 public: | 39 public: |
| 40 GeolocationPermissionRequest( | 40 GeolocationPermissionRequest( |
| 41 ChromeGeolocationPermissionContext* context, | 41 ChromeGeolocationPermissionContext* context, |
| 42 const PermissionRequestID& id, | 42 const PermissionRequestID& id, |
| 43 const GURL& requesting_frame, | 43 const GURL& requesting_frame, |
| 44 bool user_gesture, |
| 44 base::Callback<void(bool)> callback, | 45 base::Callback<void(bool)> callback, |
| 45 const std::string& display_languages); | 46 const std::string& display_languages); |
| 46 virtual ~GeolocationPermissionRequest(); | 47 virtual ~GeolocationPermissionRequest(); |
| 47 | 48 |
| 48 // PermissionBubbleDelegate: | 49 // PermissionBubbleDelegate: |
| 49 virtual int GetIconID() const OVERRIDE; | 50 virtual int GetIconID() const OVERRIDE; |
| 50 virtual base::string16 GetMessageText() const OVERRIDE; | 51 virtual base::string16 GetMessageText() const OVERRIDE; |
| 51 virtual base::string16 GetMessageTextFragment() const OVERRIDE; | 52 virtual base::string16 GetMessageTextFragment() const OVERRIDE; |
| 52 virtual bool HasUserGesture() const OVERRIDE; | 53 virtual bool HasUserGesture() const OVERRIDE; |
| 53 virtual GURL GetRequestingHostname() const OVERRIDE; | 54 virtual GURL GetRequestingHostname() const OVERRIDE; |
| 54 virtual void PermissionGranted() OVERRIDE; | 55 virtual void PermissionGranted() OVERRIDE; |
| 55 virtual void PermissionDenied() OVERRIDE; | 56 virtual void PermissionDenied() OVERRIDE; |
| 56 virtual void Cancelled() OVERRIDE; | 57 virtual void Cancelled() OVERRIDE; |
| 57 virtual void RequestFinished() OVERRIDE; | 58 virtual void RequestFinished() OVERRIDE; |
| 58 | 59 |
| 59 private: | 60 private: |
| 60 ChromeGeolocationPermissionContext* context_; | 61 ChromeGeolocationPermissionContext* context_; |
| 61 PermissionRequestID id_; | 62 PermissionRequestID id_; |
| 62 GURL requesting_frame_; | 63 GURL requesting_frame_; |
| 64 bool user_gesture_; |
| 63 base::Callback<void(bool)> callback_; | 65 base::Callback<void(bool)> callback_; |
| 64 std::string display_languages_; | 66 std::string display_languages_; |
| 65 }; | 67 }; |
| 66 | 68 |
| 67 GeolocationPermissionRequest::GeolocationPermissionRequest( | 69 GeolocationPermissionRequest::GeolocationPermissionRequest( |
| 68 ChromeGeolocationPermissionContext* context, | 70 ChromeGeolocationPermissionContext* context, |
| 69 const PermissionRequestID& id, | 71 const PermissionRequestID& id, |
| 70 const GURL& requesting_frame, | 72 const GURL& requesting_frame, |
| 73 bool user_gesture, |
| 71 base::Callback<void(bool)> callback, | 74 base::Callback<void(bool)> callback, |
| 72 const std::string& display_languages) | 75 const std::string& display_languages) |
| 73 : context_(context), | 76 : context_(context), |
| 74 id_(id), | 77 id_(id), |
| 75 requesting_frame_(requesting_frame), | 78 requesting_frame_(requesting_frame), |
| 79 user_gesture_(user_gesture), |
| 76 callback_(callback), | 80 callback_(callback), |
| 77 display_languages_(display_languages) {} | 81 display_languages_(display_languages) {} |
| 78 | 82 |
| 79 GeolocationPermissionRequest::~GeolocationPermissionRequest() {} | 83 GeolocationPermissionRequest::~GeolocationPermissionRequest() {} |
| 80 | 84 |
| 81 int GeolocationPermissionRequest::GetIconID() const { | 85 int GeolocationPermissionRequest::GetIconID() const { |
| 82 return IDR_INFOBAR_GEOLOCATION; | 86 return IDR_INFOBAR_GEOLOCATION; |
| 83 } | 87 } |
| 84 | 88 |
| 85 base::string16 GeolocationPermissionRequest::GetMessageText() const { | 89 base::string16 GeolocationPermissionRequest::GetMessageText() const { |
| 86 return l10n_util::GetStringFUTF16(IDS_GEOLOCATION_INFOBAR_QUESTION, | 90 return l10n_util::GetStringFUTF16(IDS_GEOLOCATION_INFOBAR_QUESTION, |
| 87 net::FormatUrl(requesting_frame_, display_languages_)); | 91 net::FormatUrl(requesting_frame_, display_languages_)); |
| 88 } | 92 } |
| 89 | 93 |
| 90 base::string16 GeolocationPermissionRequest::GetMessageTextFragment() const { | 94 base::string16 GeolocationPermissionRequest::GetMessageTextFragment() const { |
| 91 return l10n_util::GetStringUTF16(IDS_GEOLOCATION_INFOBAR_PERMISSION_FRAGMENT); | 95 return l10n_util::GetStringUTF16(IDS_GEOLOCATION_INFOBAR_PERMISSION_FRAGMENT); |
| 92 } | 96 } |
| 93 | 97 |
| 94 bool GeolocationPermissionRequest::HasUserGesture() const { | 98 bool GeolocationPermissionRequest::HasUserGesture() const { |
| 95 // TODO(gbillock): plumb this through from GeolocationDispatcher. | 99 return user_gesture_; |
| 96 return false; | |
| 97 } | 100 } |
| 98 | 101 |
| 99 GURL GeolocationPermissionRequest::GetRequestingHostname() const { | 102 GURL GeolocationPermissionRequest::GetRequestingHostname() const { |
| 100 return requesting_frame_; | 103 return requesting_frame_; |
| 101 } | 104 } |
| 102 | 105 |
| 103 void GeolocationPermissionRequest::PermissionGranted() { | 106 void GeolocationPermissionRequest::PermissionGranted() { |
| 104 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, true); | 107 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, true); |
| 105 } | 108 } |
| 106 | 109 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 128 // or the IO thread, but the PermissionQueueController must have been | 131 // or the IO thread, but the PermissionQueueController must have been |
| 129 // destroyed on the UI thread. | 132 // destroyed on the UI thread. |
| 130 DCHECK(!permission_queue_controller_.get()); | 133 DCHECK(!permission_queue_controller_.get()); |
| 131 } | 134 } |
| 132 | 135 |
| 133 void ChromeGeolocationPermissionContext::RequestGeolocationPermission( | 136 void ChromeGeolocationPermissionContext::RequestGeolocationPermission( |
| 134 int render_process_id, | 137 int render_process_id, |
| 135 int render_view_id, | 138 int render_view_id, |
| 136 int bridge_id, | 139 int bridge_id, |
| 137 const GURL& requesting_frame, | 140 const GURL& requesting_frame, |
| 141 bool user_gesture, |
| 138 base::Callback<void(bool)> callback) { | 142 base::Callback<void(bool)> callback) { |
| 139 GURL requesting_frame_origin = requesting_frame.GetOrigin(); | 143 GURL requesting_frame_origin = requesting_frame.GetOrigin(); |
| 140 if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) { | 144 if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) { |
| 141 content::BrowserThread::PostTask( | 145 content::BrowserThread::PostTask( |
| 142 content::BrowserThread::UI, FROM_HERE, | 146 content::BrowserThread::UI, FROM_HERE, |
| 143 base::Bind( | 147 base::Bind( |
| 144 &ChromeGeolocationPermissionContext::RequestGeolocationPermission, | 148 &ChromeGeolocationPermissionContext::RequestGeolocationPermission, |
| 145 this, render_process_id, render_view_id, bridge_id, | 149 this, render_process_id, render_view_id, bridge_id, |
| 146 requesting_frame_origin, callback)); | 150 requesting_frame_origin, user_gesture, callback)); |
| 147 return; | 151 return; |
| 148 } | 152 } |
| 149 | 153 |
| 150 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 154 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 151 if (shutting_down_) | 155 if (shutting_down_) |
| 152 return; | 156 return; |
| 153 | 157 |
| 154 content::WebContents* web_contents = | 158 content::WebContents* web_contents = |
| 155 tab_util::GetWebContentsByID(render_process_id, render_view_id); | 159 tab_util::GetWebContentsByID(render_process_id, render_view_id); |
| 156 const PermissionRequestID id(render_process_id, render_view_id, bridge_id, 0); | 160 const PermissionRequestID id(render_process_id, render_view_id, bridge_id, 0); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 186 | 190 |
| 187 GURL embedder = web_contents->GetLastCommittedURL().GetOrigin(); | 191 GURL embedder = web_contents->GetLastCommittedURL().GetOrigin(); |
| 188 if (!requesting_frame_origin.is_valid() || !embedder.is_valid()) { | 192 if (!requesting_frame_origin.is_valid() || !embedder.is_valid()) { |
| 189 LOG(WARNING) << "Attempt to use geolocation from an invalid URL: " | 193 LOG(WARNING) << "Attempt to use geolocation from an invalid URL: " |
| 190 << requesting_frame_origin << "," << embedder | 194 << requesting_frame_origin << "," << embedder |
| 191 << " (geolocation is not supported in popups)"; | 195 << " (geolocation is not supported in popups)"; |
| 192 NotifyPermissionSet(id, requesting_frame_origin, callback, false); | 196 NotifyPermissionSet(id, requesting_frame_origin, callback, false); |
| 193 return; | 197 return; |
| 194 } | 198 } |
| 195 | 199 |
| 196 DecidePermission(web_contents, id, requesting_frame_origin, | 200 DecidePermission(web_contents, id, requesting_frame_origin, user_gesture, |
| 197 embedder, "", callback); | 201 embedder, "", callback); |
| 198 } | 202 } |
| 199 | 203 |
| 200 void ChromeGeolocationPermissionContext::CancelGeolocationPermissionRequest( | 204 void ChromeGeolocationPermissionContext::CancelGeolocationPermissionRequest( |
| 201 int render_process_id, | 205 int render_process_id, |
| 202 int render_view_id, | 206 int render_view_id, |
| 203 int bridge_id, | 207 int bridge_id, |
| 204 const GURL& requesting_frame) { | 208 const GURL& requesting_frame) { |
| 205 // TODO(gbillock): cancel permission bubble request. | 209 // TODO(gbillock): cancel permission bubble request. |
| 206 CancelPendingInfobarRequest(PermissionRequestID( | 210 CancelPendingInfobarRequest(PermissionRequestID( |
| 207 render_process_id, render_view_id, bridge_id, 0)); | 211 render_process_id, render_view_id, bridge_id, 0)); |
| 208 } | 212 } |
| 209 | 213 |
| 210 void ChromeGeolocationPermissionContext::DecidePermission( | 214 void ChromeGeolocationPermissionContext::DecidePermission( |
| 211 content::WebContents* web_contents, | 215 content::WebContents* web_contents, |
| 212 const PermissionRequestID& id, | 216 const PermissionRequestID& id, |
| 213 const GURL& requesting_frame, | 217 const GURL& requesting_frame, |
| 218 bool user_gesture, |
| 214 const GURL& embedder, | 219 const GURL& embedder, |
| 215 const std::string& accept_button_label, | 220 const std::string& accept_button_label, |
| 216 base::Callback<void(bool)> callback) { | 221 base::Callback<void(bool)> callback) { |
| 217 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 222 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 218 | 223 |
| 219 ContentSetting content_setting = | 224 ContentSetting content_setting = |
| 220 profile_->GetHostContentSettingsMap()->GetContentSetting( | 225 profile_->GetHostContentSettingsMap()->GetContentSetting( |
| 221 requesting_frame, embedder, CONTENT_SETTINGS_TYPE_GEOLOCATION, | 226 requesting_frame, embedder, CONTENT_SETTINGS_TYPE_GEOLOCATION, |
| 222 std::string()); | 227 std::string()); |
| 223 switch (content_setting) { | 228 switch (content_setting) { |
| 224 case CONTENT_SETTING_BLOCK: | 229 case CONTENT_SETTING_BLOCK: |
| 225 PermissionDecided(id, requesting_frame, embedder, callback, false); | 230 PermissionDecided(id, requesting_frame, embedder, callback, false); |
| 226 break; | 231 break; |
| 227 case CONTENT_SETTING_ALLOW: | 232 case CONTENT_SETTING_ALLOW: |
| 228 PermissionDecided(id, requesting_frame, embedder, callback, true); | 233 PermissionDecided(id, requesting_frame, embedder, callback, true); |
| 229 break; | 234 break; |
| 230 default: | 235 default: |
| 231 if (PermissionBubbleManager::Enabled()) { | 236 if (PermissionBubbleManager::Enabled()) { |
| 232 PermissionBubbleManager* mgr = | 237 PermissionBubbleManager* mgr = |
| 233 PermissionBubbleManager::FromWebContents(web_contents); | 238 PermissionBubbleManager::FromWebContents(web_contents); |
| 234 mgr->AddRequest(new GeolocationPermissionRequest( | 239 mgr->AddRequest(new GeolocationPermissionRequest( |
| 235 this, id, requesting_frame, callback, | 240 this, id, requesting_frame, user_gesture, callback, |
| 236 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages))); | 241 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages))); |
| 237 } else { | 242 } else { |
| 238 // setting == ask. Prompt the user. | 243 // setting == ask. Prompt the user. |
| 239 QueueController()->CreateInfoBarRequest( | 244 QueueController()->CreateInfoBarRequest( |
| 240 id, requesting_frame, embedder, accept_button_label, | 245 id, requesting_frame, embedder, accept_button_label, |
| 241 base::Bind( | 246 base::Bind( |
| 242 &ChromeGeolocationPermissionContext::NotifyPermissionSet, | 247 &ChromeGeolocationPermissionContext::NotifyPermissionSet, |
| 243 base::Unretained(this), id, requesting_frame, callback)); | 248 base::Unretained(this), id, requesting_frame, callback)); |
| 244 } | 249 } |
| 245 } | 250 } |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 this, id)); | 322 this, id)); |
| 318 return; | 323 return; |
| 319 } | 324 } |
| 320 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 325 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 321 if (shutting_down_) | 326 if (shutting_down_) |
| 322 return; | 327 return; |
| 323 | 328 |
| 324 // TODO(gbillock): handle permission bubble cancellation. | 329 // TODO(gbillock): handle permission bubble cancellation. |
| 325 QueueController()->CancelInfoBarRequest(id); | 330 QueueController()->CancelInfoBarRequest(id); |
| 326 } | 331 } |
| OLD | NEW |