Title: [215246] trunk
Revision
215246
Author
[email protected]
Date
2017-04-11 11:43:46 -0700 (Tue, 11 Apr 2017)

Log Message

Add SPI for handling geolocation authorization requests
https://bugs.webkit.org/show_bug.cgi?id=170362
rdar://problem/17508627

Patch by David Quesada <[email protected]> on 2017-04-11
Reviewed by Alex Christensen.

Source/WebKit2:

Add a new WKUIDelegate method for the WKGeolocationProviderIOS to call when a web page
requests geolocation access. To support testing this change, make it possible to override
the CoreLocation abstraction WKGeolocationProviderIOS uses. There is now a configurable
object on the process pool that implements a protocol for providing location updates for
web views in the process pool. If the client doesn't provide this object,
WKGeolocationProviderIOS falls back to an object that wraps the existing WebKit1
WebGeolocationCoreLocationProvider and conforms to the new protocol.

* Shared/Cocoa/APIObject.mm:
(API::Object::newObject):
* Shared/WebGeolocationPosition.h:
(WebKit::WebGeolocationPosition::create):
* UIProcess/API/C/WKGeolocationPosition.cpp:
(WKGeolocationPositionCreate_b):
* UIProcess/API/Cocoa/WKProcessPool.mm:
(-[WKProcessPool _coreLocationProvider]):
(-[WKProcessPool _setCoreLocationProvider:]):
* UIProcess/API/Cocoa/WKProcessPoolPrivate.h:
* UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
* UIProcess/API/Cocoa/_WKGeolocationCoreLocationProvider.h: Copied from Source/WebKit2/UIProcess/API/C/WKGeolocationPosition.cpp.
* UIProcess/API/Cocoa/_WKGeolocationPosition.h: Copied from Source/WebKit2/UIProcess/API/C/WKGeolocationPosition.cpp.
* UIProcess/API/Cocoa/_WKGeolocationPosition.mm: Added.
(WebKit::if):
(-[_WKGeolocationPosition dealloc]):
(-[_WKGeolocationPosition _apiObject]):
* UIProcess/API/Cocoa/_WKGeolocationPositionInternal.h: Copied from Source/WebKit2/UIProcess/API/C/WKGeolocationPosition.cpp.
(WebKit::wrapper):
* UIProcess/ios/WKGeolocationProviderIOS.mm:
(kit):
(-[WKGeolocationProviderIOS initWithProcessPool:]):
(-[WKGeolocationProviderIOS geolocationAuthorizationGranted]):
(-[WKGeolocationProviderIOS positionChanged:]):
(-[WKLegacyCoreLocationProvider setListener:]):
(-[WKLegacyCoreLocationProvider requestGeolocationAuthorization]):
(-[WKLegacyCoreLocationProvider start]):
(-[WKLegacyCoreLocationProvider stop]):
(-[WKLegacyCoreLocationProvider setEnableHighAccuracy:]):
(-[WKLegacyCoreLocationProvider geolocationAuthorizationGranted]):
(-[WKLegacyCoreLocationProvider geolocationAuthorizationDenied]):
(-[WKLegacyCoreLocationProvider positionChanged:]):
(-[WKLegacyCoreLocationProvider errorOccurred:]):
(-[WKLegacyCoreLocationProvider resetGeolocation]):
Implement a new class that bridges the currently used WebGeolocationCoreLocationProvider
to conform to the _WKGeolocationCoreLocationProvider protocol that WKGeolocationProviderIOS
expects.
* WebKit2.xcodeproj/project.pbxproj:

Tools:

