[Extra zoom mode] Implement multiple and single select menus
authorwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 7 Feb 2018 23:07:02 +0000 (23:07 +0000)
committerwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 7 Feb 2018 23:07:02 +0000 (23:07 +0000)
https://bugs.webkit.org/show_bug.cgi?id=182525
<rdar://problem/35143016>

Reviewed by Tim Horton.

Add support for presenting picker views when focusing single or multiple select elements. See changes below for
additional detail.

* UIProcess/ios/WKContentViewInteraction.h:
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView _startAssistingKeyboard]):

Move logic for presenting view controllers when focusing elements out of _startAssistingKeyboard, and into
_startAssistingNode:(...). This is because _startAssistingKeyboard is only invoked for certain types of focused
element types; importantly, this set excludes select elements. Putting the call to present the focused view
controller there also didn't make much since, considering that these new view controllers are not tied to
keyboards in any way.

(-[WKContentView _startAssistingNode:userIsInteracting:blurPreviousNode:changingActivityState:userObject:]):
(-[WKContentView _stopAssistingNode]):

Dismiss any select menu that is being presented.

(-[WKContentView presentSelectMenuViewController:]):
(-[WKContentView dismissSelectMenuViewController:]):

Introduce idempotent helpers for presenting and dismissing the select menu view controller.

(-[WKContentView presentViewControllerForAssistedNode:]):
(-[WKContentView selectMenu:didSelectItemAtIndex:]):

For single select menus. Called when the user selects a row.

(-[WKContentView didCancelSelectionInSelectMenu:]):
(-[WKContentView numberOfItemsInSelectMenu:]):
(-[WKContentView selectMenu:displayTextForItemAtIndex:]):

Indicates the text value to show at a given index.

(-[WKContentView selectMenu:didCheckItemAtIndex:checked:]):

For multiple select menus, invoked when an item is checked. The `checked` parameter indicates whether or not the
item is now checked.

(-[WKContentView selectMenuSupportsMultipleSelection:]):

Indicates whether this select menu is single-item-only, or allows multiple items to be selected (checked).

(-[WKContentView selectMenu:hasCheckedOptionAtIndex:]):

For multiple select menus. Determines whether an option at the given index is checked.

(-[WKContentView startingIndexForSelectMenu:]):

Determines the index to instantly scroll to when presenting the select menu.

* UIProcess/ios/forms/WKSelectMenuViewController.h: Added.
* UIProcess/ios/forms/WKSelectMenuViewController.mm: Added.

Add new harness files for WKSelectMenuViewController's header and implementation (see WebKitAdditions).

* WebKit.xcodeproj/project.pbxproj:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@228245 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit/ChangeLog
Source/WebKit/UIProcess/ios/WKContentViewInteraction.h
Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm
Source/WebKit/UIProcess/ios/forms/WKSelectMenuViewController.h [new file with mode: 0644]
Source/WebKit/UIProcess/ios/forms/WKSelectMenuViewController.mm [new file with mode: 0644]
Source/WebKit/WebKit.xcodeproj/project.pbxproj

