Update default link action sheets for app links
authorjoepeck@webkit.org <joepeck@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 11 Jul 2015 22:58:08 +0000 (22:58 +0000)
committerjoepeck@webkit.org <joepeck@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 11 Jul 2015 22:58:08 +0000 (22:58 +0000)
https://bugs.webkit.org/show_bug.cgi?id=146658
<rdar://problem/21221902>

Reviewed by Dan Bernstein.

Source/WebCore:

* English.lproj/Localizable.strings:
* platform/spi/ios/LaunchServicesSPI.h:

Source/WebKit2:

* Shared/mac/SandboxUtilities.h:
* Shared/mac/SandboxUtilities.mm: Renamed from Source/WebKit2/Shared/mac/SandboxUtilities.cpp.
(WebKit::processHasEntitlement):
* UIProcess/ApplicationStateTracker.mm:
(WebKit::applicationType):
(WebKit::hasEntitlement): Deleted.
* WebKit2.xcodeproj/project.pbxproj:
Share a helper for checking if the current process has an entitlement.

* UIProcess/API/Cocoa/_WKElementAction.h:
* UIProcess/API/Cocoa/_WKElementAction.mm:
(+[_WKElementAction _elementActionWithType:title:actionHandler:]):
(+[_WKElementAction _elementActionWithType:customTitle:assistant:]):
* UIProcess/API/Cocoa/_WKElementActionInternal.h:
Add an internal way to make an element action with a standard type and regular handler.
We use this for the new standard types that don't have a default implementation.

* UIProcess/ios/WKActionSheetAssistant.mm:
(applicationHasAppLinkEntitlements):
(appLinkForURL):
Helpers checking access to app links and fetching app links.

(-[WKActionSheetAssistant _appendOpenActionsForURL:actions:]):
(-[WKActionSheetAssistant defaultActionsForLinkSheet]):
(-[WKActionSheetAssistant defaultActionsForImageSheet]):
Create "Open in Safari" and "Open in 'App'" default actions for AppLinks,
otherwise add the normal default "Open" action.

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

12 files changed:
Source/WebCore/ChangeLog
Source/WebCore/English.lproj/Localizable.strings
Source/WebCore/platform/spi/ios/LaunchServicesSPI.h
Source/WebKit2/ChangeLog
Source/WebKit2/Shared/mac/SandboxUtilities.h
Source/WebKit2/Shared/mac/SandboxUtilities.mm [moved from Source/WebKit2/Shared/mac/SandboxUtilities.cpp with 79% similarity]
Source/WebKit2/UIProcess/API/Cocoa/_WKElementAction.h
Source/WebKit2/UIProcess/API/Cocoa/_WKElementAction.mm
Source/WebKit2/UIProcess/API/Cocoa/_WKElementActionInternal.h
Source/WebKit2/UIProcess/ApplicationStateTracker.mm
Source/WebKit2/UIProcess/ios/WKActionSheetAssistant.mm
Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

index 37e8aa2..e7a6b4d 100644 (file)
@@ -1,3 +1,14 @@
+2015-07-11  Joseph Pecoraro  <pecoraro@apple.com>
+
+        Update default link action sheets for app links
+        https://bugs.webkit.org/show_bug.cgi?id=146658
+        <rdar://problem/21221902>
+
+        Reviewed by Dan Bernstein.
+
+        * English.lproj/Localizable.strings:
+        * platform/spi/ios/LaunchServicesSPI.h:
+
 2015-07-11  Benjamin Poulain  <benjamin@webkit.org>
 
         Fix CONTENT_EXTENSIONS_STATE_MACHINE_DEBUGGING
index d61256b..96d6068 100644 (file)
 "Copy" = "Copy";
 
 /* Title for Copy Link or Image action button */
-"Copy ActionSheet Link" = "Copy";
+"Copy (ActionSheet)" = "Copy";
 
 /* Copy Audio Address Location context menu item */
 "Copy Audio Address" = "Copy Audio Address";
 "Off" = "Off";
 
 /* Title for Open Link action button */