Add API tests for the new WKUIDelegate SPI for allowing or denying websites permission
to use geolocation. Adopt the new WKProcessPool._coreLocationProvider property to
provide a stub object to simulate the various configurations of geolocation permissions:
1. The app doesn't have permission to use geolocation.
2. The app is allowed to use geolocation, but the UI delegate denies the web view permission.
3. The app is allowed to use geolocation, and the UI delegate allows the web view permission.

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WebKit2Cocoa/Geolocation.mm: Added.
(-[TestCoreLocationProvider setListener:]):
(-[TestCoreLocationProvider requestGeolocationAuthorization]):
(-[TestCoreLocationProvider start]):
(-[TestCoreLocationProvider stop]):
(-[TestCoreLocationProvider setEnableHighAccuracy:]):
(expectException):
(-[GeolocationTestUIDelegate _webView:requestGeolocationAuthorizationForURL:frame:decisionHandler:]):
(-[GeolocationTestUIDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
(TestWebKitAPI::TEST):
* TestWebKitAPI/Tests/WebKit2Cocoa/GeolocationGetCurrentPositionResult.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (215245 => 215246)


--- trunk/Source/WebKit2/ChangeLog	2017-04-11 18:41:39 UTC (rev 215245)
+++ trunk/Source/WebKit2/ChangeLog	2017-04-11 18:43:46 UTC (rev 215246)
@@ -1,3 +1,58 @@
+2017-04-11  David Quesada  <[email protected]>
+
+        Add SPI for handling geolocation authorization requests
+        https://bugs.webkit.org/show_bug.cgi?id=170362
+        rdar://problem/17508627
+
+        Reviewed by Alex Christensen.
+
+        Add a new WKUIDelegate method for the WKGeolocationProviderIOS to call when a web page
+        requests geolocation access. To support testing this change, make it possible to override
+        the CoreLocation abstraction WKGeolocationProviderIOS uses. There is now a configurable
+        object on the process pool that implements a protocol for providing location updates for
+        web views in the process pool. If the client doesn't provide this object,
+        WKGeolocationProviderIOS falls back to an object that wraps the existing WebKit1
+        WebGeolocationCoreLocationProvider and conforms to the new protocol.
+
+        * Shared/Cocoa/APIObject.mm:
+        (API::Object::newObject):
+        * Shared/WebGeolocationPosition.h:
+        (WebKit::WebGeolocationPosition::create):
+        * UIProcess/API/C/WKGeolocationPosition.cpp:
+        (WKGeolocationPositionCreate_b):
+        * UIProcess/API/Cocoa/WKProcessPool.mm:
+        (-[WKProcessPool _coreLocationProvider]):
+        (-[WKProcessPool _setCoreLocationProvider:]):
+        * UIProcess/API/Cocoa/WKProcessPoolPrivate.h:
+        * UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
+        * UIProcess/API/Cocoa/_WKGeolocationCoreLocationProvider.h: Copied from Source/WebKit2/UIProcess/API/C/WKGeolocationPosition.cpp.
+        * UIProcess/API/Cocoa/_WKGeolocationPosition.h: Copied from Source/WebKit2/UIProcess/API/C/WKGeolocationPosition.cpp.
+        * UIProcess/API/Cocoa/_WKGeolocationPosition.mm: Added.
+        (WebKit::if):
+        (-[_WKGeolocationPosition dealloc]):
+        (-[_WKGeolocationPosition _apiObject]):
+        * UIProcess/API/Cocoa/_WKGeolocationPositionInternal.h: Copied from Source/WebKit2/UIProcess/API/C/WKGeolocationPosition.cpp.
+        (WebKit::wrapper):
+        * UIProcess/ios/WKGeolocationProviderIOS.mm:
+        (kit):
+        (-[WKGeolocationProviderIOS initWithProcessPool:]):
+        (-[WKGeolocationProviderIOS geolocationAuthorizationGranted]):
+        (-[WKGeolocationProviderIOS positionChanged:]):
+        (-[WKLegacyCoreLocationProvider setListener:]):
+        (-[WKLegacyCoreLocationProvider requestGeolocationAuthorization]):
+        (-[WKLegacyCoreLocationProvider start]):
+        (-[WKLegacyCoreLocationProvider stop]):
+        (-[WKLegacyCoreLocationProvider setEnableHighAccuracy:]):
+        (-[WKLegacyCoreLocationProvider geolocationAuthorizationGranted]):
+        (-[WKLegacyCoreLocationProvider geolocationAuthorizationDenied]):
+        (-[WKLegacyCoreLocationProvider positionChanged:]):
+        (-[WKLegacyCoreLocationProvider errorOccurred:]):
+        (-[WKLegacyCoreLocationProvider resetGeolocation]):
+        Implement a new class that bridges the currently used WebGeolocationCoreLocationProvider
+        to conform to the _WKGeolocationCoreLocationProvider protocol that WKGeolocationProviderIOS
+        expects.
+        * WebKit2.xcodeproj/project.pbxproj:
+
 2017-04-11  Eric Carlson  <[email protected]>
 
         [MediaStream] Set correct audio session category when capturing audio

Modified: trunk/Source/WebKit2/Shared/Cocoa/APIObject.mm (215245 => 215246)


--- trunk/Source/WebKit2/Shared/Cocoa/APIObject.mm	2017-04-11 18:41:39 UTC (rev 215245)
+++ trunk/Source/WebKit2/Shared/Cocoa/APIObject.mm	2017-04-11 18:43:46 UTC (rev 215246)
@@ -72,6 +72,7 @@
 #import "_WKDownloadInternal.h"
 #import "_WKExperimentalFeatureInternal.h"
 #import "_WKFrameHandleInternal.h"
+#import "_WKGeolocationPositionInternal.h"
 #import "_WKHitTestResultInternal.h"
 #import "_WKProcessPoolConfigurationInternal.h"
 #import "_WKUserContentWorldInternal.h"
@@ -179,6 +180,12 @@
         wrapper = [WKFrameInfo alloc];
         break;
 
+#if PLATFORM(IOS)
+    case Type::GeolocationPosition:
+        wrapper = [_WKGeolocationPosition alloc];
+        break;
+#endif
+
     case Type::HTTPCookieStore:
         wrapper = [WKHTTPCookieStore alloc];
         break;

Modified: trunk/Source/WebKit2/Shared/WebGeolocationPosition.h (215245 => 215246)


--- trunk/Source/WebKit2/Shared/WebGeolocationPosition.h	2017-04-11 18:41:39 UTC (rev 215245)
+++ trunk/Source/WebKit2/Shared/WebGeolocationPosition.h	2017-04-11 18:43:46 UTC (rev 215246)
@@ -58,9 +58,9 @@
         bool canProvideSpeed;
     };
 
-    static PassRefPtr<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)
+    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)
     {
-        return adoptRef(new WebGeolocationPosition(timestamp, latitude, longitude, accuracy, providesAltitude, altitude, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed));
+        return adoptRef(*new WebGeolocationPosition(timestamp, latitude, longitude, accuracy, providesAltitude, altitude, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed));
     }
 
     virtual ~WebGeolocationPosition();

Modified: trunk/Source/WebKit2/UIProcess/API/C/WKGeolocationPosition.cpp (215245 => 215246)


--- trunk/Source/WebKit2/UIProcess/API/C/WKGeolocationPosition.cpp	2017-04-11 18:41:39 UTC (rev 215245)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKGeolocationPosition.cpp	2017-04-11 18:43:46 UTC (rev 215246)
@@ -44,5 +44,5 @@
 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);
-    return toAPI(position.leakRef());
+    return toAPI(&position.leakRef());
 }

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKProcessPool.mm (215245 => 215246)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKProcessPool.mm	2017-04-11 18:41:39 UTC (rev 215245)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKProcessPool.mm	2017-04-11 18:43:46 UTC (rev 215246)
@@ -61,6 +61,7 @@
     RetainPtr<_WKAutomationSession> _automationSession;
 #if PLATFORM(IOS)
     RetainPtr<WKGeolocationProviderIOS> _geolocationProvider;
+    RetainPtr<id <_WKGeolocationCoreLocationProvider>> _coreLocationProvider;
 #endif // PLATFORM(IOS)
 }
 
@@ -308,6 +309,21 @@
     _processPool->setCookieStoragePartitioningEnabled(enabled);
 }
 
+#if PLATFORM(IOS)
+- (id <_WKGeolocationCoreLocationProvider>)_coreLocationProvider
+{
+    return _coreLocationProvider.get();
+}
+
+- (void)_setCoreLocationProvider:(id<_WKGeolocationCoreLocationProvider>)coreLocationProvider
+{
+    if (_geolocationProvider)
+        [NSException raise:NSGenericException format:@"Changing the location provider is not supported after a web view in the process pool has begun servicing geolocation requests."];
+
+    _coreLocationProvider = coreLocationProvider;
+}
+#endif // PLATFORM(IOS)
+
 @end
 
 #endif // WK_API_ENABLED

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKProcessPoolPrivate.h (215245 => 215246)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKProcessPoolPrivate.h	2017-04-11 18:41:39 UTC (rev 215245)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKProcessPoolPrivate.h	2017-04-11 18:43:46 UTC (rev 215246)
@@ -31,6 +31,7 @@
 @class _WKProcessPoolConfiguration;
 @protocol _WKAutomationDelegate;
 @protocol _WKDownloadDelegate;
+@protocol _WKGeolocationCoreLocationProvider;
 
 @interface WKProcessPool ()
 - (instancetype)_initWithConfiguration:(_WKProcessPoolConfiguration *)configuration __attribute__((objc_method_family(init))) NS_DESIGNATED_INITIALIZER;
@@ -54,6 +55,10 @@
 @property (nonatomic, weak, setter=_setDownloadDelegate:) id <_WKDownloadDelegate> _downloadDelegate;
 @property (nonatomic, weak, setter=_setAutomationDelegate:) id <_WKAutomationDelegate> _automationDelegate WK_API_AVAILABLE(macosx(10.12), ios(10.0));
 
+#if TARGET_OS_IPHONE
+@property (nonatomic, setter=_setCoreLocationProvider:) id <_WKGeolocationCoreLocationProvider> _coreLocationProvider WK_API_AVAILABLE(ios(WK_IOS_TBA));
+#endif
+
 + (NSURL *)_websiteDataURLForContainerWithURL:(NSURL *)containerURL;
 + (NSURL *)_websiteDataURLForContainerWithURL:(NSURL *)containerURL bundleIdentifierIfNotInContainer:(NSString *)bundleIdentifier;
 

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegatePrivate.h (215245 => 215246)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegatePrivate.h	2017-04-11 18:41:39 UTC (rev 215245)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegatePrivate.h	2017-04-11 18:43:46 UTC (rev 215246)
@@ -35,6 +35,7 @@
 @class UIItemProvider;
 @class UIScrollView;
 @class UIViewController;
