Title: [215355] trunk
Revision
215355
Author
[email protected]
Date
2017-04-13 21:33:07 -0700 (Thu, 13 Apr 2017)

Log Message

[Cocoa] Allow clients to specify in _WKProcessPoolConfiguration additional directory sandbox extensions
https://bugs.webkit.org/show_bug.cgi?id=170387

Reviewed by Sam Weinig.

Source/WebKit2:

Test: TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLs.mm

Added an additionalReadAccessAllowedURLs property to _WKProcessPoolConfiguration.

* Shared/WebProcessCreationParameters.cpp:
(WebKit::WebProcessCreationParameters::encode): Encode the new
  additionalSandboxExtensionHandles member.
(WebKit::WebProcessCreationParameters::decode): Decode it.
* Shared/WebProcessCreationParameters.h: Added additionalSandboxExtensionHandles member.

* UIProcess/API/APIProcessPoolConfiguration.cpp:
(API::ProcessPoolConfiguration::copy): Copy new m_additionalReadAccessAllowedPaths member.
* UIProcess/API/APIProcessPoolConfiguration.h: Added m_additionalReadAccessAllowedPaths
  member and accessor functions.

* UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h: Declared new
  additionalReadAccessAllowedURLs property whose value is an array of URLs to which the Web
  Content process will be given read access.
* UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm:
(-[_WKProcessPoolConfiguration additionalReadAccessAllowedURLs]): New getter that returns
  an array of file URLs from the ProcessPoolConfiguration's additionalReadAccessAllowedPaths().
(-[_WKProcessPoolConfiguration setAdditionalReadAccessAllowedURLs:]): New setter that checks
  that the given URLs are file URLs and populates the ProcessPoolConfiguration's
  additionalReadAccessAllowedPaths with their paths.

* UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::resolvePathsForSandboxExtensions): Populate the new
  m_resolvedPaths.additionalWebProcessSandboxExtensionPaths with resolved paths from the
  ProcessPoolConfiguration's additionalReadAccessAllowedPaths.
(WebKit::WebProcessPool::createNewWebProcess): Populate the WebProcessCreationParameters's
  additionalSandboxExtensionHandles member with read-only sandbox extensions created from
  the resolved paths.
* UIProcess/WebProcessPool.h: Added additionalWebProcessSandboxExtensionPaths member to
  the Paths struct.

* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::initializeWebProcess): Consume the additional sandbox extensions.

Tools:

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLs.mm: Added.
(TEST):
* TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLsPlugin.mm: Added.
(-[AdditionalReadAccessAllowedURLsPlugIn webProcessPlugIn:didCreateBrowserContextController:]):
(-[AdditionalReadAccessAllowedURLsPlugIn dealloc]):
(-[AdditionalReadAccessAllowedURLsPlugIn readStringFromURL:completionHandler:]):
* TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLsProtocol.h: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (215354 => 215355)


