[macOS, iOS] Adopt new secure coding APIs in WebKit
authorbfulgham@apple.com <bfulgham@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 3 Jan 2018 05:10:37 +0000 (05:10 +0000)
committerbfulgham@apple.com <bfulgham@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 3 Jan 2018 05:10:37 +0000 (05:10 +0000)
https://bugs.webkit.org/show_bug.cgi?id=181085
<rdar://problem/34837397>

Reviewed by Tim Horton.

Source/WebCore/PAL:

Add a new helper function to allow WebKit code to use NSSecureCoding in more
places when the underlying operating system supports it.

* pal/spi/cocoa/NSKeyedArchiverSPI.h:
(decodeObjectOfClassForKeyFromCoder): New wrapper method.

Source/WebKit:

Update WebKit code to use NSSecureCoding when the underlying operating system supports it. Use new
wrapper functions so the same code can be built on all supported OS releases, while enabling
seure coding when possible.

Note that NSView-based classes cannot be migrated at present due to AppKit not supporting NSSecureCoding
in its class hierarchy.

Tested by exising TestWebKitAPI tests for Coding and data transfer.

* Platform/ios/AccessibilityIOS.mm:
(WebKit::newAccessibilityRemoteToken): Encode using NSSecureCoding.
* UIProcess/API/Cocoa/WKPreferences.h:
* UIProcess/API/Cocoa/WKPreferences.mm:
(+[WKPreferences supportsSecureCoding]): Added to enable NSSecureCoding.
* UIProcess/API/Cocoa/WKProcessPool.h:
* UIProcess/API/Cocoa/WKProcessPool.mm:
(+[WKProcessPool supportsSecureCoding]): Ditto.
* UIProcess/API/Cocoa/WKUserContentController.h:
* UIProcess/API/Cocoa/WKUserContentController.mm:
(+[WKUserContentController supportsSecureCoding]): Ditto.
* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView initWithCoder:]): Use coding initialization that supports secure coding if
it is available in the supplied class.
* UIProcess/API/Cocoa/WKWebViewConfiguration.h:
* UIProcess/API/Cocoa/WKWebViewConfiguration.mm:
(+[WKWebViewConfiguration supportsSecureCoding]): Added to enable NSSecureCoding.
(-[WKWebViewConfiguration initWithCoder:]): Use secure coding when possible.
* UIProcess/API/Cocoa/WKWebsiteDataStore.h:
* UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
(+[WKWebsiteDataStore supportsSecureCoding]): Added to enable NSSecureCoding.
* UIProcess/API/Cocoa/_WKApplicationManifest.h:
* UIProcess/API/Cocoa/_WKApplicationManifest.mm:
(+[_WKApplicationManifest supportsSecureCoding]): Added to enable NSSecureCoding.
(-[_WKApplicationManifest initWithCoder:]): Use secure coding when possible.

Tools:

Update API tests to use secure coding wherever possible. Currently, NSView/UIView-based classes are not
capable of supporting NSSecureCoding, so pass through the current coding routines.

* TestWebKitAPI/Tests/WebKitCocoa/ApplicationManifest.mm: Updated for NSSecureCoding.
* TestWebKitAPI/Tests/WebKitCocoa/Coding.mm:
(encodeAndDecode): Check if class supports the NSSecureCoding protocol and use non-secure coding
routines if necessary.
(TEST): Updated for NSSecureCoding.
* TestWebKitAPI/Tests/mac/EarlyKVOCrash.mm:
(TestWebKitAPI::TEST): Updated for NSSecureCoding.

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

