Title: [223192] trunk
Revision
223192
Author
cdu...@apple.com
Date
2017-10-11 10:41:59 -0700 (Wed, 11 Oct 2017)

Log Message

Modernize Geolocation code
https://bugs.webkit.org/show_bug.cgi?id=178148

Reviewed by Ryosuke Niwa.

Source/WebCore:

Modernize Geolocation code:
- Use std::optional<> instead of separate boolean members
- Make GeolocationPosition a simple struct that can be passed via IPC
- Replace WebGeolocationPosition::Data with GeolocationPosition
- Move logic to construct a GeolocationPosition from a CLLocation on iOS
  in one place to avoid code duplication.

* Modules/geolocation/Coordinates.cpp:
(WebCore::Coordinates::Coordinates):
* Modules/geolocation/Coordinates.h:
(WebCore::Coordinates::create):
(WebCore::Coordinates::isolatedCopy const):
(WebCore::Coordinates::latitude const):
(WebCore::Coordinates::longitude const):
(WebCore::Coordinates::altitude const):
(WebCore::Coordinates::accuracy const):
(WebCore::Coordinates::altitudeAccuracy const):
(WebCore::Coordinates::heading const):
(WebCore::Coordinates::speed const):
* Modules/geolocation/Geolocation.cpp:
(WebCore::createGeoposition):
(WebCore::Geolocation::lastPosition):
* Modules/geolocation/GeolocationClient.h:
* Modules/geolocation/GeolocationController.cpp:
(WebCore::GeolocationController::positionChanged):
(WebCore::GeolocationController::lastPosition):
* Modules/geolocation/GeolocationController.h:
* Modules/geolocation/GeolocationPosition.h:
(WebCore::GeolocationPosition::GeolocationPosition):
The default constructor is only needed by our IPC decoding code.

(WebCore::GeolocationPosition::encode const):
(WebCore::GeolocationPosition::decode):
* Modules/geolocation/ios/GeolocationPositionIOS.mm: Copied from Source/WebCore/Modules/geolocation/Coordinates.cpp.
(WebCore::GeolocationPosition::GeolocationPosition):
* WebCore.xcodeproj/project.pbxproj:
* platform/mock/GeolocationClientMock.cpp:
(WebCore::GeolocationClientMock::lastPosition):
(WebCore::GeolocationClientMock::controllerTimerFired):
* platform/mock/GeolocationClientMock.h:

Source/WebKit:

* Shared/WebGeolocationPosition.cpp:
(WebKit::WebGeolocationPosition::create):
(WebKit::WebGeolocationPosition::~WebGeolocationPosition):
* Shared/WebGeolocationPosition.h:
(WebKit::WebGeolocationPosition::timestamp const):
(WebKit::WebGeolocationPosition::latitude const):
(WebKit::WebGeolocationPosition::longitude const):
(WebKit::WebGeolocationPosition::accuracy const):
(WebKit::WebGeolocationPosition::altitude const):
(WebKit::WebGeolocationPosition::altitudeAccuracy const):
(WebKit::WebGeolocationPosition::heading const):
(WebKit::WebGeolocationPosition::speed const):
(WebKit::WebGeolocationPosition::corePosition const):
(WebKit::WebGeolocationPosition::WebGeolocationPosition):
* UIProcess/API/C/WKGeolocationPosition.cpp:
(WKGeolocationPositionCreate_b):
* UIProcess/API/Cocoa/_WKGeolocationPosition.mm:
(WebKit::wrapper):
* UIProcess/API/glib/WebKitGeolocationProvider.cpp:
(WebKit::WebKitGeolocationProvider::notifyPositionChanged):
* UIProcess/WebGeolocationManagerProxy.cpp:
(WebKit::WebGeolocationManagerProxy::providerDidChangePosition):
* UIProcess/ios/WKGeolocationProviderIOS.mm:
(-[WKLegacyCoreLocationProvider positionChanged:]):
* WebProcess/Geolocation/WebGeolocationManager.cpp:
(WebKit::WebGeolocationManager::didChangePosition):
* WebProcess/Geolocation/WebGeolocationManager.h:
* WebProcess/Geolocation/WebGeolocationManager.messages.in:
* WebProcess/WebCoreSupport/WebGeolocationClient.cpp:
(WebKit::WebGeolocationClient::lastPosition):
* WebProcess/WebCoreSupport/WebGeolocationClient.h:

Source/WebKitLegacy/ios:

* Misc/WebGeolocationCoreLocationProvider.h:
* Misc/WebGeolocationCoreLocationProvider.mm:
(-[WebGeolocationCoreLocationProvider sendLocation:]):
* Misc/WebGeolocationProviderIOS.mm:
(-[_WebCoreLocationUpdateThreadingProxy positionChanged:]):

Source/WebKitLegacy/mac:

* WebCoreSupport/WebGeolocationClient.h:
* WebCoreSupport/WebGeolocationClient.mm:
(WebGeolocationClient::lastPosition):
* WebView/WebGeolocationPosition.mm:
(-[WebGeolocationPositionInternal initWithCoreGeolocationPosition:]):
(core):
(-[WebGeolocationPosition initWithTimestamp:latitude:longitude:accuracy:]):
(-[WebGeolocationPosition initWithGeolocationPosition:]):
* WebView/WebGeolocationPositionInternal.h:

Source/WebKitLegacy/win:

* WebCoreSupport/WebGeolocationClient.cpp:
(WebGeolocationClient::lastPosition):
* WebCoreSupport/WebGeolocationClient.h:
* WebGeolocationPosition.cpp:
(WebGeolocationPosition::initWithTimestamp):
(core):
* WebGeolocationPosition.h:
(WebGeolocationPosition::impl const):

Tools:

* DumpRenderTree/mac/TestRunnerMac.mm:
(TestRunner::setMockGeolocationPosition):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (223191 => 223192)


--- trunk/Source/WebCore/ChangeLog	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebCore/ChangeLog	2017-10-11 17:41:59 UTC (rev 223192)
@@ -1,3 +1,51 @@
+2017-10-11  Chris Dumez  <cdu...@apple.com>
+
+        Modernize Geolocation code
+        https://bugs.webkit.org/show_bug.cgi?id=178148
+
+        Reviewed by Ryosuke Niwa.
+
+        Modernize Geolocation code:
+        - Use std::optional<> instead of separate boolean members
+        - Make GeolocationPosition a simple struct that can be passed via IPC
+        - Replace WebGeolocationPosition::Data with GeolocationPosition
+        - Move logic to construct a GeolocationPosition from a CLLocation on iOS
+          in one place to avoid code duplication.
+
+        * Modules/geolocation/Coordinates.cpp:
+        (WebCore::Coordinates::Coordinates):
+        * Modules/geolocation/Coordinates.h:
+        (WebCore::Coordinates::create):
+        (WebCore::Coordinates::isolatedCopy const):
+        (WebCore::Coordinates::latitude const):
+        (WebCore::Coordinates::longitude const):
+        (WebCore::Coordinates::altitude const):
+        (WebCore::Coordinates::accuracy const):
+        (WebCore::Coordinates::altitudeAccuracy const):
+        (WebCore::Coordinates::heading const):
+        (WebCore::Coordinates::speed const):
+        * Modules/geolocation/Geolocation.cpp:
+        (WebCore::createGeoposition):
+        (WebCore::Geolocation::lastPosition):
+        * Modules/geolocation/GeolocationClient.h:
+        * Modules/geolocation/GeolocationController.cpp:
+        (WebCore::GeolocationController::positionChanged):
+        (WebCore::GeolocationController::lastPosition):
+        * Modules/geolocation/GeolocationController.h:
+        * Modules/geolocation/GeolocationPosition.h:
+        (WebCore::GeolocationPosition::GeolocationPosition):
+        The default constructor is only needed by our IPC decoding code.
+
+        (WebCore::GeolocationPosition::encode const):
+        (WebCore::GeolocationPosition::decode):
+        * Modules/geolocation/ios/GeolocationPositionIOS.mm: Copied from Source/WebCore/Modules/geolocation/Coordinates.cpp.
+        (WebCore::GeolocationPosition::GeolocationPosition):
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/mock/GeolocationClientMock.cpp:
+        (WebCore::GeolocationClientMock::lastPosition):
+        (WebCore::GeolocationClientMock::controllerTimerFired):
+        * platform/mock/GeolocationClientMock.h:
+
 2017-10-11  Brady Eidson  <beid...@apple.com>
 
         Add a SW context process (where SW scripts will actually execute).

Modified: trunk/Source/WebCore/Modules/geolocation/Coordinates.cpp (223191 => 223192)