--- trunk/Source/WebKit2/ChangeLog	2017-04-14 04:25:01 UTC (rev 215354)
+++ trunk/Source/WebKit2/ChangeLog	2017-04-14 04:33:07 UTC (rev 215355)
@@ -1,3 +1,48 @@
+2017-04-13  Dan Bernstein  <[email protected]>
+
+        [Cocoa] Allow clients to specify in _WKProcessPoolConfiguration additional directory sandbox extensions
+        https://bugs.webkit.org/show_bug.cgi?id=170387
+
+        Reviewed by Sam Weinig.
+
+        Test: TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLs.mm
+
+        Added an additionalReadAccessAllowedURLs property to _WKProcessPoolConfiguration.
+
+        * Shared/WebProcessCreationParameters.cpp:
+        (WebKit::WebProcessCreationParameters::encode): Encode the new
+          additionalSandboxExtensionHandles member.
+        (WebKit::WebProcessCreationParameters::decode): Decode it.
+        * Shared/WebProcessCreationParameters.h: Added additionalSandboxExtensionHandles member.
+
+        * UIProcess/API/APIProcessPoolConfiguration.cpp:
+        (API::ProcessPoolConfiguration::copy): Copy new m_additionalReadAccessAllowedPaths member.
+        * UIProcess/API/APIProcessPoolConfiguration.h: Added m_additionalReadAccessAllowedPaths
+          member and accessor functions.
+
+        * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h: Declared new
+          additionalReadAccessAllowedURLs property whose value is an array of URLs to which the Web
+          Content process will be given read access.
+        * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm:
+        (-[_WKProcessPoolConfiguration additionalReadAccessAllowedURLs]): New getter that returns
+          an array of file URLs from the ProcessPoolConfiguration’s additionalReadAccessAllowedPaths().
+        (-[_WKProcessPoolConfiguration setAdditionalReadAccessAllowedURLs:]): New setter that checks
+          that the given URLs are file URLs and populates the ProcessPoolConfiguration’s
+          additionalReadAccessAllowedPaths with their paths.
+
+        * UIProcess/WebProcessPool.cpp:
+        (WebKit::WebProcessPool::resolvePathsForSandboxExtensions): Populate the new
+          m_resolvedPaths.additionalWebProcessSandboxExtensionPaths with resolved paths from the
+          ProcessPoolConfiguration’s additionalReadAccessAllowedPaths.
+        (WebKit::WebProcessPool::createNewWebProcess): Populate the WebProcessCreationParameters’s
+          additionalSandboxExtensionHandles member with read-only sandbox extensions created from
+          the resolved paths.
+        * UIProcess/WebProcessPool.h: Added additionalWebProcessSandboxExtensionPaths member to
+          the Paths struct.
+
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::initializeWebProcess): Consume the additional sandbox extensions.
+
 2017-04-13  Alex Christensen  <[email protected]>
 
         Fix CMake build

Modified: trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp (215354 => 215355)


--- trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp	2017-04-14 04:25:01 UTC (rev 215354)
+++ trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp	2017-04-14 04:33:07 UTC (rev 215355)
@@ -46,6 +46,7 @@
 {
     encoder << injectedBundlePath;
     encoder << injectedBundlePathExtensionHandle;
+    encoder << additionalSandboxExtensionHandles;
     encoder << initializationUserData;
     encoder << applicationCacheDirectory;
     encoder << applicationCacheFlatFileSubdirectoryName;
@@ -151,6 +152,8 @@
         return false;
     if (!decoder.decode(parameters.injectedBundlePathExtensionHandle))
         return false;
+    if (!decoder.decode(parameters.additionalSandboxExtensionHandles))
+        return false;
     if (!decoder.decode(parameters.initializationUserData))
         return false;
     if (!decoder.decode(parameters.applicationCacheDirectory))

Modified: trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h (215354 => 215355)


--- trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h	2017-04-14 04:25:01 UTC (rev 215354)
+++ trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h	2017-04-14 04:33:07 UTC (rev 215355)
@@ -65,6 +65,7 @@
 
     String injectedBundlePath;
     SandboxExtension::Handle injectedBundlePathExtensionHandle;
+    SandboxExtension::HandleArray additionalSandboxExtensionHandles;
 
     UserData initializationUserData;
 

Modified: trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.cpp (215354 => 215355)


--- trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.cpp	2017-04-14 04:25:01 UTC (rev 215354)
+++ trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.cpp	2017-04-14 04:33:07 UTC (rev 215355)
@@ -111,6 +111,7 @@
     copy->m_webSQLDatabaseDirectory = this->m_webSQLDatabaseDirectory;
     copy->m_cachePartitionedURLSchemes = this->m_cachePartitionedURLSchemes;
     copy->m_alwaysRevalidatedURLSchemes = this->m_alwaysRevalidatedURLSchemes;
+    copy->m_additionalReadAccessAllowedPaths = this->m_additionalReadAccessAllowedPaths;
     copy->m_fullySynchronousModeIsAllowedForTesting = this->m_fullySynchronousModeIsAllowedForTesting;
     copy->m_ignoreSynchronousMessagingTimeoutsForTesting = this->m_ignoreSynchronousMessagingTimeoutsForTesting;
     copy->m_overrideLanguages = this->m_overrideLanguages;

Modified: trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.h (215354 => 215355)


--- trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.h	2017-04-14 04:25:01 UTC (rev 215354)
+++ trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.h	2017-04-14 04:33:07 UTC (rev 215355)
@@ -96,6 +96,9 @@
     const Vector<WTF::String>& alwaysRevalidatedURLSchemes() { return m_alwaysRevalidatedURLSchemes; }
     void setAlwaysRevalidatedURLSchemes(Vector<WTF::String>&& alwaysRevalidatedURLSchemes) { m_alwaysRevalidatedURLSchemes = WTFMove(alwaysRevalidatedURLSchemes); }
 
+    const Vector<WTF::String>& additionalReadAccessAllowedPaths() { return m_additionalReadAccessAllowedPaths; }
+    void setAdditionalReadAccessAllowedPaths(Vector<WTF::String>&& additionalReadAccessAllowedPaths) { m_additionalReadAccessAllowedPaths = additionalReadAccessAllowedPaths; }
+
     bool fullySynchronousModeIsAllowedForTesting() const { return m_fullySynchronousModeIsAllowedForTesting; }
     void setFullySynchronousModeIsAllowedForTesting(bool allowed) { m_fullySynchronousModeIsAllowedForTesting = allowed; }
 
@@ -146,6 +149,7 @@
     WTF::String m_javaScriptConfigurationDirectory;
     Vector<WTF::String> m_cachePartitionedURLSchemes;
     Vector<WTF::String> m_alwaysRevalidatedURLSchemes;
+    Vector<WTF::String> m_additionalReadAccessAllowedPaths;
     bool m_fullySynchronousModeIsAllowedForTesting { false };
     bool m_ignoreSynchronousMessagingTimeoutsForTesting { false };
     Vector<WTF::String> m_overrideLanguages;

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h (215354 => 215355)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h	2017-04-14 04:25:01 UTC (rev 215354)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h	2017-04-14 04:33:07 UTC (rev 215355)
@@ -38,6 +38,8 @@
 
 @property (nonatomic) BOOL ignoreSynchronousMessagingTimeoutsForTesting WK_API_AVAILABLE(macosx(10.12), ios(10.0));
 
+@property (nonatomic, copy) NSArray<NSURL *> *additionalReadAccessAllowedURLs WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
+
 // Network Process properties
 // FIXME: These should be be per-session/data store when we support multiple non-persistent sessions/data stores.
 

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm (215354 => 215355)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm	2017-04-14 04:25:01 UTC (rev 215354)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm	2017-04-14 04:33:07 UTC (rev 215355)
@@ -102,6 +102,33 @@
     _processPoolConfiguration->setIgnoreSynchronousMessagingTimeoutsForTesting(ignoreSynchronousMessagingTimeoutsForTesting);
 }
 