-"Open ActionSheet Link" = "Open";
+"Open" = "Open";
 
 /* Open Audio in New Window context menu item */
 "Open Audio in New Window" = "Open Audio in New Window";
 /* Open Video in New Window context menu item */
 "Open Video in New Window" = "Open Video in New Window";
 
+/* Title for Open in Safari Link action button */
+"Open in Safari" = "Open in Safari";
+
+/* Title for Open in External Application Link action button */
+"Open in “%@”" = "Open in “%@”";
+
 /* context menu item for PDF */
 "Open with %@" = "Open with %@";
 
index 0f4047b..ce868ed 100644 (file)
@@ -46,6 +46,7 @@ typedef void (^LSAppLinkOpenCompletionHandler)(BOOL success, NSError *error);
 
 @interface LSAppLink (Details)
 + (void)openWithURL:(NSURL *)aURL completionHandler:(LSAppLinkOpenCompletionHandler)completionHandler;
+- (void)openInWebBrowser:(BOOL)inWebBrowser setAppropriateOpenStrategyAndWebBrowserState:(NSDictionary<NSString *, id> *)state completionHandler:(LSAppLinkOpenCompletionHandler)completionHandler;
 @end
 #endif
 
index 0baf985..96da940 100644 (file)
@@ -1,3 +1,39 @@
+2015-07-11  Joseph Pecoraro  <pecoraro@apple.com>
+
+        Update default link action sheets for app links
+        https://bugs.webkit.org/show_bug.cgi?id=146658
+        <rdar://problem/21221902>
+
+        Reviewed by Dan Bernstein.
+
+        * Shared/mac/SandboxUtilities.h:
+        * Shared/mac/SandboxUtilities.mm: Renamed from Source/WebKit2/Shared/mac/SandboxUtilities.cpp.
+        (WebKit::processHasEntitlement):
+        * UIProcess/ApplicationStateTracker.mm:
+        (WebKit::applicationType):
+        (WebKit::hasEntitlement): Deleted.
+        * WebKit2.xcodeproj/project.pbxproj:
+        Share a helper for checking if the current process has an entitlement.
+
+        * UIProcess/API/Cocoa/_WKElementAction.h:
+        * UIProcess/API/Cocoa/_WKElementAction.mm:
+        (+[_WKElementAction _elementActionWithType:title:actionHandler:]):
+        (+[_WKElementAction _elementActionWithType:customTitle:assistant:]):
+        * UIProcess/API/Cocoa/_WKElementActionInternal.h:
+        Add an internal way to make an element action with a standard type and regular handler.
+        We use this for the new standard types that don't have a default implementation.
+
+        * UIProcess/ios/WKActionSheetAssistant.mm:
+        (applicationHasAppLinkEntitlements):
+        (appLinkForURL):
+        Helpers checking access to app links and fetching app links.
+
+        (-[WKActionSheetAssistant _appendOpenActionsForURL:actions:]):
+        (-[WKActionSheetAssistant defaultActionsForLinkSheet]):
+        (-[WKActionSheetAssistant defaultActionsForImageSheet]):
+        Create "Open in Safari" and "Open in 'App'" default actions for AppLinks,
+        otherwise add the normal default "Open" action.
+
 2015-07-11  Enrica Casucci  <enrica@apple.com>
 
         Remove incorrect overriding of inputAssistantItem in WKContentView.
index dbc4cb3..a24ed3f 100644 (file)
@@ -26,8 +26,8 @@
 #ifndef SandboxUtilities_h
 #define SandboxUtilities_h
 
-#include <sys/types.h>
-#include <wtf/Forward.h>
+#import <sys/types.h>
+#import <wtf/Forward.h>
 
 namespace WebKit {
 
@@ -37,6 +37,8 @@ bool processHasContainer();
 // Returns an empty string if the process is not in a container.
 String pathForProcessContainer();
 
+bool processHasEntitlement(NSString *entitlement);
+
 }
 
 #endif // SandboxUtilities_h
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include "config.h"
-#include "SandboxUtilities.h"
+#import "config.h"
+#import "SandboxUtilities.h"
 
