// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_GEOLOCATION_GEOLOCATION_PERMISSION_CONTEXT_H_ #define CHROME_BROWSER_GEOLOCATION_GEOLOCATION_PERMISSION_CONTEXT_H_ #include #include #include "base/callback.h" #include "base/containers/scoped_ptr_hash_map.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "chrome/browser/content_settings/permission_queue_controller.h" #include "chrome/browser/geolocation/geolocation_permission_context_extensions.h" namespace content { class WebContents; } class GeolocationPermissionRequest; class PermissionRequestID; class Profile; // This manages Geolocation permissions flow, and delegates UI handling via // PermissionQueueController. class GeolocationPermissionContext : public base::RefCountedThreadSafe { public: explicit GeolocationPermissionContext(Profile* profile); // See ContentBrowserClient method of the same name. void RequestGeolocationPermission( content::WebContents* web_contents, int bridge_id, const GURL& requesting_frame, bool user_gesture, base::Callback result_callback, base::Closure* cancel_callback); // Called on the UI thread when the profile is about to be destroyed. void ShutdownOnUIThread(); // Notifies whether or not the corresponding bridge is allowed to use // geolocation via // GeolocationPermissionContext::SetGeolocationPermissionResponse(). // Called on the UI thread. void NotifyPermissionSet(const PermissionRequestID& id, const GURL& requesting_frame, base::Callback callback, bool allowed); protected: virtual ~GeolocationPermissionContext(); Profile* profile() const { return profile_; } // Return an instance of the infobar queue controller, creating it // if necessary. PermissionQueueController* QueueController(); void CancelGeolocationPermissionRequest( int render_process_id, int render_view_id, int bridge_id); // GeolocationPermissionContext implementation: // Decide whether the geolocation permission should be granted. // Calls PermissionDecided if permission can be decided non-interactively, // or NotifyPermissionSet if permission decided by presenting an // infobar to the user. Called on the UI thread. virtual void DecidePermission(content::WebContents* web_contents, const PermissionRequestID& id, const GURL& requesting_frame, bool user_gesture, const GURL& embedder, const std::string& accept_button_label, base::Callback callback); // Called when permission is granted without interactively asking // the user. Can be overridden to introduce additional UI flow. // Should ultimately ensure that NotifyPermissionSet is called. // Called on the UI thread. virtual void PermissionDecided(const PermissionRequestID& id, const GURL& requesting_frame, const GURL& embedder, base::Callback callback, bool allowed); // Create an PermissionQueueController. overriden in derived classes to // provide additional UI flow. Called on the UI thread. virtual PermissionQueueController* CreateQueueController(); private: friend class base::RefCountedThreadSafe; friend class GeolocationPermissionRequest; // Removes any pending InfoBar request. void CancelPendingInfobarRequest(const PermissionRequestID& id); // Creates and show an info bar. void CreateInfoBarRequest(const PermissionRequestID& id, const GURL& requesting_frame, const GURL& embedder, const std::string accept_button_label, base::Callback callback); // Notify the context that a particular request object is no longer needed. void RequestFinished(GeolocationPermissionRequest* request); // These must only be accessed from the UI thread. Profile* const profile_; bool shutting_down_; scoped_ptr permission_queue_controller_; GeolocationPermissionContextExtensions extensions_context_; base::ScopedPtrHashMap pending_requests_; DISALLOW_COPY_AND_ASSIGN(GeolocationPermissionContext); }; #endif // CHROME_BROWSER_GEOLOCATION_GEOLOCATION_PERMISSION_CONTEXT_H_