+@class WKFrameInfo;
 @class _WKContextMenuElementInfo;
 @class _WKActivatedElementInfo;
 @class _WKElementAction;
@@ -72,6 +73,7 @@
 - (NSArray *)_webView:(WKWebView *)webView actionsForElement:(_WKActivatedElementInfo *)element defaultActions:(NSArray<_WKElementAction *> *)defaultActions;
 - (void)_webView:(WKWebView *)webView didNotHandleTapAsClickAtPoint:(CGPoint)point;
 - (BOOL)_webView:(WKWebView *)webView shouldRequestGeolocationAuthorizationForURL:(NSURL *)url isMainFrame:(BOOL)isMainFrame mainFrameURL:(NSURL *)mainFrameURL;
+- (void)_webView:(WKWebView *)webView requestGeolocationAuthorizationForURL:(NSURL *)url frame:(WKFrameInfo *)frame decisionHandler:(void (^)(BOOL authorized))decisionHandler WK_API_AVAILABLE(ios(WK_IOS_TBA));
 - (UIViewController *)_webView:(WKWebView *)webView previewViewControllerForURL:(NSURL *)url WK_API_AVAILABLE(ios(9.0));
 - (void)_webView:(WKWebView *)webView commitPreviewedViewController:(UIViewController *)previewedViewController WK_API_AVAILABLE(ios(9.0));
 - (void)_webView:(WKWebView *)webView willPreviewImageWithURL:(NSURL *)imageURL WK_API_AVAILABLE(ios(9.0));

Copied: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKGeolocationCoreLocationProvider.h (from rev 215245, trunk/Source/WebKit2/UIProcess/API/C/WKGeolocationPosition.cpp) (0 => 215246)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKGeolocationCoreLocationProvider.h	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKGeolocationCoreLocationProvider.h	2017-04-11 18:43:46 UTC (rev 215246)
@@ -0,0 +1,54 @@
+/*
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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.
+ */
+
+#import <WebKit/WKFoundation.h>
+
+#if WK_API_ENABLED && TARGET_OS_IPHONE
+
+#import <Foundation/NSObject.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class _WKGeolocationPosition;
+
+@protocol _WKGeolocationCoreLocationListener <NSObject>
+- (void)geolocationAuthorizationGranted;
+- (void)geolocationAuthorizationDenied;
+- (void)positionChanged:(_WKGeolocationPosition *)position;
+- (void)errorOccurred:(NSString *)errorMessage;
+- (void)resetGeolocation;
+@end
+
+@protocol _WKGeolocationCoreLocationProvider <NSObject>
+- (void)setListener:(id <_WKGeolocationCoreLocationListener>)listener;
+- (void)requestGeolocationAuthorization;
+- (void)start;
+- (void)stop;
+- (void)setEnableHighAccuracy:(BOOL)flag;
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif // WK_API_ENABLED && TARGET_OS_IPHONE

Copied: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKGeolocationPosition.h (from rev 215245, trunk/Source/WebKit2/UIProcess/API/C/WKGeolocationPosition.cpp) (0 => 215246)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKGeolocationPosition.h	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKGeolocationPosition.h	2017-04-11 18:43:46 UTC (rev 215246)
@@ -0,0 +1,45 @@
+/*
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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.
+ */
+
+#import <WebKit/WKFoundation.h>
+
+#if WK_API_ENABLED && TARGET_OS_IPHONE
+
+#import <Foundation/Foundation.h>
+
+@class CLLocation;
+
+NS_ASSUME_NONNULL_BEGIN
+
+WK_CLASS_AVAILABLE(ios(WK_IOS_TBA))
+@interface _WKGeolocationPosition : NSObject
+
++ (instancetype)positionWithLocation:(CLLocation *)location;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif // WK_API_ENABLED && TARGET_OS_IPHONE

Added: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKGeolocationPosition.mm (0 => 215246)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKGeolocationPosition.mm	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKGeolocationPosition.mm	2017-04-11 18:43:46 UTC (rev 215246)
@@ -0,0 +1,83 @@
+/*
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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.
+ */
+
+#import "config.h"
+#import "_WKGeolocationPositionInternal.h"
+
+#if WK_API_ENABLED && TARGET_OS_IPHONE
+
+#import <CoreLocation/CLLocation.h>
+
+using namespace WebKit;
+
+@implementation _WKGeolocationPosition
+
++ (instancetype)positionWithLocation:(CLLocation *)location
+{
+    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];
+}
+
+- (void)dealloc
+{
+    _geolocationPosition->~WebGeolocationPosition();
+
+    [super dealloc];
+}
+
+#pragma mark WKObject protocol implementation
+
+- (API::Object&)_apiObject
+{
+    return *_geolocationPosition;
+}
+
+@end
+
+#endif // WK_API_ENABLED && TARGET_OS_IPHONE

Copied: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKGeolocationPositionInternal.h (from rev 215245, trunk/Source/WebKit2/UIProcess/API/C/WKGeolocationPosition.cpp) (0 => 215246)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKGeolocationPositionInternal.h	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKGeolocationPositionInternal.h	2017-04-11 18:43:46 UTC (rev 215246)
@@ -0,0 +1,48 @@
+/*
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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.
+ */
+
+#import "_WKGeolocationPosition.h"
+
+#if WK_API_ENABLED && TARGET_OS_IPHONE
+
+#import "WebGeolocationPosition.h"
+
+namespace WebKit {
+
+inline _WKGeolocationPosition *wrapper(WebKit::WebGeolocationPosition &position)
+{
+    ASSERT([position.wrapper() isKindOfClass:[_WKGeolocationPosition class]]);
+    return (_WKGeolocationPosition *)position.wrapper();
+}
+
+}
+
+@interface _WKGeolocationPosition () <WKObject> {
+@package
+    API::ObjectStorage<WebKit::WebGeolocationPosition> _geolocationPosition;
+}
+@end
+
+#endif // WK_API_ENABLED && TARGET_OS_IPHONE

Modified: trunk/Source/WebKit2/UIProcess/ios/WKGeolocationProviderIOS.mm (215245 => 215246)


--- trunk/Source/WebKit2/UIProcess/ios/WKGeolocationProviderIOS.mm	2017-04-11 18:41:39 UTC (rev 215245)
+++ trunk/Source/WebKit2/UIProcess/ios/WKGeolocationProviderIOS.mm	2017-04-11 18:43:46 UTC (rev 215246)
@@ -28,16 +28,23 @@
 
 #if PLATFORM(IOS)
 
+#import "APIFrameInfo.h"
 #import "APISecurityOrigin.h"
+#import "CompletionHandlerCallChecker.h"
 #import "GeolocationPermissionRequestProxy.h"