21 files changed:
Source/WebCore/PAL/ChangeLog
Source/WebCore/PAL/pal/spi/cocoa/NSKeyedArchiverSPI.h
Source/WebKit/ChangeLog
Source/WebKit/Platform/ios/AccessibilityIOS.mm
Source/WebKit/UIProcess/API/Cocoa/WKPreferences.h
Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm
Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.h
Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm
Source/WebKit/UIProcess/API/Cocoa/WKUserContentController.h
Source/WebKit/UIProcess/API/Cocoa/WKUserContentController.mm
Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm
Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfiguration.h
Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfiguration.mm
Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.h
Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm
Source/WebKit/UIProcess/API/Cocoa/_WKApplicationManifest.h
Source/WebKit/UIProcess/API/Cocoa/_WKApplicationManifest.mm
Tools/ChangeLog
Tools/TestWebKitAPI/Tests/WebKitCocoa/ApplicationManifest.mm
Tools/TestWebKitAPI/Tests/WebKitCocoa/Coding.mm
Tools/TestWebKitAPI/Tests/mac/EarlyKVOCrash.mm

index deb2295..f2e946d 100644 (file)
@@ -1,3 +1,17 @@
+2018-01-02  Brent Fulgham  <bfulgham@apple.com>
+
+        [macOS, iOS] Adopt new secure coding APIs in WebKit
+        https://bugs.webkit.org/show_bug.cgi?id=181085
+        <rdar://problem/34837397>
+
+        Reviewed by Tim Horton.
+
+        Add a new helper function to allow WebKit code to use NSSecureCoding in more
+        places when the underlying operating system supports it.
+
+        * pal/spi/cocoa/NSKeyedArchiverSPI.h:
+        (decodeObjectOfClassForKeyFromCoder): New wrapper method.
+
 2017-12-21  Brent Fulgham  <bfulgham@apple.com>
 
         Unreviewed test fix after r226224.
index 28d0d67..8ad1352 100644 (file)
@@ -134,3 +134,12 @@ inline RetainPtr<NSKeyedUnarchiver> secureUnarchiverFromData(NSData *_Nonnull da
     return adoptNS(unarchiver);
 }
 
+inline id _Nullable decodeObjectOfClassForKeyFromCoder(Class _Nonnull cls, NSString * _Nonnull key, NSCoder * _Nonnull coder)
+{
+#if USE(SECURE_ARCHIVER_API)
+    return [coder decodeObjectOfClass:cls forKey:key];
+#else
+    UNUSED_PARAM(cls);
+    return [coder decodeObjectForKey:key];
+#endif
+}
index e3ed6fa..3c62aa3 100644 (file)
@@ -1,3 +1,46 @@
+2018-01-02  Brent Fulgham  <bfulgham@apple.com>
+
+        [macOS, iOS] Adopt new secure coding APIs in WebKit
+        https://bugs.webkit.org/show_bug.cgi?id=181085
+        <rdar://problem/34837397>
+
+        Reviewed by Tim Horton.
+
+        Update WebKit code to use NSSecureCoding when the underlying operating system supports it. Use new
+        wrapper functions so the same code can be built on all supported OS releases, while enabling
+        seure coding when possible.
+
+        Note that NSView-based classes cannot be migrated at present due to AppKit not supporting NSSecureCoding
+        in its class hierarchy.
+
+        Tested by exising TestWebKitAPI tests for Coding and data transfer.
+
+        * Platform/ios/AccessibilityIOS.mm:
+        (WebKit::newAccessibilityRemoteToken): Encode using NSSecureCoding.
+        * UIProcess/API/Cocoa/WKPreferences.h:
+        * UIProcess/API/Cocoa/WKPreferences.mm:
+        (+[WKPreferences supportsSecureCoding]): Added to enable NSSecureCoding.
+        * UIProcess/API/Cocoa/WKProcessPool.h:
+        * UIProcess/API/Cocoa/WKProcessPool.mm:
+        (+[WKProcessPool supportsSecureCoding]): Ditto.
+        * UIProcess/API/Cocoa/WKUserContentController.h:
+        * UIProcess/API/Cocoa/WKUserContentController.mm:
+        (+[WKUserContentController supportsSecureCoding]): Ditto.
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView initWithCoder:]): Use coding initialization that supports secure coding if
+        it is available in the supplied class.
+        * UIProcess/API/Cocoa/WKWebViewConfiguration.h:
+        * UIProcess/API/Cocoa/WKWebViewConfiguration.mm:
+        (+[WKWebViewConfiguration supportsSecureCoding]): Added to enable NSSecureCoding.
+        (-[WKWebViewConfiguration initWithCoder:]): Use secure coding when possible.
+        * UIProcess/API/Cocoa/WKWebsiteDataStore.h:
+        * UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
+        (+[WKWebsiteDataStore supportsSecureCoding]): Added to enable NSSecureCoding.
+        * UIProcess/API/Cocoa/_WKApplicationManifest.h:
+        * UIProcess/API/Cocoa/_WKApplicationManifest.mm:
+        (+[_WKApplicationManifest supportsSecureCoding]): Added to enable NSSecureCoding.
+        (-[_WKApplicationManifest initWithCoder:]): Use secure coding when possible.
+
 2017-12-28  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         Remove std::chrono completely
