namespace content {
class LocationArbitrator;
-// This is the main API to the geolocation subsystem. The application will hold
-// a single instance of this class and can register multiple clients to be
-// notified of location changes:
-// * Callbacks are registered by AddLocationUpdateCallback() and will keep
-// receiving updates until unregistered by RemoveLocationUpdateCallback().
-// The application must instantiate the GeolocationProvider on the IO thread and
-// must communicate with it on the same thread.
-// The underlying location arbitrator will only be enabled whilst there is at
-// least one registered observer or pending callback. The arbitrator and the
-// location providers it uses run on a separate Geolocation thread.
class CONTENT_EXPORT GeolocationProviderImpl
: public NON_EXPORTED_BASE(GeolocationProvider),
public base::Thread {
public:
// GeolocationProvider implementation:
- virtual void AddLocationUpdateCallback(const LocationUpdateCallback& callback,
- bool use_high_accuracy) OVERRIDE;
- virtual bool RemoveLocationUpdateCallback(
- const LocationUpdateCallback& callback) OVERRIDE;
+ virtual scoped_ptr<GeolocationProvider::Subscription>
+ AddLocationUpdateCallback(const LocationUpdateCallback& callback,
+ bool use_high_accuracy) OVERRIDE;
virtual void UserDidOptIntoLocationServices() OVERRIDE;
-
- bool LocationServicesOptedIn() const;
-
- // Overrides the location for automation/testing. Suppresses any further
- // updates from the actual providers and sends an update with the overridden
- // position to all registered clients.
- void OverrideLocationForTesting(const Geoposition& override_position);
+ virtual void OverrideLocationForTesting(const Geoposition& position) OVERRIDE;
// Callback from the LocationArbitrator. Public for testing.
void OnLocationUpdate(const Geoposition& position);
// Gets a pointer to the singleton instance of the location relayer, which
// is in turn bound to the browser's global context objects. This must only be
- // called on the IO thread so that the GeolocationProviderImpl is always
+ // called on the UI thread so that the GeolocationProviderImpl is always
// instantiated on the same thread. Ownership is NOT returned.
static GeolocationProviderImpl* GetInstance();
+ bool user_did_opt_into_location_services_for_testing() {
+ return user_did_opt_into_location_services_;
+ }
+
protected:
friend struct DefaultSingletonTraits<GeolocationProviderImpl>;
GeolocationProviderImpl();
virtual LocationArbitrator* CreateArbitrator();
private:
- typedef std::pair<LocationUpdateCallback, bool> LocationUpdateInfo;
- typedef std::list<LocationUpdateInfo> CallbackList;
-
bool OnGeolocationThread() const;
// Start and stop providers as needed when clients are added or removed.
virtual void Init() OVERRIDE;
virtual void CleanUp() OVERRIDE;
- // Only used on the IO thread
- CallbackList callbacks_;
+ base::CallbackList<void(const Geoposition&)> high_accuracy_callbacks_;
+ base::CallbackList<void(const Geoposition&)> low_accuracy_callbacks_;
+
bool user_did_opt_into_location_services_;
Geoposition position_;