index 7c6d2ee..f98fed3 100644 (file)
@@ -1,3 +1,69 @@
+2018-02-07  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+        [Extra zoom mode] Implement multiple and single select menus
+        https://bugs.webkit.org/show_bug.cgi?id=182525
+        <rdar://problem/35143016>
+
+        Reviewed by Tim Horton.
+
+        Add support for presenting picker views when focusing single or multiple select elements. See changes below for
+        additional detail.
+
+        * UIProcess/ios/WKContentViewInteraction.h:
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView _startAssistingKeyboard]):
+
+        Move logic for presenting view controllers when focusing elements out of _startAssistingKeyboard, and into
+        _startAssistingNode:(...). This is because _startAssistingKeyboard is only invoked for certain types of focused
+        element types; importantly, this set excludes select elements. Putting the call to present the focused view
+        controller there also didn't make much since, considering that these new view controllers are not tied to
+        keyboards in any way.
+
+        (-[WKContentView _startAssistingNode:userIsInteracting:blurPreviousNode:changingActivityState:userObject:]):
+        (-[WKContentView _stopAssistingNode]):
+
+        Dismiss any select menu that is being presented.
+
+        (-[WKContentView presentSelectMenuViewController:]):
+        (-[WKContentView dismissSelectMenuViewController:]):
+
+        Introduce idempotent helpers for presenting and dismissing the select menu view controller.
+
+        (-[WKContentView presentViewControllerForAssistedNode:]):
+        (-[WKContentView selectMenu:didSelectItemAtIndex:]):
+
+        For single select menus. Called when the user selects a row.
+
+        (-[WKContentView didCancelSelectionInSelectMenu:]):
+        (-[WKContentView numberOfItemsInSelectMenu:]):
+        (-[WKContentView selectMenu:displayTextForItemAtIndex:]):
+
+        Indicates the text value to show at a given index.
+
+        (-[WKContentView selectMenu:didCheckItemAtIndex:checked:]):
+
+        For multiple select menus, invoked when an item is checked. The `checked` parameter indicates whether or not the
+        item is now checked.
+
+        (-[WKContentView selectMenuSupportsMultipleSelection:]):
+
+        Indicates whether this select menu is single-item-only, or allows multiple items to be selected (checked).
+
+        (-[WKContentView selectMenu:hasCheckedOptionAtIndex:]):
+
+        For multiple select menus. Determines whether an option at the given index is checked.
+
+        (-[WKContentView startingIndexForSelectMenu:]):
+
+        Determines the index to instantly scroll to when presenting the select menu.
+
+        * UIProcess/ios/forms/WKSelectMenuViewController.h: Added.
+        * UIProcess/ios/forms/WKSelectMenuViewController.mm: Added.
+
+        Add new harness files for WKSelectMenuViewController's header and implementation (see WebKitAdditions).
+
+        * WebKit.xcodeproj/project.pbxproj:
+
 2018-02-07  Brent Fulgham  <bfulgham@apple.com>
 
         Improve NetworkResourceLoader logging to capture redirect cases
index 97b133d..c362375 100644 (file)
@@ -86,6 +86,7 @@ class WebPageProxy;
 #if ENABLE(EXTRA_ZOOM_MODE)
 @class WKFocusedFormControlViewController;
 @class WKNumberPadViewController;
+@class WKSelectMenuViewController;
 @class WKTextInputViewController;
 #endif
 
@@ -247,6 +248,7 @@ struct WKAutoCorrectionData {
     RetainPtr<WKTextInputViewController> _textInputViewController;
     RetainPtr<WKFocusedFormControlViewController> _focusedFormControlViewController;
     RetainPtr<WKNumberPadViewController> _numberPadViewController;
+    RetainPtr<WKSelectMenuViewController> _selectMenuViewController;
 #endif
 }
 
index 5757944..beb4735 100644 (file)
@@ -51,6 +51,7 @@
 #import "WKPreviewActionItemIdentifiers.h"
 #import "WKPreviewActionItemInternal.h"
 #import "WKPreviewElementInfoInternal.h"
+#import "WKSelectMenuViewController.h"
 #import "WKTextInputViewController.h"
 #import "WKUIDelegatePrivate.h"
 #import "WKWebViewConfiguration.h"
 
 #if ENABLE(EXTRA_ZOOM_MODE)
 
-@interface WKContentView (ExtraZoomMode) <WKTextFormControlViewControllerDelegate, WKFocusedFormControlViewControllerDelegate>
+@interface WKContentView (ExtraZoomMode) <WKTextFormControlViewControllerDelegate, WKFocusedFormControlViewControllerDelegate, WKSelectMenuViewControllerDelegate>
 @end
 
 #endif