-#include <array>
-#include <sys/param.h>
-#include <wtf/text/WTFString.h>
+#import <WebCore/SecuritySPI.h>
+#import <array>
+#import <sys/param.h>
+#import <wtf/text/WTFString.h>
 
 #if __has_include(<sandbox/private.h>)
 #import <sandbox/private.h>
@@ -78,4 +79,20 @@ String pathForProcessContainer()
     return String::fromUTF8(path.data());
 }
 
+bool processHasEntitlement(NSString *entitlement)
+{
+    auto task = adoptCF(SecTaskCreateFromSelf(CFAllocatorGetDefault()));
+    if (!task)
+        return false;
+
+    auto value = adoptCF(SecTaskCopyValueForEntitlement(task.get(), (__bridge CFStringRef)entitlement, nullptr));
+    if (!value)
+        return false;
+
+    if (CFGetTypeID(value.get()) != CFBooleanGetTypeID())
+        return false;
+
+    return CFBooleanGetValue(static_cast<CFBooleanRef>(value.get()));
+}
+
 }
index a9c85c2..4a36db8 100644 (file)
@@ -41,6 +41,8 @@ typedef NS_ENUM(NSInteger, _WKElementActionType) {
     _WKElementActionTypeSaveImage,
 #if !defined(TARGET_OS_IOS) || TARGET_OS_IOS
     _WKElementActionTypeAddToReadingList,
+    _WKElementActionTypeOpenInDefaultBrowser WK_ENUM_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA),
+    _WKElementActionTypeOpenInExternalApplication WK_ENUM_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA),
 #endif
 } WK_ENUM_AVAILABLE(10_10, 8_0);
 
index a42618e..dc25ab7 100644 (file)
@@ -90,25 +90,31 @@ static void addToReadingList(NSURL *targetURL, NSString *title)
 }
 #endif
 