index e5342e4..7a2d194 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 Apple Inc. All rights reserved.
+ * Copyright (C) 2015-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
@@ -35,7 +35,7 @@ NSData *newAccessibilityRemoteToken(NSUUID *uuid)
 {
     if (!uuid)
         return nil;
-    return insecurelyArchivedDataWithRootObject(@{ @"ax-pid" : @(getpid()), @"ax-uuid" : [uuid UUIDString], @"ax-register" : @YES });
+    return securelyArchivedDataWithRootObject(@{ @"ax-pid" : @(getpid()), @"ax-uuid" : [uuid UUIDString], @"ax-register" : @YES });
 }
 
 } // namespace WebKit
index 950d810..e35b719 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-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
@@ -35,7 +35,7 @@
  its web view configuration.
  */
 WK_CLASS_AVAILABLE(macosx(10.10), ios(8.0))
-@interface WKPreferences : NSObject <NSCoding>
+@interface WKPreferences : NSObject <NSSecureCoding>
 
 /*! @abstract The minimum font size in points.
  @discussion The default value is 0.
index 186a171..2259672 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014-2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-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
     [super dealloc];
 }
 
++ (BOOL)supportsSecureCoding
+{
+    return YES;
+}
+
 // FIXME: We currently only encode/decode API preferences. We should consider whether we should
 // encode/decode SPI preferences as well.
 
index ed76602..e72d5b8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-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
@@ -36,7 +36,7 @@
  with the same process pool end up sharing web content processes.
  */
 WK_CLASS_AVAILABLE(macosx(10.10), ios(8.0))
-@interface WKProcessPool : NSObject <NSCoding>
+@interface WKProcessPool : NSObject <NSSecureCoding>
 @end
 
 #endif
index a9bcbae..d55b4d3 100644 (file)
@@ -96,6 +96,11 @@ static WKProcessPool *sharedProcessPool;
     [super dealloc];
 }
 