@@ -3931,10 +3932,7 @@ static NSString *contentTypeFromFieldName(WebCore::AutofillFieldName fieldName)
 {
     [self useSelectionAssistantWithGranularity:WKSelectionGranularityCharacter];
 
-#if ENABLE(EXTRA_ZOOM_MODE)
-    if (!_isChangingFocus)
-        [self presentViewControllerForAssistedNode:_assistedNodeInformation];
-#else
+#if !ENABLE(EXTRA_ZOOM_MODE)
     [self reloadInputViews];
 #endif
 }
@@ -4027,14 +4025,16 @@ static bool isAssistableInputType(InputType type)
     _inputPeripheral = nil;
     _traits = nil;
 
-#if ENABLE(EXTRA_ZOOM_MODE)
-    [self presentFocusedFormControlViewController:NO];
-#endif
-
     if (![self isFirstResponder])
         [self becomeFirstResponder];
 
+#if ENABLE(EXTRA_ZOOM_MODE)
+    [self presentFocusedFormControlViewController:NO];
+    if (!_isChangingFocus)
+        [self presentViewControllerForAssistedNode:_assistedNodeInformation];
+#else
     [self reloadInputViews];
+#endif
     
     switch (information.elementType) {
     case InputType::Select:
@@ -4090,6 +4090,7 @@ static bool isAssistableInputType(InputType type)
 #if ENABLE(EXTRA_ZOOM_MODE)
     [self dismissTextInputViewController:YES];
     [self dismissNumberPadViewController:YES];
+    [self dismissSelectMenuViewController:YES];
     if (!_isChangingFocus)
         [self dismissFocusedFormControlViewController:[_focusedFormControlViewController isVisible]];
 #endif
@@ -4103,6 +4104,25 @@ static bool isAssistableInputType(InputType type)
 
 #if ENABLE(EXTRA_ZOOM_MODE)
 
+- (void)presentSelectMenuViewController:(BOOL)animated
+{
+    if (_selectMenuViewController)
+        return;
+
+    _selectMenuViewController = adoptNS([[WKSelectMenuViewController alloc] init]);
+    [_selectMenuViewController setDelegate:self];
+    [_focusedFormControlViewController presentViewController:_selectMenuViewController.get() animated:animated completion:nil];
+}
+
+- (void)dismissSelectMenuViewController:(BOOL)animated
+{
+    if (!_selectMenuViewController)
+        return;
+
+    auto selectMenuViewController = WTFMove(_selectMenuViewController);
+    [selectMenuViewController dismissViewControllerAnimated:animated completion:nil];
+}
+
 - (void)presentFocusedFormControlViewController:(BOOL)animated
 {
     if (_focusedFormControlViewController)
@@ -4158,6 +4178,9 @@ static bool isAssistableInputType(InputType type)
     case InputType::Phone:
         [self presentNumberPadViewController:YES];
         break;
+    case InputType::Select:
+        [self presentSelectMenuViewController:YES];
+        break;
     default:
         break;
     }
@@ -4258,6 +4281,82 @@ static bool isAssistableInputType(InputType type)
     return _assistedNodeInformation.hasPreviousNode;
 }
 
