Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CONTENT_BROWSER_GEOLOCATION_GEOLOCATION_DISPATCHER_HOST_H_ | 5 #ifndef CONTENT_BROWSER_GEOLOCATION_GEOLOCATION_DISPATCHER_HOST_H_ |
| 6 #define CONTENT_BROWSER_GEOLOCATION_GEOLOCATION_DISPATCHER_HOST_H_ | 6 #define CONTENT_BROWSER_GEOLOCATION_GEOLOCATION_DISPATCHER_HOST_H_ |
| 7 | 7 |
| 8 #include <map> | |
| 9 #include <set> | |
| 10 | |
| 11 #include "content/browser/geolocation/geolocation_provider_impl.h" | 8 #include "content/browser/geolocation/geolocation_provider_impl.h" |
| 12 #include "content/public/browser/browser_message_filter.h" | 9 #include "content/public/browser/web_contents_observer.h" |
| 13 | 10 |
| 14 class GURL; | 11 class GURL; |
| 15 | 12 |
| 16 namespace content { | 13 namespace content { |
| 17 | 14 |
| 18 class GeolocationPermissionContext; | 15 class GeolocationPermissionContext; |
| 19 | 16 |
| 20 // GeolocationDispatcherHost is a browser filter for Geolocation messages. | 17 // GeolocationDispatcherHost is an observer for Geolocation messages. |
| 21 // It's the complement of GeolocationDispatcher (owned by RenderView). | 18 // It's the complement of GeolocationDispatcher (owned by RenderView). |
| 22 class GeolocationDispatcherHost : public BrowserMessageFilter { | 19 class GeolocationDispatcherHost : public WebContentsObserver { |
| 23 public: | 20 public: |
| 24 GeolocationDispatcherHost( | 21 explicit GeolocationDispatcherHost(WebContents* web_contents); |
| 25 int render_process_id, | 22 virtual ~GeolocationDispatcherHost(); |
| 26 GeolocationPermissionContext* geolocation_permission_context); | |
| 27 | 23 |
| 28 // Pause or resumes geolocation for the given |render_view_id|. Should | 24 // Pause or resumes geolocation. Resuming when nothing is paused is a no-op. |
| 29 // be called on the IO thread. Resuming when nothing is paused is a no-op. | 25 // If the web contents is paused while not currently using geolocation but |
| 30 // If a renderer is paused while not currently using geolocation but | 26 // then goes on to do so before being resumed, then it will not get |
| 31 // then goes on to do so before being resumed, then that renderer will | 27 // geolocation updates until it is resumed. |
| 32 // not get geolocation updates until it is resumed. | 28 void PauseOrResume(bool should_pause); |
| 33 void PauseOrResume(int render_view_id, bool should_pause); | |
| 34 | 29 |
| 35 private: | 30 private: |
| 36 virtual ~GeolocationDispatcherHost(); | 31 // WebContentsObserver |
| 37 | 32 virtual void RenderViewHostChanged(RenderViewHost* old_host, |
| 38 // GeolocationDispatcherHost | 33 RenderViewHost* new_host) OVERRIDE; |
| 39 virtual bool OnMessageReceived(const IPC::Message& msg, | 34 virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; |
| 40 bool* msg_was_ok) OVERRIDE; | |
| 41 | 35 |
| 42 // Message handlers: | 36 // Message handlers: |
| 43 void OnRequestPermission(int render_view_id, | 37 void OnRequestPermission(int bridge_id, |
| 44 int bridge_id, | |
| 45 const GURL& requesting_frame, | 38 const GURL& requesting_frame, |
| 46 bool user_gesture); | 39 bool user_gesture); |
| 47 void OnCancelPermissionRequest(int render_view_id, | 40 void OnCancelPermissionRequest(int bridge_id, |
| 48 int bridge_id, | |
| 49 const GURL& requesting_frame); | 41 const GURL& requesting_frame); |
| 50 void OnStartUpdating(int render_view_id, | 42 void OnStartUpdating(const GURL& requesting_frame, |
| 51 const GURL& requesting_frame, | |
| 52 bool enable_high_accuracy); | 43 bool enable_high_accuracy); |
| 53 void OnStopUpdating(int render_view_id); | 44 void OnStopUpdating(); |
| 54 | 45 |
| 55 // Updates the |geolocation_provider_| with the currently required update | 46 // Updates the geolocation provider with the currently required update |
| 56 // options. | 47 // options. |
| 57 void RefreshGeolocationOptions(); | 48 void RefreshGeolocationOptions(); |
| 58 | 49 |
| 59 void OnLocationUpdate(const Geoposition& position); | 50 void OnLocationUpdate(const Geoposition& position); |
| 60 | 51 |
| 61 int render_process_id_; | |
| 62 scoped_refptr<GeolocationPermissionContext> geolocation_permission_context_; | 52 scoped_refptr<GeolocationPermissionContext> geolocation_permission_context_; |
| 63 | 53 |
| 64 struct RendererGeolocationOptions { | 54 bool watching_requested_; |
| 65 bool high_accuracy; | 55 bool paused_; |
| 66 bool is_paused; | 56 bool high_accuracy_; |
| 67 }; | |
| 68 | 57 |
| 69 // Used to keep track of the renderers in this process that are using | 58 scoped_ptr<content::GeolocationProvider::Subscription> |
|
Michael van Ouwerkerk
2014/05/08 13:20:02
nit: no need for content::
jam
2014/05/08 15:04:58
Done.
| |
| 70 // geolocation and the options associated with them. The map is iterated | 59 geolocation_subscription_; |
| 71 // when a location update is available and the fan out to individual bridge | |
| 72 // IDs happens renderer side, in order to minimize context switches. | |
| 73 // Only used on the IO thread. | |
| 74 std::map<int, RendererGeolocationOptions> geolocation_renderers_; | |
| 75 | |
| 76 // Used by Android WebView to support that case that a renderer is in the | |
| 77 // 'paused' state but not yet using geolocation. If the renderer does start | |
| 78 // using geolocation while paused, we move from this set into | |
| 79 // |geolocation_renderers_|. If the renderer doesn't end up wanting to use | |
| 80 // geolocation while 'paused' then we remove from this set. A renderer id | |
| 81 // can exist only in this set or |geolocation_renderers_|, never both. | |
| 82 std::set<int> pending_paused_geolocation_renderers_; | |
| 83 | |
| 84 // Only set whilst we are registered with the geolocation provider. | |
| 85 GeolocationProviderImpl* geolocation_provider_; | |
| 86 | |
| 87 GeolocationProviderImpl::LocationUpdateCallback callback_; | |
| 88 | 60 |
| 89 DISALLOW_COPY_AND_ASSIGN(GeolocationDispatcherHost); | 61 DISALLOW_COPY_AND_ASSIGN(GeolocationDispatcherHost); |
| 90 }; | 62 }; |
| 91 | 63 |
| 92 } // namespace content | 64 } // namespace content |
| 93 | 65 |
| 94 #endif // CONTENT_BROWSER_GEOLOCATION_GEOLOCATION_DISPATCHER_HOST_H_ | 66 #endif // CONTENT_BROWSER_GEOLOCATION_GEOLOCATION_DISPATCHER_HOST_H_ |
| OLD | NEW |