15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008, 2009, 2010 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 32d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "bindings/core/v8/V8XMLHttpRequest.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionMessages.h" 35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h" 36197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/V8Binding.h" 37d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "bindings/core/v8/V8Blob.h" 38d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "bindings/core/v8/V8Document.h" 39d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "bindings/core/v8/V8FormData.h" 40d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "bindings/core/v8/V8HTMLDocument.h" 419e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "bindings/core/v8/V8ReadableStream.h" 42d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "bindings/core/v8/V8Stream.h" 43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/custom/V8ArrayBufferCustom.h" 44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/custom/V8ArrayBufferViewCustom.h" 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h" 479e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/streams/ReadableStream.h" 48197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/streams/Stream.h" 49591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/workers/WorkerGlobalScope.h" 5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XMLHttpRequest.h" 5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/ArrayBuffer.h" 52e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include <v8.h> 53e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 54c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void V8XMLHttpRequest::constructorCustom(const v8::FunctionCallbackInfo<v8::Value>& info) 57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ExecutionContext* context = currentExecutionContext(info.GetIsolate()); 59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<SecurityOrigin> securityOrigin; 61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (context->isDocument()) { 62f5f02c98d2d694be40c6182631462fff13b4a479Ben Murdoch DOMWrapperWorld& world = DOMWrapperWorld::current(info.GetIsolate()); 63f5f02c98d2d694be40c6182631462fff13b4a479Ben Murdoch if (world.isIsolatedWorld()) 64f5f02c98d2d694be40c6182631462fff13b4a479Ben Murdoch securityOrigin = world.isolatedWorldSecurityOrigin(); 65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 67d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) RefPtrWillBeRawPtr<XMLHttpRequest> xmlHttpRequest = XMLHttpRequest::create(context, securityOrigin); 68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 6919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) v8::Handle<v8::Object> wrapper = info.Holder(); 707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci V8DOMWrapper::associateObjectWithWrapper<V8XMLHttpRequest>(xmlHttpRequest.release(), &wrapperTypeInfo, wrapper, info.GetIsolate()); 7119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) info.GetReturnValue().Set(wrapper); 72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 7419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void V8XMLHttpRequest::responseTextAttributeGetterCustom(const v8::PropertyCallbackInfo<v8::Value>& info) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toImpl(info.Holder()); 77a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) ExceptionState exceptionState(ExceptionState::GetterContext, "responseText", "XMLHttpRequest", info.Holder(), info.GetIsolate()); 78323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ScriptString text = xmlHttpRequest->responseText(exceptionState); 7951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (exceptionState.throwIfNeeded()) 805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 8110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (text.isEmpty()) { 82e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch v8SetReturnValueString(info, emptyString(), info.GetIsolate()); 83521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return; 84521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 85521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) v8SetReturnValue(info, text.v8Value()); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void V8XMLHttpRequest::responseAttributeGetterCustom(const v8::PropertyCallbackInfo<v8::Value>& info) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toImpl(info.Holder()); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (xmlHttpRequest->responseTypeCode()) { 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case XMLHttpRequest::ResponseTypeDefault: 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case XMLHttpRequest::ResponseTypeText: 9519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) responseTextAttributeGetterCustom(info); 965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 98e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) case XMLHttpRequest::ResponseTypeJSON: 99e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) { 100e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) v8::Isolate* isolate = info.GetIsolate(); 101e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 102c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) ScriptString jsonSource = xmlHttpRequest->responseJSONSource(); 103323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (jsonSource.isEmpty()) { 104a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) v8SetReturnValue(info, v8::Null(isolate)); 105e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return; 106e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 107e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 108e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // Catch syntax error. 109e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) v8::TryCatch exceptionCatcher; 110323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) v8::Handle<v8::Value> json = v8::JSON::Parse(jsonSource.v8Value()); 111e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (exceptionCatcher.HasCaught() || json.IsEmpty()) 112a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) v8SetReturnValue(info, v8::Null(isolate)); 113e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) else 114e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) v8SetReturnValue(info, json); 115e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return; 116e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 117e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case XMLHttpRequest::ResponseTypeDocument: 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 120a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) ExceptionState exceptionState(ExceptionState::GetterContext, "response", "XMLHttpRequest", info.Holder(), info.GetIsolate()); 12151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) Document* document = xmlHttpRequest->responseXML(exceptionState); 12251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (exceptionState.throwIfNeeded()) 1235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 124e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) v8SetReturnValueFast(info, document, xmlHttpRequest); 1255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case XMLHttpRequest::ResponseTypeBlob: 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 130e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) Blob* blob = xmlHttpRequest->responseBlob(); 131e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) v8SetReturnValueFast(info, blob, xmlHttpRequest); 1325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 135e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) case XMLHttpRequest::ResponseTypeLegacyStream: 1368abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) { 1379e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) Stream* stream = xmlHttpRequest->responseLegacyStream(); 1389e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) v8SetReturnValueFast(info, stream, xmlHttpRequest); 1399e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) return; 1409e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) } 1419e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) 1429e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) case XMLHttpRequest::ResponseTypeStream: 1439e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) { 1449e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) ReadableStream* stream = xmlHttpRequest->responseStream(); 1458abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) v8SetReturnValueFast(info, stream, xmlHttpRequest); 1468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return; 1478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) } 1488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case XMLHttpRequest::ResponseTypeArrayBuffer: 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 151e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) ArrayBuffer* arrayBuffer = xmlHttpRequest->responseArrayBuffer(); 15206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (arrayBuffer) { 15351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) arrayBuffer->setDeallocationObserver(V8ArrayBufferDeallocationObserver::instanceTemplate()); 15453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 155e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) v8SetReturnValueFast(info, arrayBuffer, xmlHttpRequest); 1565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void V8XMLHttpRequest::openMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Four cases: 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // open(method, url) 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // open(method, url, async) 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // open(method, url, async, user) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // open(method, url, async, user, passwd) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 169a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) ExceptionState exceptionState(ExceptionState::ExecutionContext, "open", "XMLHttpRequest", info.Holder(), info.GetIsolate()); 170a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 17119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (info.Length() < 2) { 172a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments(2, info.Length())); 173a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwIfNeeded(); 1745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 1755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toImpl(info.Holder()); 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1796f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch TOSTRING_VOID(V8StringResource<>, method, info[0]); 1806f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch TOSTRING_VOID(V8StringResource<>, urlstring, info[1]); 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ExecutionContext* context = currentExecutionContext(info.GetIsolate()); 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) KURL url = context->completeURL(urlstring); 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (info.Length() >= 3) { 18619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) bool async = info[2]->BooleanValue(); 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (info.Length() >= 4 && !info[3]->IsUndefined()) { 189197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch TOSTRING_VOID(V8StringResource<TreatNullAsNullString>, user, info[3]); 19002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 19119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (info.Length() >= 5 && !info[4]->IsUndefined()) { 192197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch TOSTRING_VOID(V8StringResource<TreatNullAsNullString>, password, info[4]); 19351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->open(method, url, async, user, password, exceptionState); 1947757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } else { 19551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->open(method, url, async, user, exceptionState); 1967757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 1977757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } else { 19851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->open(method, url, async, exceptionState); 1997757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 2007757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } else { 20151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->open(method, url, exceptionState); 2027757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) exceptionState.throwIfNeeded(); 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static bool isDocumentType(v8::Handle<v8::Value> value, v8::Isolate* isolate) 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: add other document types. 21009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return V8Document::hasInstance(value, isolate) || V8HTMLDocument::hasInstance(value, isolate); 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void V8XMLHttpRequest::sendMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toImpl(info.Holder()); 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) InspectorInstrumentation::willSendXMLHttpRequest(xmlHttpRequest->executionContext(), xmlHttpRequest->url()); 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 219a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) ExceptionState exceptionState(ExceptionState::ExecutionContext, "send", "XMLHttpRequest", info.Holder(), info.GetIsolate()); 220197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (info.Length() < 1) { 22151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(exceptionState); 222197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } else { 22319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) v8::Handle<v8::Value> arg = info[0]; 22419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (isUndefinedOrNull(arg)) { 22551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(exceptionState); 22609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else if (isDocumentType(arg, info.GetIsolate())) { 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); 2287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Document* document = V8Document::toImpl(object); 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(document); 23051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(document, exceptionState); 23109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else if (V8Blob::hasInstance(arg, info.GetIsolate())) { 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); 2337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Blob* blob = V8Blob::toImpl(object); 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(blob); 23551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(blob, exceptionState); 23609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else if (V8FormData::hasInstance(arg, info.GetIsolate())) { 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); 2387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DOMFormData* domFormData = V8FormData::toImpl(object); 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(domFormData); 24051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(domFormData, exceptionState); 24109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else if (V8ArrayBuffer::hasInstance(arg, info.GetIsolate())) { 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); 2437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(object); 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(arrayBuffer); 24551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(arrayBuffer, exceptionState); 24609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else if (V8ArrayBufferView::hasInstance(arg, info.GetIsolate())) { 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); 2487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ArrayBufferView* arrayBufferView = V8ArrayBufferView::toImpl(object); 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(arrayBufferView); 25051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(arrayBufferView, exceptionState); 25119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) } else { 252197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch TOSTRING_VOID(V8StringResource<TreatNullAsNullString>, argString, arg); 25351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(argString, exceptionState); 25419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) } 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) exceptionState.throwIfNeeded(); 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 260c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 261