++ (BOOL)supportsSecureCoding
+{
+    return YES;
+}
+
 - (void)encodeWithCoder:(NSCoder *)coder
 {
     if (self == sharedProcessPool) {
index 7f47b58..85d5340 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-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
@@ -41,7 +41,7 @@ NS_ASSUME_NONNULL_BEGIN
  web view configuration.
  */
 WK_CLASS_AVAILABLE(macosx(10.10), ios(8.0))
-@interface WKUserContentController : NSObject <NSCoding>
+@interface WKUserContentController : NSObject <NSSecureCoding>
 
 /*! @abstract The user scripts associated with this user content
  controller.
index 3f3c561..62463f0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-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
     [super dealloc];
 }
 
++ (BOOL)supportsSecureCoding
+{
+    return YES;
+}
+
 - (void)encodeWithCoder:(NSCoder *)coder
 {
 }
index 028f4e5..fe26381 100644 (file)
@@ -723,11 +723,11 @@ static void validate(WKWebViewConfiguration *configuration)
     if (!(self = [super initWithCoder:coder]))
         return nil;
 
-    WKWebViewConfiguration *configuration = [coder decodeObjectForKey:@"configuration"];
+    WKWebViewConfiguration *configuration = decodeObjectOfClassForKeyFromCoder([WKWebViewConfiguration class], @"configuration", coder);
     [self _initializeWithConfiguration:configuration];
 
     self.allowsBackForwardNavigationGestures = [coder decodeBoolForKey:@"allowsBackForwardNavigationGestures"];
-    self.customUserAgent = [coder decodeObjectForKey:@"customUserAgent"];
+    self.customUserAgent = decodeObjectOfClassForKeyFromCoder([NSString class], @"customUserAgent", coder);
     self.allowsLinkPreview = [coder decodeBoolForKey:@"allowsLinkPreview"];
 
 #if PLATFORM(MAC)
index e27f9dd..ea1324d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-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
@@ -92,7 +92,7 @@ typedef NS_OPTIONS(NSUInteger, WKAudiovisualMediaTypes) {
  @helps Contains properties used to configure a @link WKWebView @/link.
  */
 WK_CLASS_AVAILABLE(macosx(10.10), ios(8.0))
-@interface WKWebViewConfiguration : NSObject <NSCoding, NSCopying>
+@interface WKWebViewConfiguration : NSObject <NSSecureCoding, NSCopying>
 
 /*! @abstract The process pool from which to obtain the view's web content
  process.
index 2b489fb..14fea60 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014-2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-2017 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -25,6 +25,7 @@
 
 #import "config.h"
 #import "WKWebViewConfigurationInternal.h"
+#import <pal/spi/cocoa/NSKeyedArchiverSPI.h>
 
 #if WK_API_ENABLED
 
@@ -237,6 +238,11 @@ static _WKDragLiftDelay toDragLiftDelay(NSUInteger value)
     return [NSString stringWithFormat:@"<%@: %p; processPool = %@; preferences = %@>", NSStringFromClass(self.class), self, self.processPool, self.preferences];
 }
 
++ (BOOL)supportsSecureCoding
+{
+    return YES;
+}
+
 // FIXME: Encode the process pool, user content controller and website data store.
 
 - (void)encodeWithCoder:(NSCoder *)coder
@@ -269,13 +275,13 @@ static _WKDragLiftDelay toDragLiftDelay(NSUInteger value)
     if (!(self = [self init]))
         return nil;
 
-    self.processPool = [coder decodeObjectForKey:@"processPool"];
-    self.preferences = [coder decodeObjectForKey:@"preferences"];
-    self.userContentController = [coder decodeObjectForKey:@"userContentController"];
-    self.websiteDataStore = [coder decodeObjectForKey:@"websiteDataStore"];
+    self.processPool = decodeObjectOfClassForKeyFromCoder([WKProcessPool class], @"processPool", coder);
+    self.preferences = decodeObjectOfClassForKeyFromCoder([WKPreferences class], @"preferences", coder);
+    self.userContentController = decodeObjectOfClassForKeyFromCoder([WKUserContentController class], @"userContentController", coder);
+    self.websiteDataStore = decodeObjectOfClassForKeyFromCoder([WKWebsiteDataStore class], @"websiteDataStore", coder);
 
     self.suppressesIncrementalRendering = [coder decodeBoolForKey:@"suppressesIncrementalRendering"];
-    self.applicationNameForUserAgent = [coder decodeObjectForKey:@"applicationNameForUserAgent"];
+    self.applicationNameForUserAgent = decodeObjectOfClassForKeyFromCoder([NSString class], @"applicationNameForUserAgent", coder);
     self.allowsAirPlayForMediaPlayback = [coder decodeBoolForKey:@"allowsAirPlayForMediaPlayback"];
 
 #if PLATFORM(IOS)
index d041363..4464390 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-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
@@ -38,7 +38,7 @@ NS_ASSUME_NONNULL_BEGIN
  IndexedDB databases, and local storage.
  */
 WK_CLASS_AVAILABLE(macosx(10.11), ios(9.0))
-@interface WKWebsiteDataStore : NSObject <NSCoding>
+@interface WKWebsiteDataStore : NSObject <NSSecureCoding>
 
 /* @abstract Returns the default data store. */
 + (WKWebsiteDataStore *)defaultDataStore;
index b865b42..9d5631b 100644 (file)
@@ -59,6 +59,11 @@ using namespace WebCore;
     [super dealloc];
 }
 
++ (BOOL)supportsSecureCoding
+{
+    return YES;
+}
+
 - (instancetype)initWithCoder:(NSCoder *)coder
 {
     if (!(self = [super init]))
index 587d0c5..f6109e8 100644 (file)
@@ -41,7 +41,7 @@ typedef NS_ENUM(NSInteger, _WKApplicationManifestDisplayMode) {
 } WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 
 WK_CLASS_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA))