+#import "WKFrameInfoInternal.h"
+#import "WKProcessPoolInternal.h"
 #import "WKUIDelegatePrivate.h"
 #import "WKWebView.h"
 #import "WebGeolocationManagerProxy.h"
 #import "WebProcessPool.h"
+#import "_WKGeolocationCoreLocationProvider.h"
+#import "_WKGeolocationPositionInternal.h"
 #import <WebCore/GeolocationPosition.h>
 #import <WebCore/URL.h>
 #import <WebGeolocationPosition.h>
 #import <wtf/Assertions.h>
+#import <wtf/BlockPtr.h>
 #import <wtf/HashSet.h>
 #import <wtf/PassRefPtr.h>
 #import <wtf/RefPtr.h>
@@ -53,9 +60,12 @@
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
 
-@interface WKGeolocationProviderIOS (WebGeolocationCoreLocationUpdateListener) <WebGeolocationCoreLocationUpdateListener>
+@interface WKGeolocationProviderIOS (_WKGeolocationCoreLocationListener) <_WKGeolocationCoreLocationListener>
 @end
 
+@interface WKLegacyCoreLocationProvider : NSObject<_WKGeolocationCoreLocationProvider, WebGeolocationCoreLocationUpdateListener>
+@end
+
 @interface WKWebAllowDenyPolicyListener : NSObject<WebAllowDenyPolicyListener>
 - (id)initWithPermissionRequestProxy:(PassRefPtr<GeolocationPermissionRequestProxy>)permissionRequestProxy;
 - (void)denyOnlyThisRequest NO_RETURN_DUE_TO_ASSERT;
@@ -65,6 +75,11 @@
 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;
@@ -74,7 +89,7 @@
 
 @implementation WKGeolocationProviderIOS {
     RefPtr<WebGeolocationManagerProxy> _geolocationManager;
-    RetainPtr<WebGeolocationCoreLocationProvider> _coreLocationProvider;
+    RetainPtr<id <_WKGeolocationCoreLocationProvider>> _coreLocationProvider;
     BOOL _isWebCoreGeolocationActive;
     RefPtr<WebGeolocationPosition> _lastActivePosition;
     Vector<GeolocationRequestData> _requestsWaitingForCoreLocationAuthorization;
@@ -148,7 +163,8 @@
         setEnableHighAccuracy
     };
     _geolocationManager->initializeProvider(reinterpret_cast<WKGeolocationProviderBase*>(&providerCallback));
-    _coreLocationProvider = adoptNS([[WebGeolocationCoreLocationProvider alloc] initWithListener:self]);
+    _coreLocationProvider = wrapper(processPool)._coreLocationProvider ?: adoptNS(static_cast<id <_WKGeolocationCoreLocationProvider>>([[WKLegacyCoreLocationProvider alloc] init]));
+    [_coreLocationProvider setListener:self];
     return self;
 }
 
@@ -177,6 +193,22 @@
         bool requiresUserAuthorization = true;
 
         id<WKUIDelegatePrivate> uiDelegate = static_cast<id <WKUIDelegatePrivate>>([request.view UIDelegate]);
+        if ([uiDelegate respondsToSelector:@selector(_webView:requestGeolocationAuthorizationForURL:frame:decisionHandler:)]) {
+            URL requestFrameURL(URL(), request.frame->url());
+            RetainPtr<WKFrameInfo> frameInfo = wrapper(API::FrameInfo::create(*request.frame.get(), *request.origin.get()));
+            RefPtr<CompletionHandlerCallChecker> checker = CompletionHandlerCallChecker::create(uiDelegate, @selector(_webView:requestGeolocationAuthorizationForURL:frame:decisionHandler:));
+            [uiDelegate _webView:request.view.get() requestGeolocationAuthorizationForURL:requestFrameURL frame:frameInfo.get() decisionHandler:BlockPtr<void(BOOL)>::fromCallable([request, checker = WTFMove(checker)](BOOL authorized) {
+                if (checker->completionHandlerHasBeenCalled())
+                    return;
+                if (authorized)
+                    request.permissionRequest->allow();
+                else
+                    request.permissionRequest->deny();
+                checker->didCallCompletionHandler();
+            }).get()];
+            return;
+        }
+
         if ([uiDelegate respondsToSelector:@selector(_webView:shouldRequestGeolocationAuthorizationForURL:isMainFrame:mainFrameURL:)]) {
             const WebFrameProxy* mainFrame = request.frame->page()->mainFrame();
             bool isMainFrame = request.frame == mainFrame;
@@ -203,9 +235,9 @@
         requestData.permissionRequest->deny();
 }
 
-- (void)positionChanged:(GeolocationPosition*)position
+- (void)positionChanged:(_WKGeolocationPosition *)position
 {
-    _lastActivePosition = 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());
+    _lastActivePosition = position->_geolocationPosition.get();
     _geolocationManager->providerDidChangePosition(_lastActivePosition.get());
 }
 
@@ -221,6 +253,81 @@
 
 @end
 
+# pragma mark - Implementation of WKLegacyCoreLocationProvider
+
+@implementation WKLegacyCoreLocationProvider {
+    id <_WKGeolocationCoreLocationListener> _listener;
+    RetainPtr<WebGeolocationCoreLocationProvider> _provider;
+}
+
+// <_WKGeolocationCoreLocationProvider> Methods
+
+- (void)setListener:(id<_WKGeolocationCoreLocationListener>)listener
+{
+    ASSERT(listener && !_listener && !_provider);
+    _listener = listener;
+    _provider = adoptNS([[WebGeolocationCoreLocationProvider alloc] initWithListener:self]);
+}
+
+- (void)requestGeolocationAuthorization
+{
+    ASSERT(_provider);
+    [_provider requestGeolocationAuthorization];
+}
+
+- (void)start
+{
+    ASSERT(_provider);
+    [_provider start];
+}
+
+- (void)stop
+{
+    ASSERT(_provider);
+    [_provider stop];
+}
+
+- (void)setEnableHighAccuracy:(BOOL)flag
+{
+    ASSERT(_provider);
+    [_provider setEnableHighAccuracy:flag];
+}
+
+// <WebGeolocationCoreLocationUpdateListener> Methods
+
+- (void)geolocationAuthorizationGranted
+{
+    ASSERT(_listener);
+    [_listener geolocationAuthorizationGranted];
+}
+
+- (void)geolocationAuthorizationDenied
+{
+    ASSERT(_listener);
+    [_listener geolocationAuthorizationDenied];
+}
+
+- (void)positionChanged:(WebCore::GeolocationPosition *)corePosition
+{
+    ASSERT(_listener);
+    auto position = kit(corePosition);
+    [_listener positionChanged:wrapper(position.get())];
+}
+
+- (void)errorOccurred:(NSString *)errorMessage
+{
+    ASSERT(_listener);
+    [_listener errorOccurred:errorMessage];
+}
+
+- (void)resetGeolocation
+{
+    ASSERT(_listener);
+    [_listener resetGeolocation];
+}
+
+@end
+
 # pragma mark - Implementation of WKWebAllowDenyPolicyListener
 @implementation WKWebAllowDenyPolicyListener {
     RefPtr<GeolocationPermissionRequestProxy> _permissionRequestProxy;

Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (215245 => 215246)


--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj	2017-04-11 18:41:39 UTC (rev 215245)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj	2017-04-11 18:43:46 UTC (rev 215246)
@@ -1171,6 +1171,10 @@
 		5CD286581E7235D10094FDC8 /* WKContentExtensionStorePrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CD286501E722F440094FDC8 /* WKContentExtensionStorePrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		5CE85B201C88E64B0070BFCE /* PingLoad.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CE85B1F1C88E6430070BFCE /* PingLoad.h */; };
 		5CFECB041E1ED1CC00F88504 /* LegacyCustomProtocolManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CFECB031E1ED1C800F88504 /* LegacyCustomProtocolManager.cpp */; };
