OLD | NEW |
(Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "content/common/service_worker/service_worker_fetch_request_struct_trai
ts.h" |
| 6 |
| 7 #include "base/logging.h" |
| 8 #include "content/public/common/referrer_struct_traits.h" |
| 9 #include "url/mojo/url_gurl_struct_traits.h" |
| 10 |
| 11 namespace mojo { |
| 12 |
| 13 namespace { |
| 14 |
| 15 // Struct traits context for the FetchAPIRequest type. Since getters are invoked |
| 16 // twice when serializing the type, this reduces the load for heavy members. |
| 17 struct ServiceWorkerFetchRequestStructTraitsContext { |
| 18 ServiceWorkerFetchRequestStructTraitsContext() = default; |
| 19 ~ServiceWorkerFetchRequestStructTraitsContext() = default; |
| 20 |
| 21 std::map<std::string, std::string> headers; |
| 22 }; |
| 23 |
| 24 } // namespace |
| 25 |
| 26 using blink::mojom::FetchCredentialsMode; |
| 27 using blink::mojom::FetchRedirectMode; |
| 28 using blink::mojom::FetchRequestMode; |
| 29 using blink::mojom::RequestContextFrameType; |
| 30 using blink::mojom::RequestContextType; |
| 31 using blink::mojom::ServiceWorkerFetchType; |
| 32 |
| 33 FetchCredentialsMode |
| 34 EnumTraits<FetchCredentialsMode, content::FetchCredentialsMode>::ToMojom( |
| 35 content::FetchCredentialsMode input) { |
| 36 switch (input) { |
| 37 case content::FETCH_CREDENTIALS_MODE_OMIT: |
| 38 return FetchCredentialsMode::OMIT; |
| 39 case content::FETCH_CREDENTIALS_MODE_SAME_ORIGIN: |
| 40 return FetchCredentialsMode::SAME_ORIGIN; |
| 41 case content::FETCH_CREDENTIALS_MODE_INCLUDE: |
| 42 return FetchCredentialsMode::INCLUDE; |
| 43 case content::FETCH_CREDENTIALS_MODE_PASSWORD: |
| 44 return FetchCredentialsMode::PASSWORD; |
| 45 } |
| 46 |
| 47 NOTREACHED(); |
| 48 return FetchCredentialsMode::OMIT; |
| 49 } |
| 50 |
| 51 bool EnumTraits<FetchCredentialsMode, content::FetchCredentialsMode>::FromMojom( |
| 52 FetchCredentialsMode input, |
| 53 content::FetchCredentialsMode* out) { |
| 54 switch (input) { |
| 55 case FetchCredentialsMode::OMIT: |
| 56 *out = content::FETCH_CREDENTIALS_MODE_OMIT; |
| 57 return true; |
| 58 case FetchCredentialsMode::SAME_ORIGIN: |
| 59 *out = content::FETCH_CREDENTIALS_MODE_SAME_ORIGIN; |
| 60 return true; |
| 61 case FetchCredentialsMode::INCLUDE: |
| 62 *out = content::FETCH_CREDENTIALS_MODE_INCLUDE; |
| 63 return true; |
| 64 case FetchCredentialsMode::PASSWORD: |
| 65 *out = content::FETCH_CREDENTIALS_MODE_PASSWORD; |
| 66 return true; |
| 67 } |
| 68 |
| 69 return false; |
| 70 } |
| 71 |
| 72 FetchRedirectMode |
| 73 EnumTraits<FetchRedirectMode, content::FetchRedirectMode>::ToMojom( |
| 74 content::FetchRedirectMode input) { |
| 75 switch (input) { |
| 76 case content::FetchRedirectMode::FOLLOW_MODE: |
| 77 return FetchRedirectMode::FOLLOW; |
| 78 case content::FetchRedirectMode::ERROR_MODE: |
| 79 return FetchRedirectMode::ERROR_MODE; |
| 80 case content::FetchRedirectMode::MANUAL_MODE: |
| 81 return FetchRedirectMode::MANUAL; |
| 82 } |
| 83 |
| 84 NOTREACHED(); |
| 85 return FetchRedirectMode::ERROR_MODE; |
| 86 } |
| 87 |
| 88 bool EnumTraits<FetchRedirectMode, content::FetchRedirectMode>::FromMojom( |
| 89 FetchRedirectMode input, |
| 90 content::FetchRedirectMode* out) { |
| 91 switch (input) { |
| 92 case FetchRedirectMode::FOLLOW: |
| 93 *out = content::FetchRedirectMode::FOLLOW_MODE; |
| 94 return true; |
| 95 case FetchRedirectMode::ERROR_MODE: |
| 96 *out = content::FetchRedirectMode::ERROR_MODE; |
| 97 return true; |
| 98 case FetchRedirectMode::MANUAL: |
| 99 *out = content::FetchRedirectMode::MANUAL_MODE; |
| 100 return true; |
| 101 } |
| 102 |
| 103 return false; |
| 104 } |
| 105 |
| 106 FetchRequestMode |
| 107 EnumTraits<FetchRequestMode, content::FetchRequestMode>::ToMojom( |
| 108 content::FetchRequestMode input) { |
| 109 switch (input) { |
| 110 case content::FETCH_REQUEST_MODE_SAME_ORIGIN: |
| 111 return FetchRequestMode::SAME_ORIGIN; |
| 112 case content::FETCH_REQUEST_MODE_NO_CORS: |
| 113 return FetchRequestMode::NO_CORS; |
| 114 case content::FETCH_REQUEST_MODE_CORS: |
| 115 return FetchRequestMode::CORS; |
| 116 case content::FETCH_REQUEST_MODE_CORS_WITH_FORCED_PREFLIGHT: |
| 117 return FetchRequestMode::CORS_WITH_FORCED_PREFLIGHT; |
| 118 case content::FETCH_REQUEST_MODE_NAVIGATE: |
| 119 return FetchRequestMode::NAVIGATE; |
| 120 } |
| 121 |
| 122 NOTREACHED(); |
| 123 return FetchRequestMode::NO_CORS; |
| 124 } |
| 125 |
| 126 bool EnumTraits<FetchRequestMode, content::FetchRequestMode>::FromMojom( |
| 127 FetchRequestMode input, |
| 128 content::FetchRequestMode* out) { |
| 129 switch (input) { |
| 130 case FetchRequestMode::SAME_ORIGIN: |
| 131 *out = content::FETCH_REQUEST_MODE_SAME_ORIGIN; |
| 132 return true; |
| 133 case FetchRequestMode::NO_CORS: |
| 134 *out = content::FETCH_REQUEST_MODE_NO_CORS; |
| 135 return true; |
| 136 case FetchRequestMode::CORS: |
| 137 *out = content::FETCH_REQUEST_MODE_CORS; |
| 138 return true; |
| 139 case FetchRequestMode::CORS_WITH_FORCED_PREFLIGHT: |
| 140 *out = content::FETCH_REQUEST_MODE_CORS_WITH_FORCED_PREFLIGHT; |
| 141 return true; |
| 142 case FetchRequestMode::NAVIGATE: |
| 143 *out = content::FETCH_REQUEST_MODE_NAVIGATE; |
| 144 return true; |
| 145 } |
| 146 |
| 147 return false; |
| 148 } |
| 149 |
| 150 RequestContextFrameType |
| 151 EnumTraits<RequestContextFrameType, content::RequestContextFrameType>::ToMojom( |
| 152 content::RequestContextFrameType input) { |
| 153 switch (input) { |
| 154 case content::REQUEST_CONTEXT_FRAME_TYPE_AUXILIARY: |
| 155 return RequestContextFrameType::AUXILIARY; |
| 156 case content::REQUEST_CONTEXT_FRAME_TYPE_NESTED: |
| 157 return RequestContextFrameType::NESTED; |
| 158 case content::REQUEST_CONTEXT_FRAME_TYPE_NONE: |
| 159 return RequestContextFrameType::NONE; |
| 160 case content::REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL: |
| 161 return RequestContextFrameType::TOP_LEVEL; |
| 162 } |
| 163 |
| 164 NOTREACHED(); |
| 165 return RequestContextFrameType::NONE; |
| 166 } |
| 167 |
| 168 bool EnumTraits<RequestContextFrameType, content::RequestContextFrameType>:: |
| 169 FromMojom(RequestContextFrameType input, |
| 170 content::RequestContextFrameType* out) { |
| 171 switch (input) { |
| 172 case RequestContextFrameType::AUXILIARY: |
| 173 *out = content::REQUEST_CONTEXT_FRAME_TYPE_AUXILIARY; |
| 174 return true; |
| 175 case RequestContextFrameType::NESTED: |
| 176 *out = content::REQUEST_CONTEXT_FRAME_TYPE_NESTED; |
| 177 return true; |
| 178 case RequestContextFrameType::NONE: |
| 179 *out = content::REQUEST_CONTEXT_FRAME_TYPE_NONE; |
| 180 return true; |
| 181 case RequestContextFrameType::TOP_LEVEL: |
| 182 *out = content::REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL; |
| 183 return true; |
| 184 } |
| 185 |
| 186 return false; |
| 187 } |
| 188 |
| 189 RequestContextType |
| 190 EnumTraits<RequestContextType, content::RequestContextType>::ToMojom( |
| 191 content::RequestContextType input) { |
| 192 switch (input) { |
| 193 case content::REQUEST_CONTEXT_TYPE_UNSPECIFIED: |
| 194 return RequestContextType::UNSPECIFIED; |
| 195 case content::REQUEST_CONTEXT_TYPE_AUDIO: |
| 196 return RequestContextType::AUDIO; |
| 197 case content::REQUEST_CONTEXT_TYPE_BEACON: |
| 198 return RequestContextType::BEACON; |
| 199 case content::REQUEST_CONTEXT_TYPE_CSP_REPORT: |
| 200 return RequestContextType::CSP_REPORT; |
| 201 case content::REQUEST_CONTEXT_TYPE_DOWNLOAD: |
| 202 return RequestContextType::DOWNLOAD; |
| 203 case content::REQUEST_CONTEXT_TYPE_EMBED: |
| 204 return RequestContextType::EMBED; |
| 205 case content::REQUEST_CONTEXT_TYPE_EVENT_SOURCE: |
| 206 return RequestContextType::EVENT_SOURCE; |
| 207 case content::REQUEST_CONTEXT_TYPE_FAVICON: |
| 208 return RequestContextType::FAVICON; |
| 209 case content::REQUEST_CONTEXT_TYPE_FETCH: |
| 210 return RequestContextType::FETCH; |
| 211 case content::REQUEST_CONTEXT_TYPE_FONT: |
| 212 return RequestContextType::FONT; |
| 213 case content::REQUEST_CONTEXT_TYPE_FORM: |
| 214 return RequestContextType::FORM; |
| 215 case content::REQUEST_CONTEXT_TYPE_FRAME: |
| 216 return RequestContextType::FRAME; |
| 217 case content::REQUEST_CONTEXT_TYPE_HYPERLINK: |
| 218 return RequestContextType::HYPERLINK; |
| 219 case content::REQUEST_CONTEXT_TYPE_IFRAME: |
| 220 return RequestContextType::IFRAME; |
| 221 case content::REQUEST_CONTEXT_TYPE_IMAGE: |
| 222 return RequestContextType::IMAGE; |
| 223 case content::REQUEST_CONTEXT_TYPE_IMAGE_SET: |
| 224 return RequestContextType::IMAGE_SET; |
| 225 case content::REQUEST_CONTEXT_TYPE_IMPORT: |
| 226 return RequestContextType::IMPORT; |
| 227 case content::REQUEST_CONTEXT_TYPE_INTERNAL: |
| 228 return RequestContextType::INTERNAL; |
| 229 case content::REQUEST_CONTEXT_TYPE_LOCATION: |
| 230 return RequestContextType::LOCATION; |
| 231 case content::REQUEST_CONTEXT_TYPE_MANIFEST: |
| 232 return RequestContextType::MANIFEST; |
| 233 case content::REQUEST_CONTEXT_TYPE_OBJECT: |
| 234 return RequestContextType::OBJECT; |
| 235 case content::REQUEST_CONTEXT_TYPE_PING: |
| 236 return RequestContextType::PING; |
| 237 case content::REQUEST_CONTEXT_TYPE_PLUGIN: |
| 238 return RequestContextType::PLUGIN; |
| 239 case content::REQUEST_CONTEXT_TYPE_PREFETCH: |
| 240 return RequestContextType::PREFETCH; |
| 241 case content::REQUEST_CONTEXT_TYPE_SCRIPT: |
| 242 return RequestContextType::SCRIPT; |
| 243 case content::REQUEST_CONTEXT_TYPE_SERVICE_WORKER: |
| 244 return RequestContextType::SERVICE_WORKER; |
| 245 case content::REQUEST_CONTEXT_TYPE_SHARED_WORKER: |
| 246 return RequestContextType::SHARED_WORKER; |
| 247 case content::REQUEST_CONTEXT_TYPE_SUBRESOURCE: |
| 248 return RequestContextType::SUBRESOURCE; |
| 249 case content::REQUEST_CONTEXT_TYPE_STYLE: |
| 250 return RequestContextType::STYLE; |
| 251 case content::REQUEST_CONTEXT_TYPE_TRACK: |
| 252 return RequestContextType::TRACK; |
| 253 case content::REQUEST_CONTEXT_TYPE_VIDEO: |
| 254 return RequestContextType::VIDEO; |
| 255 case content::REQUEST_CONTEXT_TYPE_WORKER: |
| 256 return RequestContextType::WORKER; |
| 257 case content::REQUEST_CONTEXT_TYPE_XML_HTTP_REQUEST: |
| 258 return RequestContextType::XML_HTTP_REQUEST; |
| 259 case content::REQUEST_CONTEXT_TYPE_XSLT: |
| 260 return RequestContextType::XSLT; |
| 261 } |
| 262 |
| 263 NOTREACHED(); |
| 264 return RequestContextType::UNSPECIFIED; |
| 265 } |
| 266 |
| 267 bool EnumTraits<RequestContextType, content::RequestContextType>::FromMojom( |
| 268 RequestContextType input, |
| 269 content::RequestContextType* out) { |
| 270 switch (input) { |
| 271 case RequestContextType::UNSPECIFIED: |
| 272 *out = content::REQUEST_CONTEXT_TYPE_UNSPECIFIED; |
| 273 return true; |
| 274 case RequestContextType::AUDIO: |
| 275 *out = content::REQUEST_CONTEXT_TYPE_AUDIO; |
| 276 return true; |
| 277 case RequestContextType::BEACON: |
| 278 *out = content::REQUEST_CONTEXT_TYPE_BEACON; |
| 279 return true; |
| 280 case RequestContextType::CSP_REPORT: |
| 281 *out = content::REQUEST_CONTEXT_TYPE_CSP_REPORT; |
| 282 return true; |
| 283 case RequestContextType::DOWNLOAD: |
| 284 *out = content::REQUEST_CONTEXT_TYPE_DOWNLOAD; |
| 285 return true; |
| 286 case RequestContextType::EMBED: |
| 287 *out = content::REQUEST_CONTEXT_TYPE_EMBED; |
| 288 return true; |
| 289 case RequestContextType::EVENT_SOURCE: |
| 290 *out = content::REQUEST_CONTEXT_TYPE_EVENT_SOURCE; |
| 291 return true; |
| 292 case RequestContextType::FAVICON: |
| 293 *out = content::REQUEST_CONTEXT_TYPE_FAVICON; |
| 294 return true; |
| 295 case RequestContextType::FETCH: |
| 296 *out = content::REQUEST_CONTEXT_TYPE_FETCH; |
| 297 return true; |
| 298 case RequestContextType::FONT: |
| 299 *out = content::REQUEST_CONTEXT_TYPE_FONT; |
| 300 return true; |
| 301 case RequestContextType::FORM: |
| 302 *out = content::REQUEST_CONTEXT_TYPE_FORM; |
| 303 return true; |
| 304 case RequestContextType::FRAME: |
| 305 *out = content::REQUEST_CONTEXT_TYPE_FRAME; |
| 306 return true; |
| 307 case RequestContextType::HYPERLINK: |
| 308 *out = content::REQUEST_CONTEXT_TYPE_HYPERLINK; |
| 309 return true; |
| 310 case RequestContextType::IFRAME: |
| 311 *out = content::REQUEST_CONTEXT_TYPE_IFRAME; |
| 312 return true; |
| 313 case RequestContextType::IMAGE: |
| 314 *out = content::REQUEST_CONTEXT_TYPE_IMAGE; |
| 315 return true; |
| 316 case RequestContextType::IMAGE_SET: |
| 317 *out = content::REQUEST_CONTEXT_TYPE_IMAGE_SET; |
| 318 return true; |
| 319 case RequestContextType::IMPORT: |
| 320 *out = content::REQUEST_CONTEXT_TYPE_IMPORT; |
| 321 return true; |
| 322 case RequestContextType::INTERNAL: |
| 323 *out = content::REQUEST_CONTEXT_TYPE_INTERNAL; |
| 324 return true; |
| 325 case RequestContextType::LOCATION: |
| 326 *out = content::REQUEST_CONTEXT_TYPE_LOCATION; |
| 327 return true; |
| 328 case RequestContextType::MANIFEST: |
| 329 *out = content::REQUEST_CONTEXT_TYPE_MANIFEST; |
| 330 return true; |
| 331 case RequestContextType::OBJECT: |
| 332 *out = content::REQUEST_CONTEXT_TYPE_OBJECT; |
| 333 return true; |
| 334 case RequestContextType::PING: |
| 335 *out = content::REQUEST_CONTEXT_TYPE_PING; |
| 336 return true; |
| 337 case RequestContextType::PLUGIN: |
| 338 *out = content::REQUEST_CONTEXT_TYPE_PLUGIN; |
| 339 return true; |
| 340 case RequestContextType::PREFETCH: |
| 341 *out = content::REQUEST_CONTEXT_TYPE_PREFETCH; |
| 342 return true; |
| 343 case RequestContextType::SCRIPT: |
| 344 *out = content::REQUEST_CONTEXT_TYPE_SCRIPT; |
| 345 return true; |
| 346 case RequestContextType::SERVICE_WORKER: |
| 347 *out = content::REQUEST_CONTEXT_TYPE_SERVICE_WORKER; |
| 348 return true; |
| 349 case RequestContextType::SHARED_WORKER: |
| 350 *out = content::REQUEST_CONTEXT_TYPE_SHARED_WORKER; |
| 351 return true; |
| 352 case RequestContextType::SUBRESOURCE: |
| 353 *out = content::REQUEST_CONTEXT_TYPE_SUBRESOURCE; |
| 354 return true; |
| 355 case RequestContextType::STYLE: |
| 356 *out = content::REQUEST_CONTEXT_TYPE_STYLE; |
| 357 return true; |
| 358 case RequestContextType::TRACK: |
| 359 *out = content::REQUEST_CONTEXT_TYPE_TRACK; |
| 360 return true; |
| 361 case RequestContextType::VIDEO: |
| 362 *out = content::REQUEST_CONTEXT_TYPE_VIDEO; |
| 363 return true; |
| 364 case RequestContextType::WORKER: |
| 365 *out = content::REQUEST_CONTEXT_TYPE_WORKER; |
| 366 return true; |
| 367 case RequestContextType::XML_HTTP_REQUEST: |
| 368 *out = content::REQUEST_CONTEXT_TYPE_XML_HTTP_REQUEST; |
| 369 return true; |
| 370 case RequestContextType::XSLT: |
| 371 *out = content::REQUEST_CONTEXT_TYPE_XSLT; |
| 372 return true; |
| 373 } |
| 374 |
| 375 return false; |
| 376 } |
| 377 |
| 378 ServiceWorkerFetchType |
| 379 EnumTraits<ServiceWorkerFetchType, content::ServiceWorkerFetchType>::ToMojom( |
| 380 content::ServiceWorkerFetchType input) { |
| 381 switch (input) { |
| 382 case content::ServiceWorkerFetchType::FETCH: |
| 383 return ServiceWorkerFetchType::FETCH; |
| 384 case content::ServiceWorkerFetchType::FOREIGN_FETCH: |
| 385 return ServiceWorkerFetchType::FOREIGN_FETCH; |
| 386 } |
| 387 |
| 388 NOTREACHED(); |
| 389 return ServiceWorkerFetchType::FETCH; |
| 390 } |
| 391 |
| 392 bool EnumTraits<ServiceWorkerFetchType, content::ServiceWorkerFetchType>:: |
| 393 FromMojom(ServiceWorkerFetchType input, |
| 394 content::ServiceWorkerFetchType* out) { |
| 395 switch (input) { |
| 396 case ServiceWorkerFetchType::FETCH: |
| 397 *out = content::ServiceWorkerFetchType::FETCH; |
| 398 return true; |
| 399 case ServiceWorkerFetchType::FOREIGN_FETCH: |
| 400 *out = content::ServiceWorkerFetchType::FOREIGN_FETCH; |
| 401 return true; |
| 402 } |
| 403 |
| 404 return false; |
| 405 } |
| 406 |
| 407 void* StructTraits<blink::mojom::FetchAPIRequestDataView, |
| 408 content::ServiceWorkerFetchRequest>:: |
| 409 SetUpContext(const content::ServiceWorkerFetchRequest& request) { |
| 410 ServiceWorkerFetchRequestStructTraitsContext* context = |
| 411 new ServiceWorkerFetchRequestStructTraitsContext(); |
| 412 context->headers.insert(request.headers.begin(), request.headers.end()); |
| 413 |
| 414 return context; |
| 415 } |
| 416 |
| 417 void StructTraits<blink::mojom::FetchAPIRequestDataView, |
| 418 content::ServiceWorkerFetchRequest>:: |
| 419 TearDownContext(const content::ServiceWorkerFetchRequest& request, |
| 420 void* context) { |
| 421 delete static_cast<ServiceWorkerFetchRequestStructTraitsContext*>(context); |
| 422 } |
| 423 |
| 424 const std::map<std::string, std::string>& |
| 425 StructTraits<blink::mojom::FetchAPIRequestDataView, |
| 426 content::ServiceWorkerFetchRequest>:: |
| 427 headers(const content::ServiceWorkerFetchRequest& request, void* context) { |
| 428 return static_cast<ServiceWorkerFetchRequestStructTraitsContext*>(context) |
| 429 ->headers; |
| 430 } |
| 431 |
| 432 bool StructTraits<blink::mojom::FetchAPIRequestDataView, |
| 433 content::ServiceWorkerFetchRequest>:: |
| 434 Read(blink::mojom::FetchAPIRequestDataView data, |
| 435 content::ServiceWorkerFetchRequest* out) { |
| 436 std::unordered_map<std::string, std::string> headers; |
| 437 base::Optional<std::string> blob_uuid; |
| 438 if (!data.ReadMode(&out->mode) || |
| 439 !data.ReadRequestContextType(&out->request_context_type) || |
| 440 !data.ReadFrameType(&out->frame_type) || !data.ReadUrl(&out->url) || |
| 441 !data.ReadMethod(&out->method) || !data.ReadHeaders(&headers) || |
| 442 !data.ReadBlobUuid(&blob_uuid) || !data.ReadReferrer(&out->referrer) || |
| 443 !data.ReadCredentialsMode(&out->credentials_mode) || |
| 444 !data.ReadRedirectMode(&out->redirect_mode) || |
| 445 !data.ReadClientId(&out->client_id) || |
| 446 !data.ReadFetchType(&out->fetch_type)) { |
| 447 return false; |
| 448 } |
| 449 |
| 450 out->is_main_resource_load = data.is_main_resource_load(); |
| 451 out->headers.insert(headers.begin(), headers.end()); |
| 452 if (blob_uuid) { |
| 453 out->blob_uuid = blob_uuid.value(); |
| 454 out->blob_size = data.blob_size(); |
| 455 } |
| 456 out->is_reload = data.is_reload(); |
| 457 return true; |
| 458 } |
| 459 |
| 460 } // namespace mojo |
OLD | NEW |