Index: third_party/WebKit/Source/modules/geolocation/Geolocation.h |
diff --git a/third_party/WebKit/Source/modules/geolocation/Geolocation.h b/third_party/WebKit/Source/modules/geolocation/Geolocation.h |
index 6518b959b7977789051bfb3c7acc4774cf8be38b..8c41a8b9205ed15d0bc341523a6f20b7792cee7a 100644 |
--- a/third_party/WebKit/Source/modules/geolocation/Geolocation.h |
+++ b/third_party/WebKit/Source/modules/geolocation/Geolocation.h |
@@ -28,7 +28,8 @@ |
#define Geolocation_h |
#include "bindings/core/v8/ScriptWrappable.h" |
-#include "core/dom/ActiveDOMObject.h" |
+#include "core/dom/ContextLifecycleObserver.h" |
+#include "core/page/PageLifecycleObserver.h" |
#include "modules/ModulesExport.h" |
#include "modules/geolocation/GeoNotifier.h" |
#include "modules/geolocation/GeolocationWatchers.h" |
@@ -39,6 +40,9 @@ |
#include "modules/geolocation/PositionOptions.h" |
#include "platform/Timer.h" |
#include "platform/heap/Handle.h" |
+#include "third_party/WebKit/public/platform/modules/geolocation/geolocation.mojom-blink.h" |
+#include "third_party/WebKit/public/platform/modules/permissions/permission.mojom-blink.h" |
+#include "third_party/WebKit/public/platform/modules/permissions/permission_status.mojom-blink.h" |
namespace blink { |
@@ -50,15 +54,18 @@ class ExecutionContext; |
class MODULES_EXPORT Geolocation final |
: public GarbageCollectedFinalized<Geolocation> |
, public ScriptWrappable |
- , public ActiveDOMObject { |
+ , public ContextLifecycleObserver |
+ , public PageLifecycleObserver { |
DEFINE_WRAPPERTYPEINFO(); |
USING_GARBAGE_COLLECTED_MIXIN(Geolocation); |
public: |
static Geolocation* create(ExecutionContext*); |
- ~Geolocation() override; |
+ ~Geolocation(); |
DECLARE_VIRTUAL_TRACE(); |
- void stop() override; |
+ // Inherited from ContextLifecycleObserver AND PageLifecycleObserver. |
+ void contextDestroyed() override; |
+ |
Document* document() const; |
LocalFrame* frame() const; |
@@ -73,17 +80,12 @@ public: |
// Removes all references to the watcher, it will not be updated again. |
void clearWatch(int watchID); |
- void setIsAllowed(bool); |
- |
bool isAllowed() const { return m_geolocationPermission == PermissionAllowed; } |
// Notifies this that a new position is available. Must never be called |
// before permission is granted by the user. |
void positionChanged(); |
- // Notifies this that an error has occurred, it must be handled immediately. |
- void setError(GeolocationError*); |
- |
// Discards the notifier because a fatal error occurred for it. |
void fatalErrorOccurred(GeoNotifier*); |
@@ -95,10 +97,10 @@ public: |
// Discards the notifier if it is a oneshot because it timed it. |
void requestTimedOut(GeoNotifier*); |
-private: |
- // Returns the last known position, if any. May return null. |
- Geoposition* lastPosition(); |
+ // Inherited from PageLifecycleObserver. |
+ void pageVisibilityChanged() override; |
+private: |
bool isDenied() const { return m_geolocationPermission == PermissionDenied; } |
explicit Geolocation(ExecutionContext*); |
@@ -141,33 +143,37 @@ private: |
// Requests permission to share positions with the page. |
void requestPermission(); |
- // Attempts to register this with the controller for receiving updates. |
- // Returns false if there is no controller to register with. |
- bool startUpdating(GeoNotifier*); |
+ // Connects to the Geolocation mojo service and starts polling for updates. |
+ void startUpdating(GeoNotifier*); |
void stopUpdating(); |
- // Processes the notifiers that were waiting for a permission decision. If |
- // granted and this can be registered with the controller then the |
- // notifier's timers are started. Otherwise, a fatal error is set on them. |
- void handlePendingPermissionNotifiers(); |
+ void updateGeolocationServiceConnection(); |
+ void queryNextPosition(); |
// Attempts to obtain a position for the given notifier, either by using |
- // the cached position or by requesting one from the controller. Sets a |
- // fatal error if permission is denied or no position can be obtained. |
+ // the cached position or by requesting one from the GeolocationService. |
+ // Sets a fatal error if permission is denied or no position can be |
+ // obtained. |
void startRequest(GeoNotifier*); |
bool haveSuitableCachedPosition(const PositionOptions&); |
- // Runs the success callbacks for the set of notifiers awaiting a cached |
- // position, the set is then cleared. The oneshots are removed everywhere. |
- void makeCachedPositionCallbacks(); |
- |
// Record whether the origin trying to access Geolocation would be allowed |
// to access a feature that can only be accessed by secure origins. |
// See https://goo.gl/Y0ZkNV |
void recordOriginTypeAccess() const; |
+ void onPositionUpdated(mojom::blink::GeopositionPtr); |
+ |
+ // Processes the notifiers that were waiting for a permission decision. If |
+ // granted then the notifier's timers are started. Otherwise, a fatal error |
+ // is set on them. |
+ void onGeolocationPermissionUpdated(mojom::blink::PermissionStatus); |
+ |
+ void onGeolocationConnectionError(); |
+ void onPermissionConnectionError(); |
+ |
GeoNotifierSet m_oneShots; |
GeolocationWatchers m_watchers; |
GeoNotifierSet m_pendingForPermissionNotifiers; |
@@ -184,8 +190,17 @@ private: |
}; |
Permission m_geolocationPermission; |
+ mojom::blink::GeolocationServicePtr m_geolocationService; |
+ bool m_enableHighAccuracy = false; |
+ mojom::blink::PermissionServicePtr m_permissionService; |
+ |
+ // Whether a GeoNotifier is waiting for a position update. |
+ bool m_updating = false; |
- GeoNotifierSet m_requestsAwaitingCachedPosition; |
+ // Set to true when m_geolocationService is disconnected. This is used to |
+ // detect when m_geolocationService is disconnected and reconnected while |
+ // running callbacks in response to a call to onPositionUpdated(). |
+ bool m_disconnectedGeolocationService = false; |
}; |
} // namespace blink |