-@interface _WKApplicationManifest : NSObject <NSCoding>
+@interface _WKApplicationManifest : NSObject <NSSecureCoding>
 
 @property (nonatomic, readonly, nullable, copy) NSString *name;
 @property (nonatomic, readonly, nullable, copy) NSString *shortName;
index 4a917c4..c753503 100644 (file)
 
 #import <WebCore/ApplicationManifest.h>
 #import <WebCore/ApplicationManifestParser.h>
+#import <pal/spi/cocoa/NSKeyedArchiverSPI.h>
 
 @implementation _WKApplicationManifest
 
 #if ENABLE(APPLICATION_MANIFEST)
 
++ (BOOL)supportsSecureCoding
+{
+    return YES;
+}
+
 - (instancetype)initWithCoder:(NSCoder *)aDecoder
 {
-    NSString *name = [aDecoder decodeObjectForKey:@"name"];
-    NSString *shortName = [aDecoder decodeObjectForKey:@"short_name"];
-    NSString *description = [aDecoder decodeObjectForKey:@"description"];
-    NSURL *scopeURL = [aDecoder decodeObjectForKey:@"scope"];
+    NSString *name = decodeObjectOfClassForKeyFromCoder([NSString class], @"name", aDecoder);
+    NSString *shortName = decodeObjectOfClassForKeyFromCoder([NSString class], @"short_name", aDecoder);
+    NSString *description = decodeObjectOfClassForKeyFromCoder([NSString class], @"description", aDecoder);
+    NSURL *scopeURL = decodeObjectOfClassForKeyFromCoder([NSURL class], @"scope", aDecoder);
     NSInteger display = [aDecoder decodeIntegerForKey:@"display"];
-    NSURL *startURL = [aDecoder decodeObjectForKey:@"start_url"];
+    NSURL *startURL = decodeObjectOfClassForKeyFromCoder([NSURL class], @"start_url", aDecoder);
 
     WebCore::ApplicationManifest coreApplicationManifest {
         WTF::String(name),
index 0084aee..4712c53 100644 (file)
@@ -1,3 +1,22 @@
+2018-01-02  Brent Fulgham  <bfulgham@apple.com>
+
+        [macOS, iOS] Adopt new secure coding APIs in WebKit
+        https://bugs.webkit.org/show_bug.cgi?id=181085
+        <rdar://problem/34837397>
+
+        Reviewed by Tim Horton.
+
+        Update API tests to use secure coding wherever possible. Currently, NSView/UIView-based classes are not
+        capable of supporting NSSecureCoding, so pass through the current coding routines.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/ApplicationManifest.mm: Updated for NSSecureCoding.
+        * TestWebKitAPI/Tests/WebKitCocoa/Coding.mm:
+        (encodeAndDecode): Check if class supports the NSSecureCoding protocol and use non-secure coding
+        routines if necessary.
+        (TEST): Updated for NSSecureCoding.
+        * TestWebKitAPI/Tests/mac/EarlyKVOCrash.mm:
+        (TestWebKitAPI::TEST): Updated for NSSecureCoding.
+
 2017-12-28  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         Remove std::chrono completely
index 9bc154e..6a5bada 100644 (file)
@@ -34,6 +34,7 @@
 #import <WebKit/WKWebViewConfigurationPrivate.h>
 #import <WebKit/WKWebViewPrivate.h>
 #import <WebKit/_WKApplicationManifest.h>
+#import <pal/spi/cocoa/NSKeyedArchiverSPI.h>
 
 namespace TestWebKitAPI {
 
@@ -42,7 +43,7 @@ TEST(WebKit, ApplicationManifestCoding)
     auto jsonString = @"{ \"name\": \"TestName\", \"short_name\": \"TestShortName\", \"description\": \"TestDescription\", \"scope\": \"https://test.com/app\", \"start_url\": \"https://test.com/app/index.html\", \"display\": \"minimal-ui\" }";
     RetainPtr<_WKApplicationManifest> manifest { [_WKApplicationManifest applicationManifestFromJSON:jsonString manifestURL:[NSURL URLWithString:@"https://test.com/manifest.json"] documentURL:[NSURL URLWithString:@"https://test.com/"]] };
     
-    manifest = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:manifest.get()]];
+    manifest = unarchivedObjectOfClassesFromData([NSSet setWithObject:[_WKApplicationManifest class]], securelyArchivedDataWithRootObject(manifest.get()));
     
     EXPECT_TRUE([manifest isKindOfClass:[_WKApplicationManifest class]]);
     EXPECT_STREQ("TestName", manifest.get().name.UTF8String);
index 194271a..8e8f760 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-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
 #if WK_API_ENABLED
 
 #import <WebKit/WKProcessPoolPrivate.h>
+#import <pal/spi/cocoa/NSKeyedArchiverSPI.h>
 #import <wtf/RetainPtr.h>
 
 template<typename T>
 RetainPtr<T> encodeAndDecode(T* t)
 {
-    auto data = [NSKeyedArchiver archivedDataWithRootObject:t];
+    if ([t conformsToProtocol:@protocol(NSSecureCoding)]) {
+        auto data = securelyArchivedDataWithRootObject(t);
+        return unarchivedObjectOfClassesFromData([NSSet setWithObjects:[t class], nil], data);
+    }
 
-    return [NSKeyedUnarchiver unarchiveObjectWithData:data];
+    auto data = insecurelyArchivedDataWithRootObject(t);
+    return insecurelyUnarchiveObjectFromData(data);
 }
 
 TEST(Coding, WKPreferences)
@@ -161,11 +166,11 @@ TEST(Coding, WKWebView_SameConfiguration)
         auto a = adoptNS([[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration.get()]);
         auto b = adoptNS([[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration.get()]);
 
-        data = [NSKeyedArchiver archivedDataWithRootObject:@[a.get(), b.get()]];
+        data = securelyArchivedDataWithRootObject(@[a.get(), b.get()]);
     }
 
     // Then, decode and verify that the important configuration properties are the same.
-    NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data.get()];
+    NSArray *array = unarchivedObjectOfClassesFromData([NSSet setWithObject:[NSArray class]], data.get());
 
     WKWebView *aView = array[0];
     WKWebView *bView = array[1];
index b635d8a..d64fae1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-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
@@ -26,6 +26,7 @@
 #import "config.h"
 
 #import <WebKit/WebView.h>
+#import <pal/spi/cocoa/NSKeyedArchiverSPI.h>
 #import <wtf/RetainPtr.h>
 
 @interface EarlyKVOCrashResponder : NSResponder {
@@ -85,8 +86,12 @@ TEST(WebKitLegacy, EarlyKVOCrash)
 
     [webView setNextResponder:earlyKVOCrashResponder.get()];
 
-    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:@[ webView.get(), earlyKVOCrashResponder.get() ]];
-    [NSKeyedUnarchiver unarchiveObjectWithData:data];
+    auto data = securelyArchivedDataWithRootObject(@[webView.get(), earlyKVOCrashResponder.get()]);
+
+    if ([webView conformsToProtocol:@protocol(NSSecureCoding)])
+        unarchivedObjectOfClassesFromData([NSSet setWithObjects:[NSArray class], [WebView class], [EarlyKVOCrashResponder class], nil], data);
+    else
+        insecurelyUnarchiveObjectFromData(data);
 }
 
 } // namespace TestWebKitAPI