void V8XMLHttpRequest::openMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) { // Four cases: // open(method, url) // open(method, url, async) // open(method, url, async, user) // open(method, url, async, user, passwd) ExceptionState exceptionState(ExceptionState::ExecutionContext, "open", "XMLHttpRequest", info.Holder(), info.GetIsolate()); if (info.Length() < 2) { exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments(2, info.Length())); exceptionState.throwIfNeeded(); return; } XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toNative(info.Holder()); TOSTRING_VOID(V8StringResource<>, method, info[0]); TOSTRING_VOID(V8StringResource<>, urlstring, info[1]); ExecutionContext* context = currentExecutionContext(info.GetIsolate()); KURL url = context->completeURL(urlstring); if (info.Length() >= 3) { bool async = info[2]->BooleanValue(); if (info.Length() >= 4 && !info[3]->IsUndefined()) { TOSTRING_VOID(V8StringResource<TreatNullAsNullString>, user, info[3]); if (info.Length() >= 5 && !info[4]->IsUndefined()) { TOSTRING_VOID(V8StringResource<TreatNullAsNullString>, password, info[4]); xmlHttpRequest->open(method, url, async, user, password, exceptionState); } else { xmlHttpRequest->open(method, url, async, user, exceptionState); } } else { xmlHttpRequest->open(method, url, async, exceptionState); } } else { xmlHttpRequest->open(method, url, exceptionState); } exceptionState.throwIfNeeded(); }
v8::Handle<v8::Value> V8XMLHttpRequest::openCallback(const v8::Arguments& args) { INC_STATS("DOM.XMLHttpRequest.open()"); // Four cases: // open(method, url) // open(method, url, async) // open(method, url, async, user) // open(method, url, async, user, passwd) if (args.Length() < 2) return throwError("Not enough arguments", V8Proxy::SyntaxError); XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toNative(args.Holder()); String method = toWebCoreString(args[0]); String urlstring = toWebCoreString(args[1]); ScriptExecutionContext* context = getScriptExecutionContext(); if (!context) return v8::Undefined(); KURL url = context->completeURL(urlstring); ExceptionCode ec = 0; if (args.Length() >= 3) { bool async = args[2]->BooleanValue(); if (args.Length() >= 4 && !args[3]->IsUndefined()) { String user = toWebCoreStringWithNullCheck(args[3]); if (args.Length() >= 5 && !args[4]->IsUndefined()) { String passwd = toWebCoreStringWithNullCheck(args[4]); xmlHttpRequest->open(method, url, async, user, passwd, ec); } else xmlHttpRequest->open(method, url, async, user, ec); } else xmlHttpRequest->open(method, url, async, ec); } else xmlHttpRequest->open(method, url, ec); if (ec) return throwError(ec); return v8::Undefined(); }
v8::Handle<v8::Value> V8XMLHttpRequest::responseAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { INC_STATS("DOM.XMLHttpRequest.response._get"); XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toNative(info.Holder()); switch (xmlHttpRequest->responseTypeCode()) { case XMLHttpRequest::ResponseTypeDefault: case XMLHttpRequest::ResponseTypeText: return responseTextAccessorGetter(name, info); case XMLHttpRequest::ResponseTypeDocument: { ExceptionCode ec = 0; Document* document = xmlHttpRequest->responseXML(ec); if (ec) return V8Proxy::setDOMException(ec, info.GetIsolate()); return toV8(document, info.GetIsolate()); } case XMLHttpRequest::ResponseTypeBlob: #if ENABLE(XHR_RESPONSE_BLOB) { ExceptionCode ec = 0; Blob* blob = xmlHttpRequest->responseBlob(ec); if (ec) return V8Proxy::setDOMException(ec, info.GetIsolate()); return toV8(blob, info.GetIsolate()); } #else return v8::Undefined(); #endif case XMLHttpRequest::ResponseTypeArrayBuffer: { ExceptionCode ec = 0; ArrayBuffer* arrayBuffer = xmlHttpRequest->responseArrayBuffer(ec); if (ec) return V8Proxy::setDOMException(ec, info.GetIsolate()); return toV8(arrayBuffer, info.GetIsolate()); } } return v8::Undefined(); }
v8::Handle<v8::Value> V8XMLHttpRequest::openMethodCustom(const v8::Arguments& args) { // Four cases: // open(method, url) // open(method, url, async) // open(method, url, async, user) // open(method, url, async, user, passwd) if (args.Length() < 2) return throwNotEnoughArgumentsError(args.GetIsolate()); XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toNative(args.Holder()); String method = toWebCoreString(args[0]); String urlstring = toWebCoreString(args[1]); ScriptExecutionContext* context = getScriptExecutionContext(); KURL url = context->completeURL(urlstring); ExceptionCode ec = 0; if (args.Length() >= 3) { bool async = args[2]->BooleanValue(); if (args.Length() >= 4 && !args[3]->IsUndefined()) { String user = toWebCoreStringWithNullCheck(args[3]); if (args.Length() >= 5 && !args[4]->IsUndefined()) { String passwd = toWebCoreStringWithNullCheck(args[4]); xmlHttpRequest->open(method, url, async, user, passwd, ec); } else xmlHttpRequest->open(method, url, async, user, ec); } else xmlHttpRequest->open(method, url, async, ec); } else xmlHttpRequest->open(method, url, ec); if (ec) return setDOMException(ec, args.GetIsolate()); return v8::Undefined(); }
v8::Handle<v8::Value> V8XMLHttpRequest::sendCallback(const v8::Arguments& args) { INC_STATS("DOM.XMLHttpRequest.send()"); XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toNative(args.Holder()); InspectorInstrumentation::willSendXMLHttpRequest(xmlHttpRequest->scriptExecutionContext(), xmlHttpRequest->url()); ExceptionCode ec = 0; if (args.Length() < 1) xmlHttpRequest->send(ec); else { v8::Handle<v8::Value> arg = args[0]; if (isUndefinedOrNull(arg)) xmlHttpRequest->send(ec); else if (isDocumentType(arg)) { v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); Document* document = V8Document::toNative(object); ASSERT(document); xmlHttpRequest->send(document, ec); } else if (V8Blob::HasInstance(arg)) { v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); Blob* blob = V8Blob::toNative(object); ASSERT(blob); xmlHttpRequest->send(blob, ec); } else if (V8DOMFormData::HasInstance(arg)) { v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); DOMFormData* domFormData = V8DOMFormData::toNative(object); ASSERT(domFormData); xmlHttpRequest->send(domFormData, ec); #if ENABLE(WEBGL) || ENABLE(BLOB) } else if (V8ArrayBuffer::HasInstance(arg)) { v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); ArrayBuffer* arrayBuffer = V8ArrayBuffer::toNative(object); ASSERT(arrayBuffer); xmlHttpRequest->send(arrayBuffer, ec); #endif } else xmlHttpRequest->send(toWebCoreStringWithNullCheck(arg), ec); } if (ec) return throwError(ec, args.GetIsolate()); return v8::Undefined(); }
v8::Handle<v8::Value> V8XMLHttpRequest::responseAttrGetterCustom(v8::Local<v8::String> name, const v8::AccessorInfo& info) { XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toNative(info.Holder()); switch (xmlHttpRequest->responseTypeCode()) { case XMLHttpRequest::ResponseTypeDefault: case XMLHttpRequest::ResponseTypeText: return responseTextAttrGetterCustom(name, info); case XMLHttpRequest::ResponseTypeDocument: { ExceptionCode ec = 0; Document* document = xmlHttpRequest->responseXML(ec); if (ec) return setDOMException(ec, info.GetIsolate()); return toV8Fast(document, info, xmlHttpRequest); } case XMLHttpRequest::ResponseTypeBlob: { ExceptionCode ec = 0; Blob* blob = xmlHttpRequest->responseBlob(ec); if (ec) return setDOMException(ec, info.GetIsolate()); return toV8Fast(blob, info, xmlHttpRequest); } case XMLHttpRequest::ResponseTypeArrayBuffer: { ExceptionCode ec = 0; ArrayBuffer* arrayBuffer = xmlHttpRequest->responseArrayBuffer(ec); if (ec) return setDOMException(ec, info.GetIsolate()); return toV8Fast(arrayBuffer, info, xmlHttpRequest); } } return v8::Undefined(); }
void V8XMLHttpRequest::responseAttributeGetterCustom( const v8::FunctionCallbackInfo<v8::Value>& info) { XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toImpl(info.Holder()); ExceptionState exceptionState(info.GetIsolate(), ExceptionState::GetterContext, "XMLHttpRequest", "response"); switch (xmlHttpRequest->getResponseTypeCode()) { case XMLHttpRequest::ResponseTypeDefault: case XMLHttpRequest::ResponseTypeText: responseTextAttributeGetterCustom(info); return; case XMLHttpRequest::ResponseTypeJSON: { v8::Isolate* isolate = info.GetIsolate(); ScriptString jsonSource = xmlHttpRequest->responseJSONSource(); if (jsonSource.isEmpty()) { v8SetReturnValue(info, v8::Null(isolate)); return; } // Catch syntax error. Swallows an exception (when thrown) as the // spec says. https://xhr.spec.whatwg.org/#response-body v8::Local<v8::Value> json = fromJSONString( isolate, toCoreString(jsonSource.v8Value()), exceptionState); if (exceptionState.hadException()) { exceptionState.clearException(); v8SetReturnValue(info, v8::Null(isolate)); } else { v8SetReturnValue(info, json); } return; } case XMLHttpRequest::ResponseTypeDocument: { Document* document = xmlHttpRequest->responseXML(exceptionState); v8SetReturnValueFast(info, document, xmlHttpRequest); return; } case XMLHttpRequest::ResponseTypeBlob: { Blob* blob = xmlHttpRequest->responseBlob(); v8SetReturnValueFast(info, blob, xmlHttpRequest); return; } case XMLHttpRequest::ResponseTypeArrayBuffer: { DOMArrayBuffer* arrayBuffer = xmlHttpRequest->responseArrayBuffer(); v8SetReturnValueFast(info, arrayBuffer, xmlHttpRequest); return; } } }
v8::Handle<v8::Value> V8XMLHttpRequest::sendCallback(const v8::Arguments& args) { INC_STATS("DOM.XMLHttpRequest.send()"); XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toNative(args.Holder()); ExceptionCode ec = 0; if (args.Length() < 1) xmlHttpRequest->send(ec); else { v8::Handle<v8::Value> arg = args[0]; if (isUndefinedOrNull(arg)) xmlHttpRequest->send(ec); else if (isDocumentType(arg)) { v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); Document* document = V8Document::toNative(object); ASSERT(document); xmlHttpRequest->send(document, ec); } else if (V8Blob::HasInstance(arg)) { v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); Blob* blob = V8Blob::toNative(object); ASSERT(blob); xmlHttpRequest->send(blob, ec); } else if (V8DOMFormData::HasInstance(arg)) { v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); DOMFormData* domFormData = V8DOMFormData::toNative(object); ASSERT(domFormData); xmlHttpRequest->send(domFormData, ec); } else xmlHttpRequest->send(toWebCoreStringWithNullCheck(arg), ec); } if (ec) return throwError(ec); return v8::Undefined(); }
void V8XMLHttpRequest::responseAttributeGetterCustom(const v8::PropertyCallbackInfo<v8::Value>& info) { XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toNative(info.Holder()); switch (xmlHttpRequest->responseTypeCode()) { case XMLHttpRequest::ResponseTypeDefault: case XMLHttpRequest::ResponseTypeText: responseTextAttributeGetterCustom(info); return; case XMLHttpRequest::ResponseTypeJSON: { v8::Isolate* isolate = info.GetIsolate(); ScriptString jsonSource = xmlHttpRequest->responseJSONSource(); if (jsonSource.isEmpty()) { v8SetReturnValue(info, v8::Null(isolate)); return; } // Catch syntax error. v8::TryCatch exceptionCatcher; v8::Handle<v8::Value> json = v8::JSON::Parse(jsonSource.v8Value()); if (exceptionCatcher.HasCaught() || json.IsEmpty()) v8SetReturnValue(info, v8::Null(isolate)); else v8SetReturnValue(info, json); return; } case XMLHttpRequest::ResponseTypeDocument: { ExceptionState exceptionState(ExceptionState::GetterContext, "response", "XMLHttpRequest", info.Holder(), info.GetIsolate()); Document* document = xmlHttpRequest->responseXML(exceptionState); if (exceptionState.throwIfNeeded()) return; v8SetReturnValueFast(info, document, xmlHttpRequest); return; } case XMLHttpRequest::ResponseTypeBlob: { Blob* blob = xmlHttpRequest->responseBlob(); v8SetReturnValueFast(info, blob, xmlHttpRequest); return; } case XMLHttpRequest::ResponseTypeLegacyStream: { Stream* stream = xmlHttpRequest->responseLegacyStream(); v8SetReturnValueFast(info, stream, xmlHttpRequest); return; } case XMLHttpRequest::ResponseTypeStream: { ReadableStream* stream = xmlHttpRequest->responseStream(); v8SetReturnValueFast(info, stream, xmlHttpRequest); return; } case XMLHttpRequest::ResponseTypeArrayBuffer: { ArrayBuffer* arrayBuffer = xmlHttpRequest->responseArrayBuffer(); if (arrayBuffer) { arrayBuffer->setDeallocationObserver(V8ArrayBufferDeallocationObserver::instanceTemplate()); } v8SetReturnValueFast(info, arrayBuffer, xmlHttpRequest); return; } } }
void V8XMLHttpRequest::responseAttributeGetterCustom(const v8::PropertyCallbackInfo<v8::Value>& info) { XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toImpl(info.Holder()); switch (xmlHttpRequest->responseTypeCode()) { case XMLHttpRequest::ResponseTypeDefault: case XMLHttpRequest::ResponseTypeText: responseTextAttributeGetterCustom(info); return; case XMLHttpRequest::ResponseTypeJSON: { v8::Isolate* isolate = info.GetIsolate(); ScriptString jsonSource = xmlHttpRequest->responseJSONSource(); if (jsonSource.isEmpty()) { v8SetReturnValue(info, v8::Null(isolate)); return; } // Catch syntax error. Swallows an exception (when thrown) as the // spec says. https://xhr.spec.whatwg.org/#response-body v8::TryCatch exceptionCatcher; v8::Local<v8::Value> json; if (v8Call(v8::JSON::Parse(isolate, jsonSource.v8Value()), json, exceptionCatcher)) v8SetReturnValue(info, json); else v8SetReturnValue(info, v8::Null(isolate)); return; } case XMLHttpRequest::ResponseTypeDocument: { ExceptionState exceptionState(ExceptionState::GetterContext, "response", "XMLHttpRequest", info.Holder(), info.GetIsolate()); Document* document = xmlHttpRequest->responseXML(exceptionState); if (exceptionState.throwIfNeeded()) return; v8SetReturnValueFast(info, document, xmlHttpRequest); return; } case XMLHttpRequest::ResponseTypeBlob: { Blob* blob = xmlHttpRequest->responseBlob(); v8SetReturnValueFast(info, blob, xmlHttpRequest); return; } case XMLHttpRequest::ResponseTypeLegacyStream: { Stream* stream = xmlHttpRequest->responseLegacyStream(); v8SetReturnValueFast(info, stream, xmlHttpRequest); return; } case XMLHttpRequest::ResponseTypeStream: { ReadableStream* stream = xmlHttpRequest->responseStream(); v8SetReturnValueFast(info, stream, xmlHttpRequest); return; } case XMLHttpRequest::ResponseTypeArrayBuffer: { DOMArrayBuffer* arrayBuffer = xmlHttpRequest->responseArrayBuffer(); v8SetReturnValueFast(info, arrayBuffer, xmlHttpRequest); return; } } }
v8::Handle<v8::Value> V8XMLHttpRequest::responseTextAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { INC_STATS("DOM.XMLHttpRequest.responsetext._get"); XMLHttpRequest* xmlHttpRequest = V8XMLHttpRequest::toNative(info.Holder()); return xmlHttpRequest->responseText().v8StringOrNull(); }