Files
Michael 0371603c24 Copy inline media resources to theme temp folder
The theme temp folder is that which WebkIt2 is granted permission to access. As we cannot grant it access to multiple locations, then this is the immediate solution. The theme temp folder is stored in the Caches folder under its own name.
2025-02-04 18:19:41 -05:00

158 lines
5.3 KiB
Objective-C

/* *********************************************************************
* _____ _ _
* |_ _|____ _| |_ _ _ __ _| |
* | |/ _ \ \/ / __| | | |/ _` | |
* | | __/> <| |_| |_| | (_| | |
* |_|\___/_/\_\\__|\__,_|\__,_|_|
*
* Copyright (c) 2010 - 2018 Codeux Software, LLC & respective contributors.
* Please see Acknowledgements.pdf for additional information.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * 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.
* * Neither the name of Textual, "Codeux Software, LLC", nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND 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 THE AUTHOR OR 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 "TPCPathInfoPrivate.h"
#import "TPCThemeController.h"
#import "ICLPayloadInternal.h"
NS_ASSUME_NONNULL_BEGIN
@implementation ICLPayload (ICLPayloadLocalPrivate)
- (NSString *)_resourcesTemporaryLocation
{
// NSString *sourcePath = [TPCPathInfo applicationTemporaryProcessSpecific];
NSString *sourcePath = themeController().temporaryPath;
NSString *basePath = [sourcePath stringByAppendingPathComponent:@"/ICLPayload-Resources/"];
[TPCPathInfo _createDirectoryAtPath:basePath];
return basePath;
}
/* WebKit2 uses sandboxed processes. We copy the resources files to
the application's temporary folder so that it can access them. */
- (nullable NSArray<NSString *> *)_copyResourcesToTemporaryLocation:(nullable NSArray<NSURL *> *)resources
{
if (resources == nil) {
return nil;
}
NSString *basePath = [self _resourcesTemporaryLocation];
NSString *(^copyOperation)(NSURL *) = ^NSString *(NSURL *resourceURL)
{
if (resourceURL.isFileURL == NO) {
return resourceURL.absoluteString;
}
NSString *resourcePath = resourceURL.relativePath;
NSString *filename =
[NSString stringWithFormat:@"%@.%@",
resourcePath.md5,
resourcePath.pathExtension];
NSString *destinationPath = [basePath stringByAppendingPathComponent:filename];
if ([RZFileManager() fileExistsAtPath:destinationPath]) {
return destinationPath;
}
NSError *copyError;
BOOL copyResult =
[RZFileManager() copyItemAtPath:resourcePath
toPath:destinationPath
error:&copyError];
if (copyResult == NO) {
LogToConsoleError("Copy operation for '%{public}@' failed with error: %{public}@",
resourcePath.standardizedTildePath, copyError.localizedDescription);
}
return destinationPath;
};
NSMutableArray<NSString *> *temporaryResources = [NSMutableArray arrayWithCapacity:resources.count];
for (NSURL *resourceURL in resources) {
@autoreleasepool {
[temporaryResources addObject:copyOperation(resourceURL)];
}
}
return [temporaryResources copy];
}
- (NSDictionary<NSString *, id> *)javaScriptObject
{
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setUnsignedInteger:self->_contentLength forKey:@"contentLength"];
[dic setObject:@{
@"width" : @(self->_contentSize.width),
@"height" : @(self->_contentSize.height)
} forKey:@"contentSize"];
[dic maybeSetObject:[self _copyResourcesToTemporaryLocation:self->_styleResources]
forKey:@"styleResources"];
[dic maybeSetObject:[self _copyResourcesToTemporaryLocation:self->_scriptResources]
forKey:@"scriptResources"];
[dic setObject:self->_html forKey:@"html"];
NSString *entrypoint = self->_entrypoint;
if (entrypoint) {
[dic setObject:entrypoint forKey:@"entrypoint"];
/* call self. instead of self->_ for entrypointPayload to allow
the default values to be assigned to the exported object. */
[dic setObject:self.entrypointPayload forKey:@"entrypointPayload"];
}
[dic setObject:self->_url forKey:@"url"];
[dic setObject:self->_urlToInline forKey:@"urlToInline"];
[dic setObject:self->_lineNumber forKey:@"lineNumber"];
[dic setObject:self->_uniqueIdentifier forKey:@"uniqueIdentifier"];
// [dic setObject:self->_viewIdentifier forKey:@"viewIdentifier"];
[dic setUnsignedInteger:self->_index forKey:@"index"];
return [dic copy];
}
@end
NS_ASSUME_NONNULL_END