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];