Home | History | Annotate | Download | only in geolocation
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_GEOLOCATION_GEOLOCATION_PERMISSION_CONTEXT_H_
      6 #define CHROME_BROWSER_GEOLOCATION_GEOLOCATION_PERMISSION_CONTEXT_H_
      7 
      8 #include <map>
      9 #include <string>
     10 
     11 #include "base/callback.h"
     12 #include "base/containers/scoped_ptr_hash_map.h"
     13 #include "base/memory/ref_counted.h"
     14 #include "base/memory/scoped_ptr.h"
     15 #include "chrome/browser/content_settings/permission_queue_controller.h"
     16 #include "chrome/browser/geolocation/geolocation_permission_context_extensions.h"
     17 
     18 namespace content {
     19 class WebContents;
     20 }
     21 
     22 class GeolocationPermissionRequest;
     23 class PermissionRequestID;
     24 class Profile;
     25 
     26 // This manages Geolocation permissions flow, and delegates UI handling via
     27 // PermissionQueueController.
     28 class GeolocationPermissionContext
     29     : public base::RefCountedThreadSafe<GeolocationPermissionContext> {
     30  public:
     31   explicit GeolocationPermissionContext(Profile* profile);
     32 
     33   // See ContentBrowserClient method of the same name.
     34   void RequestGeolocationPermission(
     35       content::WebContents* web_contents,
     36       int bridge_id,
     37       const GURL& requesting_frame,
     38       bool user_gesture,
     39       base::Callback<void(bool)> result_callback,
     40       base::Closure* cancel_callback);
     41 
     42   // Called on the UI thread when the profile is about to be destroyed.
     43   void ShutdownOnUIThread();
     44 
     45   // Notifies whether or not the corresponding bridge is allowed to use
     46   // geolocation via
     47   // GeolocationPermissionContext::SetGeolocationPermissionResponse().
     48   // Called on the UI thread.
     49   void NotifyPermissionSet(const PermissionRequestID& id,
     50                            const GURL& requesting_frame,
     51                            base::Callback<void(bool)> callback,
     52                            bool allowed);
     53 
     54  protected:
     55   virtual ~GeolocationPermissionContext();
     56 
     57   Profile* profile() const { return profile_; }
     58 
     59   // Return an instance of the infobar queue controller, creating it
     60   // if necessary.
     61   PermissionQueueController* QueueController();
     62 
     63   void CancelGeolocationPermissionRequest(
     64       int render_process_id,
     65       int render_view_id,
     66       int bridge_id);
     67 
     68   // GeolocationPermissionContext implementation:
     69   // Decide whether the geolocation permission should be granted.
     70   // Calls PermissionDecided if permission can be decided non-interactively,
     71   // or NotifyPermissionSet if permission decided by presenting an
     72   // infobar to the user. Called on the UI thread.
     73   virtual void DecidePermission(content::WebContents* web_contents,
     74                                 const PermissionRequestID& id,
     75                                 const GURL& requesting_frame,
     76                                 bool user_gesture,
     77                                 const GURL& embedder,
     78                                 const std::string& accept_button_label,
     79                                 base::Callback<void(bool)> callback);
     80 
     81   // Called when permission is granted without interactively asking
     82   // the user. Can be overridden to introduce additional UI flow.
     83   // Should ultimately ensure that NotifyPermissionSet is called.
     84   // Called on the UI thread.
     85   virtual void PermissionDecided(const PermissionRequestID& id,
     86                                  const GURL& requesting_frame,
     87                                  const GURL& embedder,
     88                                  base::Callback<void(bool)> callback,
     89                                  bool allowed);
     90 
     91   // Create an PermissionQueueController. overriden in derived classes to
     92   // provide additional UI flow.  Called on the UI thread.
     93   virtual PermissionQueueController* CreateQueueController();
     94 
     95  private:
     96   friend class base::RefCountedThreadSafe<GeolocationPermissionContext>;
     97   friend class GeolocationPermissionRequest;
     98 
     99   // Removes any pending InfoBar request.
    100   void CancelPendingInfobarRequest(const PermissionRequestID& id);
    101 
    102   // Creates and show an info bar.
    103   void CreateInfoBarRequest(const PermissionRequestID& id,
    104                             const GURL& requesting_frame,
    105                             const GURL& embedder,
    106                             const std::string accept_button_label,
    107                             base::Callback<void(bool)> callback);
    108 
    109   // Notify the context that a particular request object is no longer needed.
    110   void RequestFinished(GeolocationPermissionRequest* request);
    111 
    112   // These must only be accessed from the UI thread.
    113   Profile* const profile_;
    114   bool shutting_down_;
    115   scoped_ptr<PermissionQueueController> permission_queue_controller_;
    116   GeolocationPermissionContextExtensions extensions_context_;
    117 
    118   base::ScopedPtrHashMap<std::string, GeolocationPermissionRequest>
    119       pending_requests_;
    120 
    121   DISALLOW_COPY_AND_ASSIGN(GeolocationPermissionContext);
    122 };
    123 
    124 #endif  // CHROME_BROWSER_GEOLOCATION_GEOLOCATION_PERMISSION_CONTEXT_H_
    125