blob: 9c2791139579e0d467c380a523d5515142231ab1 [file] [log] [blame]
/*
* Copyright (C) 2022 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.
*/
#pragma once
#import "config.h"
#import "BundleResourceLoader.h"
#import "HTTPHeaderMap.h"
#import "MIMETypeRegistry.h"
#import "ResourceError.h"
#import "ResourceLoader.h"
#import "ResourceResponse.h"
#import "SharedBuffer.h"
#import <wtf/RunLoop.h>
#import <wtf/WorkQueue.h>
namespace WebCore {
namespace BundleResourceLoader {
static WorkQueue& loadQueue()
{
static auto& queue = WorkQueue::create("org.WebKit.BundleResourceLoader", WorkQueue::QOS::Utility).leakRef();
return queue;
}
void loadResourceFromBundle(ResourceLoader& loader, const String& subdirectory)
{
ASSERT(RunLoop::isMain());
loadQueue().dispatch([protectedLoader = Ref { loader }, url = loader.request().url().isolatedCopy(), subdirectory = subdirectory.isolatedCopy()]() mutable {
auto *relativePath = [subdirectory stringByAppendingString: url.path().toString()];
auto *bundle = [NSBundle bundleWithIdentifier:@"com.apple.WebCore"];
auto *path = [bundle pathForResource:relativePath ofType:nil];
auto *data = [NSData dataWithContentsOfFile:path];
if (!data) {
RunLoop::main().dispatch([protectedLoader = WTFMove(protectedLoader), url = WTFMove(url).isolatedCopy()] {
protectedLoader->didFail(ResourceError { errorDomainWebKitInternal, 0, url, "URL is invalid"_s });
});
return;
}
RunLoop::main().dispatch([protectedLoader = WTFMove(protectedLoader), url = WTFMove(url).isolatedCopy(), buffer = SharedBuffer::create(data)]() mutable {
auto mimeType = MIMETypeRegistry::mimeTypeForPath(url.path());
ResourceResponse response { url, mimeType, static_cast<long long>(buffer->size()), MIMETypeRegistry::isTextMIMEType(mimeType) ? "UTF-8"_s : String() };
response.setHTTPStatusCode(200);
response.setHTTPStatusText("OK"_s);
response.setSource(ResourceResponse::Source::Network);
// Allow images to load.
response.addHTTPHeaderField(HTTPHeaderName::AccessControlAllowOrigin, "*"_s);
protectedLoader->deliverResponseAndData(response, WTFMove(buffer));
});
});
}
}
}