+		636353A51E9858DF0009F8AF /* _WKGeolocationCoreLocationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 63FABE191E970D65003011D5 /* _WKGeolocationCoreLocationProvider.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		63C32C251E9810D900699BD0 /* _WKGeolocationPosition.mm in Sources */ = {isa = PBXBuildFile; fileRef = 63C32C231E9810D900699BD0 /* _WKGeolocationPosition.mm */; };
+		63C32C261E9810D900699BD0 /* _WKGeolocationPosition.h in Headers */ = {isa = PBXBuildFile; fileRef = 63C32C241E9810D900699BD0 /* _WKGeolocationPosition.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		63C32C281E98119000699BD0 /* _WKGeolocationPositionInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 63C32C271E98119000699BD0 /* _WKGeolocationPositionInternal.h */; };
 		6501BD1A12F1243400E9F248 /* WKBundleInspector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65B86F1712F11D7B00B7DD8A /* WKBundleInspector.cpp */; };
 		659C551E130006410025C0C2 /* InjectedBundlePageResourceLoadClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6546A82913000164000CEB1C /* InjectedBundlePageResourceLoadClient.cpp */; };
 		65B86F1E12F11DE300B7DD8A /* WKBundleInspector.h in Headers */ = {isa = PBXBuildFile; fileRef = 65B86F1812F11D7B00B7DD8A /* WKBundleInspector.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -3431,6 +3435,10 @@
 		5CFECB031E1ED1C800F88504 /* LegacyCustomProtocolManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LegacyCustomProtocolManager.cpp; path = NetworkProcess/CustomProtocols/LegacyCustomProtocolManager.cpp; sourceTree = "<group>"; };
 		5D442A5516D5856700AC3331 /* PluginService.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PluginService.entitlements; sourceTree = "<group>"; };
 		5DAD73F1116FF90C00EE5396 /* BaseTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = BaseTarget.xcconfig; sourceTree = "<group>"; };
+		63C32C231E9810D900699BD0 /* _WKGeolocationPosition.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKGeolocationPosition.mm; sourceTree = "<group>"; };
+		63C32C241E9810D900699BD0 /* _WKGeolocationPosition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKGeolocationPosition.h; sourceTree = "<group>"; };
+		63C32C271E98119000699BD0 /* _WKGeolocationPositionInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKGeolocationPositionInternal.h; sourceTree = "<group>"; };
+		63FABE191E970D65003011D5 /* _WKGeolocationCoreLocationProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = _WKGeolocationCoreLocationProvider.h; sourceTree = "<group>"; };
 		6546A82913000164000CEB1C /* InjectedBundlePageResourceLoadClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundlePageResourceLoadClient.cpp; sourceTree = "<group>"; };
 		6546A82A13000164000CEB1C /* InjectedBundlePageResourceLoadClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InjectedBundlePageResourceLoadClient.h; sourceTree = "<group>"; };
 		65B86F1712F11D7B00B7DD8A /* WKBundleInspector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKBundleInspector.cpp; sourceTree = "<group>"; };
@@ -5522,6 +5530,10 @@
 				2E7A94491BBD95C600945547 /* _WKFocusedElementInfo.h */,
 				37A64E5618F38F4600EB30F1 /* _WKFormInputSession.h */,
 				CD78E1181DB7E5AD0014A2DE /* _WKFullscreenDelegate.h */,
+				63FABE191E970D65003011D5 /* _WKGeolocationCoreLocationProvider.h */,
+				63C32C241E9810D900699BD0 /* _WKGeolocationPosition.h */,
+				63C32C231E9810D900699BD0 /* _WKGeolocationPosition.mm */,
+				63C32C271E98119000699BD0 /* _WKGeolocationPositionInternal.h */,
 				5143B25E1DDCDFD10014FAC6 /* _WKIconLoadingDelegate.h */,
 				37A64E5418F38E3C00EB30F1 /* _WKInputDelegate.h */,
 				2D790A9C1AD7050D00AB90B3 /* _WKLayoutMode.h */,
@@ -8081,6 +8093,7 @@
 				93A88B3B1BC710D900ABA5C2 /* _WKHitTestResultInternal.h in Headers */,
 				510F59101DDE296900412FF5 /* _WKIconLoadingDelegate.h in Headers */,
 				37A64E5518F38E3C00EB30F1 /* _WKInputDelegate.h in Headers */,
+				63C32C281E98119000699BD0 /* _WKGeolocationPositionInternal.h in Headers */,
 				2D790A9D1AD7050D00AB90B3 /* _WKLayoutMode.h in Headers */,
 				510F59111DDE297000412FF5 /* _WKLinkIconParameters.h in Headers */,
 				A118A9F31908B8EA00F7C92B /* _WKNSFileManagerExtras.h in Headers */,
@@ -8277,6 +8290,7 @@
 				BCCF6B2512C93E7A008F9C35 /* ImageOptions.h in Headers */,
 				1A1EC69E1872092100B951F0 /* ImportanceAssertion.h in Headers */,
 				BC204EE311C83E98008F3375 /* InjectedBundle.h in Headers */,
+				636353A51E9858DF0009F8AF /* _WKGeolocationCoreLocationProvider.h in Headers */,
 				935EEBA2127761D0003322B8 /* InjectedBundleBackForwardList.h in Headers */,
 				935EEBA4127761D6003322B8 /* InjectedBundleBackForwardListItem.h in Headers */,
 				BCEE7DC5128B645D009827DA /* InjectedBundleClient.h in Headers */,
@@ -8790,6 +8804,7 @@
 				BC14DF9F120B635F00826C0C /* WKBundleScriptWorld.h in Headers */,
 				BC4075F6124FF0270068F20A /* WKCertificateInfo.h in Headers */,
 				BC407627124FF0400068F20A /* WKCertificateInfoMac.h in Headers */,
+				63C32C261E9810D900699BD0 /* _WKGeolocationPosition.h in Headers */,
 				BCA284D71492F2C7001F9042 /* WKConnection.h in Headers */,
 				BC5C75C814954DA600BC4775 /* WKConnectionInternal.h in Headers */,
 				BC4A6297147313A0006C681A /* WKConnectionRef.h in Headers */,
@@ -10326,6 +10341,7 @@
 				2DA944A31884E4F000ED86DB /* WebTouchEventIOS.cpp in Sources */,
 				BCA0EF8012331E78007D3CFB /* WebUndoStep.cpp in Sources */,
 				51D124281E6D3F5D002B2820 /* WebURLSchemeHandler.cpp in Sources */,
+				63C32C251E9810D900699BD0 /* _WKGeolocationPosition.mm in Sources */,
 				51D124331E6DE6CA002B2820 /* WebURLSchemeHandlerCocoa.mm in Sources */,
 				51D1242C1E6D41FD002B2820 /* WebURLSchemeHandlerProxy.cpp in Sources */,
 				51E8B68E1E712877001B7132 /* WebURLSchemeHandlerTask.cpp in Sources */,

Modified: trunk/Tools/ChangeLog (215245 => 215246)


--- trunk/Tools/ChangeLog	2017-04-11 18:41:39 UTC (rev 215245)
+++ trunk/Tools/ChangeLog	2017-04-11 18:43:46 UTC (rev 215246)
@@ -1,3 +1,31 @@
+2017-04-11  David Quesada  <[email protected]>
+
+        Add SPI for handling geolocation authorization requests
+        https://bugs.webkit.org/show_bug.cgi?id=170362
+        rdar://problem/17508627
+
+        Reviewed by Alex Christensen.
+
+        Add API tests for the new WKUIDelegate SPI for allowing or denying websites permission
+        to use geolocation. Adopt the new WKProcessPool._coreLocationProvider property to
+        provide a stub object to simulate the various configurations of geolocation permissions:
+        1. The app doesn't have permission to use geolocation.
+        2. The app is allowed to use geolocation, but the UI delegate denies the web view permission.
+        3. The app is allowed to use geolocation, and the UI delegate allows the web view permission.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebKit2Cocoa/Geolocation.mm: Added.
+        (-[TestCoreLocationProvider setListener:]):
+        (-[TestCoreLocationProvider requestGeolocationAuthorization]):
+        (-[TestCoreLocationProvider start]):
+        (-[TestCoreLocationProvider stop]):
+        (-[TestCoreLocationProvider setEnableHighAccuracy:]):
+        (expectException):
+        (-[GeolocationTestUIDelegate _webView:requestGeolocationAuthorizationForURL:frame:decisionHandler:]):
+        (-[GeolocationTestUIDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
+        (TestWebKitAPI::TEST):
+        * TestWebKitAPI/Tests/WebKit2Cocoa/GeolocationGetCurrentPositionResult.html: Added.
+
 2017-04-10  Matt Rajca  <[email protected]>
 
         Change autoplay state to "prevented" when media is paused due to restrictions.

Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (215245 => 215246)


--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2017-04-11 18:41:39 UTC (rev 215245)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2017-04-11 18:43:46 UTC (rev 215246)
@@ -196,6 +196,9 @@
 		5C9E59431D3EB5AC00E3C62E /* ApplicationCache.db-wal in Copy Resources */ = {isa = PBXBuildFile; fileRef = 5C9E59401D3EB1DE00E3C62E /* ApplicationCache.db-wal */; };
 		5CE354D91E70DA5C00BEFE3B /* WKUserContentExtensionStore.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5CE354D81E70D9C300BEFE3B /* WKUserContentExtensionStore.mm */; };
 		5E4B1D2E1D404C6100053621 /* WKScrollViewDelegateCrash.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5E4B1D2C1D404C6100053621 /* WKScrollViewDelegateCrash.mm */; };
+		631EFFF61E7B5E8D00D2EBB8 /* Geolocation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 631EFFF51E7B5E8D00D2EBB8 /* Geolocation.mm */; };
+		634910E01E9D3FF300880309 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 634910DF1E9D3FF300880309 /* CoreLocation.framework */; };
+		636353A71E98665D0009F8AF /* GeolocationGetCurrentPositionResult.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 636353A61E9861940009F8AF /* GeolocationGetCurrentPositionResult.html */; };
 		6BFD294C1D5E6C1D008EC968 /* HashCountedSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7A38D7E51C752D5F004F157D /* HashCountedSet.cpp */; };
 		755A20AF1E6E38630093C69F /* DatabaseTrackerTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 755A20AE1E6E38630093C69F /* DatabaseTrackerTest.cpp */; };
 		764322D71B61CCC30024F801 /* WordBoundaryTypingAttributes.mm in Sources */ = {isa = PBXBuildFile; fileRef = 764322D51B61CCA40024F801 /* WordBoundaryTypingAttributes.mm */; };