+- (NSArray<NSURL *> *)additionalReadAccessAllowedURLs
+{
+    auto paths = _processPoolConfiguration->additionalReadAccessAllowedPaths();
+    if (paths.isEmpty())
+        return @[ ];
+
+    NSMutableArray *urls = [NSMutableArray arrayWithCapacity:paths.size()];
+    for (const auto& path : paths)
+        [urls addObject:[NSURL fileURLWithPath:path]];
+
+    return urls;
+}
+
+- (void)setAdditionalReadAccessAllowedURLs:(NSArray<NSURL *> *)additionalReadAccessAllowedURLs
+{
+    Vector<String> paths;
+    paths.reserveInitialCapacity(additionalReadAccessAllowedURLs.count);
+    for (NSURL *url in additionalReadAccessAllowedURLs) {
+        if (!url.isFileURL)
+            [NSException raise:NSInvalidArgumentException format:@"%@ is not a file URL", url];
+
+        paths.uncheckedAppend(url.fileSystemRepresentation);
+    }
+
+    _processPoolConfiguration->setAdditionalReadAccessAllowedPaths(WTFMove(paths));
+}
+
 - (NSArray *)cachePartitionedURLSchemes
 {
     auto schemes = _processPoolConfiguration->cachePartitionedURLSchemes();

Modified: trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp (215354 => 215355)


--- trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp	2017-04-14 04:25:01 UTC (rev 215354)
+++ trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp	2017-04-14 04:33:07 UTC (rev 215355)
@@ -614,6 +614,10 @@
     m_resolvedPaths.mediaCacheDirectory = resolveAndCreateReadWriteDirectoryForSandboxExtension(m_configuration->mediaCacheDirectory());
     m_resolvedPaths.mediaKeyStorageDirectory = resolveAndCreateReadWriteDirectoryForSandboxExtension(m_configuration->mediaKeysStorageDirectory());
 
+    m_resolvedPaths.additionalWebProcessSandboxExtensionPaths.reserveCapacity(m_configuration->additionalReadAccessAllowedPaths().size());
+    for (const auto& path : m_configuration->additionalReadAccessAllowedPaths())
+        m_resolvedPaths.additionalWebProcessSandboxExtensionPaths.uncheckedAppend(resolvePathForSandboxExtension(path));
+
     platformResolvePathsForSandboxExtensions();
 }
 
@@ -632,6 +636,10 @@
     if (!parameters.injectedBundlePath.isEmpty())
         SandboxExtension::createHandleWithoutResolvingPath(parameters.injectedBundlePath, SandboxExtension::ReadOnly, parameters.injectedBundlePathExtensionHandle);
 
+    parameters.additionalSandboxExtensionHandles.allocate(m_resolvedPaths.additionalWebProcessSandboxExtensionPaths.size());
+    for (size_t i = 0, size = m_resolvedPaths.additionalWebProcessSandboxExtensionPaths.size(); i < size; ++i)
+        SandboxExtension::createHandleWithoutResolvingPath(m_resolvedPaths.additionalWebProcessSandboxExtensionPaths[i], SandboxExtension::ReadOnly, parameters.additionalSandboxExtensionHandles[i]);
+
     parameters.applicationCacheDirectory = websiteDataStore ? websiteDataStore->resolvedApplicationCacheDirectory() : m_resolvedPaths.applicationCacheDirectory;
     if (parameters.applicationCacheDirectory.isEmpty())
         parameters.applicationCacheDirectory = m_resolvedPaths.applicationCacheDirectory;

Modified: trunk/Source/WebKit2/UIProcess/WebProcessPool.h (215354 => 215355)


--- trunk/Source/WebKit2/UIProcess/WebProcessPool.h	2017-04-14 04:25:01 UTC (rev 215354)
+++ trunk/Source/WebKit2/UIProcess/WebProcessPool.h	2017-04-14 04:33:07 UTC (rev 215355)
@@ -611,6 +611,8 @@
         String containerCachesDirectory;
         String containerTemporaryDirectory;
 #endif
+
+        Vector<String> additionalWebProcessSandboxExtensionPaths;
     };
     Paths m_resolvedPaths;
 };

Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (215354 => 215355)


--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp	2017-04-14 04:25:01 UTC (rev 215354)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp	2017-04-14 04:33:07 UTC (rev 215355)
@@ -286,6 +286,9 @@
     if (!parameters.injectedBundlePath.isEmpty())
         m_injectedBundle = InjectedBundle::create(parameters, transformHandlesToObjects(parameters.initializationUserData.object()).get());
 
