// 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_