Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(203)

Side by Side Diff: third_party/WebKit/Source/modules/fetch/RequestInit.cpp

Issue 2691513002: Fetch: Make Headers' constructor match the current spec IDL. (Closed)
Patch Set: Rebase again Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/fetch/RequestInit.h" 5 #include "modules/fetch/RequestInit.h"
6 6
7 #include "bindings/core/v8/Dictionary.h" 7 #include "bindings/core/v8/Dictionary.h"
8 #include "bindings/core/v8/V8ArrayBuffer.h" 8 #include "bindings/core/v8/V8ArrayBuffer.h"
9 #include "bindings/core/v8/V8ArrayBufferView.h" 9 #include "bindings/core/v8/V8ArrayBufferView.h"
10 #include "bindings/core/v8/V8Binding.h" 10 #include "bindings/core/v8/V8Binding.h"
11 #include "bindings/core/v8/V8Blob.h" 11 #include "bindings/core/v8/V8Blob.h"
12 #include "bindings/core/v8/V8FormData.h" 12 #include "bindings/core/v8/V8FormData.h"
13 #include "bindings/core/v8/V8URLSearchParams.h" 13 #include "bindings/core/v8/V8URLSearchParams.h"
14 #include "bindings/modules/v8/ByteStringSequenceSequenceOrByteStringByteStringRe cordOrHeaders.h"
14 #include "bindings/modules/v8/V8PasswordCredential.h" 15 #include "bindings/modules/v8/V8PasswordCredential.h"
15 #include "core/dom/URLSearchParams.h" 16 #include "core/dom/URLSearchParams.h"
16 #include "core/fileapi/Blob.h" 17 #include "core/fileapi/Blob.h"
17 #include "core/html/FormData.h" 18 #include "core/html/FormData.h"
18 #include "modules/fetch/BlobBytesConsumer.h" 19 #include "modules/fetch/BlobBytesConsumer.h"
19 #include "modules/fetch/FormDataBytesConsumer.h" 20 #include "modules/fetch/FormDataBytesConsumer.h"
20 #include "modules/fetch/Headers.h" 21 #include "modules/fetch/Headers.h"
21 #include "platform/RuntimeEnabledFeatures.h" 22 #include "platform/RuntimeEnabledFeatures.h"
22 #include "platform/blob/BlobData.h" 23 #include "platform/blob/BlobData.h"
23 #include "platform/network/EncodedFormData.h" 24 #include "platform/network/EncodedFormData.h"
24 #include "platform/weborigin/ReferrerPolicy.h" 25 #include "platform/weborigin/ReferrerPolicy.h"
25 26
26 namespace blink { 27 namespace blink {
27 28
28 // TODO(yiyix): Verify if any DictionaryHelper::get should be replaced with 29 // TODO(yiyix): Verify if any DictionaryHelper::get should be replaced with
29 // DictionaryHelper::getWithUndefinedCheck. 30 // DictionaryHelper::getWithUndefinedCheck.
30 RequestInit::RequestInit(ExecutionContext* context, 31 RequestInit::RequestInit(ExecutionContext* context,
31 const Dictionary& options, 32 const Dictionary& options,
32 ExceptionState& exception_state) 33 ExceptionState& exception_state)
33 : are_any_members_set(false) { 34 : are_any_members_set(false) {
34 are_any_members_set |= DictionaryHelper::Get(options, "method", method); 35 are_any_members_set |= DictionaryHelper::Get(options, "method", method);
35 are_any_members_set |= DictionaryHelper::Get(options, "headers", headers); 36
36 if (!headers) { 37 // From https://github.com/whatwg/fetch/issues/479:
37 Vector<Vector<String>> headers_vector; 38 // - undefined is the same as "this member has not been passed".
38 if (DictionaryHelper::Get(options, "headers", headers_vector, 39 // - {} means "the list of headers is empty", so the member has been set.
39 exception_state)) { 40 // - null is an invalid value for both sequences and records, but it is not
40 headers = Headers::Create(headers_vector, exception_state); 41 // the same as undefined: a value has been set, even if invalid, and will
41 are_any_members_set = true; 42 // throw a TypeError later when it gets converted to a HeadersInit object.
42 } else { 43 v8::Local<v8::Value> v8_headers;
43 are_any_members_set |= 44 bool is_header_set = DictionaryHelper::Get(options, "headers", v8_headers) &&
44 DictionaryHelper::Get(options, "headers", headers_dictionary); 45 !v8_headers->IsUndefined();
45 } 46 are_any_members_set |= is_header_set;
46 } 47
47 are_any_members_set |= DictionaryHelper::Get(options, "mode", mode); 48 are_any_members_set |= DictionaryHelper::Get(options, "mode", mode);
48 are_any_members_set |= DictionaryHelper::Get(options, "redirect", redirect); 49 are_any_members_set |= DictionaryHelper::Get(options, "redirect", redirect);
49 AtomicString referrer_string; 50 AtomicString referrer_string;
50 bool is_referrer_string_set = DictionaryHelper::GetWithUndefinedCheck( 51 bool is_referrer_string_set = DictionaryHelper::GetWithUndefinedCheck(
51 options, "referrer", referrer_string); 52 options, "referrer", referrer_string);
52 are_any_members_set |= is_referrer_string_set; 53 are_any_members_set |= is_referrer_string_set;
53 are_any_members_set |= DictionaryHelper::Get(options, "integrity", integrity); 54 are_any_members_set |= DictionaryHelper::Get(options, "integrity", integrity);
54 AtomicString referrer_policy_string; 55 AtomicString referrer_policy_string;
55 bool is_referrer_policy_set = 56 bool is_referrer_policy_set =
56 DictionaryHelper::Get(options, "referrerPolicy", referrer_policy_string); 57 DictionaryHelper::Get(options, "referrerPolicy", referrer_policy_string);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 referrer.referrer_policy = 95 referrer.referrer_policy =
95 kReferrerPolicyNoReferrerWhenDowngradeOriginWhenCrossOrigin; 96 kReferrerPolicyNoReferrerWhenDowngradeOriginWhenCrossOrigin;
96 } else { 97 } else {
97 exception_state.ThrowTypeError("Invalid referrer policy"); 98 exception_state.ThrowTypeError("Invalid referrer policy");
98 return; 99 return;
99 } 100 }
100 } 101 }
101 } 102 }
102 103
103 v8::Isolate* isolate = ToIsolate(context); 104 v8::Isolate* isolate = ToIsolate(context);
105
106 if (is_header_set) {
107 ByteStringSequenceSequenceOrByteStringByteStringRecordOrHeaders
108 headers_init;
109 V8ByteStringSequenceSequenceOrByteStringByteStringRecordOrHeaders::toImpl(
110 isolate, v8_headers, headers_init,
111 UnionTypeConversionMode::kNotNullable, exception_state);
112 if (exception_state.HadException())
113 return;
114 headers = Headers::Create(headers_init, exception_state);
115 if (exception_state.HadException())
116 return;
117 }
118
104 if (is_credential_set) { 119 if (is_credential_set) {
105 if (V8PasswordCredential::hasInstance(v8_credential, isolate)) { 120 if (V8PasswordCredential::hasInstance(v8_credential, isolate)) {
106 // TODO(mkwst): According to the spec, we'd serialize this once we touch 121 // TODO(mkwst): According to the spec, we'd serialize this once we touch
107 // the network. We're serializing it here, ahead of time, because lifetime 122 // the network. We're serializing it here, ahead of time, because lifetime
108 // issues around ResourceRequest make it pretty difficult to pass a 123 // issues around ResourceRequest make it pretty difficult to pass a
109 // PasswordCredential around at the platform level, and the hop between 124 // PasswordCredential around at the platform level, and the hop between
110 // the browser and renderer processes to deal with service workers is 125 // the browser and renderer processes to deal with service workers is
111 // equally painful. There should be no developer-visible difference in 126 // equally painful. There should be no developer-visible difference in
112 // behavior with this option, except that the `Content-Type` header will 127 // behavior with this option, except that the `Content-Type` header will
113 // be set early. That seems reasonable. 128 // be set early. That seems reasonable.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 AtomicString("application/x-www-form-urlencoded;charset=UTF-8"); 166 AtomicString("application/x-www-form-urlencoded;charset=UTF-8");
152 body = new FormDataBytesConsumer(context, form_data.Release()); 167 body = new FormDataBytesConsumer(context, form_data.Release());
153 } else if (v8_body->IsString()) { 168 } else if (v8_body->IsString()) {
154 content_type = "text/plain;charset=UTF-8"; 169 content_type = "text/plain;charset=UTF-8";
155 body = new FormDataBytesConsumer( 170 body = new FormDataBytesConsumer(
156 ToUSVString(isolate, v8_body, exception_state)); 171 ToUSVString(isolate, v8_body, exception_state));
157 } 172 }
158 } 173 }
159 174
160 } // namespace blink 175 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/modules/fetch/RequestInit.h ('k') | third_party/WebKit/Source/modules/fetch/Response.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698