mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
ccc56e1b20
The ServiceWorkerRegistrationInfo's principal is the principal of the document that called register(). If we create WorkerPrivate instances based off of this, they have a valid principal in terms of security and same-origin-ness, but the URI path is wrong. When fetching the script from the network, the channel's principal is used to update the worker principal. We need to do the same when the script is loaded from Cache. This patch adds support to store the channel principal in the cache.
120 lines
3.5 KiB
C++
120 lines
3.5 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "InternalResponse.h"
|
|
|
|
#include "mozilla/dom/InternalHeaders.h"
|
|
#include "mozilla/dom/cache/CacheTypes.h"
|
|
#include "mozilla/ipc/PBackgroundSharedTypes.h"
|
|
#include "nsStreamUtils.h"
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
InternalResponse::InternalResponse(uint16_t aStatus, const nsACString& aStatusText)
|
|
: mType(ResponseType::Default)
|
|
, mStatus(aStatus)
|
|
, mStatusText(aStatusText)
|
|
, mHeaders(new InternalHeaders(HeadersGuardEnum::Response))
|
|
{
|
|
}
|
|
|
|
InternalResponse::~InternalResponse()
|
|
{
|
|
}
|
|
|
|
already_AddRefed<InternalResponse>
|
|
InternalResponse::Clone()
|
|
{
|
|
nsRefPtr<InternalResponse> clone = CreateIncompleteCopy();
|
|
|
|
clone->mHeaders = new InternalHeaders(*mHeaders);
|
|
if (mWrappedResponse) {
|
|
clone->mWrappedResponse = mWrappedResponse->Clone();
|
|
MOZ_ASSERT(!mBody);
|
|
return clone.forget();
|
|
}
|
|
|
|
if (!mBody) {
|
|
return clone.forget();
|
|
}
|
|
|
|
nsCOMPtr<nsIInputStream> clonedBody;
|
|
nsCOMPtr<nsIInputStream> replacementBody;
|
|
|
|
nsresult rv = NS_CloneInputStream(mBody, getter_AddRefs(clonedBody),
|
|
getter_AddRefs(replacementBody));
|
|
if (NS_WARN_IF(NS_FAILED(rv))) { return nullptr; }
|
|
|
|
clone->mBody.swap(clonedBody);
|
|
if (replacementBody) {
|
|
mBody.swap(replacementBody);
|
|
}
|
|
|
|
return clone.forget();
|
|
}
|
|
|
|
already_AddRefed<InternalResponse>
|
|
InternalResponse::BasicResponse()
|
|
{
|
|
MOZ_ASSERT(!mWrappedResponse, "Can't BasicResponse a already wrapped response");
|
|
nsRefPtr<InternalResponse> basic = CreateIncompleteCopy();
|
|
basic->mType = ResponseType::Basic;
|
|
basic->mHeaders = InternalHeaders::BasicHeaders(Headers());
|
|
basic->mWrappedResponse = this;
|
|
return basic.forget();
|
|
}
|
|
|
|
already_AddRefed<InternalResponse>
|
|
InternalResponse::CORSResponse()
|
|
{
|
|
MOZ_ASSERT(!mWrappedResponse, "Can't CORSResponse a already wrapped response");
|
|
nsRefPtr<InternalResponse> cors = CreateIncompleteCopy();
|
|
cors->mType = ResponseType::Cors;
|
|
cors->mHeaders = InternalHeaders::CORSHeaders(Headers());
|
|
cors->mWrappedResponse = this;
|
|
return cors.forget();
|
|
}
|
|
|
|
void
|
|
InternalResponse::SetPrincipalInfo(UniquePtr<mozilla::ipc::PrincipalInfo> aPrincipalInfo)
|
|
{
|
|
mPrincipalInfo = Move(aPrincipalInfo);
|
|
}
|
|
|
|
already_AddRefed<InternalResponse>
|
|
InternalResponse::OpaqueResponse()
|
|
{
|
|
MOZ_ASSERT(!mWrappedResponse, "Can't OpaqueResponse a already wrapped response");
|
|
nsRefPtr<InternalResponse> response = new InternalResponse(0, EmptyCString());
|
|
response->mType = ResponseType::Opaque;
|
|
response->mTerminationReason = mTerminationReason;
|
|
response->mURL = mURL;
|
|
response->mChannelInfo = mChannelInfo;
|
|
if (mPrincipalInfo) {
|
|
response->mPrincipalInfo = MakeUnique<mozilla::ipc::PrincipalInfo>(*mPrincipalInfo);
|
|
}
|
|
response->mWrappedResponse = this;
|
|
return response.forget();
|
|
}
|
|
|
|
already_AddRefed<InternalResponse>
|
|
InternalResponse::CreateIncompleteCopy()
|
|
{
|
|
nsRefPtr<InternalResponse> copy = new InternalResponse(mStatus, mStatusText);
|
|
copy->mType = mType;
|
|
copy->mTerminationReason = mTerminationReason;
|
|
copy->mURL = mURL;
|
|
copy->mChannelInfo = mChannelInfo;
|
|
if (mPrincipalInfo) {
|
|
copy->mPrincipalInfo = MakeUnique<mozilla::ipc::PrincipalInfo>(*mPrincipalInfo);
|
|
}
|
|
return copy.forget();
|
|
}
|
|
|
|
} // namespace dom
|
|
} // namespace mozilla
|