- add sources.
[platform/framework/web/crosswalk.git] / src / content / browser / browser_plugin / browser_plugin_geolocation_permission_context.cc
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::
17     BrowserPluginGeolocationPermissionContext() {
18 }
19
20 BrowserPluginGeolocationPermissionContext::
21     ~BrowserPluginGeolocationPermissionContext() {
22 }
23
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::
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