+    for (size_t i = 0, size = parameters.additionalSandboxExtensionHandles.size(); i < size; ++i)
+        SandboxExtension::consumePermanently(parameters.additionalSandboxExtensionHandles[i]);
+
     for (auto& supplement : m_supplements.values())
         supplement->initialize(parameters);
 

Modified: trunk/Tools/ChangeLog (215354 => 215355)


--- trunk/Tools/ChangeLog	2017-04-14 04:25:01 UTC (rev 215354)
+++ trunk/Tools/ChangeLog	2017-04-14 04:33:07 UTC (rev 215355)
@@ -1,3 +1,19 @@
+2017-04-13  Dan Bernstein  <[email protected]>
+
+        [Cocoa] Allow clients to specify in _WKProcessPoolConfiguration additional directory sandbox extensions
+        https://bugs.webkit.org/show_bug.cgi?id=170387
+
+        Reviewed by Sam Weinig.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLs.mm: Added.
+        (TEST):
+        * TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLsPlugin.mm: Added.
+        (-[AdditionalReadAccessAllowedURLsPlugIn webProcessPlugIn:didCreateBrowserContextController:]):
+        (-[AdditionalReadAccessAllowedURLsPlugIn dealloc]):
+        (-[AdditionalReadAccessAllowedURLsPlugIn readStringFromURL:completionHandler:]):
+        * TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLsProtocol.h: Added.
+
 2017-04-13  Jonathan Bedard  <[email protected]>
 
         webkitpy: Ignore previously launched pid when system is under stress

Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (215354 => 215355)


--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2017-04-14 04:25:01 UTC (rev 215354)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2017-04-14 04:33:07 UTC (rev 215355)
@@ -117,6 +117,8 @@
 		37D36ED71AF42ECD00BAF5D9 /* LoadAlternateHTMLString.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37D36ED61AF42ECD00BAF5D9 /* LoadAlternateHTMLString.mm */; };
 		37DC6791140D7D7600ABCCDB /* DOMRangeOfString.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 37DC678F140D7D3A00ABCCDB /* DOMRangeOfString.html */; };
 		37E1064C1697681800B78BD0 /* DOMHTMLTableCellElementCellAbove.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 37E1064B169767F700B78BD0 /* DOMHTMLTableCellElementCellAbove.html */; };
+		37E7DD641EA06FF2009B396D /* AdditionalReadAccessAllowedURLs.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37E7DD631EA06FF2009B396D /* AdditionalReadAccessAllowedURLs.mm */; };
+		37E7DD671EA071F3009B396D /* AdditionalReadAccessAllowedURLsPlugin.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37E7DD661EA071F3009B396D /* AdditionalReadAccessAllowedURLsPlugin.mm */; };
 		37FB72971DB2E82F00E41BE4 /* ContextMenuDefaultItemsHaveTags.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37FB72951DB2E82F00E41BE4 /* ContextMenuDefaultItemsHaveTags.mm */; };
 		3FBD1B4A1D3D66AB00E6D6FA /* FullscreenLayoutConstraints.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 3FBD1B491D39D1DB00E6D6FA /* FullscreenLayoutConstraints.html */; };
 		46397B951DC2C850009A78AE /* DOMNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 46397B941DC2C850009A78AE /* DOMNode.mm */; };
