• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 CONTENT_BROWSER_GEOLOCATION_GEOLOCATION_DISPATCHER_HOST_H_
6 #define CONTENT_BROWSER_GEOLOCATION_GEOLOCATION_DISPATCHER_HOST_H_
7 
8 #include <map>
9 #include <vector>
10 
11 #include "base/callback_forward.h"
12 #include "base/memory/weak_ptr.h"
13 #include "content/browser/geolocation/geolocation_provider_impl.h"
14 #include "content/public/browser/web_contents_observer.h"
15 
16 class GURL;
17 
18 namespace content {
19 
20 // GeolocationDispatcherHost is an observer for Geolocation messages.
21 // It's the complement of GeolocationDispatcher (owned by RenderView).
22 class GeolocationDispatcherHost : public WebContentsObserver {
23  public:
24   explicit GeolocationDispatcherHost(WebContents* web_contents);
25   virtual ~GeolocationDispatcherHost();
26 
27   // Pause or resumes geolocation. Resuming when nothing is paused is a no-op.
28   // If the web contents is paused while not currently using geolocation but
29   // then goes on to do so before being resumed, then it will not get
30   // geolocation updates until it is resumed.
31   void PauseOrResume(bool should_pause);
32 
33  private:
34   // WebContentsObserver
35   virtual void RenderFrameDeleted(RenderFrameHost* render_frame_host) OVERRIDE;
36   virtual void RenderViewHostChanged(RenderViewHost* old_host,
37                                      RenderViewHost* new_host) OVERRIDE;
38   virtual bool OnMessageReceived(
39       const IPC::Message& msg, RenderFrameHost* render_frame_host) OVERRIDE;
40 
41   // Message handlers:
42   void OnRequestPermission(RenderFrameHost* render_frame_host,
43                            int bridge_id,
44                            const GURL& requesting_frame,
45                            bool user_gesture);
46   void OnCancelPermissionRequest(RenderFrameHost* render_frame_host,
47                                  int bridge_id,
48                                  const GURL& requesting_frame);
49   void OnStartUpdating(RenderFrameHost* render_frame_host,
50                        const GURL& requesting_frame,
51                        bool enable_high_accuracy);
52   void OnStopUpdating(RenderFrameHost* render_frame_host);
53 
54   // Updates the geolocation provider with the currently required update
55   // options.
56   void RefreshGeolocationOptions();
57 
58   void OnLocationUpdate(const Geoposition& position);
59 
60   void SendGeolocationPermissionResponse(int render_process_id,
61                                          int render_frame_id,
62                                          int bridge_id,
63                                          bool allowed);
64 
65   // A map from the RenderFrameHosts that have requested geolocation updates to
66   // the type of accuracy they requested (true = high accuracy).
67   std::map<RenderFrameHost*, bool> updating_frames_;
68   bool paused_;
69 
70   struct PendingPermission {
71     PendingPermission(int render_frame_id,
72                       int render_process_id,
73                       int bridge_id);
74     ~PendingPermission();
75     int render_frame_id;
76     int render_process_id;
77     int bridge_id;
78     base::Closure cancel;
79   };
80   std::vector<PendingPermission> pending_permissions_;
81 
82   scoped_ptr<GeolocationProvider::Subscription> geolocation_subscription_;
83 
84   base::WeakPtrFactory<GeolocationDispatcherHost> weak_factory_;
85 
86   DISALLOW_COPY_AND_ASSIGN(GeolocationDispatcherHost);
87 };
88 
89 }  // namespace content
90 
91 #endif  // CONTENT_BROWSER_GEOLOCATION_GEOLOCATION_DISPATCHER_HOST_H_
92