Chromium Code Reviews| Index: third_party/WebKit/Source/platform/mojo/FetchAPIRequestStructTraits.cpp | 
| diff --git a/third_party/WebKit/Source/platform/mojo/FetchAPIRequestStructTraits.cpp b/third_party/WebKit/Source/platform/mojo/FetchAPIRequestStructTraits.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..796dd0a85ba214c057b67cf4a7aad901e9802cb8 | 
| --- /dev/null | 
| +++ b/third_party/WebKit/Source/platform/mojo/FetchAPIRequestStructTraits.cpp | 
| @@ -0,0 +1,503 @@ | 
| +// 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::FetchCredentialsModeOmit: | 
| + return FetchCredentialsMode::OMIT; | 
| + case blink::WebURLRequest::FetchCredentialsModeSameOrigin: | 
| + return FetchCredentialsMode::SAME_ORIGIN; | 
| + case blink::WebURLRequest::FetchCredentialsModeInclude: | 
| + return FetchCredentialsMode::INCLUDE; | 
| + case blink::WebURLRequest::FetchCredentialsModePassword: | 
| + 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::FetchCredentialsModeOmit; | 
| + return true; | 
| + case FetchCredentialsMode::SAME_ORIGIN: | 
| + *out = blink::WebURLRequest::FetchCredentialsModeSameOrigin; | 
| + return true; | 
| + case FetchCredentialsMode::INCLUDE: | 
| + *out = blink::WebURLRequest::FetchCredentialsModeInclude; | 
| + return true; | 
| + case FetchCredentialsMode::PASSWORD: | 
| + *out = blink::WebURLRequest::FetchCredentialsModePassword; | 
| + return true; | 
| + } | 
| + | 
| + return false; | 
| +} | 
| + | 
| +FetchRedirectMode | 
| +EnumTraits<FetchRedirectMode, blink::WebURLRequest::FetchRedirectMode>::ToMojom( | 
| + blink::WebURLRequest::FetchRedirectMode input) { | 
| + switch (input) { | 
| + case blink::WebURLRequest::FetchRedirectModeFollow: | 
| + return FetchRedirectMode::FOLLOW; | 
| + case blink::WebURLRequest::FetchRedirectModeError: | 
| + return FetchRedirectMode::ERROR; | 
| + case blink::WebURLRequest::FetchRedirectModeManual: | 
| + return FetchRedirectMode::MANUAL; | 
| + } | 
| + | 
| + NOTREACHED(); | 
| + return FetchRedirectMode::ERROR; | 
| +} | 
| + | 
| +bool EnumTraits<FetchRedirectMode, blink::WebURLRequest::FetchRedirectMode>:: | 
| + FromMojom(FetchRedirectMode input, | 
| + blink::WebURLRequest::FetchRedirectMode* out) { | 
| + switch (input) { | 
| + case FetchRedirectMode::FOLLOW: | 
| + *out = blink::WebURLRequest::FetchRedirectModeFollow; | 
| + return true; | 
| + case FetchRedirectMode::ERROR: | 
| + *out = blink::WebURLRequest::FetchRedirectModeError; | 
| + return true; | 
| + case FetchRedirectMode::MANUAL: | 
| + *out = blink::WebURLRequest::FetchRedirectModeManual; | 
| + return true; | 
| + } | 
| + | 
| + return false; | 
| +} | 
| + | 
| +FetchRequestMode | 
| +EnumTraits<FetchRequestMode, blink::WebURLRequest::FetchRequestMode>::ToMojom( | 
| + blink::WebURLRequest::FetchRequestMode input) { | 
| + switch (input) { | 
| + case blink::WebURLRequest::FetchRequestModeSameOrigin: | 
| + return FetchRequestMode::SAME_ORIGIN; | 
| + case blink::WebURLRequest::FetchRequestModeNoCORS: | 
| + return FetchRequestMode::NO_CORS; | 
| + case blink::WebURLRequest::FetchRequestModeCORS: | 
| + return FetchRequestMode::CORS; | 
| + case blink::WebURLRequest::FetchRequestModeCORSWithForcedPreflight: | 
| + return FetchRequestMode::CORS_WITH_FORCED_PREFLIGHT; | 
| + case blink::WebURLRequest::FetchRequestModeNavigate: | 
| + 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::FetchRequestModeSameOrigin; | 
| + return true; | 
| + case FetchRequestMode::NO_CORS: | 
| + *out = blink::WebURLRequest::FetchRequestModeNoCORS; | 
| + return true; | 
| + case FetchRequestMode::CORS: | 
| + *out = blink::WebURLRequest::FetchRequestModeCORS; | 
| + return true; | 
| + case FetchRequestMode::CORS_WITH_FORCED_PREFLIGHT: | 
| + *out = blink::WebURLRequest::FetchRequestModeCORSWithForcedPreflight; | 
| + return true; | 
| + case FetchRequestMode::NAVIGATE: | 
| + *out = blink::WebURLRequest::FetchRequestModeNavigate; | 
| + return true; | 
| + } | 
| + | 
| + return false; | 
| +} | 
| + | 
| +RequestContextFrameType | 
| +EnumTraits<RequestContextFrameType, blink::WebURLRequest::FrameType>::ToMojom( | 
| + blink::WebURLRequest::FrameType input) { | 
| + switch (input) { | 
| + case blink::WebURLRequest::FrameTypeAuxiliary: | 
| + return RequestContextFrameType::AUXILIARY; | 
| + case blink::WebURLRequest::FrameTypeNested: | 
| + return RequestContextFrameType::NESTED; | 
| + case blink::WebURLRequest::FrameTypeNone: | 
| + return RequestContextFrameType::NONE; | 
| + case blink::WebURLRequest::FrameTypeTopLevel: | 
| + 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::FrameTypeAuxiliary; | 
| + return true; | 
| + case RequestContextFrameType::NESTED: | 
| + *out = blink::WebURLRequest::FrameTypeNested; | 
| + return true; | 
| + case RequestContextFrameType::NONE: | 
| + *out = blink::WebURLRequest::FrameTypeNone; | 
| + return true; | 
| + case RequestContextFrameType::TOP_LEVEL: | 
| + *out = blink::WebURLRequest::FrameTypeTopLevel; | 
| + return true; | 
| + } | 
| + | 
| + return false; | 
| +} | 
| + | 
| +RequestContextType | 
| +EnumTraits<RequestContextType, blink::WebURLRequest::RequestContext>::ToMojom( | 
| + blink::WebURLRequest::RequestContext input) { | 
| + switch (input) { | 
| + case blink::WebURLRequest::RequestContextUnspecified: | 
| + return RequestContextType::UNSPECIFIED; | 
| + case blink::WebURLRequest::RequestContextAudio: | 
| + return RequestContextType::AUDIO; | 
| + case blink::WebURLRequest::RequestContextBeacon: | 
| + return RequestContextType::BEACON; | 
| + case blink::WebURLRequest::RequestContextCSPReport: | 
| + return RequestContextType::CSP_REPORT; | 
| + case blink::WebURLRequest::RequestContextDownload: | 
| + return RequestContextType::DOWNLOAD; | 
| + case blink::WebURLRequest::RequestContextEmbed: | 
| + return RequestContextType::EMBED; | 
| + case blink::WebURLRequest::RequestContextEventSource: | 
| + return RequestContextType::EVENT_SOURCE; | 
| + case blink::WebURLRequest::RequestContextFavicon: | 
| + return RequestContextType::FAVICON; | 
| + case blink::WebURLRequest::RequestContextFetch: | 
| + return RequestContextType::FETCH; | 
| + case blink::WebURLRequest::RequestContextFont: | 
| + return RequestContextType::FONT; | 
| + case blink::WebURLRequest::RequestContextForm: | 
| + return RequestContextType::FORM; | 
| + case blink::WebURLRequest::RequestContextFrame: | 
| + return RequestContextType::FRAME; | 
| + case blink::WebURLRequest::RequestContextHyperlink: | 
| + return RequestContextType::HYPERLINK; | 
| + case blink::WebURLRequest::RequestContextIframe: | 
| + return RequestContextType::IFRAME; | 
| + case blink::WebURLRequest::RequestContextImage: | 
| + return RequestContextType::IMAGE; | 
| + case blink::WebURLRequest::RequestContextImageSet: | 
| + return RequestContextType::IMAGE_SET; | 
| + case blink::WebURLRequest::RequestContextImport: | 
| + return RequestContextType::IMPORT; | 
| + case blink::WebURLRequest::RequestContextInternal: | 
| + return RequestContextType::INTERNAL; | 
| + case blink::WebURLRequest::RequestContextLocation: | 
| + return RequestContextType::LOCATION; | 
| + case blink::WebURLRequest::RequestContextManifest: | 
| + return RequestContextType::MANIFEST; | 
| + case blink::WebURLRequest::RequestContextObject: | 
| + return RequestContextType::OBJECT; | 
| + case blink::WebURLRequest::RequestContextPing: | 
| + return RequestContextType::PING; | 
| + case blink::WebURLRequest::RequestContextPlugin: | 
| + return RequestContextType::PLUGIN; | 
| + case blink::WebURLRequest::RequestContextPrefetch: | 
| + return RequestContextType::PREFETCH; | 
| + case blink::WebURLRequest::RequestContextScript: | 
| + return RequestContextType::SCRIPT; | 
| + case blink::WebURLRequest::RequestContextServiceWorker: | 
| + return RequestContextType::SERVICE_WORKER; | 
| + case blink::WebURLRequest::RequestContextSharedWorker: | 
| + return RequestContextType::SHARED_WORKER; | 
| + case blink::WebURLRequest::RequestContextSubresource: | 
| + return RequestContextType::SUBRESOURCE; | 
| + case blink::WebURLRequest::RequestContextStyle: | 
| + return RequestContextType::STYLE; | 
| + case blink::WebURLRequest::RequestContextTrack: | 
| + return RequestContextType::TRACK; | 
| + case blink::WebURLRequest::RequestContextVideo: | 
| + return RequestContextType::VIDEO; | 
| + case blink::WebURLRequest::RequestContextWorker: | 
| + return RequestContextType::WORKER; | 
| + case blink::WebURLRequest::RequestContextXMLHttpRequest: | 
| + return RequestContextType::XML_HTTP_REQUEST; | 
| + case blink::WebURLRequest::RequestContextXSLT: | 
| + 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::RequestContextUnspecified; | 
| + return true; | 
| + case RequestContextType::AUDIO: | 
| + *out = blink::WebURLRequest::RequestContextAudio; | 
| + return true; | 
| + case RequestContextType::BEACON: | 
| + *out = blink::WebURLRequest::RequestContextBeacon; | 
| + return true; | 
| + case RequestContextType::CSP_REPORT: | 
| + *out = blink::WebURLRequest::RequestContextCSPReport; | 
| + return true; | 
| + case RequestContextType::DOWNLOAD: | 
| + *out = blink::WebURLRequest::RequestContextDownload; | 
| + return true; | 
| + case RequestContextType::EMBED: | 
| + *out = blink::WebURLRequest::RequestContextEmbed; | 
| + return true; | 
| + case RequestContextType::EVENT_SOURCE: | 
| + *out = blink::WebURLRequest::RequestContextEventSource; | 
| + return true; | 
| + case RequestContextType::FAVICON: | 
| + *out = blink::WebURLRequest::RequestContextFavicon; | 
| + return true; | 
| + case RequestContextType::FETCH: | 
| + *out = blink::WebURLRequest::RequestContextFetch; | 
| + return true; | 
| + case RequestContextType::FONT: | 
| + *out = blink::WebURLRequest::RequestContextFont; | 
| + return true; | 
| + case RequestContextType::FORM: | 
| + *out = blink::WebURLRequest::RequestContextForm; | 
| + return true; | 
| + case RequestContextType::FRAME: | 
| + *out = blink::WebURLRequest::RequestContextFrame; | 
| + return true; | 
| + case RequestContextType::HYPERLINK: | 
| + *out = blink::WebURLRequest::RequestContextHyperlink; | 
| + return true; | 
| + case RequestContextType::IFRAME: | 
| + *out = blink::WebURLRequest::RequestContextIframe; | 
| + return true; | 
| + case RequestContextType::IMAGE: | 
| + *out = blink::WebURLRequest::RequestContextImage; | 
| + return true; | 
| + case RequestContextType::IMAGE_SET: | 
| + *out = blink::WebURLRequest::RequestContextImageSet; | 
| + return true; | 
| + case RequestContextType::IMPORT: | 
| + *out = blink::WebURLRequest::RequestContextImport; | 
| + return true; | 
| + case RequestContextType::INTERNAL: | 
| + *out = blink::WebURLRequest::RequestContextInternal; | 
| + return true; | 
| + case RequestContextType::LOCATION: | 
| + *out = blink::WebURLRequest::RequestContextLocation; | 
| + return true; | 
| + case RequestContextType::MANIFEST: | 
| + *out = blink::WebURLRequest::RequestContextManifest; | 
| + return true; | 
| + case RequestContextType::OBJECT: | 
| + *out = blink::WebURLRequest::RequestContextObject; | 
| + return true; | 
| + case RequestContextType::PING: | 
| + *out = blink::WebURLRequest::RequestContextPing; | 
| + return true; | 
| + case RequestContextType::PLUGIN: | 
| + *out = blink::WebURLRequest::RequestContextPlugin; | 
| + return true; | 
| + case RequestContextType::PREFETCH: | 
| + *out = blink::WebURLRequest::RequestContextPrefetch; | 
| + return true; | 
| + case RequestContextType::SCRIPT: | 
| + *out = blink::WebURLRequest::RequestContextScript; | 
| + return true; | 
| + case RequestContextType::SERVICE_WORKER: | 
| + *out = blink::WebURLRequest::RequestContextServiceWorker; | 
| + return true; | 
| + case RequestContextType::SHARED_WORKER: | 
| + *out = blink::WebURLRequest::RequestContextSharedWorker; | 
| + return true; | 
| + case RequestContextType::SUBRESOURCE: | 
| + *out = blink::WebURLRequest::RequestContextSubresource; | 
| + return true; | 
| + case RequestContextType::STYLE: | 
| + *out = blink::WebURLRequest::RequestContextStyle; | 
| + return true; | 
| + case RequestContextType::TRACK: | 
| + *out = blink::WebURLRequest::RequestContextTrack; | 
| + return true; | 
| + case RequestContextType::VIDEO: | 
| + *out = blink::WebURLRequest::RequestContextVideo; | 
| + return true; | 
| + case RequestContextType::WORKER: | 
| + *out = blink::WebURLRequest::RequestContextWorker; | 
| + return true; | 
| + case RequestContextType::XML_HTTP_REQUEST: | 
| + *out = blink::WebURLRequest::RequestContextXMLHttpRequest; | 
| + return true; | 
| + case RequestContextType::XSLT: | 
| + *out = blink::WebURLRequest::RequestContextXSLT; | 
| + 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); | 
| 
 
dcheng
2017/03/28 06:52:24
Ditto here with MapTraits, or possibly typemapping
 
Peter Beverloo
2017/03/28 14:07:53
I believe this is also covered by crbug.com/705972
 
 | 
| + | 
| + 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.referrer(); | 
| +} | 
| + | 
| +// static | 
| +WTF::String StructTraits<blink::mojom::FetchAPIRequestDataView, | 
| + blink::WebServiceWorkerRequest>:: | 
| + blob_uuid(const blink::WebServiceWorkerRequest& request) { | 
| + if (request.blobDataHandle()) | 
| + return request.blobDataHandle()->uuid(); | 
| + | 
| + return WTF::String(); | 
| +} | 
| + | 
| +// static | 
| +uint64_t StructTraits<blink::mojom::FetchAPIRequestDataView, | 
| + blink::WebServiceWorkerRequest>:: | 
| + blob_size(const blink::WebServiceWorkerRequest& request) { | 
| + if (request.blobDataHandle()) | 
| + return request.blobDataHandle()->size(); | 
| + | 
| + return 0; | 
| +} | 
| + | 
| +// 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 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)) { | 
| + 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.referrerPolicy)); | 
| + out->setCredentialsMode(credentialsMode); | 
| + out->setRedirectMode(redirectMode); | 
| + out->setClientId(clientId); | 
| + out->setIsReload(data.is_reload()); | 
| + return true; | 
| +} | 
| + | 
| +} // namespace mojo |