15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef CHROME_BROWSER_GEOLOCATION_GEOLOCATION_PERMISSION_CONTEXT_H_
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define CHROME_BROWSER_GEOLOCATION_GEOLOCATION_PERMISSION_CONTEXT_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/callback.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/containers/scoped_ptr_hash_map.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/ref_counted.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
15a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "chrome/browser/content_settings/permission_queue_controller.h"
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/geolocation/geolocation_permission_context_extensions.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content {
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class WebContents;
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class GeolocationPermissionRequest;
23a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass PermissionRequestID;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// This manages Geolocation permissions flow, and delegates UI handling via
27a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// PermissionQueueController.
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class GeolocationPermissionContext
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : public base::RefCountedThreadSafe<GeolocationPermissionContext> {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  explicit GeolocationPermissionContext(Profile* profile);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // See ContentBrowserClient method of the same name.
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void RequestGeolocationPermission(
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      content::WebContents* web_contents,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int bridge_id,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& requesting_frame,
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      bool user_gesture,
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::Callback<void(bool)> result_callback,
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::Closure* cancel_callback);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called on the UI thread when the profile is about to be destroyed.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ShutdownOnUIThread();
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifies whether or not the corresponding bridge is allowed to use
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // geolocation via
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GeolocationPermissionContext::SetGeolocationPermissionResponse().
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called on the UI thread.
49a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  void NotifyPermissionSet(const PermissionRequestID& id,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const GURL& requesting_frame,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::Callback<void(bool)> callback,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           bool allowed);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual ~GeolocationPermissionContext();
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Profile* profile() const { return profile_; }
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Return an instance of the infobar queue controller, creating it
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // if necessary.
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PermissionQueueController* QueueController();
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void CancelGeolocationPermissionRequest(
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      int render_process_id,
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      int render_view_id,
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      int bridge_id);
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // GeolocationPermissionContext implementation:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Decide whether the geolocation permission should be granted.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls PermissionDecided if permission can be decided non-interactively,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or NotifyPermissionSet if permission decided by presenting an
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // infobar to the user. Called on the UI thread.
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DecidePermission(content::WebContents* web_contents,
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                const PermissionRequestID& id,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const GURL& requesting_frame,
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                bool user_gesture,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const GURL& embedder,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                base::Callback<void(bool)> callback);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when permission is granted without interactively asking
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the user. Can be overridden to introduce additional UI flow.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should ultimately ensure that NotifyPermissionSet is called.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called on the UI thread.
84a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  virtual void PermissionDecided(const PermissionRequestID& id,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const GURL& requesting_frame,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const GURL& embedder,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::Callback<void(bool)> callback,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool allowed);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Create an PermissionQueueController. overriden in derived classes to
91a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // provide additional UI flow.  Called on the UI thread.
92a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  virtual PermissionQueueController* CreateQueueController();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  friend class base::RefCountedThreadSafe<GeolocationPermissionContext>;
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  friend class GeolocationPermissionRequest;
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes any pending InfoBar request.
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void CancelPendingInfobarRequest(const PermissionRequestID& id);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Creates and show an info bar.
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void CreateInfoBarRequest(const PermissionRequestID& id,
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            const GURL& requesting_frame,
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            const GURL& embedder,
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            base::Callback<void(bool)> callback);
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Notify the context that a particular request object is no longer needed.
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void RequestFinished(GeolocationPermissionRequest* request);
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // These must only be accessed from the UI thread.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* const profile_;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool shutting_down_;
113a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  scoped_ptr<PermissionQueueController> permission_queue_controller_;
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GeolocationPermissionContextExtensions extensions_context_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ScopedPtrHashMap<std::string, GeolocationPermissionRequest>
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      pending_requests_;
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GeolocationPermissionContext);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // CHROME_BROWSER_GEOLOCATION_GEOLOCATION_PERMISSION_CONTEXT_H_
123