++ (instancetype)_elementActionWithType:(_WKElementActionType)type title:(NSString *)title actionHandler:(WKElementActionHandler)actionHandler
+{
+    WKElementActionHandlerInternal handler = ^(WKActionSheetAssistant *, _WKActivatedElementInfo *actionInfo) { actionHandler(actionInfo); };
+    return [[[self alloc] _initWithTitle:title actionHandler:handler type:type assistant:nil] autorelease];
+}
+
 + (instancetype)_elementActionWithType:(_WKElementActionType)type customTitle:(NSString *)customTitle assistant:(WKActionSheetAssistant *)assistant
 {
     NSString *title;
     WKElementActionHandlerInternal handler;
     switch (type) {
     case _WKElementActionTypeCopy:
-        title = WEB_UI_STRING_KEY("Copy", "Copy ActionSheet Link", "Title for Copy Link or Image action button");
+        title = WEB_UI_STRING_KEY("Copy", "Copy (ActionSheet)", "Title for Copy Link or Image action button");
         handler = ^(WKActionSheetAssistant *assistant, _WKActivatedElementInfo *actionInfo) {
             [assistant.delegate actionSheetAssistant:assistant performAction:WebKit::SheetAction::Copy];
         };
         break;
     case _WKElementActionTypeOpen:
-        title = WEB_UI_STRING_KEY("Open", "Open ActionSheet Link", "Title for Open Link action button");
+        title = WEB_UI_STRING("Open", "Title for Open Link action button");
         handler = ^(WKActionSheetAssistant *assistant, _WKActivatedElementInfo *actionInfo) {
             [assistant.delegate actionSheetAssistant:assistant openElementAtLocation:actionInfo._interactionLocation];
         };
         break;
     case _WKElementActionTypeSaveImage:
-        title = WEB_UI_STRING_KEY("Save Image", "Save Image", "Title for Save Image action button");
+        title = WEB_UI_STRING("Save Image", "Title for Save Image action button");
         handler = ^(WKActionSheetAssistant *assistant, _WKActivatedElementInfo *actionInfo) {
             [assistant.delegate actionSheetAssistant:assistant performAction:WebKit::SheetAction::SaveImage];
         };
index a2fe50c..98d1751 100644 (file)
@@ -35,6 +35,7 @@
 @interface _WKElementAction ()
 
 + (instancetype)_elementActionWithType:(_WKElementActionType)type assistant:(WKActionSheetAssistant *)assistant;
++ (instancetype)_elementActionWithType:(_WKElementActionType)type title:(NSString *)title actionHandler:(WKElementActionHandler)actionHandler;
 - (void)_runActionWithElementInfo:(_WKActivatedElementInfo *)info forActionSheetAssistant:(WKActionSheetAssistant *)assistant;
 
 @end
index a1f2ba9..e133554 100644 (file)
@@ -29,6 +29,7 @@
 #if PLATFORM(IOS)
 
 #import "AssertionServicesSPI.h"
+#import "SandboxUtilities.h"
 #import "UIKitSPI.h"
 #import "WKContentView.h"
 #import <WebCore/SecuritySPI.h>
 
 namespace WebKit {
 
-static bool hasEntitlement(NSString *entitlement)
-{
-    auto task = adoptCF(SecTaskCreateFromSelf(CFAllocatorGetDefault()));
-    if (!task)
-        return false;
-
-    auto value = adoptCF(SecTaskCopyValueForEntitlement(task.get(), (__bridge CFStringRef)entitlement, nullptr));
-    if (!value)
-        return false;
-
-    if (CFGetTypeID(value.get()) != CFBooleanGetTypeID())
-        return false;
-
-    return CFBooleanGetValue(static_cast<CFBooleanRef>(value.get()));
-}
 
 enum class ApplicationType {
     Application,
@@ -70,7 +56,7 @@ static ApplicationType applicationType(UIWindow *window)
     if (_UIApplicationIsExtension())
         return ApplicationType::Extension;
 
-    if (hasEntitlement(@"com.apple.UIKit.vends-view-services") && window._isHostedInAnotherProcess)
+    if (processHasEntitlement(@"com.apple.UIKit.vends-view-services") && window._isHostedInAnotherProcess)
         return ApplicationType::ViewService;
 
     return ApplicationType::Application;
index ffcf59a..2e5b73c 100644 (file)
 #if PLATFORM(IOS)
 
 #import "APIUIClient.h"
+#import "SandboxUtilities.h"
 #import "TCCSPI.h"
 #import "UIKitSPI.h"
 #import "WKActionSheet.h"
 #import "WKContentViewInteraction.h"
+#import "WKNSURLExtras.h"
 #import "WeakObjCPtr.h"
 #import "WebPageProxy.h"
-#import "WKNSURLExtras.h"
 #import "_WKActivatedElementInfoInternal.h"
 #import "_WKElementActionInternal.h"
 #import <UIKit/UIView.h>
 #import <WebCore/WebCoreNSURLExtras.h>
 #import <wtf/text/WTFString.h>
 
+#if HAVE(APP_LINKS)
+#import <WebCore/LaunchServicesSPI.h>
+#endif
+
 #if HAVE(SAFARI_SERVICES_FRAMEWORK)
 #import <SafariServices/SSReadingList.h>
 SOFT_LINK_FRAMEWORK(SafariServices)
@@ -56,6 +61,28 @@ SOFT_LINK_CONSTANT(TCC, kTCCServicePhotos, CFStringRef)
 
 using namespace WebKit;
 
+#if HAVE(APP_LINKS)
+static bool applicationHasAppLinkEntitlements()
+{
+    static bool hasEntitlement = processHasEntitlement(@"com.apple.private.canGetAppLinkInfo") && processHasEntitlement(@"com.apple.private.canModifyAppLinkPermissions");
+    return hasEntitlement;
+}
+
+static LSAppLink *appLinkForURL(NSURL *url)
+{
+    __block LSAppLink *syncAppLink = nil;
+
+    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
+    [LSAppLink getAppLinkWithURL:url completionHandler:^(LSAppLink *appLink, NSError *error) {
+        syncAppLink = [appLink retain];
+        dispatch_semaphore_signal(semaphore);
+    }];
+    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
+
+    return [syncAppLink autorelease];
+}
+#endif
+
 @implementation WKActionSheetAssistant {
     WeakObjCPtr<id <WKActionSheetAssistantDelegate>> _delegate;
     RetainPtr<WKActionSheet> _interactionSheet;
@@ -264,6 +291,35 @@ using namespace WebKit;
         [self cleanupSheet];
 }
 
+- (void)_appendOpenActionsForURL:(NSURL *)url actions:(NSMutableArray *)defaultActions
+{
+#if HAVE(APP_LINKS)
+    if (applicationHasAppLinkEntitlements()) {
+        LSAppLink *appLink = appLinkForURL(url);
+        if (appLink) {
+            NSString *title = WEB_UI_STRING("Open in Safari", "Title for Open in Safari Link action button");
+            _WKElementAction *openInDefaultBrowserAction = [_WKElementAction _elementActionWithType:_WKElementActionTypeOpenInDefaultBrowser title:title actionHandler:^(_WKActivatedElementInfo *) {
+                [appLink openInWebBrowser:YES setAppropriateOpenStrategyAndWebBrowserState:nil completionHandler:^(BOOL success, NSError *error) { }];
+            }];
+            [defaultActions addObject:openInDefaultBrowserAction];
+
+            NSString *externalApplicationName = [appLink.targetApplicationProxy localizedNameForContext:nil];
+            if (externalApplicationName) {
+                NSString *title = [NSString stringWithFormat:WEB_UI_STRING("Open in “%@”", "Title for Open in External Application Link action button"), externalApplicationName];
+                _WKElementAction *openInExternalApplicationAction = [_WKElementAction _elementActionWithType:_WKElementActionTypeOpenInExternalApplication title:title actionHandler:^(_WKActivatedElementInfo *) {
+                    [appLink openInWebBrowser:NO setAppropriateOpenStrategyAndWebBrowserState:nil completionHandler:^(BOOL success, NSError *error) { }];
+                }];
+                [defaultActions addObject:openInExternalApplicationAction];
+            }
+        } else
+            [defaultActions addObject:[_WKElementAction _elementActionWithType:_WKElementActionTypeOpen assistant:self]];
+    } else
+        [defaultActions addObject:[_WKElementAction _elementActionWithType:_WKElementActionTypeOpen assistant:self]];
+#else
+    [defaultActions addObject:[_WKElementAction _elementActionWithType:_WKElementActionTypeOpen assistant:self]];
+#endif
+}
+
 - (RetainPtr<NSArray>)defaultActionsForLinkSheet
 {
     auto delegate = _delegate.get();
@@ -277,7 +333,8 @@ using namespace WebKit;
         return nil;
 
     auto defaultActions = adoptNS([[NSMutableArray alloc] init]);
-    [defaultActions addObject:[_WKElementAction _elementActionWithType:_WKElementActionTypeOpen assistant:self]];
+    [self _appendOpenActionsForURL:targetURL actions:defaultActions.get()];
+
 #if HAVE(SAFARI_SERVICES_FRAMEWORK)
     if ([getSSReadingListClass() supportsURL:targetURL])
         [defaultActions addObject:[_WKElementAction _elementActionWithType:_WKElementActionTypeAddToReadingList assistant:self]];
@@ -299,7 +356,8 @@ using namespace WebKit;
 
     auto defaultActions = adoptNS([[NSMutableArray alloc] init]);
     if (!positionInformation.url.isEmpty())
-        [defaultActions addObject:[_WKElementAction _elementActionWithType:_WKElementActionTypeOpen assistant:self]];
+        [self _appendOpenActionsForURL:targetURL actions:defaultActions.get()];
+
 #if HAVE(SAFARI_SERVICES_FRAMEWORK)
     if ([getSSReadingListClass() supportsURL:targetURL])
         [defaultActions addObject:[_WKElementAction _elementActionWithType:_WKElementActionTypeAddToReadingList assistant:self]];
index 22c7b6d..4cab9fd 100644 (file)
                E19582D6153CC05400B60875 /* PDFKitImports.mm in Sources */ = {isa = PBXBuildFile; fileRef = E19582D4153CC05300B60875 /* PDFKitImports.mm */; };
                E19BDA86193665E300B97F57 /* com.apple.appstore.CodeRedeemerNetscapePlugin.sb in Copy Plug-in Sandbox Profiles */ = {isa = PBXBuildFile; fileRef = E19BDA8419365F4B00B97F57 /* com.apple.appstore.CodeRedeemerNetscapePlugin.sb */; };
                E19BDA8A193686A400B97F57 /* SandboxUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = E19BDA88193686A400B97F57 /* SandboxUtilities.h */; };
-               E19BDA8B19368D4600B97F57 /* SandboxUtilities.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E19BDA87193686A400B97F57 /* SandboxUtilities.cpp */; };
+               E19BDA8B19368D4600B97F57 /* SandboxUtilities.mm in Sources */ = {isa = PBXBuildFile; fileRef = E19BDA87193686A400B97F57 /* SandboxUtilities.mm */; };
                E1A31732134CEA6C007C9A4F /* AttributedString.h in Headers */ = {isa = PBXBuildFile; fileRef = E1A31731134CEA6C007C9A4F /* AttributedString.h */; };
                E1A31735134CEA80007C9A4F /* AttributedString.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1A31734134CEA80007C9A4F /* AttributedString.mm */; };
                E1A9A852169E2025002D7176 /* WebKit.icns in Resources */ = {isa = PBXBuildFile; fileRef = E133FD891423DD7F00FC7BFB /* WebKit.icns */; };
                E19582D4153CC05300B60875 /* PDFKitImports.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PDFKitImports.mm; sourceTree = "<group>"; };
                E1967E37150AB5E200C73169 /* com.apple.WebProcess.sb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = com.apple.WebProcess.sb; sourceTree = "<group>"; };
                E19BDA8419365F4B00B97F57 /* com.apple.appstore.CodeRedeemerNetscapePlugin.sb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = com.apple.appstore.CodeRedeemerNetscapePlugin.sb; sourceTree = "<group>"; };
-               E19BDA87193686A400B97F57 /* SandboxUtilities.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SandboxUtilities.cpp; sourceTree = "<group>"; };
+               E19BDA87193686A400B97F57 /* SandboxUtilities.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SandboxUtilities.mm; sourceTree = "<group>"; };
                E19BDA88193686A400B97F57 /* SandboxUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SandboxUtilities.h; sourceTree = "<group>"; };
                E1A31731134CEA6C007C9A4F /* AttributedString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AttributedString.h; sourceTree = "<group>"; };
                E1A31734134CEA80007C9A4F /* AttributedString.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AttributedString.mm; sourceTree = "<group>"; };
                                1AF1AC691651759E00C17D7F /* RemoteLayerTreeTransaction.mm */,
                                1AAB4AA91296F1540023952F /* SandboxExtensionMac.mm */,
                                E1E552C216AE065E004ED653 /* SandboxInitialiationParametersMac.mm */,
-                               E19BDA87193686A400B97F57 /* SandboxUtilities.cpp */,
                                E19BDA88193686A400B97F57 /* SandboxUtilities.h */,
+                               E19BDA87193686A400B97F57 /* SandboxUtilities.mm */,
                                51D1304F1382EAC000351EDD /* SecItemRequestData.cpp */,
                                51D130501382EAC000351EDD /* SecItemRequestData.h */,
                                51D130511382EAC000351EDD /* SecItemResponseData.cpp */,
                                BC111B09112F5E3C00337BAB /* ResponsivenessTimer.cpp in Sources */,
                                1AAB4AAA1296F1540023952F /* SandboxExtensionMac.mm in Sources */,
                                E1E552C416AE065F004ED653 /* SandboxInitialiationParametersMac.mm in Sources */,
-                               E19BDA8B19368D4600B97F57 /* SandboxUtilities.cpp in Sources */,
+                               E19BDA8B19368D4600B97F57 /* SandboxUtilities.mm in Sources */,
                                0F931C1D18C5711900DBA7C3 /* ScrollingTreeOverflowScrollingNodeIOS.mm in Sources */,
                                51D130531382EAC000351EDD /* SecItemRequestData.cpp in Sources */,
                                51D130551382EAC000351EDD /* SecItemResponseData.cpp in Sources */,