--- trunk/Source/WebCore/Modules/geolocation/Coordinates.cpp	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebCore/Modules/geolocation/Coordinates.cpp	2017-10-11 17:41:59 UTC (rev 223192)
@@ -28,32 +28,10 @@
 
 namespace WebCore {
 
-std::optional<double> Coordinates::altitude() const
+Coordinates::Coordinates(GeolocationPosition&& position)
+    : m_position(WTFMove(position))
 {
-    if (!m_canProvideAltitude)
-        return std::nullopt;
-    return m_altitude;
+    ASSERT(m_position.isValid());
 }
 
-std::optional<double> Coordinates::altitudeAccuracy() const
-{
-    if (!m_canProvideAltitudeAccuracy)
-        return std::nullopt;
-    return m_altitudeAccuracy;
-}
-
-std::optional<double> Coordinates::heading() const
-{
-    if (!m_canProvideHeading)
-        return std::nullopt;
-    return m_heading;
-}
-
-std::optional<double> Coordinates::speed() const
-{
-    if (!m_canProvideSpeed)
-        return std::nullopt;
-    return m_speed;
-}
-    
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/geolocation/Coordinates.h (223191 => 223192)


--- trunk/Source/WebCore/Modules/geolocation/Coordinates.h	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebCore/Modules/geolocation/Coordinates.h	2017-10-11 17:41:59 UTC (rev 223192)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2009-2017 Apple Inc. All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include "GeolocationPosition.h"
 #include <wtf/Optional.h>
 #include <wtf/Ref.h>
 #include <wtf/RefCounted.h>
@@ -33,49 +34,28 @@
 
 class Coordinates : public RefCounted<Coordinates> {
 public:
-    static Ref<Coordinates> create(double latitude, double longitude, bool providesAltitude, double altitude, double accuracy, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed) { return adoptRef(*new Coordinates(latitude, longitude, providesAltitude, altitude, accuracy, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed)); }
+    static Ref<Coordinates> create(GeolocationPosition&& position)
+    {
+        return adoptRef(*new Coordinates(WTFMove(position)));
+    }
 
     Ref<Coordinates> isolatedCopy() const
     {
-        return Coordinates::create(m_latitude, m_longitude, m_canProvideAltitude, m_altitude, m_accuracy, m_canProvideAltitudeAccuracy, m_altitudeAccuracy, m_canProvideHeading, m_heading, m_canProvideSpeed, m_speed);
+        return Coordinates::create( GeolocationPosition { m_position });
     }
 
-    double latitude() const { return m_latitude; }
-    double longitude() const { return m_longitude; }
-    std::optional<double> altitude() const;
-    double accuracy() const { return m_accuracy; }
-    std::optional<double> altitudeAccuracy() const;
-    std::optional<double> heading() const;
-    std::optional<double> speed() const;
+    double latitude() const { return m_position.latitude; }
+    double longitude() const { return m_position.longitude; }
+    std::optional<double> altitude() const { return m_position.altitude; }
+    double accuracy() const { return m_position.accuracy; }
+    std::optional<double> altitudeAccuracy() const { return m_position.altitudeAccuracy; }
+    std::optional<double> heading() const { return m_position.heading; }
+    std::optional<double> speed() const { return m_position.speed; }
     
 private:
-    Coordinates(double latitude, double longitude, bool providesAltitude, double altitude, double accuracy, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed)
-        : m_latitude(latitude)
-        , m_longitude(longitude)
-        , m_altitude(altitude)
-        , m_accuracy(accuracy)
-        , m_altitudeAccuracy(altitudeAccuracy)
-        , m_heading(heading)
-        , m_speed(speed)
-        , m_canProvideAltitude(providesAltitude)
-        , m_canProvideAltitudeAccuracy(providesAltitudeAccuracy)
-        , m_canProvideHeading(providesHeading)
-        , m_canProvideSpeed(providesSpeed)
-    {
-    }
+    explicit Coordinates(GeolocationPosition&&);
 
-    double m_latitude;
-    double m_longitude;
-    double m_altitude;
-    double m_accuracy;
-    double m_altitudeAccuracy;
-    double m_heading;
-    double m_speed;
-    
-    bool m_canProvideAltitude;
-    bool m_canProvideAltitudeAccuracy;
-    bool m_canProvideHeading;
-    bool m_canProvideSpeed;
+    GeolocationPosition m_position;
 };
     
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/geolocation/Geolocation.cpp (223191 => 223192)


--- trunk/Source/WebCore/Modules/geolocation/Geolocation.cpp	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebCore/Modules/geolocation/Geolocation.cpp	2017-10-11 17:41:59 UTC (rev 223192)
@@ -53,16 +53,13 @@
 static const char framelessDocumentErrorMessage[] = "Geolocation cannot be used in frameless documents";
 static const char originCannotRequestGeolocationErrorMessage[] = "Origin does not have permission to use Geolocation service";
 
-static RefPtr<Geoposition> createGeoposition(GeolocationPosition* position)
+static RefPtr<Geoposition> createGeoposition(std::optional<GeolocationPosition>&& position)
 {
     if (!position)
         return nullptr;
     
-    auto coordinates = Coordinates::create(position->latitude(), position->longitude(), position->canProvideAltitude(), position->altitude(), 
-        position->accuracy(), position->canProvideAltitudeAccuracy(), position->altitudeAccuracy(),
-        position->canProvideHeading(), position->heading(), position->canProvideSpeed(), position->speed());
-
-    return Geoposition::create(WTFMove(coordinates), convertSecondsToDOMTimeStamp(position->timestamp()));
+    DOMTimeStamp timestamp = convertSecondsToDOMTimeStamp(position->timestamp);
+    return Geoposition::create(Coordinates::create(WTFMove(position.value())), timestamp);
 }
 
 static Ref<PositionError> createPositionError(GeolocationError& error)
@@ -296,7 +293,7 @@
 {
     Page* page = this->page();
     if (!page)
-        return 0;
+        return nullptr;
 
     m_lastPosition = createGeoposition(GeolocationController::from(page)->lastPosition());
 

Modified: trunk/Source/WebCore/Modules/geolocation/GeolocationClient.h (223191 => 223192)


--- trunk/Source/WebCore/Modules/geolocation/GeolocationClient.h	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebCore/Modules/geolocation/GeolocationClient.h	2017-10-11 17:41:59 UTC (rev 223192)
@@ -25,6 +25,8 @@
 
 #pragma once
 
+#include <wtf/Optional.h>
+
 namespace WebCore {
 
 class Geolocation;
@@ -42,7 +44,7 @@
     // We should update WebKit to reflect this if and when the V2 specification
     // is published.
     virtual void setEnableHighAccuracy(bool) = 0;
-    virtual GeolocationPosition* lastPosition() = 0;
+    virtual std::optional<GeolocationPosition> lastPosition() = 0;
 
     virtual void requestPermission(Geolocation&) = 0;
     virtual void cancelPermissionRequest(Geolocation&) = 0;

Modified: trunk/Source/WebCore/Modules/geolocation/GeolocationController.cpp (223191 => 223192)


--- trunk/Source/WebCore/Modules/geolocation/GeolocationController.cpp	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebCore/Modules/geolocation/GeolocationController.cpp	2017-10-11 17:41:59 UTC (rev 223192)
@@ -99,7 +99,7 @@
     m_client.cancelPermissionRequest(geolocation);
 }
 
-void GeolocationController::positionChanged(GeolocationPosition* position)
+void GeolocationController::positionChanged(const std::optional<GeolocationPosition>& position)
 {
     m_lastPosition = position;
     Vector<Ref<Geolocation>> observersVector;
@@ -120,10 +120,10 @@
         observer->setError(error);
 }
 
-GeolocationPosition* GeolocationController::lastPosition()
+std::optional<GeolocationPosition> GeolocationController::lastPosition()
 {
-    if (m_lastPosition.get())
-        return m_lastPosition.get();
+    if (m_lastPosition)
+        return m_lastPosition.value();
 
     return m_client.lastPosition();
 }

Modified: trunk/Source/WebCore/Modules/geolocation/GeolocationController.h (223191 => 223192)


--- trunk/Source/WebCore/Modules/geolocation/GeolocationController.h	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebCore/Modules/geolocation/GeolocationController.h	2017-10-11 17:41:59 UTC (rev 223192)
@@ -53,10 +53,10 @@
     void requestPermission(Geolocation&);
     void cancelPermissionRequest(Geolocation&);
 
-    WEBCORE_EXPORT void positionChanged(GeolocationPosition*);
+    WEBCORE_EXPORT void positionChanged(const std::optional<GeolocationPosition>&);
     WEBCORE_EXPORT void errorOccurred(GeolocationError&);
 
-    GeolocationPosition* lastPosition();
+    std::optional<GeolocationPosition> lastPosition();
 
     GeolocationClient& client() { return m_client; }
 
@@ -69,7 +69,7 @@
 
     void activityStateDidChange(ActivityState::Flags oldActivityState, ActivityState::Flags newActivityState) override;
 
-    RefPtr<GeolocationPosition> m_lastPosition;
+    std::optional<GeolocationPosition> m_lastPosition;
 
     typedef HashSet<Ref<Geolocation>> ObserversSet;
     // All observers; both those requesting high accuracy and those not.

Modified: trunk/Source/WebCore/Modules/geolocation/GeolocationPosition.h (223191 => 223192)


--- trunk/Source/WebCore/Modules/geolocation/GeolocationPosition.h	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebCore/Modules/geolocation/GeolocationPosition.h	2017-10-11 17:41:59 UTC (rev 223192)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009-2017 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -25,85 +25,89 @@
 
 #pragma once
 
+#include <cmath>
+#include <wtf/Optional.h>
 #include <wtf/Ref.h>
 #include <wtf/RefCounted.h>
 
+#if PLATFORM(IOS)
+OBJC_CLASS CLLocation;
+#endif
+
 namespace WebCore {
 
-class GeolocationPosition : public RefCounted<GeolocationPosition> {
+class GeolocationPosition {
 public:
-    static Ref<GeolocationPosition> create(double timestamp, double latitude, double longitude, double accuracy)
-    {
-        return adoptRef(*new GeolocationPosition(timestamp, latitude, longitude, accuracy));
-    }
+    GeolocationPosition() = default;
 
-    static Ref<GeolocationPosition> create(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed)
+    GeolocationPosition(double timestamp, double latitude, double longitude, double accuracy)
+        : timestamp(timestamp)
+        , latitude(latitude)
+        , longitude(longitude)
+        , accuracy(accuracy)
     {
-        return adoptRef(*new GeolocationPosition(timestamp, latitude, longitude, accuracy, providesAltitude, altitude, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed));
     }
 
-    double timestamp() const { return m_timestamp; }
+#if PLATFORM(IOS)
+    WEBCORE_EXPORT explicit GeolocationPosition(CLLocation*);
+#endif
 
-    double latitude() const { return m_latitude; }
-    double longitude() const { return m_longitude; }
-    double accuracy() const { return m_accuracy; }
-    double altitude() const { return m_altitude; }
-    double altitudeAccuracy() const { return m_altitudeAccuracy; }
-    double heading() const { return m_heading; }
-    double speed() const { return m_speed; }
+    double timestamp { std::numeric_limits<double>::quiet_NaN() };
 
-    bool canProvideAltitude() const { return m_canProvideAltitude; }
-    bool canProvideAltitudeAccuracy() const { return m_canProvideAltitudeAccuracy; }
-    bool canProvideHeading() const { return m_canProvideHeading; }
-    bool canProvideSpeed() const { return m_canProvideSpeed; }
+    double latitude { std::numeric_limits<double>::quiet_NaN() };
+    double longitude { std::numeric_limits<double>::quiet_NaN() };
+    double accuracy { std::numeric_limits<double>::quiet_NaN() };
 
-private:
-    GeolocationPosition(double timestamp, double latitude, double longitude, double accuracy)
-        : m_timestamp(timestamp)
-        , m_latitude(latitude)
-        , m_longitude(longitude)
-        , m_accuracy(accuracy)
-        , m_altitude(0)
-        , m_altitudeAccuracy(0)
-        , m_heading(0)
-        , m_speed(0)
-        , m_canProvideAltitude(false)
-        , m_canProvideAltitudeAccuracy(false)
-        , m_canProvideHeading(false)
-        , m_canProvideSpeed(false)
-    {
-    }
+    std::optional<double> altitude;
+    std::optional<double> altitudeAccuracy;
+    std::optional<double> heading;
+    std::optional<double> speed;
 
-    GeolocationPosition(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed)
-        : m_timestamp(timestamp)
-        , m_latitude(latitude)
-        , m_longitude(longitude)
-        , m_accuracy(accuracy)
-        , m_altitude(altitude)
-        , m_altitudeAccuracy(altitudeAccuracy)
-        , m_heading(heading)
-        , m_speed(speed)
-        , m_canProvideAltitude(providesAltitude)
-        , m_canProvideAltitudeAccuracy(providesAltitudeAccuracy)
-        , m_canProvideHeading(providesHeading)
-        , m_canProvideSpeed(providesSpeed)
-    {
-    }
+    bool isValid() const;
 
-    double m_timestamp;
+    template<class Encoder> void encode(Encoder&) const;
+    template<class Decoder> static bool decode(Decoder&, GeolocationPosition&);
+};
 
-    double m_latitude;
-    double m_longitude;
-    double m_accuracy;
-    double m_altitude;
-    double m_altitudeAccuracy;
-    double m_heading;
-    double m_speed;
+template<class Encoder>
+void GeolocationPosition::encode(Encoder& encoder) const
+{
+    encoder << timestamp;
+    encoder << latitude;
+    encoder << longitude;
+    encoder << accuracy;
+    encoder << altitude;
+    encoder << altitudeAccuracy;
+    encoder << heading;
+    encoder << speed;
+}
 
-    bool m_canProvideAltitude;
-    bool m_canProvideAltitudeAccuracy;
-    bool m_canProvideHeading;
-    bool m_canProvideSpeed;
-};
+template<class Decoder>
+bool GeolocationPosition::decode(Decoder& decoder, GeolocationPosition& position)
+{
+    if (!decoder.decode(position.timestamp))
+        return false;
+    if (!decoder.decode(position.latitude))
+        return false;
+    if (!decoder.decode(position.longitude))
+        return false;
+    if (!decoder.decode(position.accuracy))
+        return false;
+    if (!decoder.decode(position.altitude))
+        return false;
+    if (!decoder.decode(position.altitudeAccuracy))
+        return false;
+    if (!decoder.decode(position.heading))
+        return false;
+    if (!decoder.decode(position.speed))
+        return false;
 
+    return true;
+}
+
+inline bool GeolocationPosition::isValid() const
+{
+    return !std::isnan(timestamp) && !std::isnan(latitude) && !std::isnan(longitude) && !std::isnan(accuracy);
+}
+
 } // namespace WebCore

Copied: trunk/Source/WebCore/Modules/geolocation/ios/GeolocationPositionIOS.mm (from rev 223191, trunk/Source/WebCore/Modules/geolocation/Coordinates.cpp) (0 => 223192)


--- trunk/Source/WebCore/Modules/geolocation/ios/GeolocationPositionIOS.mm	                        (rev 0)
+++ trunk/Source/WebCore/Modules/geolocation/ios/GeolocationPositionIOS.mm	2017-10-11 17:41:59 UTC (rev 223192)
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2017 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "GeolocationPosition.h"
+
+#if PLATFORM(IOS)
+
+#import <CoreLocation/CLLocation.h>
+
+namespace WebCore {
+
+GeolocationPosition::GeolocationPosition(CLLocation* location)
+    : timestamp(location.timestamp.timeIntervalSince1970)
+    , latitude(location.coordinate.latitude)
+    , longitude(location.coordinate.longitude)
+    , accuracy(location.horizontalAccuracy)
+{
+    if (location.verticalAccuracy >= 0.0) {
+        altitude = location.altitude;
+        altitudeAccuracy = location.verticalAccuracy;
+    }
+    if (location.speed >= 0.0)
+        speed = location.speed;
+    if (location.course >= 0.0)
+        heading = location.course;
+}
+
+}
+
+#endif

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (223191 => 223192)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2017-10-11 17:41:59 UTC (rev 223192)
@@ -3551,6 +3551,7 @@
 		8372DB311A6780A800C697C5 /* DiagnosticLoggingResultType.h in Headers */ = {isa = PBXBuildFile; fileRef = 8372DB301A6780A800C697C5 /* DiagnosticLoggingResultType.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		837609CA1F54CC18000C122D /* ErrorCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 837609C81F54CC13000C122D /* ErrorCallback.cpp */; };
 		83765F951DAC522F00C06537 /* MouseEventInit.h in Headers */ = {isa = PBXBuildFile; fileRef = 83765F941DAC521800C06537 /* MouseEventInit.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		837964CF1F8DB69D00218EA0 /* GeolocationPositionIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 837964CE1F8DB69A00218EA0 /* GeolocationPositionIOS.mm */; };
 		837A80131E1E127300026B9F /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 837A80111E1E127300026B9F /* Localizable.stringsdict */; };
 		837B7D201DC3F55000D051FC /* ValidationBubbleIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 837B7D1F1DC3F54C00D051FC /* ValidationBubbleIOS.mm */; };
 		8386A96D19F61B2E00E1EC4A /* StyleBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8386A96C19F61B2E00E1EC4A /* StyleBuilder.h */; };