@@ -1018,6 +1020,9 @@
 		37E1064A1697676400B78BD0 /* DOMHTMLTableCellCellAbove.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DOMHTMLTableCellCellAbove.mm; sourceTree = "<group>"; };
 		37E1064B169767F700B78BD0 /* DOMHTMLTableCellElementCellAbove.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = DOMHTMLTableCellElementCellAbove.html; sourceTree = "<group>"; };
 		37E38C33169B7D010084C28C /* WebViewDidRemoveFrameFromHierarchy.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebViewDidRemoveFrameFromHierarchy.mm; sourceTree = "<group>"; };
+		37E7DD631EA06FF2009B396D /* AdditionalReadAccessAllowedURLs.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AdditionalReadAccessAllowedURLs.mm; sourceTree = "<group>"; };
+		37E7DD651EA0715B009B396D /* AdditionalReadAccessAllowedURLsProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdditionalReadAccessAllowedURLsProtocol.h; sourceTree = "<group>"; };
+		37E7DD661EA071F3009B396D /* AdditionalReadAccessAllowedURLsPlugin.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AdditionalReadAccessAllowedURLsPlugin.mm; sourceTree = "<group>"; };
 		37FB72951DB2E82F00E41BE4 /* ContextMenuDefaultItemsHaveTags.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ContextMenuDefaultItemsHaveTags.mm; sourceTree = "<group>"; };
 		3F1B52681D3D7129008D60C4 /* FullscreenLayoutConstraints.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FullscreenLayoutConstraints.mm; sourceTree = "<group>"; };
 		3FBD1B491D39D1DB00E6D6FA /* FullscreenLayoutConstraints.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = FullscreenLayoutConstraints.html; sourceTree = "<group>"; };
@@ -1625,6 +1630,9 @@
 			children = (
 				A16F66B81C40E9E100BD4D24 /* Resources */,
 				7CEFA9641AC0B9E200B910FD /* _WKUserContentExtensionStore.mm */,
+				37E7DD631EA06FF2009B396D /* AdditionalReadAccessAllowedURLs.mm */,
+				37E7DD661EA071F3009B396D /* AdditionalReadAccessAllowedURLsPlugin.mm */,
+				37E7DD651EA0715B009B396D /* AdditionalReadAccessAllowedURLsProtocol.h */,
 				A1DF74301C41B65800A2F4D0 /* AlwaysRevalidatedURLSchemes.mm */,
 				2DE71AFD1D49C0BD00904094 /* AnimatedResize.mm */,
 				2DD355351BD08378005DF4A7 /* AutoLayoutIntegration.mm */,
@@ -2773,6 +2781,7 @@
 				46397B951DC2C850009A78AE /* DOMNode.mm in Sources */,
 				7CCE7EBC1A411A7E00447C4C /* DOMNodeFromJSObject.mm in Sources */,
 				7CCE7EBD1A411A7E00447C4C /* DOMRangeOfString.mm in Sources */,
+				37E7DD641EA06FF2009B396D /* AdditionalReadAccessAllowedURLs.mm in Sources */,
 				7CCE7EEC1A411AE600447C4C /* DOMWindowExtensionBasic.cpp in Sources */,
 				7CCE7EED1A411AE600447C4C /* DOMWindowExtensionNoCache.cpp in Sources */,
 				7CCE7F231A411AF600447C4C /* Download.mm in Sources */,
@@ -3027,6 +3036,7 @@
 				A13EBBAB1B87434600097110 /* PlatformUtilitiesCocoa.mm in Sources */,
 				1A4F81CF1BDFFD53004E672E /* RemoteObjectRegistryPlugIn.mm in Sources */,
 				A12DDC021E837C2400CF6CAE /* RenderedImageWithOptionsPlugIn.mm in Sources */,
