blob: 4fee6c7d1ab191b4f45427d7328a264ec83c8b98 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "platform/mojo/FetchAPIRequestStructTraits.h"
#include "mojo/public/cpp/bindings/map_traits_wtf_hash_map.h"
#include "mojo/public/cpp/bindings/string_traits_wtf.h"
#include "platform/blob/BlobData.h"
#include "platform/mojo/KURLStructTraits.h"
#include "platform/mojo/ReferrerStructTraits.h"
#include "platform/weborigin/Referrer.h"
#include "public/platform/WebReferrerPolicy.h"
namespace mojo {
namespace {
// Struct traits context for the FetchAPIRequest type. Since getters are invoked
// twice when serializing the type, this reduces the load for heavy members.
struct FetchAPIRequestStructTraitsContext {
FetchAPIRequestStructTraitsContext() = default;
~FetchAPIRequestStructTraitsContext() = default;
WTF::HashMap<WTF::String, WTF::String> headers;
};
} // namespace
using blink::mojom::FetchCredentialsMode;
using blink::mojom::FetchRedirectMode;
using blink::mojom::FetchRequestMode;
using blink::mojom::RequestContextFrameType;
using blink::mojom::RequestContextType;
FetchCredentialsMode
EnumTraits<FetchCredentialsMode, blink::WebURLRequest::FetchCredentialsMode>::
ToMojom(blink::WebURLRequest::FetchCredentialsMode input) {
switch (input) {
case blink::WebURLRequest::kFetchCredentialsModeOmit:
return FetchCredentialsMode::OMIT;
case blink::WebURLRequest::kFetchCredentialsModeSameOrigin:
return FetchCredentialsMode::SAME_ORIGIN;
case blink::WebURLRequest::kFetchCredentialsModeInclude:
return FetchCredentialsMode::INCLUDE;
case blink::WebURLRequest::kFetchCredentialsModePassword:
return FetchCredentialsMode::PASSWORD;
}
NOTREACHED();
return FetchCredentialsMode::OMIT;
}
bool EnumTraits<FetchCredentialsMode,
blink::WebURLRequest::FetchCredentialsMode>::
FromMojom(FetchCredentialsMode input,
blink::WebURLRequest::FetchCredentialsMode* out) {
switch (input) {
case FetchCredentialsMode::OMIT:
*out = blink::WebURLRequest::kFetchCredentialsModeOmit;
return true;
case FetchCredentialsMode::SAME_ORIGIN:
*out = blink::WebURLRequest::kFetchCredentialsModeSameOrigin;
return true;
case FetchCredentialsMode::INCLUDE:
*out = blink::WebURLRequest::kFetchCredentialsModeInclude;
return true;
case FetchCredentialsMode::PASSWORD:
*out = blink::WebURLRequest::kFetchCredentialsModePassword;
return true;
}
return false;
}
FetchRedirectMode
EnumTraits<FetchRedirectMode, blink::WebURLRequest::FetchRedirectMode>::ToMojom(
blink::WebURLRequest::FetchRedirectMode input) {
switch (input) {
case blink::WebURLRequest::kFetchRedirectModeFollow:
return FetchRedirectMode::FOLLOW;
case blink::WebURLRequest::kFetchRedirectModeError:
return FetchRedirectMode::ERROR_MODE;
case blink::WebURLRequest::kFetchRedirectModeManual:
return FetchRedirectMode::MANUAL;
}
NOTREACHED();
return FetchRedirectMode::ERROR_MODE;
}
bool EnumTraits<FetchRedirectMode, blink::WebURLRequest::FetchRedirectMode>::
FromMojom(FetchRedirectMode input,
blink::WebURLRequest::FetchRedirectMode* out) {
switch (input) {
case FetchRedirectMode::FOLLOW:
*out = blink::WebURLRequest::kFetchRedirectModeFollow;
return true;
case FetchRedirectMode::ERROR_MODE:
*out = blink::WebURLRequest::kFetchRedirectModeError;
return true;
case FetchRedirectMode::MANUAL:
*out = blink::WebURLRequest::kFetchRedirectModeManual;
return true;
}
return false;
}
FetchRequestMode
EnumTraits<FetchRequestMode, blink::WebURLRequest::FetchRequestMode>::ToMojom(
blink::WebURLRequest::FetchRequestMode input) {
switch (input) {
case blink::WebURLRequest::kFetchRequestModeSameOrigin:
return FetchRequestMode::SAME_ORIGIN;
case blink::WebURLRequest::kFetchRequestModeNoCORS:
return FetchRequestMode::NO_CORS;
case blink::WebURLRequest::kFetchRequestModeCORS:
return FetchRequestMode::CORS;
case blink::WebURLRequest::kFetchRequestModeCORSWithForcedPreflight:
return FetchRequestMode::CORS_WITH_FORCED_PREFLIGHT;
case blink::WebURLRequest::kFetchRequestModeNavigate:
return FetchRequestMode::NAVIGATE;
}
NOTREACHED();
return FetchRequestMode::NO_CORS;
}
bool EnumTraits<FetchRequestMode, blink::WebURLRequest::FetchRequestMode>::
FromMojom(FetchRequestMode input,
blink::WebURLRequest::FetchRequestMode* out) {
switch (input) {
case FetchRequestMode::SAME_ORIGIN:
*out = blink::WebURLRequest::kFetchRequestModeSameOrigin;
return true;
case FetchRequestMode::NO_CORS:
*out = blink::WebURLRequest::kFetchRequestModeNoCORS;
return true;
case FetchRequestMode::CORS:
*out = blink::WebURLRequest::kFetchRequestModeCORS;
return true;
case FetchRequestMode::CORS_WITH_FORCED_PREFLIGHT:
*out = blink::WebURLRequest::kFetchRequestModeCORSWithForcedPreflight;
return true;
case FetchRequestMode::NAVIGATE:
*out = blink::WebURLRequest::kFetchRequestModeNavigate;
return true;
}
return false;
}
RequestContextFrameType
EnumTraits<RequestContextFrameType, blink::WebURLRequest::FrameType>::ToMojom(
blink::WebURLRequest::FrameType input) {
switch (input) {
case blink::WebURLRequest::kFrameTypeAuxiliary:
return RequestContextFrameType::AUXILIARY;
case blink::WebURLRequest::kFrameTypeNested:
return RequestContextFrameType::NESTED;
case blink::WebURLRequest::kFrameTypeNone:
return RequestContextFrameType::NONE;
case blink::WebURLRequest::kFrameTypeTopLevel:
return RequestContextFrameType::TOP_LEVEL;
}
NOTREACHED();
return RequestContextFrameType::NONE;
}
bool EnumTraits<RequestContextFrameType, blink::WebURLRequest::FrameType>::
FromMojom(RequestContextFrameType input,
blink::WebURLRequest::FrameType* out) {
switch (input) {
case RequestContextFrameType::AUXILIARY:
*out = blink::WebURLRequest::kFrameTypeAuxiliary;
return true;
case RequestContextFrameType::NESTED:
*out = blink::WebURLRequest::kFrameTypeNested;
return true;
case RequestContextFrameType::NONE:
*out = blink::WebURLRequest::kFrameTypeNone;
return true;
case RequestContextFrameType::TOP_LEVEL:
*out = blink::WebURLRequest::kFrameTypeTopLevel;
return true;
}
return false;
}
RequestContextType
EnumTraits<RequestContextType, blink::WebURLRequest::RequestContext>::ToMojom(
blink::WebURLRequest::RequestContext input) {
switch (input) {
case blink::WebURLRequest::kRequestContextUnspecified:
return RequestContextType::UNSPECIFIED;
case blink::WebURLRequest::kRequestContextAudio:
return RequestContextType::AUDIO;
case blink::WebURLRequest::kRequestContextBeacon:
return RequestContextType::BEACON;
case blink::WebURLRequest::kRequestContextCSPReport:
return RequestContextType::CSP_REPORT;
case blink::WebURLRequest::kRequestContextDownload:
return RequestContextType::DOWNLOAD;
case blink::WebURLRequest::kRequestContextEmbed:
return RequestContextType::EMBED;
case blink::WebURLRequest::kRequestContextEventSource:
return RequestContextType::EVENT_SOURCE;
case blink::WebURLRequest::kRequestContextFavicon:
return RequestContextType::FAVICON;
case blink::WebURLRequest::kRequestContextFetch:
return RequestContextType::FETCH;
case blink::WebURLRequest::kRequestContextFont:
return RequestContextType::FONT;
case blink::WebURLRequest::kRequestContextForm:
return RequestContextType::FORM;
case blink::WebURLRequest::kRequestContextFrame:
return RequestContextType::FRAME;
case blink::WebURLRequest::kRequestContextHyperlink:
return RequestContextType::HYPERLINK;
case blink::WebURLRequest::kRequestContextIframe:
return RequestContextType::IFRAME;
case blink::WebURLRequest::kRequestContextImage:
return RequestContextType::IMAGE;
case blink::WebURLRequest::kRequestContextImageSet:
return RequestContextType::IMAGE_SET;
case blink::WebURLRequest::kRequestContextImport:
return RequestContextType::IMPORT;
case blink::WebURLRequest::kRequestContextInternal:
return RequestContextType::INTERNAL;
case blink::WebURLRequest::kRequestContextLocation:
return RequestContextType::LOCATION;
case blink::WebURLRequest::kRequestContextManifest:
return RequestContextType::MANIFEST;
case blink::WebURLRequest::kRequestContextObject:
return RequestContextType::OBJECT;
case blink::WebURLRequest::kRequestContextPing:
return RequestContextType::PING;
case blink::WebURLRequest::kRequestContextPlugin:
return RequestContextType::PLUGIN;
case blink::WebURLRequest::kRequestContextPrefetch:
return RequestContextType::PREFETCH;
case blink::WebURLRequest::kRequestContextScript:
return RequestContextType::SCRIPT;
case blink::WebURLRequest::kRequestContextServiceWorker:
return RequestContextType::SERVICE_WORKER;
case blink::WebURLRequest::kRequestContextSharedWorker:
return RequestContextType::SHARED_WORKER;
case blink::WebURLRequest::kRequestContextSubresource:
return RequestContextType::SUBRESOURCE;
case blink::WebURLRequest::kRequestContextStyle:
return RequestContextType::STYLE;
case blink::WebURLRequest::kRequestContextTrack:
return RequestContextType::TRACK;
case blink::WebURLRequest::kRequestContextVideo:
return RequestContextType::VIDEO;
case blink::WebURLRequest::kRequestContextWorker:
return RequestContextType::WORKER;
case blink::WebURLRequest::kRequestContextXMLHttpRequest:
return RequestContextType::XML_HTTP_REQUEST;
case blink::WebURLRequest::kRequestContextXSLT:
return RequestContextType::XSLT;
}
NOTREACHED();
return RequestContextType::UNSPECIFIED;
}
bool EnumTraits<RequestContextType, blink::WebURLRequest::RequestContext>::
FromMojom(RequestContextType input,
blink::WebURLRequest::RequestContext* out) {
switch (input) {
case RequestContextType::UNSPECIFIED:
*out = blink::WebURLRequest::kRequestContextUnspecified;
return true;
case RequestContextType::AUDIO:
*out = blink::WebURLRequest::kRequestContextAudio;
return true;
case RequestContextType::BEACON:
*out = blink::WebURLRequest::kRequestContextBeacon;
return true;
case RequestContextType::CSP_REPORT:
*out = blink::WebURLRequest::kRequestContextCSPReport;
return true;
case RequestContextType::DOWNLOAD:
*out = blink::WebURLRequest::kRequestContextDownload;
return true;
case RequestContextType::EMBED:
*out = blink::WebURLRequest::kRequestContextEmbed;
return true;
case RequestContextType::EVENT_SOURCE:
*out = blink::WebURLRequest::kRequestContextEventSource;
return true;
case RequestContextType::FAVICON:
*out = blink::WebURLRequest::kRequestContextFavicon;
return true;
case RequestContextType::FETCH:
*out = blink::WebURLRequest::kRequestContextFetch;
return true;
case RequestContextType::FONT:
*out = blink::WebURLRequest::kRequestContextFont;
return true;
case RequestContextType::FORM:
*out = blink::WebURLRequest::kRequestContextForm;
return true;
case RequestContextType::FRAME:
*out = blink::WebURLRequest::kRequestContextFrame;
return true;
case RequestContextType::HYPERLINK:
*out = blink::WebURLRequest::kRequestContextHyperlink;
return true;
case RequestContextType::IFRAME:
*out = blink::WebURLRequest::kRequestContextIframe;
return true;
case RequestContextType::IMAGE:
*out = blink::WebURLRequest::kRequestContextImage;
return true;
case RequestContextType::IMAGE_SET:
*out = blink::WebURLRequest::kRequestContextImageSet;
return true;
case RequestContextType::IMPORT:
*out = blink::WebURLRequest::kRequestContextImport;
return true;
case RequestContextType::INTERNAL:
*out = blink::WebURLRequest::kRequestContextInternal;
return true;
case RequestContextType::LOCATION:
*out = blink::WebURLRequest::kRequestContextLocation;
return true;
case RequestContextType::MANIFEST:
*out = blink::WebURLRequest::kRequestContextManifest;
return true;
case RequestContextType::OBJECT:
*out = blink::WebURLRequest::kRequestContextObject;
return true;
case RequestContextType::PING:
*out = blink::WebURLRequest::kRequestContextPing;
return true;
case RequestContextType::PLUGIN:
*out = blink::WebURLRequest::kRequestContextPlugin;
return true;
case RequestContextType::PREFETCH:
*out = blink::WebURLRequest::kRequestContextPrefetch;
return true;
case RequestContextType::SCRIPT:
*out = blink::WebURLRequest::kRequestContextScript;
return true;
case RequestContextType::SERVICE_WORKER:
*out = blink::WebURLRequest::kRequestContextServiceWorker;
return true;
case RequestContextType::SHARED_WORKER:
*out = blink::WebURLRequest::kRequestContextSharedWorker;
return true;
case RequestContextType::SUBRESOURCE:
*out = blink::WebURLRequest::kRequestContextSubresource;
return true;
case RequestContextType::STYLE:
*out = blink::WebURLRequest::kRequestContextStyle;
return true;
case RequestContextType::TRACK:
*out = blink::WebURLRequest::kRequestContextTrack;
return true;
case RequestContextType::VIDEO:
*out = blink::WebURLRequest::kRequestContextVideo;
return true;
case RequestContextType::WORKER:
*out = blink::WebURLRequest::kRequestContextWorker;
return true;
case RequestContextType::XML_HTTP_REQUEST:
*out = blink::WebURLRequest::kRequestContextXMLHttpRequest;
return true;
case RequestContextType::XSLT:
*out = blink::WebURLRequest::kRequestContextXSLT;
return true;
}
return false;
}
// static
void* StructTraits<blink::mojom::FetchAPIRequestDataView,
blink::WebServiceWorkerRequest>::
SetUpContext(const blink::WebServiceWorkerRequest& request) {
FetchAPIRequestStructTraitsContext* context =
new FetchAPIRequestStructTraitsContext();
for (const auto& pair : request.Headers())
context->headers.insert(pair.key, pair.value);
return context;
}
// static
void StructTraits<blink::mojom::FetchAPIRequestDataView,
blink::WebServiceWorkerRequest>::
TearDownContext(const blink::WebServiceWorkerRequest& request,
void* context) {
delete static_cast<FetchAPIRequestStructTraitsContext*>(context);
}
// static
blink::KURL StructTraits<blink::mojom::FetchAPIRequestDataView,
blink::WebServiceWorkerRequest>::
url(const blink::WebServiceWorkerRequest& request) {
return request.Url();
}
// static
WTF::String StructTraits<blink::mojom::FetchAPIRequestDataView,
blink::WebServiceWorkerRequest>::
method(const blink::WebServiceWorkerRequest& request) {
return request.Method();
}
// static
const WTF::HashMap<WTF::String, WTF::String>&
StructTraits<blink::mojom::FetchAPIRequestDataView,
blink::WebServiceWorkerRequest>::
headers(const blink::WebServiceWorkerRequest& request, void* context) {
DCHECK(context);
return static_cast<FetchAPIRequestStructTraitsContext*>(context)->headers;
}
// static
const blink::Referrer& StructTraits<blink::mojom::FetchAPIRequestDataView,
blink::WebServiceWorkerRequest>::
referrer(const blink::WebServiceWorkerRequest& request) {
return request.GetReferrer();
}
// static
WTF::String StructTraits<blink::mojom::FetchAPIRequestDataView,
blink::WebServiceWorkerRequest>::
blob_uuid(const blink::WebServiceWorkerRequest& request) {
if (request.GetBlobDataHandle())
return request.GetBlobDataHandle()->Uuid();
return WTF::String();
}
// static
uint64_t StructTraits<blink::mojom::FetchAPIRequestDataView,
blink::WebServiceWorkerRequest>::
blob_size(const blink::WebServiceWorkerRequest& request) {
if (request.GetBlobDataHandle())
return request.GetBlobDataHandle()->size();
return 0;
}
// static
WTF::String StructTraits<blink::mojom::FetchAPIRequestDataView,
blink::WebServiceWorkerRequest>::
integrity(const blink::WebServiceWorkerRequest& request) {
return request.Integrity();
}
// static
WTF::String StructTraits<blink::mojom::FetchAPIRequestDataView,
blink::WebServiceWorkerRequest>::
client_id(const blink::WebServiceWorkerRequest& request) {
return request.ClientId();
}
// static
bool StructTraits<blink::mojom::FetchAPIRequestDataView,
blink::WebServiceWorkerRequest>::
Read(blink::mojom::FetchAPIRequestDataView data,
blink::WebServiceWorkerRequest* out) {
blink::WebURLRequest::FetchRequestMode mode;
blink::WebURLRequest::RequestContext requestContext;
blink::WebURLRequest::FrameType frameType;
blink::KURL url;
WTF::String method;
WTF::HashMap<WTF::String, WTF::String> headers;
WTF::String blobUuid;
blink::Referrer referrer;
blink::WebURLRequest::FetchCredentialsMode credentialsMode;
blink::WebURLRequest::FetchRedirectMode redirectMode;
WTF::String integrity;
WTF::String clientId;
if (!data.ReadMode(&mode) || !data.ReadRequestContextType(&requestContext) ||
!data.ReadFrameType(&frameType) || !data.ReadUrl(&url) ||
!data.ReadMethod(&method) || !data.ReadHeaders(&headers) ||
!data.ReadBlobUuid(&blobUuid) || !data.ReadReferrer(&referrer) ||
!data.ReadCredentialsMode(&credentialsMode) ||
!data.ReadRedirectMode(&redirectMode) || !data.ReadClientId(&clientId) ||
!data.ReadIntegrity(&integrity)) {
return false;
}
out->SetMode(mode);
out->SetIsMainResourceLoad(data.is_main_resource_load());
out->SetRequestContext(requestContext);
out->SetFrameType(frameType);
out->SetURL(url);
out->SetMethod(method);
for (const auto& pair : headers)
out->SetHeader(pair.key, pair.value);
out->SetBlob(blobUuid, static_cast<long long>(data.blob_size()));
out->SetReferrer(referrer.referrer, static_cast<blink::WebReferrerPolicy>(
referrer.referrer_policy));
out->SetCredentialsMode(credentialsMode);
out->SetRedirectMode(redirectMode);
out->SetIntegrity(integrity);
out->SetClientId(clientId);
out->SetIsReload(data.is_reload());
return true;
}
} // namespace mojo