Home | History | Annotate | Download | only in browser_plugin
      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
     95