@@ -669,6 +672,7 @@
 				379028B914FAC24C007E6B43 /* acceptsFirstMouse.html in Copy Resources */,
 				1C2B81871C8925A000A5529F /* Ahem.ttf in Copy Resources */,
 				1A63479F183D72A4005B1707 /* all-content-in-one-iframe.html in Copy Resources */,
+				636353A71E98665D0009F8AF /* GeolocationGetCurrentPositionResult.html in Copy Resources */,
 				C25CCA0D1E5141840026CB8A /* AllAhem.svg in Copy Resources */,
 				5C9E59411D3EB5AC00E3C62E /* ApplicationCache.db in Copy Resources */,
 				5C9E59421D3EB5AC00E3C62E /* ApplicationCache.db-shm in Copy Resources */,
@@ -1121,6 +1125,9 @@
 		5C9E59401D3EB1DE00E3C62E /* ApplicationCache.db-wal */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ApplicationCache.db-wal"; sourceTree = "<group>"; };
 		5CE354D81E70D9C300BEFE3B /* WKUserContentExtensionStore.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKUserContentExtensionStore.mm; sourceTree = "<group>"; };
 		5E4B1D2C1D404C6100053621 /* WKScrollViewDelegateCrash.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WKScrollViewDelegateCrash.mm; path = ../ios/WKScrollViewDelegateCrash.mm; sourceTree = "<group>"; };
+		631EFFF51E7B5E8D00D2EBB8 /* Geolocation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Geolocation.mm; sourceTree = "<group>"; };
+		634910DF1E9D3FF300880309 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; };
+		636353A61E9861940009F8AF /* GeolocationGetCurrentPositionResult.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = GeolocationGetCurrentPositionResult.html; sourceTree = "<group>"; };
 		755A20AE1E6E38630093C69F /* DatabaseTrackerTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DatabaseTrackerTest.cpp; sourceTree = "<group>"; };
 		7560917719259C59009EF06E /* MemoryCacheAddImageToCacheIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MemoryCacheAddImageToCacheIOS.mm; sourceTree = "<group>"; };
 		75F3133F18C171B70041CAEC /* EphemeralSessionPushStateNoHistoryCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EphemeralSessionPushStateNoHistoryCallback.cpp; sourceTree = "<group>"; };
@@ -1506,6 +1513,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				634910E01E9D3FF300880309 /* CoreLocation.framework in Frameworks */,
 				7A010BCB1D877C0500EDE72A /* CoreGraphics.framework in Frameworks */,
 				7C83E03F1D0A61A000FEBCF3 /* libicucore.dylib in Frameworks */,
 				7A010BCD1D877C0D00EDE72A /* QuartzCore.framework in Frameworks */,
