Index: content/common/service_worker/service_worker_fetch_request_struct_traits.cc |
diff --git a/content/common/service_worker/service_worker_fetch_request_struct_traits.cc b/content/common/service_worker/service_worker_fetch_request_struct_traits.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7445fdecec6efbb34e6a8dee6b60c1d71480b203 |
--- /dev/null |
+++ b/content/common/service_worker/service_worker_fetch_request_struct_traits.cc |
@@ -0,0 +1,460 @@ |
+// 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 "content/common/service_worker/service_worker_fetch_request_struct_traits.h" |
+ |
+#include "base/logging.h" |
+#include "content/public/common/referrer_struct_traits.h" |
dcheng
2017/03/28 06:52:24
Out of curiosity, why are these includes needed?
Peter Beverloo
2017/03/28 14:07:53
We're calling ReadReferrer() on the DataView on li
|
+#include "url/mojo/url_gurl_struct_traits.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 ServiceWorkerFetchRequestStructTraitsContext { |
+ ServiceWorkerFetchRequestStructTraitsContext() = default; |
+ ~ServiceWorkerFetchRequestStructTraitsContext() = default; |
+ |
+ std::map<std::string, std::string> headers; |
+}; |
+ |
+} // namespace |
+ |
+using blink::mojom::FetchCredentialsMode; |
+using blink::mojom::FetchRedirectMode; |
+using blink::mojom::FetchRequestMode; |
+using blink::mojom::RequestContextFrameType; |
+using blink::mojom::RequestContextType; |
+using blink::mojom::ServiceWorkerFetchType; |
+ |
+FetchCredentialsMode |
+EnumTraits<FetchCredentialsMode, content::FetchCredentialsMode>::ToMojom( |
+ content::FetchCredentialsMode input) { |
+ switch (input) { |
+ case content::FETCH_CREDENTIALS_MODE_OMIT: |
+ return FetchCredentialsMode::OMIT; |
+ case content::FETCH_CREDENTIALS_MODE_SAME_ORIGIN: |
+ return FetchCredentialsMode::SAME_ORIGIN; |
+ case content::FETCH_CREDENTIALS_MODE_INCLUDE: |
+ return FetchCredentialsMode::INCLUDE; |
+ case content::FETCH_CREDENTIALS_MODE_PASSWORD: |
+ return FetchCredentialsMode::PASSWORD; |
+ } |
+ |
+ NOTREACHED(); |
+ return FetchCredentialsMode::OMIT; |
+} |
+ |
+bool EnumTraits<FetchCredentialsMode, content::FetchCredentialsMode>::FromMojom( |
+ FetchCredentialsMode input, |
+ content::FetchCredentialsMode* out) { |
+ switch (input) { |
+ case FetchCredentialsMode::OMIT: |
+ *out = content::FETCH_CREDENTIALS_MODE_OMIT; |
+ return true; |
+ case FetchCredentialsMode::SAME_ORIGIN: |
+ *out = content::FETCH_CREDENTIALS_MODE_SAME_ORIGIN; |
+ return true; |
+ case FetchCredentialsMode::INCLUDE: |
+ *out = content::FETCH_CREDENTIALS_MODE_INCLUDE; |
+ return true; |
+ case FetchCredentialsMode::PASSWORD: |
+ *out = content::FETCH_CREDENTIALS_MODE_PASSWORD; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+FetchRedirectMode |
+EnumTraits<FetchRedirectMode, content::FetchRedirectMode>::ToMojom( |
+ content::FetchRedirectMode input) { |
+ switch (input) { |
+ case content::FetchRedirectMode::FOLLOW_MODE: |
+ return FetchRedirectMode::FOLLOW; |
+ case content::FetchRedirectMode::ERROR_MODE: |
+ return FetchRedirectMode::ERROR; |
+ case content::FetchRedirectMode::MANUAL_MODE: |
+ return FetchRedirectMode::MANUAL; |
+ } |
+ |
+ NOTREACHED(); |
+ return FetchRedirectMode::ERROR; |
+} |
+ |
+bool EnumTraits<FetchRedirectMode, content::FetchRedirectMode>::FromMojom( |
+ FetchRedirectMode input, |
+ content::FetchRedirectMode* out) { |
+ switch (input) { |
+ case FetchRedirectMode::FOLLOW: |
+ *out = content::FetchRedirectMode::FOLLOW_MODE; |
+ return true; |
+ case FetchRedirectMode::ERROR: |
+ *out = content::FetchRedirectMode::ERROR_MODE; |
+ return true; |
+ case FetchRedirectMode::MANUAL: |
+ *out = content::FetchRedirectMode::MANUAL_MODE; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+FetchRequestMode |
+EnumTraits<FetchRequestMode, content::FetchRequestMode>::ToMojom( |
+ content::FetchRequestMode input) { |
+ switch (input) { |
+ case content::FETCH_REQUEST_MODE_SAME_ORIGIN: |
+ return FetchRequestMode::SAME_ORIGIN; |
+ case content::FETCH_REQUEST_MODE_NO_CORS: |
+ return FetchRequestMode::NO_CORS; |
+ case content::FETCH_REQUEST_MODE_CORS: |
+ return FetchRequestMode::CORS; |
+ case content::FETCH_REQUEST_MODE_CORS_WITH_FORCED_PREFLIGHT: |
+ return FetchRequestMode::CORS_WITH_FORCED_PREFLIGHT; |
+ case content::FETCH_REQUEST_MODE_NAVIGATE: |
+ return FetchRequestMode::NAVIGATE; |
+ } |
+ |
+ NOTREACHED(); |
+ return FetchRequestMode::NO_CORS; |
+} |
+ |
+bool EnumTraits<FetchRequestMode, content::FetchRequestMode>::FromMojom( |
+ FetchRequestMode input, |
+ content::FetchRequestMode* out) { |
+ switch (input) { |
+ case FetchRequestMode::SAME_ORIGIN: |
+ *out = content::FETCH_REQUEST_MODE_SAME_ORIGIN; |
+ return true; |
+ case FetchRequestMode::NO_CORS: |
+ *out = content::FETCH_REQUEST_MODE_NO_CORS; |
+ return true; |
+ case FetchRequestMode::CORS: |
+ *out = content::FETCH_REQUEST_MODE_CORS; |
+ return true; |
+ case FetchRequestMode::CORS_WITH_FORCED_PREFLIGHT: |
+ *out = content::FETCH_REQUEST_MODE_CORS_WITH_FORCED_PREFLIGHT; |
+ return true; |
+ case FetchRequestMode::NAVIGATE: |
+ *out = content::FETCH_REQUEST_MODE_NAVIGATE; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+RequestContextFrameType |
+EnumTraits<RequestContextFrameType, content::RequestContextFrameType>::ToMojom( |
+ content::RequestContextFrameType input) { |
+ switch (input) { |
+ case content::REQUEST_CONTEXT_FRAME_TYPE_AUXILIARY: |
+ return RequestContextFrameType::AUXILIARY; |
+ case content::REQUEST_CONTEXT_FRAME_TYPE_NESTED: |
+ return RequestContextFrameType::NESTED; |
+ case content::REQUEST_CONTEXT_FRAME_TYPE_NONE: |
+ return RequestContextFrameType::NONE; |
+ case content::REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL: |
+ return RequestContextFrameType::TOP_LEVEL; |
+ } |
+ |
+ NOTREACHED(); |
+ return RequestContextFrameType::NONE; |
+} |
+ |
+bool EnumTraits<RequestContextFrameType, content::RequestContextFrameType>:: |
+ FromMojom(RequestContextFrameType input, |
+ content::RequestContextFrameType* out) { |
+ switch (input) { |
+ case RequestContextFrameType::AUXILIARY: |
+ *out = content::REQUEST_CONTEXT_FRAME_TYPE_AUXILIARY; |
+ return true; |
+ case RequestContextFrameType::NESTED: |
+ *out = content::REQUEST_CONTEXT_FRAME_TYPE_NESTED; |
+ return true; |
+ case RequestContextFrameType::NONE: |
+ *out = content::REQUEST_CONTEXT_FRAME_TYPE_NONE; |
+ return true; |
+ case RequestContextFrameType::TOP_LEVEL: |
+ *out = content::REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+RequestContextType |
+EnumTraits<RequestContextType, content::RequestContextType>::ToMojom( |
+ content::RequestContextType input) { |
+ switch (input) { |
+ case content::REQUEST_CONTEXT_TYPE_UNSPECIFIED: |
+ return RequestContextType::UNSPECIFIED; |
+ case content::REQUEST_CONTEXT_TYPE_AUDIO: |
+ return RequestContextType::AUDIO; |
+ case content::REQUEST_CONTEXT_TYPE_BEACON: |
+ return RequestContextType::BEACON; |
+ case content::REQUEST_CONTEXT_TYPE_CSP_REPORT: |
+ return RequestContextType::CSP_REPORT; |
+ case content::REQUEST_CONTEXT_TYPE_DOWNLOAD: |
+ return RequestContextType::DOWNLOAD; |
+ case content::REQUEST_CONTEXT_TYPE_EMBED: |
+ return RequestContextType::EMBED; |
+ case content::REQUEST_CONTEXT_TYPE_EVENT_SOURCE: |
+ return RequestContextType::EVENT_SOURCE; |
+ case content::REQUEST_CONTEXT_TYPE_FAVICON: |
+ return RequestContextType::FAVICON; |
+ case content::REQUEST_CONTEXT_TYPE_FETCH: |
+ return RequestContextType::FETCH; |
+ case content::REQUEST_CONTEXT_TYPE_FONT: |
+ return RequestContextType::FONT; |
+ case content::REQUEST_CONTEXT_TYPE_FORM: |
+ return RequestContextType::FORM; |
+ case content::REQUEST_CONTEXT_TYPE_FRAME: |
+ return RequestContextType::FRAME; |
+ case content::REQUEST_CONTEXT_TYPE_HYPERLINK: |
+ return RequestContextType::HYPERLINK; |
+ case content::REQUEST_CONTEXT_TYPE_IFRAME: |
+ return RequestContextType::IFRAME; |
+ case content::REQUEST_CONTEXT_TYPE_IMAGE: |
+ return RequestContextType::IMAGE; |
+ case content::REQUEST_CONTEXT_TYPE_IMAGE_SET: |
+ return RequestContextType::IMAGE_SET; |
+ case content::REQUEST_CONTEXT_TYPE_IMPORT: |
+ return RequestContextType::IMPORT; |
+ case content::REQUEST_CONTEXT_TYPE_INTERNAL: |
+ return RequestContextType::INTERNAL; |
+ case content::REQUEST_CONTEXT_TYPE_LOCATION: |
+ return RequestContextType::LOCATION; |
+ case content::REQUEST_CONTEXT_TYPE_MANIFEST: |
+ return RequestContextType::MANIFEST; |
+ case content::REQUEST_CONTEXT_TYPE_OBJECT: |
+ return RequestContextType::OBJECT; |
+ case content::REQUEST_CONTEXT_TYPE_PING: |
+ return RequestContextType::PING; |
+ case content::REQUEST_CONTEXT_TYPE_PLUGIN: |
+ return RequestContextType::PLUGIN; |
+ case content::REQUEST_CONTEXT_TYPE_PREFETCH: |
+ return RequestContextType::PREFETCH; |
+ case content::REQUEST_CONTEXT_TYPE_SCRIPT: |
+ return RequestContextType::SCRIPT; |
+ case content::REQUEST_CONTEXT_TYPE_SERVICE_WORKER: |
+ return RequestContextType::SERVICE_WORKER; |
+ case content::REQUEST_CONTEXT_TYPE_SHARED_WORKER: |
+ return RequestContextType::SHARED_WORKER; |
+ case content::REQUEST_CONTEXT_TYPE_SUBRESOURCE: |
+ return RequestContextType::SUBRESOURCE; |
+ case content::REQUEST_CONTEXT_TYPE_STYLE: |
+ return RequestContextType::STYLE; |
+ case content::REQUEST_CONTEXT_TYPE_TRACK: |
+ return RequestContextType::TRACK; |
+ case content::REQUEST_CONTEXT_TYPE_VIDEO: |
+ return RequestContextType::VIDEO; |
+ case content::REQUEST_CONTEXT_TYPE_WORKER: |
+ return RequestContextType::WORKER; |
+ case content::REQUEST_CONTEXT_TYPE_XML_HTTP_REQUEST: |
+ return RequestContextType::XML_HTTP_REQUEST; |
+ case content::REQUEST_CONTEXT_TYPE_XSLT: |
+ return RequestContextType::XSLT; |
+ } |
+ |
+ NOTREACHED(); |
+ return RequestContextType::UNSPECIFIED; |
+} |
+ |
+bool EnumTraits<RequestContextType, content::RequestContextType>::FromMojom( |
+ RequestContextType input, |
+ content::RequestContextType* out) { |
+ switch (input) { |
+ case RequestContextType::UNSPECIFIED: |
+ *out = content::REQUEST_CONTEXT_TYPE_UNSPECIFIED; |
+ return true; |
+ case RequestContextType::AUDIO: |
+ *out = content::REQUEST_CONTEXT_TYPE_AUDIO; |
+ return true; |
+ case RequestContextType::BEACON: |
+ *out = content::REQUEST_CONTEXT_TYPE_BEACON; |
+ return true; |
+ case RequestContextType::CSP_REPORT: |
+ *out = content::REQUEST_CONTEXT_TYPE_CSP_REPORT; |
+ return true; |
+ case RequestContextType::DOWNLOAD: |
+ *out = content::REQUEST_CONTEXT_TYPE_DOWNLOAD; |
+ return true; |
+ case RequestContextType::EMBED: |
+ *out = content::REQUEST_CONTEXT_TYPE_EMBED; |
+ return true; |
+ case RequestContextType::EVENT_SOURCE: |
+ *out = content::REQUEST_CONTEXT_TYPE_EVENT_SOURCE; |
+ return true; |
+ case RequestContextType::FAVICON: |
+ *out = content::REQUEST_CONTEXT_TYPE_FAVICON; |
+ return true; |
+ case RequestContextType::FETCH: |
+ *out = content::REQUEST_CONTEXT_TYPE_FETCH; |
+ return true; |
+ case RequestContextType::FONT: |
+ *out = content::REQUEST_CONTEXT_TYPE_FONT; |
+ return true; |
+ case RequestContextType::FORM: |
+ *out = content::REQUEST_CONTEXT_TYPE_FORM; |
+ return true; |
+ case RequestContextType::FRAME: |
+ *out = content::REQUEST_CONTEXT_TYPE_FRAME; |
+ return true; |
+ case RequestContextType::HYPERLINK: |
+ *out = content::REQUEST_CONTEXT_TYPE_HYPERLINK; |
+ return true; |
+ case RequestContextType::IFRAME: |
+ *out = content::REQUEST_CONTEXT_TYPE_IFRAME; |
+ return true; |
+ case RequestContextType::IMAGE: |
+ *out = content::REQUEST_CONTEXT_TYPE_IMAGE; |
+ return true; |
+ case RequestContextType::IMAGE_SET: |
+ *out = content::REQUEST_CONTEXT_TYPE_IMAGE_SET; |
+ return true; |
+ case RequestContextType::IMPORT: |
+ *out = content::REQUEST_CONTEXT_TYPE_IMPORT; |
+ return true; |
+ case RequestContextType::INTERNAL: |
+ *out = content::REQUEST_CONTEXT_TYPE_INTERNAL; |
+ return true; |
+ case RequestContextType::LOCATION: |
+ *out = content::REQUEST_CONTEXT_TYPE_LOCATION; |
+ return true; |
+ case RequestContextType::MANIFEST: |
+ *out = content::REQUEST_CONTEXT_TYPE_MANIFEST; |
+ return true; |
+ case RequestContextType::OBJECT: |
+ *out = content::REQUEST_CONTEXT_TYPE_OBJECT; |
+ return true; |
+ case RequestContextType::PING: |
+ *out = content::REQUEST_CONTEXT_TYPE_PING; |
+ return true; |
+ case RequestContextType::PLUGIN: |
+ *out = content::REQUEST_CONTEXT_TYPE_PLUGIN; |
+ return true; |
+ case RequestContextType::PREFETCH: |
+ *out = content::REQUEST_CONTEXT_TYPE_PREFETCH; |
+ return true; |
+ case RequestContextType::SCRIPT: |
+ *out = content::REQUEST_CONTEXT_TYPE_SCRIPT; |
+ return true; |
+ case RequestContextType::SERVICE_WORKER: |
+ *out = content::REQUEST_CONTEXT_TYPE_SERVICE_WORKER; |
+ return true; |
+ case RequestContextType::SHARED_WORKER: |
+ *out = content::REQUEST_CONTEXT_TYPE_SHARED_WORKER; |
+ return true; |
+ case RequestContextType::SUBRESOURCE: |
+ *out = content::REQUEST_CONTEXT_TYPE_SUBRESOURCE; |
+ return true; |
+ case RequestContextType::STYLE: |
+ *out = content::REQUEST_CONTEXT_TYPE_STYLE; |
+ return true; |
+ case RequestContextType::TRACK: |
+ *out = content::REQUEST_CONTEXT_TYPE_TRACK; |
+ return true; |
+ case RequestContextType::VIDEO: |
+ *out = content::REQUEST_CONTEXT_TYPE_VIDEO; |
+ return true; |
+ case RequestContextType::WORKER: |
+ *out = content::REQUEST_CONTEXT_TYPE_WORKER; |
+ return true; |
+ case RequestContextType::XML_HTTP_REQUEST: |
+ *out = content::REQUEST_CONTEXT_TYPE_XML_HTTP_REQUEST; |
+ return true; |
+ case RequestContextType::XSLT: |
+ *out = content::REQUEST_CONTEXT_TYPE_XSLT; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+ServiceWorkerFetchType |
+EnumTraits<ServiceWorkerFetchType, content::ServiceWorkerFetchType>::ToMojom( |
+ content::ServiceWorkerFetchType input) { |
+ switch (input) { |
+ case content::ServiceWorkerFetchType::FETCH: |
+ return ServiceWorkerFetchType::FETCH; |
+ case content::ServiceWorkerFetchType::FOREIGN_FETCH: |
+ return ServiceWorkerFetchType::FOREIGN_FETCH; |
+ } |
+ |
+ NOTREACHED(); |
+ return ServiceWorkerFetchType::FETCH; |
+} |
+ |
+bool EnumTraits<ServiceWorkerFetchType, content::ServiceWorkerFetchType>:: |
+ FromMojom(ServiceWorkerFetchType input, |
+ content::ServiceWorkerFetchType* out) { |
+ switch (input) { |
+ case ServiceWorkerFetchType::FETCH: |
+ *out = content::ServiceWorkerFetchType::FETCH; |
+ return true; |
+ case ServiceWorkerFetchType::FOREIGN_FETCH: |
+ *out = content::ServiceWorkerFetchType::FOREIGN_FETCH; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+void* StructTraits<blink::mojom::FetchAPIRequestDataView, |
+ content::ServiceWorkerFetchRequest>:: |
+ SetUpContext(const content::ServiceWorkerFetchRequest& request) { |
+ ServiceWorkerFetchRequestStructTraitsContext* context = |
+ new ServiceWorkerFetchRequestStructTraitsContext(); |
+ context->headers.insert(request.headers.begin(), request.headers.end()); |
+ |
+ return context; |
+} |
+ |
+void StructTraits<blink::mojom::FetchAPIRequestDataView, |
+ content::ServiceWorkerFetchRequest>:: |
+ TearDownContext(const content::ServiceWorkerFetchRequest& request, |
+ void* context) { |
+ delete static_cast<ServiceWorkerFetchRequestStructTraitsContext*>(context); |
+} |
+ |
+const std::map<std::string, std::string>& |
+StructTraits<blink::mojom::FetchAPIRequestDataView, |
+ content::ServiceWorkerFetchRequest>:: |
+ headers(const content::ServiceWorkerFetchRequest& request, void* context) { |
+ return static_cast<ServiceWorkerFetchRequestStructTraitsContext*>(context) |
dcheng
2017/03/28 06:52:24
I'm OK with this to unblock things. Would you mind
Peter Beverloo
2017/03/28 14:07:53
There's some more interesting differences in these
|
+ ->headers; |
+} |
+ |
+bool StructTraits<blink::mojom::FetchAPIRequestDataView, |
+ content::ServiceWorkerFetchRequest>:: |
+ Read(blink::mojom::FetchAPIRequestDataView data, |
+ content::ServiceWorkerFetchRequest* out) { |
+ std::unordered_map<std::string, std::string> headers; |
+ base::Optional<std::string> blob_uuid; |
+ if (!data.ReadMode(&out->mode) || |
+ !data.ReadRequestContextType(&out->request_context_type) || |
+ !data.ReadFrameType(&out->frame_type) || !data.ReadUrl(&out->url) || |
+ !data.ReadMethod(&out->method) || !data.ReadHeaders(&headers) || |
+ !data.ReadBlobUuid(&blob_uuid) || !data.ReadReferrer(&out->referrer) || |
+ !data.ReadCredentialsMode(&out->credentials_mode) || |
+ !data.ReadRedirectMode(&out->redirect_mode) || |
+ !data.ReadClientId(&out->client_id) || |
+ !data.ReadFetchType(&out->fetch_type)) { |
+ return false; |
+ } |
+ |
+ out->is_main_resource_load = data.is_main_resource_load(); |
+ out->headers.insert(headers.begin(), headers.end()); |
+ if (blob_uuid) { |
+ out->blob_uuid = blob_uuid.value(); |
+ out->blob_size = data.blob_size(); |
+ } |
+ out->is_reload = data.is_reload(); |
+ return true; |
+} |
+ |
+} // namespace mojo |