void XMLHttpRequest::loadRequestSynchronously(ResourceRequest& request, ExceptionCode& ec) { ASSERT(!m_async); Vector<char> data; ResourceError error; ResourceResponse response; { // avoid deadlock in case the loader wants to use JS on a background thread KJS::JSLock::DropAllLocks dropLocks; if (m_doc->frame()) m_identifier = m_doc->frame()->loader()->loadResourceSynchronously(request, error, response, data); } m_loader = 0; // No exception for file:/// resources, see <rdar://problem/4962298>. // Also, if we have an HTTP response, then it wasn't a network error in fact. if (error.isNull() || request.url().isLocalFile() || response.httpStatusCode() > 0) { processSyncLoadResults(data, response, ec); return; } if (error.isCancellation()) { abortError(); ec = XMLHttpRequestException::ABORT_ERR; return; } networkError(); ec = XMLHttpRequestException::NETWORK_ERR; }
void XMLHttpRequest::loadRequestSynchronously(ResourceRequest& request, ExceptionCode& ec) { ASSERT(!m_async); Vector<char> data; ResourceError error; ResourceResponse response; unsigned long identifier = ThreadableLoader::loadResourceSynchronously(scriptExecutionContext(), request, error, response, data); m_loader = 0; // No exception for file:/// resources, see <rdar://problem/4962298>. // Also, if we have an HTTP response, then it wasn't a network error in fact. if (error.isNull() || request.url().isLocalFile() || response.httpStatusCode() > 0) { processSyncLoadResults(identifier, data, response, ec); return; } if (error.isCancellation()) { abortError(); ec = XMLHttpRequestException::ABORT_ERR; return; } networkError(); ec = XMLHttpRequestException::NETWORK_ERR; }
void XMLHttpRequest::send(const String& body, ExceptionCode& ec) { if (!m_doc) return; if (m_state != Loading) return; // FIXME: Should this abort instead if we already have a m_job going? if (m_job) return; m_aborted = false; if (!body.isNull() && m_method != "GET" && m_method != "HEAD" && (m_url.protocol().lower() == "http" || m_url.protocol().lower() == "https")) { String contentType = getRequestHeader("Content-Type"); String charset; if (contentType.isEmpty()) setRequestHeader("Content-Type", "application/xml", ec); else charset = getCharset(contentType); if (charset.isEmpty()) charset = "UTF-8"; TextEncoding m_encoding = TextEncoding(charset.deprecatedString().latin1()); if (!m_encoding.isValid()) // FIXME: report an error? m_encoding = TextEncoding(UTF8Encoding); m_job = new TransferJob(m_async ? this : 0, m_method, m_url, m_encoding.fromUnicode(body.deprecatedString())); } else { // FIXME: HEAD requests just crash; see <rdar://4460899> and the commented out tests in http/tests/xmlhttprequest/methods.html. if (m_method == "HEAD") m_method = "GET"; m_job = new TransferJob(m_async ? this : 0, m_method, m_url); } if (m_requestHeaders.length()) m_job->addMetaData("customHTTPHeader", m_requestHeaders); if (!m_async) { Vector<char> data; KURL finalURL; DeprecatedString headers; { // avoid deadlock in case the loader wants to use JS on a background thread KJS::JSLock::DropAllLocks dropLocks; data = ServeSynchronousRequest(cache()->loader(), m_doc->docLoader(), m_job, finalURL, headers); } m_job = 0; processSyncLoadResults(data, finalURL, headers); return; } // Neither this object nor the JavaScript wrapper should be deleted while // a request is in progress because we need to keep the listeners alive, // and they are referenced by the JavaScript wrapper. ref(); { KJS::JSLock lock; gcProtectNullTolerant(KJS::ScriptInterpreter::getDOMObject(this)); } m_job->start(m_doc->docLoader()); }
void XMLHttpRequest::send(const String& body, ExceptionCode& ec) { if (!m_doc) return; if (m_state != Open) { ec = INVALID_STATE_ERR; return; } // FIXME: Should this abort or raise an exception instead if we already have a m_loader going? if (m_loader) return; m_aborted = false; ResourceRequest request(m_url); request.setHTTPMethod(m_method); if (!body.isNull() && m_method != "GET" && m_method != "HEAD" && (m_url.protocol().lower() == "http" || m_url.protocol().lower() == "https")) { String contentType = getRequestHeader("Content-Type"); if (contentType.isEmpty()) { ExceptionCode ec = 0; setRequestHeader("Content-Type", "application/xml", ec); ASSERT(ec == 0); } // FIXME: must use xmlEncoding for documents. String charset = "UTF-8"; TextEncoding m_encoding(charset); if (!m_encoding.isValid()) // FIXME: report an error? m_encoding = UTF8Encoding(); request.setHTTPBody(PassRefPtr<FormData>(new FormData(m_encoding.encode(body.characters(), body.length())))); } if (m_requestHeaders.size() > 0) request.addHTTPHeaderFields(m_requestHeaders); if (!m_async) { Vector<char> data; ResourceError error; ResourceResponse response; { // avoid deadlock in case the loader wants to use JS on a background thread #ifdef __OWB_JS__ KJS::JSLock::DropAllLocks dropLocks; if (m_doc->frame()) m_doc->frame()->loader()->loadResourceSynchronously(request, error, response, data); #endif } m_loader = 0; if (error.isNull()) processSyncLoadResults(data, response); else ec = NETWORK_ERR; return; } // Neither this object nor the JavaScript wrapper should be deleted while // a request is in progress because we need to keep the listeners alive, // and they are referenced by the JavaScript wrapper. ref(); { #ifdef __OWB_JS__ KJS::JSLock lock; gcProtectNullTolerant(KJS::ScriptInterpreter::getDOMObject(this)); #endif } // create can return null here, for example if we're no longer attached to a page. // this is true while running onunload handlers // FIXME: Maybe create can return false for other reasons too? m_loader = SubresourceLoader::create(m_doc->frame(), this, request); }