| // 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 CONTENT_BROWSER_GEOLOCATION_GEOLOCATION_DISPATCHER_HOST_H_ |
| #define CONTENT_BROWSER_GEOLOCATION_GEOLOCATION_DISPATCHER_HOST_H_ |
| |
| #include <map> |
| #include <vector> |
| |
| #include "base/callback_forward.h" |
| #include "base/memory/weak_ptr.h" |
| #include "content/browser/geolocation/geolocation_provider_impl.h" |
| #include "content/public/browser/web_contents_observer.h" |
| |
| class GURL; |
| |
| namespace content { |
| |
| // GeolocationDispatcherHost is an observer for Geolocation messages. |
| // It's the complement of GeolocationDispatcher (owned by RenderView). |
| class GeolocationDispatcherHost : public WebContentsObserver { |
| public: |
| explicit GeolocationDispatcherHost(WebContents* web_contents); |
| virtual ~GeolocationDispatcherHost(); |
| |
| // Pause or resumes geolocation. Resuming when nothing is paused is a no-op. |
| // If the web contents is paused while not currently using geolocation but |
| // then goes on to do so before being resumed, then it will not get |
| // geolocation updates until it is resumed. |
| void PauseOrResume(bool should_pause); |
| |
| private: |
| // WebContentsObserver |
| virtual void RenderFrameDeleted(RenderFrameHost* render_frame_host) OVERRIDE; |
| virtual void RenderViewHostChanged(RenderViewHost* old_host, |
| RenderViewHost* new_host) OVERRIDE; |
| virtual bool OnMessageReceived( |
| const IPC::Message& msg, RenderFrameHost* render_frame_host) OVERRIDE; |
| |
| // Message handlers: |
| void OnRequestPermission(RenderFrameHost* render_frame_host, |
| int bridge_id, |
| const GURL& requesting_frame, |
| bool user_gesture); |
| void OnCancelPermissionRequest(RenderFrameHost* render_frame_host, |
| int bridge_id, |
| const GURL& requesting_frame); |
| void OnStartUpdating(RenderFrameHost* render_frame_host, |
| const GURL& requesting_frame, |
| bool enable_high_accuracy); |
| void OnStopUpdating(RenderFrameHost* render_frame_host); |
| |
| // Updates the geolocation provider with the currently required update |
| // options. |
| void RefreshGeolocationOptions(); |
| |
| void OnLocationUpdate(const Geoposition& position); |
| |
| void SendGeolocationPermissionResponse(int render_process_id, |
| int render_frame_id, |
| int bridge_id, |
| bool allowed); |
| |
| // A map from the RenderFrameHosts that have requested geolocation updates to |
| // the type of accuracy they requested (true = high accuracy). |
| std::map<RenderFrameHost*, bool> updating_frames_; |
| bool paused_; |
| |
| struct PendingPermission { |
| PendingPermission(int render_frame_id, |
| int render_process_id, |
| int bridge_id); |
| ~PendingPermission(); |
| int render_frame_id; |
| int render_process_id; |
| int bridge_id; |
| base::Closure cancel; |
| }; |
| std::vector<PendingPermission> pending_permissions_; |
| |
| scoped_ptr<GeolocationProvider::Subscription> geolocation_subscription_; |
| |
| base::WeakPtrFactory<GeolocationDispatcherHost> weak_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(GeolocationDispatcherHost); |
| }; |
| |
| } // namespace content |
| |
| #endif // CONTENT_BROWSER_GEOLOCATION_GEOLOCATION_DISPATCHER_HOST_H_ |