@@ -11875,6 +11876,7 @@
 		837609C81F54CC13000C122D /* ErrorCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ErrorCallback.cpp; sourceTree = "<group>"; };
 		83765F931DAC521800C06537 /* MouseEventInit.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = MouseEventInit.idl; sourceTree = "<group>"; };
 		83765F941DAC521800C06537 /* MouseEventInit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MouseEventInit.h; sourceTree = "<group>"; };
+		837964CE1F8DB69A00218EA0 /* GeolocationPositionIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = GeolocationPositionIOS.mm; path = Modules/geolocation/ios/GeolocationPositionIOS.mm; sourceTree = SOURCE_ROOT; };
 		837A80121E1E127300026B9F /* English */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = English; path = English.lproj/Localizable.stringsdict; sourceTree = SOURCE_ROOT; };
 		837B7D1F1DC3F54C00D051FC /* ValidationBubbleIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ValidationBubbleIOS.mm; sourceTree = "<group>"; };
 		837DFB341EBFEA7000601385 /* ElementCSSInlineStyle.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ElementCSSInlineStyle.idl; sourceTree = "<group>"; };
@@ -20441,6 +20443,15 @@
 			path = beacon;
 			sourceTree = "<group>";
 		};
+		837964CC1F8DB67D00218EA0 /* ios */ = {
+			isa = PBXGroup;
+			children = (
+				837964CE1F8DB69A00218EA0 /* GeolocationPositionIOS.mm */,
+			);
+			name = ios;
+			path = "New Group";
+			sourceTree = "<group>";
+		};
 		83FB33651F508A1700986E54 /* entriesapi */ = {
 			isa = PBXGroup;
 			children = (
@@ -21304,6 +21315,7 @@
 		971145FF14EF007900674FD9 /* geolocation */ = {
 			isa = PBXGroup;
 			children = (
+				837964CC1F8DB67D00218EA0 /* ios */,
 				9746AF1114F4DDE6003E7A72 /* Coordinates.cpp */,
 				9746AF1114F4DDE6003E7A70 /* Coordinates.h */,
 				9746AF1214F4DDE6003E7A70 /* Coordinates.idl */,
@@ -32158,6 +32170,7 @@
 				CD4BE52A1CE136EF009D87DA /* GenericTaskQueue.cpp in Sources */,
 				9746AF2314F4DDE6003E7A70 /* Geolocation.cpp in Sources */,
 				9746AF2614F4DDE6003E7A70 /* GeolocationController.cpp in Sources */,
+				837964CF1F8DB69D00218EA0 /* GeolocationPositionIOS.mm in Sources */,
 				0FB6252E18DE1B1500A07C05 /* GeometryUtilities.cpp in Sources */,
 				46C83EFD1A9BBE2900A79A41 /* GeoNotifier.cpp in Sources */,
 				2D5036681BCDDDC400E20BB3 /* GestureEvents.cpp in Sources */,

Modified: trunk/Source/WebCore/platform/mock/GeolocationClientMock.cpp (223191 => 223192)


--- trunk/Source/WebCore/platform/mock/GeolocationClientMock.cpp	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebCore/platform/mock/GeolocationClientMock.cpp	2017-10-11 17:41:59 UTC (rev 223192)
@@ -61,7 +61,7 @@
     m_controller = controller;
 }
 
-void GeolocationClientMock::setPosition(RefPtr<GeolocationPosition>&& position)
+void GeolocationClientMock::setPosition(GeolocationPosition&& position)
 {
     m_lastPosition = WTFMove(position);
     clearError();
@@ -72,7 +72,7 @@
 {
     m_hasError = true;
     m_errorMessage = errorMessage;
-    m_lastPosition = nullptr;
+    m_lastPosition = std::nullopt;
     asyncUpdateController();
 }
 
@@ -126,7 +126,7 @@
 
 void GeolocationClientMock::reset()
 {
-    m_lastPosition = nullptr;
+    m_lastPosition = std::nullopt;
     clearError();
     m_permissionState = PermissionStateUnset;
 }
@@ -156,9 +156,9 @@
     // See https://bugs.webkit.org/show_bug.cgi?id=49438
 }
 
-GeolocationPosition* GeolocationClientMock::lastPosition()
+std::optional<GeolocationPosition> GeolocationClientMock::lastPosition()
 {
-    return m_lastPosition.get();
+    return m_lastPosition;
 }
 
 void GeolocationClientMock::asyncUpdateController()
@@ -172,9 +172,9 @@
 {
     ASSERT(m_controller);
 
-    if (m_lastPosition.get()) {
+    if (m_lastPosition) {
         ASSERT(!m_hasError);
-        m_controller->positionChanged(m_lastPosition.get());
+        m_controller->positionChanged(*m_lastPosition);
     } else if (m_hasError) {
         auto geolocatioError = GeolocationError::create(GeolocationError::PositionUnavailable, m_errorMessage);
         m_controller->errorOccurred(geolocatioError.get());

Modified: trunk/Source/WebCore/platform/mock/GeolocationClientMock.h (223191 => 223192)


--- trunk/Source/WebCore/platform/mock/GeolocationClientMock.h	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebCore/platform/mock/GeolocationClientMock.h	2017-10-11 17:41:59 UTC (rev 223192)
@@ -32,6 +32,7 @@
 #pragma once
 
 #include "GeolocationClient.h"
+#include "GeolocationPosition.h"
 #include "Timer.h"
 #include <wtf/HashSet.h>
 #include <wtf/RefPtr.h>
@@ -40,7 +41,6 @@
 namespace WebCore {
 
 class GeolocationController;
-class GeolocationPosition;
 
 // FIXME: this should not be in WebCore. It should be moved to WebKit.
 // Provides a mock object for the geolocation client.
@@ -52,7 +52,7 @@
     void reset();
     void setController(GeolocationController*);
 
-    void setPosition(RefPtr<GeolocationPosition>&&);
+    void setPosition(GeolocationPosition&&);
     void setPositionUnavailableError(const String& errorMessage);
     void setPermission(bool allowed);
     int numberOfPendingPermissionRequests() const;
@@ -62,7 +62,7 @@
     void startUpdating() override;
     void stopUpdating() override;
     void setEnableHighAccuracy(bool) override;
-    GeolocationPosition* lastPosition() override;
+    std::optional<GeolocationPosition> lastPosition() override;
     void requestPermission(Geolocation&) override;
     void cancelPermissionRequest(Geolocation&) override;
 
@@ -76,7 +76,7 @@
     void clearError();
 
     GeolocationController* m_controller;
-    RefPtr<GeolocationPosition> m_lastPosition;
+    std::optional<GeolocationPosition> m_lastPosition;
     bool m_hasError;
     String m_errorMessage;
     Timer m_controllerTimer;

Modified: trunk/Source/WebKit/ChangeLog (223191 => 223192)


--- trunk/Source/WebKit/ChangeLog	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKit/ChangeLog	2017-10-11 17:41:59 UTC (rev 223192)
@@ -1,3 +1,42 @@
+2017-10-11  Chris Dumez  <cdu...@apple.com>
+
+        Modernize Geolocation code
+        https://bugs.webkit.org/show_bug.cgi?id=178148
+
+        Reviewed by Ryosuke Niwa.
+
+        * Shared/WebGeolocationPosition.cpp:
+        (WebKit::WebGeolocationPosition::create):
+        (WebKit::WebGeolocationPosition::~WebGeolocationPosition):
+        * Shared/WebGeolocationPosition.h:
+        (WebKit::WebGeolocationPosition::timestamp const):
+        (WebKit::WebGeolocationPosition::latitude const):
+        (WebKit::WebGeolocationPosition::longitude const):
+        (WebKit::WebGeolocationPosition::accuracy const):
+        (WebKit::WebGeolocationPosition::altitude const):
+        (WebKit::WebGeolocationPosition::altitudeAccuracy const):
+        (WebKit::WebGeolocationPosition::heading const):
+        (WebKit::WebGeolocationPosition::speed const):
+        (WebKit::WebGeolocationPosition::corePosition const):
+        (WebKit::WebGeolocationPosition::WebGeolocationPosition):
+        * UIProcess/API/C/WKGeolocationPosition.cpp:
+        (WKGeolocationPositionCreate_b):
+        * UIProcess/API/Cocoa/_WKGeolocationPosition.mm:
+        (WebKit::wrapper):
+        * UIProcess/API/glib/WebKitGeolocationProvider.cpp:
+        (WebKit::WebKitGeolocationProvider::notifyPositionChanged):
+        * UIProcess/WebGeolocationManagerProxy.cpp:
+        (WebKit::WebGeolocationManagerProxy::providerDidChangePosition):
+        * UIProcess/ios/WKGeolocationProviderIOS.mm:
+        (-[WKLegacyCoreLocationProvider positionChanged:]):
+        * WebProcess/Geolocation/WebGeolocationManager.cpp:
+        (WebKit::WebGeolocationManager::didChangePosition):
+        * WebProcess/Geolocation/WebGeolocationManager.h:
+        * WebProcess/Geolocation/WebGeolocationManager.messages.in:
+        * WebProcess/WebCoreSupport/WebGeolocationClient.cpp:
+        (WebKit::WebGeolocationClient::lastPosition):
+        * WebProcess/WebCoreSupport/WebGeolocationClient.h:
+
 2017-10-11  Brady Eidson  <beid...@apple.com>
 
         Add a SW context process (where SW scripts will actually execute).

Modified: trunk/Source/WebKit/Shared/WebGeolocationPosition.cpp (223191 => 223192)


--- trunk/Source/WebKit/Shared/WebGeolocationPosition.cpp	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKit/Shared/WebGeolocationPosition.cpp	2017-10-11 17:41:59 UTC (rev 223192)
@@ -30,20 +30,11 @@
 
 namespace WebKit {
 
-WebGeolocationPosition::WebGeolocationPosition(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed)
+using namespace WebCore;
+
+Ref<WebGeolocationPosition> WebGeolocationPosition::create(GeolocationPosition&& geolocationPosition)
 {
-    m_data.timestamp = timestamp;
-    m_data.latitude = latitude;
-    m_data.longitude = longitude;
-    m_data.accuracy = accuracy;
-    m_data.canProvideAltitude = providesAltitude;
-    m_data.altitude = altitude;
-    m_data.canProvideAltitudeAccuracy = providesAltitudeAccuracy;
-    m_data.altitudeAccuracy = altitudeAccuracy;
-    m_data.canProvideHeading = providesHeading;
-    m_data.heading = heading;
-    m_data.canProvideSpeed = providesSpeed;
-    m_data.speed = speed;
+    return adoptRef(*new WebGeolocationPosition(WTFMove(geolocationPosition)));
 }
 
 WebGeolocationPosition::~WebGeolocationPosition()
@@ -50,14 +41,4 @@
 {
 }
 
-void WebGeolocationPosition::Data::encode(IPC::Encoder& encoder) const
-{
-    IPC::SimpleArgumentCoder<WebGeolocationPosition::Data>::encode(encoder, *this);
-}
-
-bool WebGeolocationPosition::Data::decode(IPC::Decoder& decoder, Data& data)
-{
-    return IPC::SimpleArgumentCoder<WebGeolocationPosition::Data>::decode(decoder, data);
-}
-
 } // namespace WebKit

Modified: trunk/Source/WebKit/Shared/WebGeolocationPosition.h (223191 => 223192)


--- trunk/Source/WebKit/Shared/WebGeolocationPosition.h	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKit/Shared/WebGeolocationPosition.h	2017-10-11 17:41:59 UTC (rev 223192)
@@ -27,6 +27,7 @@
 #define WebGeolocationPosition_h
 
 #include "APIObject.h"
+#include <WebCore/GeolocationPosition.h>
 #include <wtf/RefPtr.h>
 
 namespace IPC {
@@ -38,56 +39,28 @@
 
 class WebGeolocationPosition : public API::ObjectImpl<API::Object::Type::GeolocationPosition> {
 public:
-    struct Data {
-        void encode(IPC::Encoder&) const;
-        static bool decode(IPC::Decoder&, Data&);
+    static Ref<WebGeolocationPosition> create(WebCore::GeolocationPosition&&);
 
-        double timestamp;
-        double latitude;
-        double longitude;
-        double accuracy;
+    virtual ~WebGeolocationPosition();
 
-        double altitude;
-        double altitudeAccuracy;
-        double heading;
-        double speed;
+    double timestamp() const { return m_corePosition.timestamp; }
+    double latitude() const { return m_corePosition.latitude; }
+    double longitude() const { return m_corePosition.longitude; }
+    double accuracy() const { return m_corePosition.accuracy; }
+    std::optional<double> altitude() const { return m_corePosition.altitude; }
+    std::optional<double> altitudeAccuracy() const { return m_corePosition.altitudeAccuracy; }
+    std::optional<double> heading() const { return m_corePosition.heading; }
+    std::optional<double> speed() const { return m_corePosition.speed; }
 
-        bool canProvideAltitude;
-        bool canProvideAltitudeAccuracy;
-        bool canProvideHeading;
-        bool canProvideSpeed;
-    };
+    const WebCore::GeolocationPosition& corePosition() const { return m_corePosition; }
 
-    static Ref<WebGeolocationPosition> create(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed)
+private:
+    explicit WebGeolocationPosition(WebCore::GeolocationPosition&& geolocationPosition)
+        : m_corePosition(WTFMove(geolocationPosition))
     {
-        return adoptRef(*new WebGeolocationPosition(timestamp, latitude, longitude, accuracy, providesAltitude, altitude, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed));
     }
 
-    virtual ~WebGeolocationPosition();
-
-    double timestamp() const { return m_data.timestamp; }
-    double latitude() const { return m_data.latitude; }
-    double longitude() const { return m_data.longitude; }
-    double accuracy() const { return m_data.accuracy; }
-
-    bool canProvideAltitude() const { return m_data.canProvideAltitude; }
-    double altitude() const { return m_data.altitude; }
-
-    bool canProvideAltitudeAccuracy() const { return m_data.canProvideAltitudeAccuracy; }
-    double altitudeAccuracy() const { return m_data.altitudeAccuracy; }
-
-    bool canProvideHeading() const { return m_data.canProvideHeading; }
-    double heading() const { return m_data.heading; }
-
-    bool canProvideSpeed() const { return m_data.canProvideSpeed; }
-    double speed() const { return m_data.speed; }
-
-    const Data& data() const { return m_data; }
-
-private:
-    WebGeolocationPosition(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed);
-
-    Data m_data;
+    WebCore::GeolocationPosition m_corePosition;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/UIProcess/API/C/WKGeolocationPosition.cpp (223191 => 223192)


--- trunk/Source/WebKit/UIProcess/API/C/WKGeolocationPosition.cpp	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKit/UIProcess/API/C/WKGeolocationPosition.cpp	2017-10-11 17:41:59 UTC (rev 223192)
@@ -43,6 +43,16 @@
 
 WKGeolocationPositionRef WKGeolocationPositionCreate_b(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed)
 {
-    auto position = WebGeolocationPosition::create(timestamp, latitude, longitude, accuracy, providesAltitude, altitude, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed);
+    WebCore::GeolocationPosition corePosition { timestamp, latitude, longitude, accuracy };
+    if (providesAltitude)
+        corePosition.altitude = altitude;
+    if (providesAltitudeAccuracy)
+        corePosition.altitudeAccuracy = altitudeAccuracy;
+    if (providesHeading)
+        corePosition.heading = heading;
+    if (providesSpeed)
+        corePosition.speed = speed;
+
+    auto position = WebGeolocationPosition::create(WTFMove(corePosition));
     return toAPI(&position.leakRef());
 }

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKGeolocationPosition.mm (223191 => 223192)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKGeolocationPosition.mm	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKGeolocationPosition.mm	2017-10-11 17:41:59 UTC (rev 223192)
@@ -39,29 +39,7 @@
     if (!location)
         return nil;
 
-    bool canProvideAltitude = true;
-    bool canProvideAltitudeAccuracy = true;
-    double altitude = location.altitude;
-    double altitudeAccuracy = location.verticalAccuracy;
-    if (altitudeAccuracy < 0.0) {
-        canProvideAltitude = false;
-        canProvideAltitudeAccuracy = false;
-    }
-
-    bool canProvideSpeed = true;
-    double speed = location.speed;
-    if (speed < 0.0)
-        canProvideSpeed = false;
-
-    bool canProvideHeading = true;
-    double heading = location.course;
-    if (heading < 0.0)
-        canProvideHeading = false;
-
-    CLLocationCoordinate2D coordinate = location.coordinate;
-    double timestamp = location.timestamp.timeIntervalSince1970;
-
-    return [wrapper(WebGeolocationPosition::create(timestamp, coordinate.latitude, coordinate.longitude, location.horizontalAccuracy, canProvideAltitude, altitude, canProvideAltitudeAccuracy, altitudeAccuracy, canProvideHeading, heading, canProvideSpeed, speed).leakRef()) autorelease];
+    return [wrapper(WebGeolocationPosition::create(WebCore::GeolocationPosition { location }).leakRef()) autorelease];
 }
 
 - (void)dealloc

Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitGeolocationProvider.cpp (223191 => 223192)


--- trunk/Source/WebKit/UIProcess/API/glib/WebKitGeolocationProvider.cpp	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitGeolocationProvider.cpp	2017-10-11 17:41:59 UTC (rev 223192)
@@ -81,7 +81,10 @@
 
 void WebKitGeolocationProvider::notifyPositionChanged(int timestamp, double latitude, double longitude, double altitude, double accuracy, double altitudeAccuracy)
 {
-    RefPtr<WebGeolocationPosition> position = WebGeolocationPosition::create(timestamp, latitude, longitude, accuracy, true, altitude, true, altitudeAccuracy, false, 0, false, 0);
+    WebCore::GeolocationPosition corePosition { static_cast<double>(timestamp), latitude, longitude, accuracy };
+    corePosition.altitude = altitude;
+    corePosition.altitudeAccuracy = altitudeAccuracy;
+    RefPtr<WebGeolocationPosition> position = WebGeolocationPosition::create(WTFMove(corePosition));
     m_geolocationManager->providerDidChangePosition(position.get());
 }
 

Modified: trunk/Source/WebKit/UIProcess/WebGeolocationManagerProxy.cpp (223191 => 223192)


--- trunk/Source/WebKit/UIProcess/WebGeolocationManagerProxy.cpp	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKit/UIProcess/WebGeolocationManagerProxy.cpp	2017-10-11 17:41:59 UTC (rev 223192)
@@ -29,6 +29,7 @@
 #include "APIGeolocationProvider.h"
 #include "WebGeolocationManagerMessages.h"
 #include "WebGeolocationManagerProxyMessages.h"
+#include "WebGeolocationPosition.h"
 #include "WebProcessPool.h"
 
 namespace WebKit {
@@ -90,7 +91,7 @@
     if (!processPool())
         return;
 
-    processPool()->sendToAllProcesses(Messages::WebGeolocationManager::DidChangePosition(position->data()));
+    processPool()->sendToAllProcesses(Messages::WebGeolocationManager::DidChangePosition(position->corePosition()));
 }
 
 void WebGeolocationManagerProxy::providerDidFailToDeterminePosition(const String& errorMessage)

Modified: trunk/Source/WebKit/UIProcess/ios/WKGeolocationProviderIOS.mm (223191 => 223192)


--- trunk/Source/WebKit/UIProcess/ios/WKGeolocationProviderIOS.mm	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKit/UIProcess/ios/WKGeolocationProviderIOS.mm	2017-10-11 17:41:59 UTC (rev 223192)
@@ -74,11 +74,6 @@
 void decidePolicyForGeolocationRequestFromOrigin(SecurityOrigin*, const String& urlString, id<WebAllowDenyPolicyListener>, UIWindow*);
 };
 
-static inline Ref<WebGeolocationPosition> kit(WebCore::GeolocationPosition *position)
-{
-    return WebGeolocationPosition::create(position->timestamp(), position->latitude(), position->longitude(), position->accuracy(), position->canProvideAltitude(), position->altitude(), position->canProvideAltitudeAccuracy(), position->altitudeAccuracy(), position->canProvideHeading(), position->heading(), position->canProvideSpeed(), position->speed());
-}
-
 struct GeolocationRequestData {
     RefPtr<SecurityOrigin> origin;
     RefPtr<WebFrameProxy> frame;
@@ -304,10 +299,10 @@
     [_listener geolocationAuthorizationDenied];
 }
 
-- (void)positionChanged:(WebCore::GeolocationPosition *)corePosition
+- (void)positionChanged:(WebCore::GeolocationPosition&&)corePosition
 {
     ASSERT(_listener);
-    auto position = kit(corePosition);
+    auto position = WebGeolocationPosition::create(WTFMove(corePosition));
     [_listener positionChanged:wrapper(position.get())];
 }
 

Modified: trunk/Source/WebKit/WebProcess/Geolocation/WebGeolocationManager.cpp (223191 => 223192)


--- trunk/Source/WebKit/WebProcess/Geolocation/WebGeolocationManager.cpp	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKit/WebProcess/Geolocation/WebGeolocationManager.cpp	2017-10-11 17:41:59 UTC (rev 223192)
@@ -91,19 +91,17 @@
         m_process.parentProcessConnection()->send(Messages::WebGeolocationManagerProxy::SetEnableHighAccuracy(highAccuracyShouldBeEnabled), 0);
 }
 
-void WebGeolocationManager::didChangePosition(const WebGeolocationPosition::Data& data)
+void WebGeolocationManager::didChangePosition(const GeolocationPosition& position)
 {
 #if ENABLE(GEOLOCATION)
-    RefPtr<GeolocationPosition> position = GeolocationPosition::create(data.timestamp, data.latitude, data.longitude, data.accuracy, data.canProvideAltitude, data.altitude, data.canProvideAltitudeAccuracy, data.altitudeAccuracy, data.canProvideHeading, data.heading, data.canProvideSpeed, data.speed);
-
     Vector<RefPtr<WebPage>> webPageCopy;
     copyToVector(m_pageSet, webPageCopy);
     for (auto& page : webPageCopy) {
         if (page->corePage())
-            GeolocationController::from(page->corePage())->positionChanged(position.get());
+            GeolocationController::from(page->corePage())->positionChanged(position);
     }
 #else
-    UNUSED_PARAM(data);
+    UNUSED_PARAM(position);
 #endif // ENABLE(GEOLOCATION)
 }
 

Modified: trunk/Source/WebKit/WebProcess/Geolocation/WebGeolocationManager.h (223191 => 223192)


--- trunk/Source/WebKit/WebProcess/Geolocation/WebGeolocationManager.h	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKit/WebProcess/Geolocation/WebGeolocationManager.h	2017-10-11 17:41:59 UTC (rev 223192)
@@ -35,6 +35,7 @@
 
 namespace WebCore {
 class Geolocation;
+class GeolocationPosition;
 }
 
 namespace WebKit {
@@ -62,7 +63,7 @@
     bool isUpdating() const { return !m_pageSet.isEmpty(); }
     bool isHighAccuracyEnabled() const { return !m_highAccuracyPageSet.isEmpty(); }
 
-    void didChangePosition(const WebGeolocationPosition::Data&);
+    void didChangePosition(const WebCore::GeolocationPosition&);
     void didFailToDeterminePosition(const String& errorMessage);
 #if PLATFORM(IOS)
     void resetPermissions();

Modified: trunk/Source/WebKit/WebProcess/Geolocation/WebGeolocationManager.messages.in (223191 => 223192)


--- trunk/Source/WebKit/WebProcess/Geolocation/WebGeolocationManager.messages.in	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKit/WebProcess/Geolocation/WebGeolocationManager.messages.in	2017-10-11 17:41:59 UTC (rev 223192)
@@ -21,7 +21,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 messages -> WebGeolocationManager {
-    DidChangePosition(WebKit::WebGeolocationPosition::Data position);
+    DidChangePosition(WebCore::GeolocationPosition position);
     DidFailToDeterminePosition(String errorMessage);
 #if PLATFORM(IOS)
     ResetPermissions();

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebGeolocationClient.cpp (223191 => 223192)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebGeolocationClient.cpp	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebGeolocationClient.cpp	2017-10-11 17:41:59 UTC (rev 223192)
@@ -64,10 +64,10 @@
     WebProcess::singleton().supplement<WebGeolocationManager>()->setEnableHighAccuracyForPage(m_page, enabled);
 }
 
-GeolocationPosition* WebGeolocationClient::lastPosition()
+std::optional<GeolocationPosition> WebGeolocationClient::lastPosition()
 {
     // FIXME: Implement this.
-    return 0;
+    return std::nullopt;
 }
 
 void WebGeolocationClient::requestPermission(Geolocation& geolocation)

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebGeolocationClient.h (223191 => 223192)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebGeolocationClient.h	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebGeolocationClient.h	2017-10-11 17:41:59 UTC (rev 223192)
@@ -47,7 +47,7 @@
     void stopUpdating() override;
     void setEnableHighAccuracy(bool) override;
 
-    WebCore::GeolocationPosition* lastPosition() override;
+    std::optional<WebCore::GeolocationPosition> lastPosition() override;
 
     void requestPermission(WebCore::Geolocation&) override;
     void cancelPermissionRequest(WebCore::Geolocation&) override;

Modified: trunk/Source/WebKitLegacy/ios/ChangeLog (223191 => 223192)


--- trunk/Source/WebKitLegacy/ios/ChangeLog	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKitLegacy/ios/ChangeLog	2017-10-11 17:41:59 UTC (rev 223192)
@@ -1,3 +1,16 @@
+2017-10-11  Chris Dumez  <cdu...@apple.com>
+
+        Modernize Geolocation code
+        https://bugs.webkit.org/show_bug.cgi?id=178148
+
+        Reviewed by Ryosuke Niwa.
+
+        * Misc/WebGeolocationCoreLocationProvider.h:
+        * Misc/WebGeolocationCoreLocationProvider.mm:
+        (-[WebGeolocationCoreLocationProvider sendLocation:]):
+        * Misc/WebGeolocationProviderIOS.mm:
+        (-[_WebCoreLocationUpdateThreadingProxy positionChanged:]):
+
 2017-10-04  Alex Christensen  <achristen...@webkit.org>
 
         Remove WebCoreSystemInterface

Modified: trunk/Source/WebKitLegacy/ios/Misc/WebGeolocationCoreLocationProvider.h (223191 => 223192)


--- trunk/Source/WebKitLegacy/ios/Misc/WebGeolocationCoreLocationProvider.h	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKitLegacy/ios/Misc/WebGeolocationCoreLocationProvider.h	2017-10-11 17:41:59 UTC (rev 223192)
@@ -43,7 +43,7 @@
 - (void)geolocationAuthorizationGranted;
 - (void)geolocationAuthorizationDenied;
 
-- (void)positionChanged:(WebCore::GeolocationPosition*)position;
+- (void)positionChanged:(WebCore::GeolocationPosition&&)position;
 - (void)errorOccurred:(NSString *)errorMessage;
 - (void)resetGeolocation;
 @end

Modified: trunk/Source/WebKitLegacy/ios/Misc/WebGeolocationCoreLocationProvider.mm (223191 => 223192)


--- trunk/Source/WebKitLegacy/ios/Misc/WebGeolocationCoreLocationProvider.mm	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKitLegacy/ios/Misc/WebGeolocationCoreLocationProvider.mm	2017-10-11 17:41:59 UTC (rev 223192)
@@ -165,29 +165,7 @@
 
 - (void)sendLocation:(CLLocation *)newLocation
 {
-    // Normalize.
-    bool canProvideAltitude = true;
-    bool canProvideAltitudeAccuracy = true;
-    double altitude = newLocation.altitude;
-    double altitudeAccuracy = newLocation.verticalAccuracy;
-    if (altitudeAccuracy < 0.0) {
-        canProvideAltitude = false;
-        canProvideAltitudeAccuracy = false;
-    }
-
-    bool canProvideSpeed = true;
-    double speed = newLocation.speed;
-    if (speed < 0.0)
-        canProvideSpeed = false;
-
-    bool canProvideHeading = true;
-    double heading = newLocation.course;
-    if (heading < 0.0)
-        canProvideHeading = false;
-
-    double timestamp = [newLocation.timestamp timeIntervalSince1970];
-    RefPtr<GeolocationPosition> geolocationPosition = GeolocationPosition::create(timestamp, newLocation.coordinate.latitude, newLocation.coordinate.longitude, newLocation.horizontalAccuracy, canProvideAltitude, altitude, canProvideAltitudeAccuracy, altitudeAccuracy, canProvideHeading, heading, canProvideSpeed, speed);
-    [_positionListener positionChanged:geolocationPosition.get()];
+    [_positionListener positionChanged:GeolocationPosition { newLocation }];
 }
 
 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

Modified: trunk/Source/WebKitLegacy/ios/Misc/WebGeolocationProviderIOS.mm (223191 => 223192)


--- trunk/Source/WebKitLegacy/ios/Misc/WebGeolocationProviderIOS.mm	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKitLegacy/ios/Misc/WebGeolocationProviderIOS.mm	2017-10-11 17:41:59 UTC (rev 223192)
@@ -44,7 +44,7 @@
 using namespace WebCore;
 
 @interface WebGeolocationPosition (Internal)
-- (id)initWithGeolocationPosition:(RefPtr<GeolocationPosition>&&)coreGeolocationPosition;
+- (id)initWithGeolocationPosition:(GeolocationPosition&&)coreGeolocationPosition;
 @end
 
 // CoreLocation runs in the main thread. WebGeolocationProviderIOS lives on the WebThread.
@@ -361,9 +361,9 @@
     });
 }
 
-- (void)positionChanged:(WebCore::GeolocationPosition*)position
+- (void)positionChanged:(WebCore::GeolocationPosition&&)position
 {
-    RetainPtr<WebGeolocationPosition> webPosition = adoptNS([[WebGeolocationPosition alloc] initWithGeolocationPosition:position]);
+    RetainPtr<WebGeolocationPosition> webPosition = adoptNS([[WebGeolocationPosition alloc] initWithGeolocationPosition:WTFMove(position)]);
     WebThreadRun(^{
         [_provider positionChanged:webPosition.get()];
     });

Modified: trunk/Source/WebKitLegacy/mac/ChangeLog (223191 => 223192)


--- trunk/Source/WebKitLegacy/mac/ChangeLog	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKitLegacy/mac/ChangeLog	2017-10-11 17:41:59 UTC (rev 223192)
@@ -1,3 +1,20 @@
+2017-10-11  Chris Dumez  <cdu...@apple.com>
+
+        Modernize Geolocation code
+        https://bugs.webkit.org/show_bug.cgi?id=178148
+
+        Reviewed by Ryosuke Niwa.
+
+        * WebCoreSupport/WebGeolocationClient.h:
+        * WebCoreSupport/WebGeolocationClient.mm:
+        (WebGeolocationClient::lastPosition):
+        * WebView/WebGeolocationPosition.mm:
+        (-[WebGeolocationPositionInternal initWithCoreGeolocationPosition:]):
+        (core):
+        (-[WebGeolocationPosition initWithTimestamp:latitude:longitude:accuracy:]):
+        (-[WebGeolocationPosition initWithGeolocationPosition:]):
+        * WebView/WebGeolocationPositionInternal.h:
+
 2017-10-10  Ryosuke Niwa  <rn...@webkit.org>
 
         Enable custom pasteboard data in DumpRenderTree and WebKitTestRunner

Modified: trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebGeolocationClient.h (223191 => 223192)


--- trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebGeolocationClient.h	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebGeolocationClient.h	2017-10-11 17:41:59 UTC (rev 223192)
@@ -47,7 +47,7 @@
     void setEnableHighAccuracy(bool) override { }
 #endif
 
-    WebCore::GeolocationPosition* lastPosition() override;
+    std::optional<WebCore::GeolocationPosition> lastPosition() override;
 
     void requestPermission(WebCore::Geolocation&) override;
     void cancelPermissionRequest(WebCore::Geolocation&) override { };

Modified: trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebGeolocationClient.mm (223191 => 223192)


--- trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebGeolocationClient.mm	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebGeolocationClient.mm	2017-10-11 17:41:59 UTC (rev 223192)
@@ -132,7 +132,7 @@
     END_BLOCK_OBJC_EXCEPTIONS;
 }
 
-GeolocationPosition* WebGeolocationClient::lastPosition()
+std::optional<GeolocationPosition> WebGeolocationClient::lastPosition()
 {
     return core([[m_webView _geolocationProvider] lastPosition]);
 }

Modified: trunk/Source/WebKitLegacy/mac/WebView/WebGeolocationPosition.mm (223191 => 223192)


--- trunk/Source/WebKitLegacy/mac/WebView/WebGeolocationPosition.mm	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKitLegacy/mac/WebView/WebGeolocationPosition.mm	2017-10-11 17:41:59 UTC (rev 223192)
@@ -26,24 +26,24 @@
 #import "WebGeolocationPosition.h"
 
 #import "WebGeolocationPositionInternal.h"
+#import <WebCore/GeolocationPosition.h>
+#import <wtf/Optional.h>
 #import <wtf/RefPtr.h>
 
-#import <WebCore/GeolocationPosition.h>
-
 using namespace WebCore;
 
 @interface WebGeolocationPositionInternal : NSObject
 {
 @public
-    RefPtr<GeolocationPosition> _position;
+    GeolocationPosition _position;
 }
 
-- (id)initWithCoreGeolocationPosition:(RefPtr<GeolocationPosition>&&)coreGeolocationPosition;
+- (id)initWithCoreGeolocationPosition:(GeolocationPosition&&)coreGeolocationPosition;
 @end
 
 @implementation WebGeolocationPositionInternal
 
-- (id)initWithCoreGeolocationPosition:(RefPtr<GeolocationPosition>&&)coreGeolocationPosition
+- (id)initWithCoreGeolocationPosition:(GeolocationPosition&&)coreGeolocationPosition
 {
     self = [super init];
     if (!self)
@@ -56,9 +56,11 @@
 
 @implementation WebGeolocationPosition
 
-GeolocationPosition* core(WebGeolocationPosition *position)
+std::optional<GeolocationPosition> core(WebGeolocationPosition *position)
 {
-    return position ? position->_internal->_position.get() : 0;
+    if (!position)
+        return std::nullopt;
+    return position->_internal->_position;
 }
 
 - (id)initWithTimestamp:(double)timestamp latitude:(double)latitude longitude:(double)longitude accuracy:(double)accuracy
@@ -66,11 +68,11 @@
     self = [super init];
     if (!self)
         return nil;
-    _internal = [[WebGeolocationPositionInternal alloc] initWithCoreGeolocationPosition:GeolocationPosition::create(timestamp, latitude, longitude, accuracy)];
+    _internal = [[WebGeolocationPositionInternal alloc] initWithCoreGeolocationPosition:GeolocationPosition { timestamp, latitude, longitude, accuracy }];
     return self;
 }
 
-- (id)initWithGeolocationPosition:(RefPtr<GeolocationPosition>&&)coreGeolocationPosition
+- (id)initWithGeolocationPosition:(GeolocationPosition&&)coreGeolocationPosition
 {
     self = [super init];
     if (!self)

Modified: trunk/Source/WebKitLegacy/mac/WebView/WebGeolocationPositionInternal.h (223191 => 223192)


--- trunk/Source/WebKitLegacy/mac/WebView/WebGeolocationPositionInternal.h	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKitLegacy/mac/WebView/WebGeolocationPositionInternal.h	2017-10-11 17:41:59 UTC (rev 223192)
@@ -24,10 +24,11 @@
  */
 
 #import "WebGeolocationPosition.h"
+#import <wtf/Optional.h>
 
 namespace WebCore {
     class GeolocationPosition;
 }
 
-WebCore::GeolocationPosition* core(WebGeolocationPosition *);
+std::optional<WebCore::GeolocationPosition> core(WebGeolocationPosition *);
 

Modified: trunk/Source/WebKitLegacy/win/ChangeLog (223191 => 223192)


--- trunk/Source/WebKitLegacy/win/ChangeLog	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKitLegacy/win/ChangeLog	2017-10-11 17:41:59 UTC (rev 223192)
@@ -1,3 +1,19 @@
+2017-10-11  Chris Dumez  <cdu...@apple.com>
+
+        Modernize Geolocation code
+        https://bugs.webkit.org/show_bug.cgi?id=178148
+
+        Reviewed by Ryosuke Niwa.
+
+        * WebCoreSupport/WebGeolocationClient.cpp:
+        (WebGeolocationClient::lastPosition):
+        * WebCoreSupport/WebGeolocationClient.h:
+        * WebGeolocationPosition.cpp:
+        (WebGeolocationPosition::initWithTimestamp):
+        (core):
+        * WebGeolocationPosition.h:
+        (WebGeolocationPosition::impl const):
+
 2017-10-05  Chris Dumez  <cdu...@apple.com>
 
         Drop unused parameters for CookiesStrategy::cookiesEnabled()

Modified: trunk/Source/WebKitLegacy/win/WebCoreSupport/WebGeolocationClient.cpp (223191 => 223192)


--- trunk/Source/WebKitLegacy/win/WebCoreSupport/WebGeolocationClient.cpp	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKitLegacy/win/WebCoreSupport/WebGeolocationClient.cpp	2017-10-11 17:41:59 UTC (rev 223192)
@@ -64,14 +64,14 @@
     provider->unregisterWebView(m_webView.get());
 }
 
-GeolocationPosition* WebGeolocationClient::lastPosition()
+std::optional<GeolocationPosition> WebGeolocationClient::lastPosition()
 {
     COMPtr<IWebGeolocationProvider> provider;
     if (FAILED(m_webView->geolocationProvider(&provider)))
-        return 0;
+        return std::nullopt;
     COMPtr<IWebGeolocationPosition> position;
     if (FAILED(provider->lastPosition(&position)))
-        return 0;
+        return std::nullopt;
     return core(position.get());
 }
 

Modified: trunk/Source/WebKitLegacy/win/WebCoreSupport/WebGeolocationClient.h (223191 => 223192)


--- trunk/Source/WebKitLegacy/win/WebCoreSupport/WebGeolocationClient.h	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKitLegacy/win/WebCoreSupport/WebGeolocationClient.h	2017-10-11 17:41:59 UTC (rev 223192)
@@ -43,7 +43,7 @@
     void startUpdating() final;
     void stopUpdating() final;
     void setEnableHighAccuracy(bool) final { }
-    WebCore::GeolocationPosition* lastPosition() final;
+    std::optional<WebCore::GeolocationPosition> lastPosition() final;
 
     void requestPermission(WebCore::Geolocation&) final;
     void cancelPermissionRequest(WebCore::Geolocation&) final { }

Modified: trunk/Source/WebKitLegacy/win/WebGeolocationPosition.cpp (223191 => 223192)


--- trunk/Source/WebKitLegacy/win/WebGeolocationPosition.cpp	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKitLegacy/win/WebGeolocationPosition.cpp	2017-10-11 17:41:59 UTC (rev 223192)
@@ -81,18 +81,18 @@
 
 HRESULT WebGeolocationPosition::initWithTimestamp(double timestamp, double latitude, double longitude, double accuracy)
 {
-    m_position = GeolocationPosition::create(timestamp, latitude, longitude, accuracy);
+    m_position = GeolocationPosition { timestamp, latitude, longitude, accuracy };
     return S_OK;
 }
 
-GeolocationPosition* core(IWebGeolocationPosition* position)
+std::optional<GeolocationPosition> core(IWebGeolocationPosition* position)
 {
     if (!position)
-        return 0;
+        return std::nullopt;
 
     COMPtr<WebGeolocationPosition> webGeolocationPosition(Query, position);
     if (!webGeolocationPosition)
-        return 0;
+        return std::nullopt;
 
     return webGeolocationPosition->impl();
 }

Modified: trunk/Source/WebKitLegacy/win/WebGeolocationPosition.h (223191 => 223192)


--- trunk/Source/WebKitLegacy/win/WebGeolocationPosition.h	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Source/WebKitLegacy/win/WebGeolocationPosition.h	2017-10-11 17:41:59 UTC (rev 223192)
@@ -27,11 +27,8 @@
 
 #include "WebKit.h"
 #include <WebCore/COMPtr.h>
+#include <WebCore/GeolocationPosition.h>
 
-namespace WebCore {
-    class GeolocationPosition;
-};
-
 class WebGeolocationPosition : public IWebGeolocationPosition {
 public:
     static COMPtr<WebGeolocationPosition> createInstance();
@@ -48,13 +45,13 @@
     // IWebGeolocationPosition
     virtual HRESULT STDMETHODCALLTYPE initWithTimestamp(double timestamp, double latitude, double longitude, double accuracy);
 
-    WebCore::GeolocationPosition* impl() const { return m_position.get(); }
+    const std::optional<WebCore::GeolocationPosition>& impl() const { return m_position; }
 
 private:
     ULONG m_refCount { 0 };
-    RefPtr<WebCore::GeolocationPosition> m_position;
+    std::optional<WebCore::GeolocationPosition> m_position;
 };
 
-WebCore::GeolocationPosition* core(IWebGeolocationPosition*);
+std::optional<WebCore::GeolocationPosition> core(IWebGeolocationPosition*);
 
 #endif // WebGeolocationPosition_h

Modified: trunk/Tools/ChangeLog (223191 => 223192)


--- trunk/Tools/ChangeLog	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Tools/ChangeLog	2017-10-11 17:41:59 UTC (rev 223192)
@@ -1,3 +1,13 @@
+2017-10-11  Chris Dumez  <cdu...@apple.com>
+
+        Modernize Geolocation code
+        https://bugs.webkit.org/show_bug.cgi?id=178148
+
+        Reviewed by Ryosuke Niwa.
+
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        (TestRunner::setMockGeolocationPosition):
+
 2017-10-11  Nael Ouedraogo  <nael.ouedra...@crf.canon.fr>
 
         [GStreamer] Many media source tests crashing with GStreamer-CRITICAL **: _gst_util_uint64_scale: assertion 'denom != 0' failed in gst_qtdemux_configure_stream()

Modified: trunk/Tools/DumpRenderTree/mac/TestRunnerMac.mm (223191 => 223192)


--- trunk/Tools/DumpRenderTree/mac/TestRunnerMac.mm	2017-10-11 17:27:08 UTC (rev 223191)
+++ trunk/Tools/DumpRenderTree/mac/TestRunnerMac.mm	2017-10-11 17:41:59 UTC (rev 223192)
@@ -125,7 +125,7 @@
 #endif
 
 @interface WebGeolocationPosition (Internal)
-- (id)initWithGeolocationPosition:(RefPtr<WebCore::GeolocationPosition>)coreGeolocationPosition;
+- (id)initWithGeolocationPosition:(WebCore::GeolocationPosition&&)coreGeolocationPosition;
 @end
 
 TestRunner::~TestRunner()
@@ -449,8 +449,16 @@
         // Test the exposed API.
         position = [[WebGeolocationPosition alloc] initWithTimestamp:currentTime() latitude:latitude longitude:longitude accuracy:accuracy];
     } else {
-        auto coreGeolocationPosition = WebCore::GeolocationPosition::create(currentTime(), latitude, longitude, accuracy, providesAltitude, altitude, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed);
-        position = [[WebGeolocationPosition alloc] initWithGeolocationPosition:(WTFMove(coreGeolocationPosition))];
+        WebCore::GeolocationPosition geolocationPosition { currentTime(), latitude, longitude, accuracy };
+        if (providesAltitude)
+            geolocationPosition.altitude = altitude;
+        if (providesAltitudeAccuracy)
+            geolocationPosition.altitudeAccuracy = altitudeAccuracy;
+        if (providesHeading)
+            geolocationPosition.heading = heading;
+        if (providesSpeed)
+            geolocationPosition.speed = speed;
+        position = [[WebGeolocationPosition alloc] initWithGeolocationPosition:(WTFMove(geolocationPosition))];
     }
     [[MockGeolocationProvider shared] setPosition:position];
     [position release];
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to