Skip to content

Commit

Permalink
Plumb SecurityOriginData from Network requests
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=259904
rdar://problem/113528936

Reviewed by Chris Dumez.

Similar to the previous patches related to partitioning the blob registry, this
patch plumbs the SecurityOriginData associated with the top document when we
are handling a request for a blob.

Most network loads already contained an associated topOrigin, but the challenge
of this patch was making sure we provided the correct origin when loading a
blob URL. In general, that top origin is the same as a normal request, but
there is an edge case where a blob URL is opened in a popup where we actually
need the top origin of the triggering document (and not the top origin of the
popup).

Downloading and System Preview required additional plumbing.

This shouldn't have any behavioral changes. No new tests.

* Source/WebCore/html/HTMLAnchorElement.cpp:
(WebCore::HTMLAnchorElement::handleClick): Needed for supporting system preview

* Source/WebCore/loader/PolicyChecker.cpp:
(WebCore::FrameLoader::PolicyChecker::extendBlobURLLifetimeIfNecessary const):
We need to correct top origin so we can extend the lifetime.

* Source/WebCore/page/ChromeClient.h:
(WebCore::ChromeClient::beginSystemPreview):
* Source/WebCore/page/Page.cpp:
(WebCore::Page::beginSystemPreview):
* Source/WebCore/page/Page.h:
More system preview plumbing

* Source/WebCore/platform/network/BlobRegistryImpl.cpp:
(WebCore::loadBlobResourceSynchronously):
(WebCore::BlobRegistryImpl::createResourceHandle): I believe these are only used
by WebKitLegacy. I wanted to make a note about that.

(WebCore::BlobRegistryImpl::registerBlobURL):
(WebCore::BlobRegistryImpl::registerBlobURLOptionallyFileBacked):
(WebCore::BlobRegistryImpl::getBlobDataFromURL const):
(WebCore::BlobRegistryImpl::filesInBlob const):
(WebCore::BlobRegistryImpl::addBlobData):
* Source/WebCore/platform/network/BlobRegistryImpl.h: General plumbing

* Source/WebKit/NetworkProcess/Downloads/DownloadManager.cpp:
(WebKit::DownloadManager::startDownload):
* Source/WebKit/NetworkProcess/Downloads/DownloadManager.h:
(WebKit::DownloadManager::startDownload):
* Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp:
(WebKit::NetworkConnectionToWebProcess::startDownload):
(WebKit::NetworkConnectionToWebProcess::convertMainResourceLoadToDownload):
* Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h:
(WebKit::NetworkConnectionToWebProcess::startDownload):
* Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in:
Supporting downloads

* Source/WebKit/NetworkProcess/NetworkDataTaskBlob.cpp:
(WebKit::NetworkDataTaskBlob::NetworkDataTaskBlob):
* Source/WebKit/NetworkProcess/NetworkDataTaskBlob.h:
* Source/WebKit/NetworkProcess/NetworkLoad.cpp:
(WebKit::NetworkLoad::NetworkLoad):
* Source/WebKit/NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::downloadRequest):
(WebKit::NetworkProcess::dataTaskWithRequest):
* Source/WebKit/NetworkProcess/NetworkProcess.h:
* Source/WebKit/NetworkProcess/NetworkProcess.messages.in:
* Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp:
(WebKit::NetworkResourceLoader::startNetworkLoad):
(WebKit::NetworkResourceLoader::convertToDownload):
* Source/WebKit/NetworkProcess/NetworkSession.h:
* Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.h:
* Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(WebKit::NetworkSessionCocoa::dataTaskWithRequest):

* Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _dataTaskWithRequest:completionHandler:]): We don't know the
correct top origin for this request, and that affects how we will partition the
registry in a future patch.

