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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 | 107 |
108 void GeolocationPermissionRequest::PermissionGranted() { | 108 void GeolocationPermissionRequest::PermissionGranted() { |
109 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, true); | 109 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, true); |
110 } | 110 } |
111 | 111 |
112 void GeolocationPermissionRequest::PermissionDenied() { | 112 void GeolocationPermissionRequest::PermissionDenied() { |
113 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, false); | 113 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, false); |
114 } | 114 } |
115 | 115 |
116 void GeolocationPermissionRequest::Cancelled() { | 116 void GeolocationPermissionRequest::Cancelled() { |
117 context_->NotifyPermissionSet(id_, requesting_frame_, callback_, false); | |
118 } | 117 } |
119 | 118 |
120 void GeolocationPermissionRequest::RequestFinished() { | 119 void GeolocationPermissionRequest::RequestFinished() { |
121 delete this; | 120 // Deletes 'this'. |
| 121 context_->RequestFinished(this); |
122 } | 122 } |
123 | 123 |
124 | 124 |
125 ChromeGeolocationPermissionContext::ChromeGeolocationPermissionContext( | 125 ChromeGeolocationPermissionContext::ChromeGeolocationPermissionContext( |
126 Profile* profile) | 126 Profile* profile) |
127 : profile_(profile), | 127 : profile_(profile), |
128 shutting_down_(false) { | 128 shutting_down_(false) { |
129 } | 129 } |
130 | 130 |
131 ChromeGeolocationPermissionContext::~ChromeGeolocationPermissionContext() { | 131 ChromeGeolocationPermissionContext::~ChromeGeolocationPermissionContext() { |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 void ChromeGeolocationPermissionContext::CancelGeolocationPermissionRequest( | 203 void ChromeGeolocationPermissionContext::CancelGeolocationPermissionRequest( |
204 content::WebContents* web_contents, | 204 content::WebContents* web_contents, |
205 int bridge_id, | 205 int bridge_id, |
206 const GURL& requesting_frame) { | 206 const GURL& requesting_frame) { |
207 WebViewGuest* guest = | 207 WebViewGuest* guest = |
208 web_contents ? WebViewGuest::FromWebContents(web_contents) : NULL; | 208 web_contents ? WebViewGuest::FromWebContents(web_contents) : NULL; |
209 if (guest) { | 209 if (guest) { |
210 guest->CancelGeolocationPermissionRequest(bridge_id); | 210 guest->CancelGeolocationPermissionRequest(bridge_id); |
211 return; | 211 return; |
212 } | 212 } |
213 // TODO(gbillock): cancel permission bubble request. | |
214 int render_process_id = web_contents->GetRenderProcessHost()->GetID(); | 213 int render_process_id = web_contents->GetRenderProcessHost()->GetID(); |
215 int render_view_id = web_contents->GetRenderViewHost()->GetRoutingID(); | 214 int render_view_id = web_contents->GetRenderViewHost()->GetRoutingID(); |
216 CancelPendingInfobarRequest(PermissionRequestID( | 215 CancelPendingInfobarRequest(PermissionRequestID( |
217 render_process_id, render_view_id, bridge_id, 0)); | 216 render_process_id, render_view_id, bridge_id, 0)); |
218 } | 217 } |
219 | 218 |
220 void ChromeGeolocationPermissionContext::DecidePermission( | 219 void ChromeGeolocationPermissionContext::DecidePermission( |
221 content::WebContents* web_contents, | 220 content::WebContents* web_contents, |
222 const PermissionRequestID& id, | 221 const PermissionRequestID& id, |
223 const GURL& requesting_frame, | 222 const GURL& requesting_frame, |
(...skipping 12 matching lines...) Expand all Loading... |
236 PermissionDecided(id, requesting_frame, embedder, callback, false); | 235 PermissionDecided(id, requesting_frame, embedder, callback, false); |
237 break; | 236 break; |
238 case CONTENT_SETTING_ALLOW: | 237 case CONTENT_SETTING_ALLOW: |
239 PermissionDecided(id, requesting_frame, embedder, callback, true); | 238 PermissionDecided(id, requesting_frame, embedder, callback, true); |
240 break; | 239 break; |
241 default: | 240 default: |
242 if (PermissionBubbleManager::Enabled()) { | 241 if (PermissionBubbleManager::Enabled()) { |
243 PermissionBubbleManager* mgr = | 242 PermissionBubbleManager* mgr = |
244 PermissionBubbleManager::FromWebContents(web_contents); | 243 PermissionBubbleManager::FromWebContents(web_contents); |
245 if (mgr) { | 244 if (mgr) { |
246 mgr->AddRequest(new GeolocationPermissionRequest( | 245 scoped_ptr<GeolocationPermissionRequest> request_ptr( |
| 246 new GeolocationPermissionRequest( |
247 this, id, requesting_frame, user_gesture, callback, | 247 this, id, requesting_frame, user_gesture, callback, |
248 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages))); | 248 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages))); |
| 249 GeolocationPermissionRequest* request = request_ptr.get(); |
| 250 pending_requests_.add(id.ToString(), request_ptr.Pass()); |
| 251 mgr->AddRequest(request); |
249 } | 252 } |
250 } else { | 253 } else { |
251 // setting == ask. Prompt the user. | 254 // setting == ask. Prompt the user. |
252 QueueController()->CreateInfoBarRequest( | 255 QueueController()->CreateInfoBarRequest( |
253 id, requesting_frame, embedder, accept_button_label, | 256 id, requesting_frame, embedder, accept_button_label, |
254 base::Bind( | 257 base::Bind( |
255 &ChromeGeolocationPermissionContext::NotifyPermissionSet, | 258 &ChromeGeolocationPermissionContext::NotifyPermissionSet, |
256 base::Unretained(this), id, requesting_frame, callback)); | 259 base::Unretained(this), id, requesting_frame, callback)); |
257 } | 260 } |
258 } | 261 } |
259 } | 262 } |
260 | 263 |
261 void ChromeGeolocationPermissionContext::CreateInfoBarRequest( | 264 void ChromeGeolocationPermissionContext::CreateInfoBarRequest( |
262 const PermissionRequestID& id, | 265 const PermissionRequestID& id, |
263 const GURL& requesting_frame, | 266 const GURL& requesting_frame, |
264 const GURL& embedder, | 267 const GURL& embedder, |
265 const std::string accept_button_label, | 268 const std::string accept_button_label, |
266 base::Callback<void(bool)> callback) { | 269 base::Callback<void(bool)> callback) { |
267 QueueController()->CreateInfoBarRequest( | 270 QueueController()->CreateInfoBarRequest( |
268 id, requesting_frame, embedder, accept_button_label, base::Bind( | 271 id, requesting_frame, embedder, accept_button_label, base::Bind( |
269 &ChromeGeolocationPermissionContext::NotifyPermissionSet, | 272 &ChromeGeolocationPermissionContext::NotifyPermissionSet, |
270 base::Unretained(this), id, requesting_frame, callback)); | 273 base::Unretained(this), id, requesting_frame, callback)); |
271 } | 274 } |
272 | 275 |
| 276 void ChromeGeolocationPermissionContext::RequestFinished( |
| 277 GeolocationPermissionRequest* request) { |
| 278 base::ScopedPtrHashMap<std::string, |
| 279 GeolocationPermissionRequest>::iterator it; |
| 280 for (it = pending_requests_.begin(); it != pending_requests_.end(); it++) { |
| 281 if (it->second == request) { |
| 282 pending_requests_.take_and_erase(it); |
| 283 return; |
| 284 } |
| 285 } |
| 286 } |
| 287 |
| 288 |
273 void ChromeGeolocationPermissionContext::ShutdownOnUIThread() { | 289 void ChromeGeolocationPermissionContext::ShutdownOnUIThread() { |
274 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 290 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
275 permission_queue_controller_.reset(); | 291 permission_queue_controller_.reset(); |
276 shutting_down_ = true; | 292 shutting_down_ = true; |
277 } | 293 } |
278 | 294 |
279 void ChromeGeolocationPermissionContext::PermissionDecided( | 295 void ChromeGeolocationPermissionContext::PermissionDecided( |
280 const PermissionRequestID& id, | 296 const PermissionRequestID& id, |
281 const GURL& requesting_frame, | 297 const GURL& requesting_frame, |
282 const GURL& embedder, | 298 const GURL& embedder, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 return new PermissionQueueController(profile(), | 335 return new PermissionQueueController(profile(), |
320 CONTENT_SETTINGS_TYPE_GEOLOCATION); | 336 CONTENT_SETTINGS_TYPE_GEOLOCATION); |
321 } | 337 } |
322 | 338 |
323 void ChromeGeolocationPermissionContext::CancelPendingInfobarRequest( | 339 void ChromeGeolocationPermissionContext::CancelPendingInfobarRequest( |
324 const PermissionRequestID& id) { | 340 const PermissionRequestID& id) { |
325 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 341 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
326 if (shutting_down_) | 342 if (shutting_down_) |
327 return; | 343 return; |
328 | 344 |
329 // TODO(gbillock): handle permission bubble cancellation. | 345 if (PermissionBubbleManager::Enabled()) { |
| 346 GeolocationPermissionRequest* cancelling = |
| 347 pending_requests_.get(id.ToString()); |
| 348 content::WebContents* web_contents = tab_util::GetWebContentsByID( |
| 349 id.render_process_id(), id.render_view_id()); |
| 350 if (cancelling != NULL && web_contents != NULL && |
| 351 PermissionBubbleManager::FromWebContents(web_contents) != NULL) { |
| 352 PermissionBubbleManager::FromWebContents(web_contents)-> |
| 353 CancelRequest(cancelling); |
| 354 } |
| 355 return; |
| 356 } |
| 357 |
330 QueueController()->CancelInfoBarRequest(id); | 358 QueueController()->CancelInfoBarRequest(id); |
331 } | 359 } |
OLD | NEW |