+				37E7DD671EA071F3009B396D /* AdditionalReadAccessAllowedURLsPlugin.mm in Sources */,
 				7C882E091C80C630006BF731 /* UserContentWorldPlugIn.mm in Sources */,
 				7C83E03D1D0A60D600FEBCF3 /* UtilitiesCocoa.mm in Sources */,
 				A13EBBAA1B87428D00097110 /* WebProcessPlugIn.mm in Sources */,

Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLs.mm (0 => 215355)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLs.mm	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLs.mm	2017-04-14 04:33:07 UTC (rev 215355)
@@ -0,0 +1,105 @@
+/*
+ * 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 <WebKit/WKFoundation.h>
+
+#if WK_API_ENABLED
+
+#import "AdditionalReadAccessAllowedURLsProtocol.h"
+#import "PlatformUtilities.h"
+#import "Utilities.h"
+#import "WKWebViewConfigurationExtras.h"
+#import <WebKit/WKProcessPoolPrivate.h>
+#import <WebKit/WKWebViewPrivate.h>
+#import <WebKit/_WKProcessPoolConfiguration.h>
+#import <WebKit/_WKRemoteObjectInterface.h>
+#import <WebKit/_WKRemoteObjectRegistry.h>
+#import <wtf/RetainPtr.h>
+
+static bool done;
+
+TEST(WebKit2, AdditionalReadAccessAllowedURLs)
+{
+    RetainPtr<WKWebViewConfiguration> configuration = retainPtr([WKWebViewConfiguration testwebkitapi_configurationWithTestPlugInClassName:@"AdditionalReadAccessAllowedURLsPlugIn"]);
+
+    _WKProcessPoolConfiguration *processPoolConfiguration = [configuration processPool]._configuration;
+
+    bool exceptionRaised = false;
+    @try {
+        processPoolConfiguration.additionalReadAccessAllowedURLs = @[ [NSURL URLWithString:@"about:blank"] ];
+    } @catch (NSException *exception) {
+        EXPECT_WK_STREQ(NSInvalidArgumentException, exception.name);
+        exceptionRaised = true;
+    }
+    EXPECT_TRUE(exceptionRaised);
+
+    char temporaryDirectory[PATH_MAX];
+    confstr(_CS_DARWIN_USER_TEMP_DIR, temporaryDirectory, sizeof(temporaryDirectory));
+
+    char readableDirectory[PATH_MAX];
+    strlcpy(readableDirectory, [[[NSFileManager defaultManager] stringWithFileSystemRepresentation:temporaryDirectory length:strlen(temporaryDirectory)] stringByAppendingPathComponent:@"WebKitTestRunner.AdditionalReadAccessAllowedURLs-XXXXXX"].fileSystemRepresentation, sizeof(temporaryDirectory));
+    mkdtemp(readableDirectory);
+    NSURL *readableDirectoryURL = [NSURL fileURLWithFileSystemRepresentation:readableDirectory isDirectory:YES relativeToURL:nil];
+
+    char unreadableDirectory[PATH_MAX];
+    strlcpy(unreadableDirectory, [[[NSFileManager defaultManager] stringWithFileSystemRepresentation:temporaryDirectory length:strlen(temporaryDirectory)] stringByAppendingPathComponent:@"WebKitTestRunner.AdditionalReadAccessAllowedURLs-XXXXXX"].fileSystemRepresentation, sizeof(temporaryDirectory));
+    mkdtemp(unreadableDirectory);
+    NSURL *unreadableDirectoryURL = [NSURL fileURLWithFileSystemRepresentation:unreadableDirectory isDirectory:YES relativeToURL:nil];
+
+    processPoolConfiguration.additionalReadAccessAllowedURLs = @[ readableDirectoryURL ];
+
+    auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration]);
+    [processPool _setObject:@"AdditionalReadAccessAllowedURLsPlugIn" forBundleParameter:TestWebKitAPI::Util::TestPlugInClassNameParameter];
+    [configuration setProcessPool:processPool.get()];
+
+    RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+
+    id<AdditionalReadAccessAllowedURLsProtocol> proxy = [[webView _remoteObjectRegistry] remoteObjectProxyWithInterface:[_WKRemoteObjectInterface remoteObjectInterfaceWithProtocol:@protocol(AdditionalReadAccessAllowedURLsProtocol)]];
+
+    NSURL *readableFileURL = [readableDirectoryURL URLByAppendingPathComponent:@"file"];
+    NSURL *unreadableFileURL = [unreadableDirectoryURL URLByAppendingPathComponent:@"file"];
+
+    [@"hello" writeToURL:readableFileURL atomically:YES encoding:NSUTF8StringEncoding error:nullptr];
+    [@"secret" writeToURL:unreadableFileURL atomically:YES encoding:NSUTF8StringEncoding error:nullptr];
+
+    [proxy readStringFromURL:readableFileURL completionHandler:^(NSString *string, NSError *error) {
+        done = true;
+        EXPECT_WK_STREQ(@"hello", string);
+        EXPECT_EQ(nullptr, error);
+    }];
+    TestWebKitAPI::Util::run(&done);
+    done = false;
+
+    [proxy readStringFromURL:unreadableFileURL completionHandler:^(NSString *string, NSError *error) {
+        done = true;
+        EXPECT_EQ(nullptr, string);
+        EXPECT_WK_STREQ(NSCocoaErrorDomain, error.domain);
+        EXPECT_EQ(NSFileReadNoPermissionError, error.code);
+    }];
+    TestWebKitAPI::Util::run(&done);
+}
+
+#endif

Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLsPlugin.mm (0 => 215355)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLsPlugin.mm	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLsPlugin.mm	2017-04-14 04:33:07 UTC (rev 215355)
@@ -0,0 +1,74 @@
+/*
+ * 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
+
+#import "AdditionalReadAccessAllowedURLsProtocol.h"
+#import "PlatformUtilities.h"
+#import <WebKit/WKWebProcessPlugIn.h>
+#import <WebKit/WKWebProcessPlugInBrowserContextControllerPrivate.h>
+#import <WebKit/WKWebProcessPlugInFrame.h>
+#import <WebKit/_WKRemoteObjectInterface.h>
+#import <WebKit/_WKRemoteObjectRegistry.h>
+#import <wtf/RetainPtr.h>
+
+@interface AdditionalReadAccessAllowedURLsPlugIn : NSObject <AdditionalReadAccessAllowedURLsProtocol, WKWebProcessPlugIn>
+@end
+
+@implementation AdditionalReadAccessAllowedURLsPlugIn {
+    RetainPtr<WKWebProcessPlugInBrowserContextController> _browserContextController;
+    RetainPtr<WKWebProcessPlugInController> _plugInController;
+    RetainPtr<_WKRemoteObjectInterface> _interface;
+}
+
+- (void)webProcessPlugIn:(WKWebProcessPlugInController *)plugInController didCreateBrowserContextController:(WKWebProcessPlugInBrowserContextController *)browserContextController
+{
+    ASSERT(!_browserContextController);
+    ASSERT(!_plugInController);
+    _browserContextController = browserContextController;
+    _plugInController = plugInController;
+
+    _interface = [_WKRemoteObjectInterface remoteObjectInterfaceWithProtocol:@protocol(AdditionalReadAccessAllowedURLsProtocol)];
+    [[browserContextController _remoteObjectRegistry] registerExportedObject:self interface:_interface.get()];
+}
+
+- (void)dealloc
+{
+    [[_browserContextController _remoteObjectRegistry] unregisterExportedObject:self interface:_interface.get()];
+    [super dealloc];
+}
+
+- (void)readStringFromURL:(NSURL *)url completionHandler:(void (^)(NSString *, NSError *))completionHandler
+{
+    NSError *error = nil;
+    NSString *string = [NSString stringWithContentsOfURL:url usedEncoding:nullptr error:&error];
+    completionHandler(string, error);
+}
+
+@end
+
+#endif // WK_API_ENABLED

Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLsProtocol.h (0 => 215355)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLsProtocol.h	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/AdditionalReadAccessAllowedURLsProtocol.h	2017-04-14 04:33:07 UTC (rev 215355)
@@ -0,0 +1,34 @@
+/*
+ * 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
+
+@protocol AdditionalReadAccessAllowedURLsProtocol <NSObject>
+- (void)readStringFromURL:(NSURL *)url completionHandler:(void (^)(NSString *string, NSError *error))completionHandler;
+@end
+
+#endif
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to