+#pragma mark - WKSelectMenuViewControllerDelegate
+
+- (void)selectMenu:(WKSelectMenuViewController *)selectMenu didSelectItemAtIndex:(NSUInteger)index
+{
+    if (!_assistedNodeInformation.isMultiSelect)
+        _page->setAssistedNodeSelectedIndex(index, false);
+
+    _page->blurAssistedNode();
+}
+
+- (void)didCancelSelectionInSelectMenu:(WKSelectMenuViewController *)selectMenu
+{
+    _page->blurAssistedNode();
+}
+
+- (NSUInteger)numberOfItemsInSelectMenu:(WKSelectMenuViewController *)selectMenu
+{
+    return self.assistedNodeSelectOptions.size();
+}
+
+- (NSString *)selectMenu:(WKSelectMenuViewController *)selectMenu displayTextForItemAtIndex:(NSUInteger)index
+{
+    auto& options = self.assistedNodeSelectOptions;
+    if (index >= options.size()) {
+        ASSERT_NOT_REACHED();
+        return @"";
+    }
+
+    return options[index].text;
+}
+
+- (void)selectMenu:(WKSelectMenuViewController *)selectMenu didCheckItemAtIndex:(NSUInteger)index checked:(BOOL)checked
+{
+    ASSERT(_assistedNodeInformation.isMultiSelect);
+    if (index >= self.assistedNodeSelectOptions.size()) {
+        ASSERT_NOT_REACHED();
+        return;
+    }
+
+    auto& option = self.assistedNodeSelectOptions[index];
+    if (option.isSelected == checked) {
+        ASSERT_NOT_REACHED();
+        return;
+    }
+
+    _page->setAssistedNodeSelectedIndex(index, true);
+    option.isSelected = checked;
+}
+
+- (BOOL)selectMenuSupportsMultipleSelection:(WKSelectMenuViewController *)selectMenu
+{
+    return _assistedNodeInformation.isMultiSelect;
+}
+
+- (BOOL)selectMenu:(WKSelectMenuViewController *)selectMenu hasCheckedOptionAtIndex:(NSUInteger)index
+{
+    if (index >= self.assistedNodeSelectOptions.size()) {
+        ASSERT_NOT_REACHED();
+        return NO;
+    }
+
+    return self.assistedNodeSelectOptions[index].isSelected;
+}
+
+- (NSUInteger)startingIndexForSelectMenu:(WKSelectMenuViewController *)selectMenu
+{
+    if (_assistedNodeInformation.isMultiSelect)
+        return 0;
+
+    auto firstSelectedIndex = self.assistedNodeSelectOptions.findMatching([&] (auto& option) {
+        return option.isSelected;
+    });
+
+    return firstSelectedIndex == notFound ? 0 : firstSelectedIndex;
+}
+
 #endif // ENABLE(EXTRA_ZOOM_MODE)
 
 - (void)_selectionChanged
diff --git a/Source/WebKit/UIProcess/ios/forms/WKSelectMenuViewController.h b/Source/WebKit/UIProcess/ios/forms/WKSelectMenuViewController.h
new file mode 100644 (file)
index 0000000..95508b4
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+#pragma once
+
+#if USE(APPLE_INTERNAL_SDK)
+#import <WebKitAdditions/WKSelectMenuViewControllerAdditions.h>
+#endif
diff --git a/Source/WebKit/UIProcess/ios/forms/WKSelectMenuViewController.mm b/Source/WebKit/UIProcess/ios/forms/WKSelectMenuViewController.mm
new file mode 100644 (file)
index 0000000..b9b468d
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2018 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 "WKSelectMenuViewController.h"
+
+#if USE(APPLE_INTERNAL_SDK)
+#import <WebKitAdditions/WKSelectMenuViewControllerAdditions.mm>
+#endif
index eb5e2c6..3dbecea 100644 (file)
                2EA7B3D22026CEF8009CE5AC /* WKNumberPadViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2EA7B3D02026CEF8009CE5AC /* WKNumberPadViewController.mm */; };
                2EA7B3D52026CF23009CE5AC /* WKNumberPadView.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EA7B3D32026CF23009CE5AC /* WKNumberPadView.h */; };
                2EA7B3D62026CF23009CE5AC /* WKNumberPadView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2EA7B3D42026CF23009CE5AC /* WKNumberPadView.mm */; };