@@ -1645,6 +1653,7 @@
 				CD78E11A1DB7EA360014A2DE /* FullscreenDelegate.mm */,
 				3F1B52681D3D7129008D60C4 /* FullscreenLayoutConstraints.mm */,
 				CDE195B31CFE0ADE0053D256 /* FullscreenTopContentInset.mm */,
+				631EFFF51E7B5E8D00D2EBB8 /* Geolocation.mm */,
 				510477751D298E03009747EB /* IDBDeleteRecovery.mm */,
 				5110FCEF1E01CBAA006F8D0B /* IDBIndexUpgradeToV2.mm */,
 				51A587841D272EF3004BA9AF /* IndexedDBDatabaseProcessKill.mm */,
@@ -1787,6 +1796,7 @@
 		7C83E0281D0A5CDF00FEBCF3 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
+				634910DF1E9D3FF300880309 /* CoreLocation.framework */,
 				7A010BCA1D877C0500EDE72A /* CoreGraphics.framework */,
 				7C83E0331D0A5F2700FEBCF3 /* libicucore.dylib */,
 				7C83E0291D0A5CDF00FEBCF3 /* libWTF.a */,
@@ -1840,6 +1850,7 @@
 				CD78E11B1DB7EA360014A2DE /* FullscreenDelegate.html */,
 				3FBD1B491D39D1DB00E6D6FA /* FullscreenLayoutConstraints.html */,
 				CDE195B21CFE0ADE0053D256 /* FullscreenTopContentInset.html */,
+				636353A61E9861940009F8AF /* GeolocationGetCurrentPositionResult.html */,
 				F4DEF6EC1E9B4D950048EF61 /* image-in-link-and-input.html */,
 				510477761D298E57009747EB /* IDBDeleteRecovery.html */,
 				5104776F1D298D85009747EB /* IDBDeleteRecovery.sqlite3 */,
@@ -2796,6 +2807,7 @@
 				7C83E0BD1D0A650C00FEBCF3 /* FullscreenTopContentInset.mm in Sources */,
 				CDBFCC451A9FF45300A7B691 /* FullscreenZoomInitialFrame.mm in Sources */,
 				7CCE7EF81A411AE600447C4C /* Geolocation.cpp in Sources */,
