Index: third_party/WebKit/Source/modules/fetch/RequestInit.cpp |
diff --git a/third_party/WebKit/Source/modules/fetch/RequestInit.cpp b/third_party/WebKit/Source/modules/fetch/RequestInit.cpp |
index d041edfe7fea8d2b159ffa404c6bfe196be9a3dc..f72060554b125a210782450a949120e85c2185e6 100644 |
--- a/third_party/WebKit/Source/modules/fetch/RequestInit.cpp |
+++ b/third_party/WebKit/Source/modules/fetch/RequestInit.cpp |
@@ -12,8 +12,11 @@ |
#include "bindings/core/v8/V8Blob.h" |
#include "bindings/core/v8/V8FormData.h" |
#include "bindings/core/v8/V8URLSearchParams.h" |
+#include "bindings/modules/v8/V8PasswordCredential.h" |
+#include "core/dom/URLSearchParams.h" |
#include "core/fileapi/Blob.h" |
#include "core/html/FormData.h" |
+#include "modules/credentialmanager/PasswordCredential.h" |
#include "modules/fetch/FetchBlobDataConsumerHandle.h" |
#include "modules/fetch/FetchFormDataConsumerHandle.h" |
#include "modules/fetch/Headers.h" |
@@ -25,6 +28,7 @@ namespace blink { |
RequestInit::RequestInit(ExecutionContext* context, const Dictionary& options, ExceptionState& exceptionState) |
: areAnyMembersSet(false) |
+ , isCredentialRequest(false) |
{ |
areAnyMembersSet = DictionaryHelper::get(options, "method", method) || areAnyMembersSet; |
areAnyMembersSet = DictionaryHelper::get(options, "headers", headers) || areAnyMembersSet; |
@@ -83,6 +87,18 @@ RequestInit::RequestInit(ExecutionContext* context, const Dictionary& options, E |
RefPtr<EncodedFormData> formData = V8URLSearchParams::toImpl(v8::Local<v8::Object>::Cast(v8Body))->encodeFormData(); |
contentType = AtomicString("application/x-www-form-urlencoded;charset=UTF-8", AtomicString::ConstructFromLiteral); |
body = FetchFormDataConsumerHandle::create(context, formData.release()); |
+ } else if (V8PasswordCredential::hasInstance(v8Body, isolate)) { |
+ // See https://w3c.github.io/webappsec-credential-management/#monkey-patching-fetch-4 |
+ // and https://w3c.github.io/webappsec-credential-management/#monkey-patching-fetch-3 |
+ isCredentialRequest = true; |
+ PasswordCredential* credential = V8PasswordCredential::toImpl(v8::Local<v8::Object>::Cast(v8Body)); |
+ |
+ RefPtr<EncodedFormData> encodedData = credential->encodeFormData(); |
+ if (encodedData->boundary().isEmpty()) |
+ contentType = AtomicString("application/x-www-form-urlencoded;charset=UTF-8", AtomicString::ConstructFromLiteral); |
+ else |
+ contentType = AtomicString("multipart/form-data; boundary=", AtomicString::ConstructFromLiteral) + encodedData->boundary().data(); |
+ body = FetchFormDataConsumerHandle::create(context, encodedData.release()); |
} else if (v8Body->IsString()) { |
contentType = "text/plain;charset=UTF-8"; |
body = FetchFormDataConsumerHandle::create(toUSVString(isolate, v8Body, exceptionState)); |