* Source/WebKit/UIProcess/Cocoa/SystemPreviewControllerCocoa.mm:
* Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp:
(WebKit::NetworkProcessProxy::dataTaskWithRequest):
* Source/WebKit/UIProcess/Network/NetworkProcessProxy.h:
* Source/WebKit/UIProcess/SystemPreviewController.h:
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::dataTaskWithRequest):
(WebKit::WebPageProxy::beginSystemPreview):
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/UIProcess/WebPageProxy.messages.in:
* Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp:
(WebKit::WebLoaderStrategy::scheduleLoadFromNetworkProcess):
* Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::beginSystemPreview):
* Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h:
* Source/WebKit/WebProcess/WebPage/WebFrame.cpp:
(WebKit::WebFrame::startDownload):
(WebKit::WebFrame::convertMainResourceLoadToDownload):

Canonical link: https://commits.webkit.org/266760@main
  • Loading branch information
sysrqb authored and Matthew Finkel committed Aug 10, 2023
1 parent e3416ac commit 91d984e
Show file tree
Hide file tree
Showing 34 changed files with 97 additions and 74 deletions.
2 changes: 1 addition & 1 deletion Source/WebCore/html/HTMLAnchorElement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -615,7 +615,7 @@ void HTMLAnchorElement::handleClick(Event& event)
systemPreviewInfo.previewRect = child->boundsInRootViewSpace();

if (auto* page = document().page())
page->beginSystemPreview(completedURL, WTFMove(systemPreviewInfo), [keepBlobAlive = URLKeepingBlobAlive(completedURL, document().topOrigin().data())] { });
page->beginSystemPreview(completedURL, document().topOrigin().data(), WTFMove(systemPreviewInfo), [keepBlobAlive = URLKeepingBlobAlive(completedURL, document().topOrigin().data())] { });
return;
}
#endif
Expand Down
4 changes: 3 additions & 1 deletion Source/WebCore/loader/PolicyChecker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,9 @@ URLKeepingBlobAlive FrameLoader::PolicyChecker::extendBlobURLLifetimeIfNecessary
if (mode != PolicyDecisionMode::Asynchronous || !request.url().protocolIsBlob())
return { };

return { request.url(), document.topOrigin().data() };
bool haveTriggeringRequester = m_frame.loader().policyDocumentLoader() && !m_frame.loader().policyDocumentLoader()->triggeringAction().isEmpty() && m_frame.loader().policyDocumentLoader()->triggeringAction().requester();
auto& topOrigin = haveTriggeringRequester ? m_frame.loader().policyDocumentLoader()->triggeringAction().requester()->topOrigin->data() : document.topOrigin().data();
return { request.url(), topOrigin };
}