+				631EFFF61E7B5E8D00D2EBB8 /* Geolocation.mm in Sources */,
 				7CCE7EE11A411A9A00447C4C /* GetBackingScaleFactor.mm in Sources */,
 				7CCE7EF91A411AE600447C4C /* GetInjectedBundleInitializationUserDataCallback.cpp in Sources */,
 				7CCE7EE21A411A9A00447C4C /* GetPIDAfterAbortedProcessLaunch.cpp in Sources */,

Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/Geolocation.mm (0 => 215246)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/Geolocation.mm	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/Geolocation.mm	2017-04-11 18:43:46 UTC (rev 215246)
@@ -0,0 +1,270 @@
+/*
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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.
+ */
+
+#import "config.h"
+
+#if WK_API_ENABLED && PLATFORM(IOS)
+
+#import "PlatformUtilities.h"
+#import "TestWKWebView.h"
+#import <CoreLocation/CLLocation.h>
+#import <WebKit/WKProcessPoolPrivate.h>
+#import <WebKit/WKUIDelegatePrivate.h>
+#import <WebKit/_WKGeolocationCoreLocationProvider.h>
+#import <WebKit/_WKGeolocationPosition.h>
+#import <wtf/MainThread.h>
+#import <wtf/RetainPtr.h>
+
+static bool hasReceivedAlert;
+
+@interface TestCoreLocationProvider : NSObject<_WKGeolocationCoreLocationProvider>
+@property (nonatomic) BOOL shouldAuthorizeGeolocation;
+@property (nonatomic) BOOL authorizationWasRequested;
+@property (nonatomic) BOOL simulateError;
+@end
+
+@implementation TestCoreLocationProvider {
+    __unsafe_unretained id <_WKGeolocationCoreLocationListener> _listener;
+}
+
+// _WKGeolocationCoreLocationProvider implementation
+
+- (void)setListener:(id <_WKGeolocationCoreLocationListener>)listener
+{
+    ASSERT(!_listener);
+    _listener = listener;
+}
+
+- (void)requestGeolocationAuthorization
+{
+    _authorizationWasRequested = YES;
+    WTF::callOnMainThread([shouldAuthorizeGeolocation = _shouldAuthorizeGeolocation, listener = _listener] {
+        if (shouldAuthorizeGeolocation)
+            [listener geolocationAuthorizationGranted];
+        else
+            [listener geolocationAuthorizationDenied];
+    });
+}
+
+- (void)start
+{
+    ASSERT(_shouldAuthorizeGeolocation);
+    WTF::callOnMainThread([listener = _listener, simulateError = _simulateError] {
+        if (!simulateError) {
+            auto location = adoptNS([[CLLocation alloc] initWithLatitude:37.3348 longitude:-122.009]);
+            [listener positionChanged:[_WKGeolocationPosition positionWithLocation:location.get()]];
+        } else
+            [listener errorOccurred:@"Error Message"];
+    });
+}
+
+- (void)stop
+{
+}
+
+- (void)setEnableHighAccuracy:(BOOL)flag
+{
+}
+
+@end
+
+@interface GeolocationTestUIDelegate : NSObject <WKUIDelegatePrivate>
+
+@property (nonatomic) BOOL allowGeolocation;
+@property (nonatomic) BOOL callDecisionHandlerTwice;
+@property (nonatomic) BOOL authorizationWasRequested;
+@property (nonatomic, readonly) NSString *alertMessage;
+
+@end
+
+@implementation GeolocationTestUIDelegate
+
+static void expectException(void (^completionHandler)())
+{
+    bool exceptionThrown = false;
+    @try {
+        completionHandler();
+    } @catch (NSException *exception) {
+        EXPECT_WK_STREQ(NSInternalInconsistencyException, exception.name);
+        exceptionThrown = true;
+    }
+    EXPECT_TRUE(exceptionThrown);
+}
+
+- (void)_webView:(WKWebView *)webView requestGeolocationAuthorizationForURL:(NSURL *)url frame:(WKFrameInfo *)frame decisionHandler:(void (^)(BOOL))decisionHandler
+{
+    _authorizationWasRequested = YES;
+    decisionHandler(_allowGeolocation);
+
+    if (_callDecisionHandlerTwice) {
+        expectException(^ {
+            decisionHandler(_allowGeolocation);
+        });
+    }
+}
+
+- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)())completionHandler
+{
+    completionHandler();
+    _alertMessage = message;
+    hasReceivedAlert = true;
+}
+
+@end
+
+
+using namespace std;
+
+namespace TestWebKitAPI {
+
+// These tests need to use TestWKWebView because it sets up a visible window for the web
+// view. Without this, the web process would wait until the page is visible before sending
+// the requests to the UI process.
+
+TEST(WebKit2, GeolocationDeniedByLocationProvider)
+{
+    auto uiDelegate = adoptNS([[GeolocationTestUIDelegate alloc] init]);
+    auto coreLocationProvider = adoptNS([[TestCoreLocationProvider alloc] init]);
+    auto processPool = adoptNS([[WKProcessPool alloc] init]);
+    processPool.get()._coreLocationProvider = coreLocationProvider.get();
+    auto config = adoptNS([[WKWebViewConfiguration alloc] init]);
+    config.get().processPool = processPool.get();
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:config.get()]);
+    webView.get().UIDelegate = uiDelegate.get();
+
+    coreLocationProvider.get().shouldAuthorizeGeolocation = NO;
+    uiDelegate.get().allowGeolocation = NO;
+    
+    hasReceivedAlert = false;
+    [webView loadTestPageNamed:@"GeolocationGetCurrentPositionResult"];
+
+    TestWebKitAPI::Util::run(&hasReceivedAlert);
+
+    EXPECT_WK_STREQ(uiDelegate.get().alertMessage, "ERROR:1");
+    EXPECT_TRUE(coreLocationProvider.get().authorizationWasRequested);
+    EXPECT_FALSE(uiDelegate.get().authorizationWasRequested);
+}
+
+TEST(WebKit2, GeolocationDeniedByAPI)
+{
+    auto uiDelegate = adoptNS([[GeolocationTestUIDelegate alloc] init]);
+    auto coreLocationProvider = adoptNS([[TestCoreLocationProvider alloc] init]);
+    auto processPool = adoptNS([[WKProcessPool alloc] init]);
+    processPool.get()._coreLocationProvider = coreLocationProvider.get();
+    auto config = adoptNS([[WKWebViewConfiguration alloc] init]);
+    config.get().processPool = processPool.get();
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:config.get()]);
+    webView.get().UIDelegate = uiDelegate.get();
+
+    coreLocationProvider.get().shouldAuthorizeGeolocation = YES;
+    uiDelegate.get().allowGeolocation = NO;
+
+    hasReceivedAlert = false;
+    [webView loadTestPageNamed:@"GeolocationGetCurrentPositionResult"];
+
+    TestWebKitAPI::Util::run(&hasReceivedAlert);
+
+    EXPECT_WK_STREQ(uiDelegate.get().alertMessage, "ERROR:1");
+    EXPECT_TRUE(coreLocationProvider.get().authorizationWasRequested);
+    EXPECT_TRUE(uiDelegate.get().authorizationWasRequested);
+}
+
+TEST(WebKit2, GeolocationAllowedByAPI)
+{
+    auto uiDelegate = adoptNS([[GeolocationTestUIDelegate alloc] init]);
+    auto coreLocationProvider = adoptNS([[TestCoreLocationProvider alloc] init]);
+    auto processPool = adoptNS([[WKProcessPool alloc] init]);
+    processPool.get()._coreLocationProvider = coreLocationProvider.get();
+    auto config = adoptNS([[WKWebViewConfiguration alloc] init]);
+    config.get().processPool = processPool.get();
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:config.get()]);
+    webView.get().UIDelegate = uiDelegate.get();
+
+    coreLocationProvider.get().shouldAuthorizeGeolocation = YES;
+    uiDelegate.get().allowGeolocation = YES;
+
+    hasReceivedAlert = false;
+    [webView loadTestPageNamed:@"GeolocationGetCurrentPositionResult"];
+
+    TestWebKitAPI::Util::run(&hasReceivedAlert);
+
+    EXPECT_WK_STREQ(uiDelegate.get().alertMessage, "SUCCESS");
+    EXPECT_TRUE(coreLocationProvider.get().authorizationWasRequested);
+    EXPECT_TRUE(uiDelegate.get().authorizationWasRequested);
+}
+
+TEST(WebKit2, GeolocationError)
+{
+    auto uiDelegate = adoptNS([[GeolocationTestUIDelegate alloc] init]);
+    auto coreLocationProvider = adoptNS([[TestCoreLocationProvider alloc] init]);
+    auto processPool = adoptNS([[WKProcessPool alloc] init]);
+    processPool.get()._coreLocationProvider = coreLocationProvider.get();
+    auto config = adoptNS([[WKWebViewConfiguration alloc] init]);
+    config.get().processPool = processPool.get();
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:config.get()]);
+    webView.get().UIDelegate = uiDelegate.get();
+
+    coreLocationProvider.get().shouldAuthorizeGeolocation = YES;
+    coreLocationProvider.get().simulateError = YES;
+    uiDelegate.get().allowGeolocation = YES;
+
+    hasReceivedAlert = false;
+    [webView loadTestPageNamed:@"GeolocationGetCurrentPositionResult"];
+
+    TestWebKitAPI::Util::run(&hasReceivedAlert);
+
+    EXPECT_WK_STREQ(uiDelegate.get().alertMessage, "ERROR:2");
+    EXPECT_TRUE(coreLocationProvider.get().authorizationWasRequested);
+    EXPECT_TRUE(uiDelegate.get().authorizationWasRequested);
+}
+
+TEST(WebKit2, DuplicateGeolocationAuthorizationCallbackCalls)
+{
+    auto uiDelegate = adoptNS([[GeolocationTestUIDelegate alloc] init]);
+    auto coreLocationProvider = adoptNS([[TestCoreLocationProvider alloc] init]);
+    auto processPool = adoptNS([[WKProcessPool alloc] init]);
+    processPool.get()._coreLocationProvider = coreLocationProvider.get();
+    auto config = adoptNS([[WKWebViewConfiguration alloc] init]);
+    config.get().processPool = processPool.get();
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:config.get()]);
+    webView.get().UIDelegate = uiDelegate.get();
+
+    coreLocationProvider.get().shouldAuthorizeGeolocation = YES;
+    uiDelegate.get().allowGeolocation = YES;
+    uiDelegate.get().callDecisionHandlerTwice = YES;
+
+    hasReceivedAlert = false;
+    [webView loadTestPageNamed:@"GeolocationGetCurrentPositionResult"];
+
+    TestWebKitAPI::Util::run(&hasReceivedAlert);
+
+    EXPECT_WK_STREQ(uiDelegate.get().alertMessage, "SUCCESS");
+    EXPECT_TRUE(coreLocationProvider.get().authorizationWasRequested);
+    EXPECT_TRUE(uiDelegate.get().authorizationWasRequested);
+}
+
+} // namespace TestWebKitAPI
+
+#endif // WK_API_ENABLED && PLATFORM(IOS)

Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/GeolocationGetCurrentPositionResult.html (0 => 215246)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/GeolocationGetCurrentPositionResult.html	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/GeolocationGetCurrentPositionResult.html	2017-04-11 18:43:46 UTC (rev 215246)
@@ -0,0 +1,9 @@
+<script>
+function success(position) {
+    alert("SUCCESS");
+}
+function error(err) {
+    alert("ERROR:" + err.code);
+}
+navigator.geolocation.getCurrentPosition(success, error);
+</script>
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to