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