+               2EE4529F20292D2A00D81777 /* WKSelectMenuViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EE4529C20292BD900D81777 /* WKSelectMenuViewController.h */; };
+               2EE452A020292D2E00D81777 /* WKSelectMenuViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2EE4529B20292BD800D81777 /* WKSelectMenuViewController.mm */; };
                2F809DD71FBD1BC9005FE63A /* TouchBarMenuItemData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2F809DD51FBD1BC9005FE63A /* TouchBarMenuItemData.cpp */; };
                2F8336861FA139DF00C6E080 /* TouchBarMenuData.h in Headers */ = {isa = PBXBuildFile; fileRef = 2FD43B911FA006A10083F51C /* TouchBarMenuData.h */; };
                2F8336871FA13A1E00C6E080 /* TouchBarMenuData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2FD43B921FA006A30083F51C /* TouchBarMenuData.cpp */; };
                2EA7B3D02026CEF8009CE5AC /* WKNumberPadViewController.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = WKNumberPadViewController.mm; path = ios/forms/WKNumberPadViewController.mm; sourceTree = "<group>"; };
                2EA7B3D32026CF23009CE5AC /* WKNumberPadView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WKNumberPadView.h; path = ios/forms/WKNumberPadView.h; sourceTree = "<group>"; };
                2EA7B3D42026CF23009CE5AC /* WKNumberPadView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = WKNumberPadView.mm; path = ios/forms/WKNumberPadView.mm; sourceTree = "<group>"; };
+               2EE4529B20292BD800D81777 /* WKSelectMenuViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WKSelectMenuViewController.mm; path = ios/forms/WKSelectMenuViewController.mm; sourceTree = "<group>"; };
+               2EE4529C20292BD900D81777 /* WKSelectMenuViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WKSelectMenuViewController.h; path = ios/forms/WKSelectMenuViewController.h; sourceTree = "<group>"; };
                2F809DD51FBD1BC9005FE63A /* TouchBarMenuItemData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = TouchBarMenuItemData.cpp; sourceTree = "<group>"; };
                2F809DD91FBD1BF2005FE63A /* TouchBarMenuItemData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TouchBarMenuItemData.h; sourceTree = "<group>"; };
                2FD43B911FA006A10083F51C /* TouchBarMenuData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TouchBarMenuData.h; sourceTree = "<group>"; };
                                2EA7B3D42026CF23009CE5AC /* WKNumberPadView.mm */,
                                2EA7B3CF2026CEF8009CE5AC /* WKNumberPadViewController.h */,
                                2EA7B3D02026CEF8009CE5AC /* WKNumberPadViewController.mm */,
+                               2EE4529C20292BD900D81777 /* WKSelectMenuViewController.h */,
+                               2EE4529B20292BD800D81777 /* WKSelectMenuViewController.mm */,
                                2E16B69F2016E680008996D6 /* WKTextFormControlViewController.h */,
                                2E16B6A02016E680008996D6 /* WKTextFormControlViewController.mm */,
                                2E16B6C82017B768008996D6 /* WKTextInputViewController.h */,
                                51CD1C651B34B9D400142CA5 /* WKSecurityOrigin.h in Headers */,
                                51CD1C671B34B9DF00142CA5 /* WKSecurityOriginInternal.h in Headers */,
                                51CD1C5E1B3493B400142CA5 /* WKSecurityOriginRef.h in Headers */,
+                               2EE4529F20292D2A00D81777 /* WKSelectMenuViewController.h in Headers */,
                                BC407604124FF0270068F20A /* WKSerializedScriptValue.h in Headers */,
                                1ADE46B31954EC61000F7985 /* WKSessionStateRef.h in Headers */,
                                BCDDB32B124EC2AB0048D13C /* WKSharedAPICast.h in Headers */,
                                0FCB4E5518BBE044000FCFC9 /* WKScrollView.mm in Sources */,
                                51CD1C661B34B9DC00142CA5 /* WKSecurityOrigin.mm in Sources */,
                                51CD1C5D1B3493AF00142CA5 /* WKSecurityOriginRef.cpp in Sources */,
+                               2EE452A020292D2E00D81777 /* WKSelectMenuViewController.mm in Sources */,
                                BC407603124FF0270068F20A /* WKSerializedScriptValue.cpp in Sources */,
                                1ADE46B21954EC61000F7985 /* WKSessionStateRef.cpp in Sources */,
                                513E462E1AD837560016234A /* WKSharingServicePickerDelegate.mm in Sources */,