void FrameLoader::PolicyChecker::checkNavigationPolicy(ResourceRequest&& request, const ResourceResponse& redirectResponse, DocumentLoader* loader, RefPtr<FormState>&& formState, NavigationPolicyDecisionFunction&& function, PolicyDecisionMode policyDecisionMode)
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/page/ChromeClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -639,7 +639,7 @@ class ChromeClient {
#endif

#if USE(SYSTEM_PREVIEW)
virtual void beginSystemPreview(const URL&, const SystemPreviewInfo&, CompletionHandler<void()>&&) { }
virtual void beginSystemPreview(const URL&, const SecurityOriginData&, const SystemPreviewInfo&, CompletionHandler<void()>&&) { }
#endif

virtual void requestCookieConsent(CompletionHandler<void(CookieConsentDecisionResult)>&&) = 0;
Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/page/Page.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4019,9 +4019,9 @@ void Page::abortApplePayAMSUISession(ApplePayAMSUIPaymentHandler& paymentHandler
#endif // ENABLE(APPLE_PAY_AMS_UI)

#if USE(SYSTEM_PREVIEW)
void Page::beginSystemPreview(const URL& url, const SystemPreviewInfo& systemPreviewInfo, CompletionHandler<void()>&& completionHandler)
void Page::beginSystemPreview(const URL& url, const SecurityOriginData& topOrigin, const SystemPreviewInfo& systemPreviewInfo, CompletionHandler<void()>&& completionHandler)
{
chrome().client().beginSystemPreview(url, systemPreviewInfo, WTFMove(completionHandler));
chrome().client().beginSystemPreview(url, topOrigin, systemPreviewInfo, WTFMove(completionHandler));
}
#endif

Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/page/Page.h
Original file line number Diff line number Diff line change
Expand Up @@ -623,7 +623,7 @@ class Page : public Supplementable<Page>, public CanMakeWeakPtr<Page> {
#endif

#if USE(SYSTEM_PREVIEW)
void beginSystemPreview(const URL&, const SystemPreviewInfo&, CompletionHandler<void()>&&);
void beginSystemPreview(const URL&, const SecurityOriginData& topOrigin, const SystemPreviewInfo&, CompletionHandler<void()>&&);
#endif

#if ENABLE(WEB_AUTHN)
Expand Down
22 changes: 12 additions & 10 deletions Source/WebCore/platform/network/BlobRegistryImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ static Ref<ResourceHandle> createBlobResourceHandle(const ResourceRequest& reque

static void loadBlobResourceSynchronously(NetworkingContext*, const ResourceRequest& request, StoredCredentialsPolicy, ResourceError& error, ResourceResponse& response, Vector<uint8_t>& data)
{
// This seems like it is only used from WebKitLegacy, so it does not support blob registry partitioning
auto* blobData = blobRegistry().blobRegistryImpl()->getBlobDataFromURL(request.url());
BlobResourceHandle::loadResourceSynchronously(blobData, request, error, response, data);
}
Expand All @@ -76,6 +77,7 @@ static void registerBlobResourceHandleConstructor()

Ref<ResourceHandle> BlobRegistryImpl::createResourceHandle(const ResourceRequest& request, ResourceHandleClient* client)
{
// This seems like it is only used from WebKitLegacy, so it does not support blob registry partitioning
auto handle = BlobResourceHandle::createAsync(getBlobDataFromURL(request.url()), request, client);
handle->start();
return handle;
Expand Down Expand Up @@ -186,29 +188,29 @@ void BlobRegistryImpl::registerInternalBlobURL(const URL& url, Vector<BlobPart>&
addBlobData(url.string(), WTFMove(blobData));
}

void BlobRegistryImpl::registerBlobURL(const URL& url, const URL& srcURL, const PolicyContainer& policyContainer, const std::optional<SecurityOriginData>&)
void BlobRegistryImpl::registerBlobURL(const URL& url, const URL& srcURL, const PolicyContainer& policyContainer, const std::optional<SecurityOriginData>& topOrigin)
{
registerBlobURLOptionallyFileBacked(url, srcURL, nullptr, { }, policyContainer);
registerBlobURLOptionallyFileBacked(url, srcURL, nullptr, { }, policyContainer, topOrigin);
}

void BlobRegistryImpl::registerInternalBlobURLOptionallyFileBacked(const URL& url, const URL& srcURL, RefPtr<BlobDataFileReference>&& file, const String& contentType, const PolicyContainer& policyContainer)
{
registerBlobURLOptionallyFileBacked(url, srcURL, WTFMove(file), contentType, policyContainer);
}

void BlobRegistryImpl::registerBlobURLOptionallyFileBacked(const URL& url, const URL& srcURL, RefPtr<BlobDataFileReference>&& file, const String& contentType, const PolicyContainer& policyContainer)
void BlobRegistryImpl::registerBlobURLOptionallyFileBacked(const URL& url, const URL& srcURL, RefPtr<BlobDataFileReference>&& file, const String& contentType, const PolicyContainer& policyContainer, const std::optional<SecurityOriginData>& topOrigin)
{
ASSERT(isMainThread());
registerBlobResourceHandleConstructor();

BlobData* src = getBlobDataFromURL(srcURL);
if (src) {
if (src->policyContainer() == policyContainer)
addBlobData(url.string(), src);
addBlobData(url.string(), src, topOrigin);
else {
auto clone = src->clone();
clone->setPolicyContainer(policyContainer);
addBlobData(url.string(), WTFMove(clone));
addBlobData(url.string(), WTFMove(clone), topOrigin);
}
return;
}
Expand All @@ -220,7 +222,7 @@ void BlobRegistryImpl::registerBlobURLOptionallyFileBacked(const URL& url, const
backingFile->appendFile(file.releaseNonNull());
backingFile->setPolicyContainer(policyContainer);

addBlobData(url.string(), WTFMove(backingFile));
addBlobData(url.string(), WTFMove(backingFile), topOrigin);
}

void BlobRegistryImpl::registerInternalBlobURLForSlice(const URL& url, const URL& srcURL, long long start, long long end, const String& contentType)
Expand Down Expand Up @@ -266,7 +268,7 @@ void BlobRegistryImpl::unregisterBlobURL(const URL& url, const std::optional<Web
m_blobs.remove(url.string());
}

BlobData* BlobRegistryImpl::getBlobDataFromURL(const URL& url) const
BlobData* BlobRegistryImpl::getBlobDataFromURL(const URL& url, const std::optional<SecurityOriginData>&) const
{
ASSERT(isMainThread());
if (url.hasFragmentIdentifier())
Expand Down Expand Up @@ -375,9 +377,9 @@ void BlobRegistryImpl::writeBlobsToTemporaryFilesForIndexedDB(const Vector<Strin
});
}

Vector<RefPtr<BlobDataFileReference>> BlobRegistryImpl::filesInBlob(const URL& url) const
Vector<RefPtr<BlobDataFileReference>> BlobRegistryImpl::filesInBlob(const URL& url, const std::optional<SecurityOriginData>& topOrigin) const
{
auto* blobData = getBlobDataFromURL(url);
auto* blobData = getBlobDataFromURL(url, topOrigin);
if (!blobData)
return { };

Expand All @@ -390,7 +392,7 @@ Vector<RefPtr<BlobDataFileReference>> BlobRegistryImpl::filesInBlob(const URL& u
return result;
}

void BlobRegistryImpl::addBlobData(const String& url, RefPtr<BlobData>&& blobData)
void BlobRegistryImpl::addBlobData(const String& url, RefPtr<BlobData>&& blobData, const std::optional<WebCore::SecurityOriginData>&)
{
auto addResult = m_blobs.set(url, WTFMove(blobData));
if (addResult.isNewEntry)
Expand Down
9 changes: 5 additions & 4 deletions Source/WebCore/platform/network/BlobRegistryImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@

#include "BlobData.h"
#include "BlobRegistry.h"
#include "SecurityOriginData.h"
#include <wtf/HashCountedSet.h>
#include <wtf/RobinHoodHashMap.h>
#include <wtf/URLHash.h>
Expand All @@ -53,7 +54,7 @@ class WEBCORE_EXPORT BlobRegistryImpl {
public:
virtual ~BlobRegistryImpl();

BlobData* getBlobDataFromURL(const URL&) const;
BlobData* getBlobDataFromURL(const URL&, const std::optional<SecurityOriginData>& topOrigin = std::nullopt) const;

Ref<ResourceHandle> createResourceHandle(const ResourceRequest&, ResourceHandleClient*);

Expand All @@ -79,14 +80,14 @@ class WEBCORE_EXPORT BlobRegistryImpl {
};

bool populateBlobsForFileWriting(const Vector<String>& blobURLs, Vector<BlobForFileWriting>&);
Vector<RefPtr<BlobDataFileReference>> filesInBlob(const URL&) const;
Vector<RefPtr<BlobDataFileReference>> filesInBlob(const URL&, const std::optional<WebCore::SecurityOriginData>& topOrigin = std::nullopt) const;

void setFileDirectory(String&&);
void setPartitioningEnabled(bool enabled) { m_isPartitioningEnabled = enabled; }

private:
void registerBlobURLOptionallyFileBacked(const URL&, const URL& srcURL, RefPtr<BlobDataFileReference>&&, const String& contentType, const PolicyContainer&);
void addBlobData(const String& url, RefPtr<BlobData>&&);
void registerBlobURLOptionallyFileBacked(const URL&, const URL& srcURL, RefPtr<BlobDataFileReference>&&, const String& contentType, const PolicyContainer&, const std::optional<SecurityOriginData>& topOrigin = std::nullopt);
void addBlobData(const String& url, RefPtr<BlobData>&&, const std::optional<WebCore::SecurityOriginData>& topOrigin = std::nullopt);
Ref<DataSegment> createDataSegment(Vector<uint8_t>&&, BlobData&);

HashCountedSet<String> m_blobReferences;
Expand Down
8 changes: 5 additions & 3 deletions Source/WebKit/NetworkProcess/Downloads/DownloadManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ DownloadManager::DownloadManager(Client& client)
{
}

void DownloadManager::startDownload(PAL::SessionID sessionID, DownloadID downloadID, const ResourceRequest& request, std::optional<NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain, const String& suggestedName)
void DownloadManager::startDownload(PAL::SessionID sessionID, DownloadID downloadID, const ResourceRequest& request, const std::optional<WebCore::SecurityOriginData>& topOrigin, std::optional<NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain, const String& suggestedName)
{
auto* networkSession = client().networkSession(sessionID);
if (!networkSession)
Expand All @@ -55,8 +55,10 @@ void DownloadManager::startDownload(PAL::SessionID sessionID, DownloadID downloa
parameters.request = request;
parameters.clientCredentialPolicy = ClientCredentialPolicy::MayAskClientForCredentials;
parameters.isNavigatingToAppBoundDomain = isNavigatingToAppBoundDomain;
if (request.url().protocolIsBlob())
parameters.blobFileReferences = client().networkSession(sessionID)->blobRegistry().filesInBlob(request.url());
if (request.url().protocolIsBlob()) {
parameters.topOrigin = topOrigin ? topOrigin->securityOrigin().ptr() : nullptr;
parameters.blobFileReferences = client().networkSession(sessionID)->blobRegistry().filesInBlob(request.url(), topOrigin);
}
parameters.storedCredentialsPolicy = sessionID.isEphemeral() ? StoredCredentialsPolicy::DoNotUse : StoredCredentialsPolicy::Use;

m_pendingDownloads.add(downloadID, makeUnique<PendingDownload>(m_client.parentProcessConnectionForDownloads(), WTFMove(parameters), downloadID, *networkSession, suggestedName));
Expand Down
2 changes: 1 addition & 1 deletion Source/WebKit/NetworkProcess/Downloads/DownloadManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ class DownloadManager {

explicit DownloadManager(Client&);

void startDownload(PAL::SessionID, DownloadID, const WebCore::ResourceRequest&, std::optional<NavigatingToAppBoundDomain>, const String& suggestedName = { });
void startDownload(PAL::SessionID, DownloadID, const WebCore::ResourceRequest&, const std::optional<WebCore::SecurityOriginData>& topOrigin, std::optional<NavigatingToAppBoundDomain>, const String& suggestedName = { });
void dataTaskBecameDownloadTask(DownloadID, std::unique_ptr<Download>&&);
void convertNetworkLoadToDownload(DownloadID, std::unique_ptr<NetworkLoad>&&, ResponseCompletionHandler&&, Vector<RefPtr<WebCore::BlobDataFileReference>>&&, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&);
void downloadDestinationDecided(DownloadID, Ref<NetworkDataTask>&&);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -751,17 +751,17 @@ NetworkStorageSession* NetworkConnectionToWebProcess::storageSession()
return networkProcess().storageSession(m_sessionID);
}

void NetworkConnectionToWebProcess::startDownload(DownloadID downloadID, const ResourceRequest& request, std::optional<NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain, const String& suggestedName)
void NetworkConnectionToWebProcess::startDownload(DownloadID downloadID, const ResourceRequest& request, const std::optional<WebCore::SecurityOriginData>& topOrigin, std::optional<NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain, const String& suggestedName)
{
m_networkProcess->downloadManager().startDownload(m_sessionID, downloadID, request, isNavigatingToAppBoundDomain, suggestedName);
m_networkProcess->downloadManager().startDownload(m_sessionID, downloadID, request, topOrigin, isNavigatingToAppBoundDomain, suggestedName);
}

void NetworkConnectionToWebProcess::convertMainResourceLoadToDownload(std::optional<WebCore::ResourceLoaderIdentifier> mainResourceLoadIdentifier, DownloadID downloadID, const ResourceRequest& request, const ResourceResponse& response, std::optional<NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain)
void NetworkConnectionToWebProcess::convertMainResourceLoadToDownload(std::optional<WebCore::ResourceLoaderIdentifier> mainResourceLoadIdentifier, DownloadID downloadID, const ResourceRequest& request, const std::optional<WebCore::SecurityOriginData>& topOrigin, const ResourceResponse& response, std::optional<NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain)
{
RELEASE_ASSERT(RunLoop::isMain());

if (!mainResourceLoadIdentifier) {
m_networkProcess->downloadManager().startDownload(m_sessionID, downloadID, request, isNavigatingToAppBoundDomain);
m_networkProcess->downloadManager().startDownload(m_sessionID, downloadID, request, topOrigin, isNavigatingToAppBoundDomain);
return;
}

Expand Down
4 changes: 2 additions & 2 deletions Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h
Original file line number Diff line number Diff line change
Expand Up @@ -249,8 +249,8 @@ class NetworkConnectionToWebProcess
void pageLoadCompleted(WebCore::PageIdentifier);
void browsingContextRemoved(WebPageProxyIdentifier, WebCore::PageIdentifier, WebCore::FrameIdentifier);
void crossOriginRedirectReceived(WebCore::ResourceLoaderIdentifier, const URL& redirectURL);
void startDownload(DownloadID, const WebCore::ResourceRequest&, std::optional<NavigatingToAppBoundDomain>, const String& suggestedName = { });
void convertMainResourceLoadToDownload(std::optional<WebCore::ResourceLoaderIdentifier> mainResourceLoadIdentifier, DownloadID, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, std::optional<NavigatingToAppBoundDomain>);
void startDownload(DownloadID, const WebCore::ResourceRequest&, const std::optional<WebCore::SecurityOriginData>& topOrigin, std::optional<NavigatingToAppBoundDomain>, const String& suggestedName = { });
void convertMainResourceLoadToDownload(std::optional<WebCore::ResourceLoaderIdentifier> mainResourceLoadIdentifier, DownloadID, const WebCore::ResourceRequest&, const std::optional<WebCore::SecurityOriginData>& topOrigin, const WebCore::ResourceResponse&, std::optional<NavigatingToAppBoundDomain>);

void registerURLSchemesAsCORSEnabled(Vector<String>&& schemes);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ messages -> NetworkConnectionToWebProcess LegacyReceiver {
PreconnectTo(std::optional<WebCore::ResourceLoaderIdentifier> preconnectionIdentifier, WebKit::NetworkResourceLoadParameters loadParameters);
IsResourceLoadFinished(WebCore::ResourceLoaderIdentifier resourceLoadIdentifier) -> (bool isFinished)

StartDownload(WebKit::DownloadID downloadID, WebCore::ResourceRequest request, std::optional<WebKit::NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain, String suggestedName)
ConvertMainResourceLoadToDownload(std::optional<WebCore::ResourceLoaderIdentifier> mainResourceLoadIdentifier, WebKit::DownloadID downloadID, WebCore::ResourceRequest request, WebCore::ResourceResponse response, std::optional<WebKit::NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain)
StartDownload(WebKit::DownloadID downloadID, WebCore::ResourceRequest request, std::optional<WebCore::SecurityOriginData> topOrigin, std::optional<WebKit::NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain, String suggestedName)
ConvertMainResourceLoadToDownload(std::optional<WebCore::ResourceLoaderIdentifier> mainResourceLoadIdentifier, WebKit::DownloadID downloadID, WebCore::ResourceRequest request, std::optional<WebCore::SecurityOriginData> topOrigin, WebCore::ResourceResponse response, std::optional<WebKit::NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain)

CookiesForDOM(URL firstParty, struct WebCore::SameSiteInfo sameSiteInfo, URL url, WebCore::FrameIdentifier frameID, WebCore::PageIdentifier pageID, enum:bool WebCore::IncludeSecureCookies includeSecureCookies, enum:bool WebCore::ApplyTrackingPrevention applyTrackingPrevention, enum:bool WebCore::ShouldRelaxThirdPartyCookieBlocking shouldRelaxThirdPartyCookieBlocking) -> (String cookieString, bool didAccessSecureCookies) Synchronous
SetCookiesFromDOM(URL firstParty, struct WebCore::SameSiteInfo sameSiteInfo, URL url, WebCore::FrameIdentifier frameID, WebCore::PageIdentifier pageID, enum:bool WebCore::ApplyTrackingPrevention applyTrackingPrevention, String cookieString, enum:bool WebCore::ShouldRelaxThirdPartyCookieBlocking shouldRelaxThirdPartyCookieBlocking)
Expand Down
11 changes: 9 additions & 2 deletions Source/WebKit/NetworkProcess/NetworkDataTaskBlob.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ static constexpr auto httpPartialContentText = "Partial Content"_s;

static constexpr auto webKitBlobResourceDomain = "WebKitBlobResource"_s;

NetworkDataTaskBlob::NetworkDataTaskBlob(NetworkSession& session, NetworkDataTaskClient& client, const ResourceRequest& request, const Vector<RefPtr<WebCore::BlobDataFileReference>>& fileReferences)
NetworkDataTaskBlob::NetworkDataTaskBlob(NetworkSession& session, NetworkDataTaskClient& client, const ResourceRequest& request, const Vector<RefPtr<WebCore::BlobDataFileReference>>& fileReferences, const RefPtr<SecurityOrigin>& topOrigin)
: NetworkDataTask(session, client, request, StoredCredentialsPolicy::DoNotUse, false, false)
, m_stream(makeUnique<AsyncFileStream>(*this))
, m_fileReferences(fileReferences)
Expand All @@ -71,7 +71,14 @@ NetworkDataTaskBlob::NetworkDataTaskBlob(NetworkSession& session, NetworkDataTas
for (auto& fileReference : m_fileReferences)
fileReference->prepareForFileAccess();

m_blobData = session.blobRegistry().getBlobDataFromURL(request.url());
// We use request.firstPartyForCookies() to indicate if the request originated from the DOM or WebView API.
ASSERT(topOrigin || request.firstPartyForCookies().isEmpty());
std::optional<SecurityOriginData> topOriginData = topOrigin ? std::optional { topOrigin->data() } : std::nullopt;
if (!topOriginData && !request.firstPartyForCookies().isEmpty() && request.firstPartyForCookies().isValid()) {
RELEASE_LOG(Network, "Got request for blob without topOrigin but request specifies firstPartyForCookies");
topOriginData = SecurityOriginData::fromURLWithoutStrictOpaqueness(request.firstPartyForCookies());
}
m_blobData = session.blobRegistry().getBlobDataFromURL(request.url(), topOriginData);

LOG(NetworkSession, "%p - Created NetworkDataTaskBlob for %s", this, request.url().string().utf8().data());
}
Expand Down
Loading

0 comments on commit 91d984e

Please sign in to comment.