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) 34d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "bindings/core/v8/V8Blob.h" 35d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "bindings/core/v8/V8Document.h" 36d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "bindings/core/v8/V8FormData.h" 37d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "bindings/core/v8/V8HTMLDocument.h" 38d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "bindings/core/v8/V8Stream.h" 39f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "bindings/v8/ExceptionMessages.h" 407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "bindings/v8/ExceptionState.h" 4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/V8Binding.h" 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/custom/V8ArrayBufferCustom.h" 433c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "bindings/v8/custom/V8ArrayBufferViewCustom.h" 4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 458abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/fileapi/Stream.h" 4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h" 47591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/workers/WorkerGlobalScope.h" 4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XMLHttpRequest.h" 4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/ArrayBuffer.h" 50e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include <v8.h> 51e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void V8XMLHttpRequest::constructorCustom(const v8::FunctionCallbackInfo<v8::Value>& info) 55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ExecutionContext* context = currentExecutionContext(info.GetIsolate()); 57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<SecurityOrigin> securityOrigin; 59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (context->isDocument()) { 60f5f02c98d2d694be40c6182631462fff13b4a479Ben Murdoch DOMWrapperWorld& world = DOMWrapperWorld::current(info.GetIsolate()); 61f5f02c98d2d694be40c6182631462fff13b4a479Ben Murdoch if (world.isIsolatedWorld()) 62f5f02c98d2d694be40c6182631462fff13b4a479Ben Murdoch securityOrigin = world.isolatedWorldSecurityOrigin(); 63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) RefPtrWillBeRawPtr<XMLHttpRequest> xmlHttpRequest = XMLHttpRequest::create(context, securityOrigin); 66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 6719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) v8::Handle<v8::Object> wrapper = info.Holder(); 6819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) V8DOMWrapper::associateObjectWithWrapper<V8XMLHttpRequest>(xmlHttpRequest.release(), &wrapperTypeInfo, wrapper, info.GetIsolate(), WrapperConfiguration::Dependent); 6919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) info.GetReturnValue().Set(wrapper); 70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 7219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void V8XMLHttpRequest::responseTextAttributeGetterCustom(const v8::PropertyCallbackInfo<v8::Value>& info) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toNative(info.Holder()); 75a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) ExceptionState exceptionState(ExceptionState::GetterContext, "responseText", "XMLHttpRequest", info.Holder(), info.GetIsolate()); 76323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ScriptString text = xmlHttpRequest->responseText(exceptionState); 7751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (exceptionState.throwIfNeeded()) 785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 7910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (text.isEmpty()) { 80e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch v8SetReturnValueString(info, emptyString(), info.GetIsolate()); 81521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return; 82521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 83521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) v8SetReturnValue(info, text.v8Value()); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void V8XMLHttpRequest::responseAttributeGetterCustom(const v8::PropertyCallbackInfo<v8::Value>& info) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toNative(info.Holder()); 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (xmlHttpRequest->responseTypeCode()) { 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case XMLHttpRequest::ResponseTypeDefault: 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case XMLHttpRequest::ResponseTypeText: 9319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) responseTextAttributeGetterCustom(info); 945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 96e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) case XMLHttpRequest::ResponseTypeJSON: 97e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) { 98e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) v8::Isolate* isolate = info.GetIsolate(); 99e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 100c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) ScriptString jsonSource = xmlHttpRequest->responseJSONSource(); 101323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (jsonSource.isEmpty()) { 102a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) v8SetReturnValue(info, v8::Null(isolate)); 103e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return; 104e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 105e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 106e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // Catch syntax error. 107e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) v8::TryCatch exceptionCatcher; 108323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) v8::Handle<v8::Value> json = v8::JSON::Parse(jsonSource.v8Value()); 109e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (exceptionCatcher.HasCaught() || json.IsEmpty()) 110a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) v8SetReturnValue(info, v8::Null(isolate)); 111e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) else 112e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) v8SetReturnValue(info, json); 113e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return; 114e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 115e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case XMLHttpRequest::ResponseTypeDocument: 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 118a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) ExceptionState exceptionState(ExceptionState::GetterContext, "response", "XMLHttpRequest", info.Holder(), info.GetIsolate()); 11951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) Document* document = xmlHttpRequest->responseXML(exceptionState); 12051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (exceptionState.throwIfNeeded()) 1215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 122e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) v8SetReturnValueFast(info, document, xmlHttpRequest); 1235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case XMLHttpRequest::ResponseTypeBlob: 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 128e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) Blob* blob = xmlHttpRequest->responseBlob(); 129e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) v8SetReturnValueFast(info, blob, xmlHttpRequest); 1305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1338abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) case XMLHttpRequest::ResponseTypeStream: 1348abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) { 1358abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) Stream* stream = xmlHttpRequest->responseStream(); 1368abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) v8SetReturnValueFast(info, stream, xmlHttpRequest); 1378abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return; 1388abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) } 1398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case XMLHttpRequest::ResponseTypeArrayBuffer: 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 142e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) ArrayBuffer* arrayBuffer = xmlHttpRequest->responseArrayBuffer(); 14306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (arrayBuffer) { 14451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) arrayBuffer->setDeallocationObserver(V8ArrayBufferDeallocationObserver::instanceTemplate()); 14553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 146e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) v8SetReturnValueFast(info, arrayBuffer, xmlHttpRequest); 1475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void V8XMLHttpRequest::openMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Four cases: 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // open(method, url) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // open(method, url, async) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // open(method, url, async, user) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // open(method, url, async, user, passwd) 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 160a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) ExceptionState exceptionState(ExceptionState::ExecutionContext, "open", "XMLHttpRequest", info.Holder(), info.GetIsolate()); 161a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 16219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (info.Length() < 2) { 163a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments(2, info.Length())); 164a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwIfNeeded(); 1655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 1665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toNative(info.Holder()); 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1706f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch TOSTRING_VOID(V8StringResource<>, method, info[0]); 1716f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch TOSTRING_VOID(V8StringResource<>, urlstring, info[1]); 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ExecutionContext* context = currentExecutionContext(info.GetIsolate()); 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) KURL url = context->completeURL(urlstring); 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (info.Length() >= 3) { 17719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) bool async = info[2]->BooleanValue(); 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (info.Length() >= 4 && !info[3]->IsUndefined()) { 1806f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch TOSTRING_VOID(V8StringResource<WithNullCheck>, user, info[3]); 18102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 18219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (info.Length() >= 5 && !info[4]->IsUndefined()) { 1836f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch TOSTRING_VOID(V8StringResource<WithNullCheck>, password, info[4]); 18451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->open(method, url, async, user, password, exceptionState); 1857757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } else { 18651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->open(method, url, async, user, exceptionState); 1877757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 1887757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } else { 18951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->open(method, url, async, exceptionState); 1907757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 1917757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } else { 19251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->open(method, url, exceptionState); 1937757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) exceptionState.throwIfNeeded(); 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static bool isDocumentType(v8::Handle<v8::Value> value, v8::Isolate* isolate) 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: add other document types. 20109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return V8Document::hasInstance(value, isolate) || V8HTMLDocument::hasInstance(value, isolate); 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void V8XMLHttpRequest::sendMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 20619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toNative(info.Holder()); 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) InspectorInstrumentation::willSendXMLHttpRequest(xmlHttpRequest->executionContext(), xmlHttpRequest->url()); 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 210a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) ExceptionState exceptionState(ExceptionState::ExecutionContext, "send", "XMLHttpRequest", info.Holder(), info.GetIsolate()); 21119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (info.Length() < 1) 21251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(exceptionState); 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else { 21419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) v8::Handle<v8::Value> arg = info[0]; 21519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (isUndefinedOrNull(arg)) { 21651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(exceptionState); 21709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else if (isDocumentType(arg, info.GetIsolate())) { 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Document* document = V8Document::toNative(object); 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(document); 22151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(document, exceptionState); 22209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else if (V8Blob::hasInstance(arg, info.GetIsolate())) { 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Blob* blob = V8Blob::toNative(object); 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(blob); 22651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(blob, exceptionState); 22709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else if (V8FormData::hasInstance(arg, info.GetIsolate())) { 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); 229e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) DOMFormData* domFormData = V8FormData::toNative(object); 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(domFormData); 23151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(domFormData, exceptionState); 23209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else if (V8ArrayBuffer::hasInstance(arg, info.GetIsolate())) { 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ArrayBuffer* arrayBuffer = V8ArrayBuffer::toNative(object); 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(arrayBuffer); 23651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(arrayBuffer, exceptionState); 23709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else if (V8ArrayBufferView::hasInstance(arg, info.GetIsolate())) { 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ArrayBufferView* arrayBufferView = V8ArrayBufferView::toNative(object); 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(arrayBufferView); 24151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(arrayBufferView, exceptionState); 24219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) } else { 2436f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch TOSTRING_VOID(V8StringResource<WithNullCheck>, argString, arg); 24451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) xmlHttpRequest->send(argString, exceptionState); 24519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) } 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) exceptionState.throwIfNeeded(); 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 252