Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(991)

Unified Diff: content/browser/geolocation/geolocation_provider.h

Issue 10344004: Add content API for requesting the current geolocation (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: *Argh*, missed another forward declaration of a struct as a class. Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/geolocation/geolocation_provider.h
diff --git a/content/browser/geolocation/geolocation_provider.h b/content/browser/geolocation/geolocation_provider.h
index b28b4ee5a64f2b84b08f12f32774a7aba10361a4..30ae4650fc63d5f7eaecfe2c827eecdcc4d19b2c 100644
--- a/content/browser/geolocation/geolocation_provider.h
+++ b/content/browser/geolocation/geolocation_provider.h
@@ -7,33 +7,40 @@
#pragma once
#include <map>
+#include <vector>
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
#include "base/threading/thread.h"
#include "content/browser/geolocation/geolocation_observer.h"
#include "content/common/content_export.h"
+#include "content/public/browser/geolocation.h"
#include "content/public/common/geoposition.h"
class GeolocationArbitrator;
-
-template<typename Type>
-struct DefaultSingletonTraits;
-
-// This is the main API to the geolocation subsystem. The application
-// will hold a single instance of this class, and can register multiple
-// observers which will be notified of location updates. Underlying location
-// arbitrator will only be enabled whilst there is at least one observer
-// registered.
+class GeolocationProviderTest;
+template<typename Type> struct DefaultSingletonTraits;
+
+// 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:
+// * Observers are registered by AddObserver() and will keep receiving updates
+// until unregistered by RemoveObserver().
+// * Callbacks are registered by RequestCallback() and will be called exactly
+// once when the next update becomes available.
+// 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 GeolocationProvider
: public base::Thread, public GeolocationObserver {
public:
- GeolocationProvider();
-
- // Must be called from the same thread as the GeolocationProvider was created
- // on. The GeolocationObserverOptions passed are used as a 'hint' for the
- // provider preferences for this particular observer, however the observer
- // could receive callbacks for best available locations from any active
- // provider whilst it is registered.
- // If an existing observer is added a second time it's options are updated
+ // The GeolocationObserverOptions passed are used as a 'hint' for the provider
+ // preferences for this particular observer, however the observer could
+ // receive updates for best available locations from any active provider
+ // whilst it is registered.
+ // If an existing observer is added a second time, its options are updated
// but only a single call to RemoveObserver() is required to remove it.
void AddObserver(GeolocationObserver* delegate,
const GeolocationObserverOptions& update_options);
@@ -42,61 +49,70 @@ class CONTENT_EXPORT GeolocationProvider
// via AddObserver(). Returns true if the observer was removed.
bool RemoveObserver(GeolocationObserver* delegate);
+ // Request a single callback when the next location update becomes available.
+ // Callbacks must only be requested by code that is allowed to access the
+ // location. No further permission checks will be made.
+ void RequestCallback(const content::GeolocationUpdateCallback& callback);
+
void OnPermissionGranted();
bool HasPermissionBeenGranted() const;
- // GeolocationObserver
+ // GeolocationObserver implementation.
virtual void OnLocationUpdate(const content::Geoposition& position) OVERRIDE;
- // Overrides the location for automation/testing. Updates any current
- // observers with the overriden position. Any further updates from location
- // providers will be ignored.
+ // 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 content::Geoposition& override_position);
// Gets a pointer to the singleton instance of the location relayer, which
- // is in turn bound to the browser's global context objects. Ownership is NOT
- // returned.
+ // is in turn bound to the browser's global context objects. This must only be
+ // called on the IO thread so that the GeolocationProvider is always
+ // instantiated on the same thread. Ownership is NOT returned.
static GeolocationProvider* GetInstance();
+ protected:
+ friend struct DefaultSingletonTraits<GeolocationProvider>;
+ GeolocationProvider();
+ virtual ~GeolocationProvider();
+
+ private:
typedef std::map<GeolocationObserver*, GeolocationObserverOptions>
ObserverMap;
- private:
- friend struct DefaultSingletonTraits<GeolocationProvider>;
- virtual ~GeolocationProvider();
+ typedef std::vector<content::GeolocationUpdateCallback> CallbackList;
- bool OnClientThread() const;
bool OnGeolocationThread() const;
- // When the observer list changes, we may start the thread and the required
- // providers, or stop them.
- void OnObserversChanged();
+ // Start and stop providers as needed when clients are added or removed.
+ void OnClientsChanged();
- // Stop the providers when there are no more observers. Note that once our
- // thread is started, we'll keep it alive (but with no pending messages).
+ // Stops the providers when there are no more registered clients. Note that
+ // once the Geolocation thread is started, it will stay alive (but sitting
+ // idle without any pending messages).
void StopProviders();
- // Starts or updates the observers' geolocation options
- // (delegates to arbitrator).
+ // Starts the geolocation providers or updates their options (delegates to
+ // arbitrator).
void StartProviders(const GeolocationObserverOptions& options);
- // Update the providers on the geolocation thread, which must be running.
+ // Updates the providers on the geolocation thread, which must be running.
void InformProvidersPermissionGranted();
- // Notifies observers when a new position fix is available.
- void NotifyObservers(const content::Geoposition& position);
+ // Notifies all registered clients that a position update is available.
+ void NotifyClients(const content::Geoposition& position);
// Thread
virtual void Init() OVERRIDE;
virtual void CleanUp() OVERRIDE;
- scoped_refptr<base::MessageLoopProxy> client_loop_;
-
- // Only used on client thread
+ // Only used on the IO thread
ObserverMap observers_;
+ CallbackList callbacks_;
bool is_permission_granted_;
content::Geoposition position_;
+
// True only in testing, where we want to use a custom position.
bool ignore_location_updates_;
« no previous file with comments | « content/browser/geolocation/geolocation_observer.h ('k') | content/browser/geolocation/geolocation_provider.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698