blob: 8231abbc620ea3b0116554dcc4c0fb19d4bf27d2 [file] [log] [blame]
/*
* Copyright (C) 2014, 2016 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.
*/
#include "config.h"
#include "APIWebsiteDataStore.h"
#include "SandboxExtension.h"
#include "SandboxUtilities.h"
#if PLATFORM(IOS)
#import <WebCore/RuntimeApplicationChecks.h>
#endif
namespace API {
String WebsiteDataStore::defaultApplicationCacheDirectory()
{
#if PLATFORM(IOS)
// This quirk used to make these apps share application cache storage, but doesn't accomplish that any more.
// Preserving it avoids the need to migrate data when upgrading.
// FIXME: Ideally we should just have Safari and WebApp create a data store with
// this application cache path, but that's not supported as of right now.
if (WebCore::IOSApplication::isMobileSafari() || WebCore::IOSApplication::isWebApp()) {
NSString *cachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches/com.apple.WebAppCache"];
return WebKit::stringByResolvingSymlinksInPath(cachePath.stringByStandardizingPath);
}
#endif
return cacheDirectoryFileSystemRepresentation("OfflineWebApplicationCache");
}
String WebsiteDataStore::defaultNetworkCacheDirectory()
{
return cacheDirectoryFileSystemRepresentation("NetworkCache");
}
String WebsiteDataStore::defaultIndexedDBDatabaseDirectory()
{
return websiteDataDirectoryFileSystemRepresentation("IndexedDB");
}
String WebsiteDataStore::defaultLocalStorageDirectory()
{
return websiteDataDirectoryFileSystemRepresentation("LocalStorage");
}
String WebsiteDataStore::defaultMediaKeysStorageDirectory()
{
return websiteDataDirectoryFileSystemRepresentation("MediaKeys");
}
String WebsiteDataStore::defaultWebSQLDatabaseDirectory()
{
return websiteDataDirectoryFileSystemRepresentation("WebSQL");
}
String WebsiteDataStore::defaultResourceLoadStatisticsDirectory()
{
return websiteDataDirectoryFileSystemRepresentation("ResourceLoadStatistics");
}
String WebsiteDataStore::cacheDirectoryFileSystemRepresentation(const String& directoryName)
{
static dispatch_once_t onceToken;
static NSURL *cacheURL;
dispatch_once(&onceToken, ^{
NSURL *url = [[NSFileManager defaultManager] URLForDirectory:NSCachesDirectory inDomain:NSUserDomainMask appropriateForURL:nullptr create:NO error:nullptr];
if (!url)
RELEASE_ASSERT_NOT_REACHED();
if (!WebKit::processHasContainer()) {
NSString *bundleIdentifier = [NSBundle mainBundle].bundleIdentifier;
if (!bundleIdentifier)
bundleIdentifier = [NSProcessInfo processInfo].processName;
url = [url URLByAppendingPathComponent:bundleIdentifier isDirectory:YES];
}
cacheURL = [[url URLByAppendingPathComponent:@"WebKit" isDirectory:YES] retain];
});
NSURL *url = [cacheURL URLByAppendingPathComponent:directoryName isDirectory:YES];
if (![[NSFileManager defaultManager] createDirectoryAtURL:url withIntermediateDirectories:YES attributes:nil error:nullptr])
LOG_ERROR("Failed to create directory %@", url);
return url.absoluteURL.path.fileSystemRepresentation;
}
String WebsiteDataStore::websiteDataDirectoryFileSystemRepresentation(const String& directoryName)
{
static dispatch_once_t onceToken;
static NSURL *websiteDataURL;
dispatch_once(&onceToken, ^{
NSURL *url = [[NSFileManager defaultManager] URLForDirectory:NSLibraryDirectory inDomain:NSUserDomainMask appropriateForURL:nullptr create:NO error:nullptr];
if (!url)
RELEASE_ASSERT_NOT_REACHED();
url = [url URLByAppendingPathComponent:@"WebKit" isDirectory:YES];
if (!WebKit::processHasContainer()) {
NSString *bundleIdentifier = [NSBundle mainBundle].bundleIdentifier;
if (!bundleIdentifier)
bundleIdentifier = [NSProcessInfo processInfo].processName;
url = [url URLByAppendingPathComponent:bundleIdentifier isDirectory:YES];
}
websiteDataURL = [[url URLByAppendingPathComponent:@"WebsiteData" isDirectory:YES] retain];
});
NSURL *url = [websiteDataURL URLByAppendingPathComponent:directoryName isDirectory:YES];
if (![[NSFileManager defaultManager] createDirectoryAtURL:url withIntermediateDirectories:YES attributes:nil error:nullptr])
LOG_ERROR("Failed to create directory %@", url);
return url.absoluteURL.path.fileSystemRepresentation;
}
WebKit::WebsiteDataStore::Configuration WebsiteDataStore::defaultDataStoreConfiguration()
{
WebKit::WebsiteDataStore::Configuration configuration;
configuration.applicationCacheDirectory = defaultApplicationCacheDirectory();
configuration.networkCacheDirectory = defaultNetworkCacheDirectory();
configuration.webSQLDatabaseDirectory = defaultWebSQLDatabaseDirectory();
configuration.localStorageDirectory = defaultLocalStorageDirectory();
configuration.mediaKeysStorageDirectory = defaultMediaKeysStorageDirectory();
configuration.resourceLoadStatisticsDirectory = defaultResourceLoadStatisticsDirectory();
return configuration;
}
}