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
3 // found in the LICENSE file.
4
5 #include "content/browser/browser_plugin/browser_plugin_geolocation_permission_context.h"
6
7 #include "base/bind.h"
8 #include "content/browser/browser_plugin/browser_plugin_guest.h"
9 #include "content/browser/web_contents/web_contents_impl.h"
10 #include "content/public/browser/browser_thread.h"
11 #include "content/public/browser/render_process_host.h"
12 #include "content/public/browser/render_view_host.h"
13
14 namespace content {
15
16 BrowserPluginGeolocationPermissionContext::
BrowserPluginGeolocationPermissionContext()17 BrowserPluginGeolocationPermissionContext() {
18 }
19
20 BrowserPluginGeolocationPermissionContext::
~BrowserPluginGeolocationPermissionContext()21 ~BrowserPluginGeolocationPermissionContext() {
22 }
23
RequestGeolocationPermission(int render_process_id,int render_view_id,int bridge_id,const GURL & requesting_frame,base::Callback<void (bool)> callback)24 void BrowserPluginGeolocationPermissionContext::RequestGeolocationPermission(
25 int render_process_id,
26 int render_view_id,
27 int bridge_id,
28 const GURL& requesting_frame,
29 base::Callback<void(bool)> callback) {
30 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
31 BrowserThread::PostTask(
32 BrowserThread::UI, FROM_HERE,
33 base::Bind(
34 &BrowserPluginGeolocationPermissionContext::
35 RequestGeolocationPermission,
36 this,
37 render_process_id,
38 render_view_id,
39 bridge_id,
40 requesting_frame,
41 callback));
42 return;
43 }
44 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
45
46 // Note that callback.Run(true) allows geolocation access, callback.Run(false)
47 // denies geolocation access.
48 // We need to go to the renderer to ask embedder's js if we are allowed to
49 // have geolocation access.
50 RenderViewHost* rvh = RenderViewHost::FromID(render_process_id,
51 render_view_id);
52 if (rvh) {
53 DCHECK(rvh->GetProcess()->IsGuest());
54 WebContentsImpl* guest_web_contents =
55 static_cast<WebContentsImpl*>(rvh->GetDelegate()->GetAsWebContents());
56 BrowserPluginGuest* guest = guest_web_contents->GetBrowserPluginGuest();
57 guest->AskEmbedderForGeolocationPermission(bridge_id,
58 requesting_frame,
59 callback);
60 }
61 }
62
63 void BrowserPluginGeolocationPermissionContext::
CancelGeolocationPermissionRequest(int render_process_id,int render_view_id,int bridge_id,const GURL & requesting_frame)64 CancelGeolocationPermissionRequest(int render_process_id,
65 int render_view_id,
66 int bridge_id,
67 const GURL& requesting_frame) {
68 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
69 BrowserThread::PostTask(
70 BrowserThread::UI, FROM_HERE,
71 base::Bind(
72 &BrowserPluginGeolocationPermissionContext::
73 CancelGeolocationPermissionRequest,
74 this,
75 render_process_id,
76 render_view_id,
77 bridge_id,
78 requesting_frame));
79 return;
80 }
81 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
82 RenderViewHost* rvh = RenderViewHost::FromID(render_process_id,
83 render_view_id);
84 if (rvh) {
85 DCHECK(rvh->GetProcess()->IsGuest());
86 WebContentsImpl* guest_web_contents =
87 static_cast<WebContentsImpl*>(rvh->GetDelegate()->GetAsWebContents());
88 BrowserPluginGuest* guest = guest_web_contents->GetBrowserPluginGuest();
89 if (guest)
90 guest->CancelGeolocationRequest(bridge_id);
91 }
92 }
93
94 } // namespace content
95