📄 xmlhttprequest.cpp
字号:
}#endif qObject->connect( job, SIGNAL( result( KIO::Job* ) ), SLOT( slotFinished( KIO::Job* ) ) );#if APPLE_CHANGES qObject->connect( job, SIGNAL( data( KIO::Job*, const char*, int ) ), SLOT( slotData( KIO::Job*, const char*, int ) ) );#else qObject->connect( job, SIGNAL( data( KIO::Job*, const QByteArray& ) ), SLOT( slotData( KIO::Job*, const QByteArray& ) ) );#endif qObject->connect( job, SIGNAL(redirection(KIO::Job*, const KURL& ) ), SLOT( slotRedirection(KIO::Job*, const KURL&) ) );#ifdef APPLE_CHANGES KWQServeRequest(khtml::Cache::loader(), doc->docLoader(), job);#else KIO::Scheduler::scheduleJob( job );#endif}void XMLHttpRequest::abort(){ if (job) { job->kill(); job = 0; } if (decoder) { decoder->deref(); decoder = 0; } aborted = true;}void XMLHttpRequest::setRequestHeader(const QString& name, const QString &value){ if (requestHeaders.length() > 0) { requestHeaders += "\r\n"; } requestHeaders += name; requestHeaders += ": "; requestHeaders += value;}Value XMLHttpRequest::getAllResponseHeaders() const{ if (responseHeaders.isEmpty()) { return Undefined(); } int endOfLine = responseHeaders.find("\n"); if (endOfLine == -1) { return Undefined(); } return String(responseHeaders.mid(endOfLine + 1) + "\n");}Value XMLHttpRequest::getResponseHeader(const QString& name) const{ if (responseHeaders.isEmpty()) { return Undefined(); } QRegExp headerLinePattern(name + ":", false); int matchLength; int headerLinePos = headerLinePattern.match(responseHeaders, 0, &matchLength); while (headerLinePos != -1) { if (headerLinePos == 0 || responseHeaders[headerLinePos-1] == '\n') { break; } headerLinePos = headerLinePattern.match(responseHeaders, headerLinePos + 1, &matchLength); } if (headerLinePos == -1) { return Undefined(); } int endOfLine = responseHeaders.find("\n", headerLinePos + matchLength); return String(responseHeaders.mid(headerLinePos + matchLength, endOfLine - (headerLinePos + matchLength)).stripWhiteSpace());}Value XMLHttpRequest::getStatus() const{ if (responseHeaders.isEmpty()) { return Undefined(); } int endOfLine = responseHeaders.find("\n"); QString firstLine = endOfLine == -1 ? responseHeaders : responseHeaders.left(endOfLine); int codeStart = firstLine.find(" "); int codeEnd = firstLine.find(" ", codeStart + 1); if (codeStart == -1 || codeEnd == -1) { return Undefined(); } QString number = firstLine.mid(codeStart + 1, codeEnd - (codeStart + 1)); bool ok = false; int code = number.toInt(&ok); if (!ok) { return Undefined(); } return Number(code);}Value XMLHttpRequest::getStatusText() const{ if (responseHeaders.isEmpty()) { return Undefined(); } int endOfLine = responseHeaders.find("\n"); QString firstLine = endOfLine == -1 ? responseHeaders : responseHeaders.left(endOfLine); int codeStart = firstLine.find(" "); int codeEnd = firstLine.find(" ", codeStart + 1); if (codeStart == -1 || codeEnd == -1) { return Undefined(); } QString statusText = firstLine.mid(codeEnd + 1, endOfLine - (codeEnd + 1)).stripWhiteSpace(); return String(statusText);}#if APPLE_CHANGES void XMLHttpRequest::processSyncLoadResults(const QByteArray &data, const KURL &finalURL, const QString &headers){ if (!urlMatchesDocumentDomain(finalURL)) { abort(); return; } responseHeaders = headers; changeState(Loaded); if (aborted) { return; } const char *bytes = (const char *)data.data(); int len = (int)data.size(); slotData(0, bytes, len); if (aborted) { return; } slotFinished(0);}#endifvoid XMLHttpRequest::slotFinished(KIO::Job *){ if (decoder) { response += decoder->flush(); } changeState(Completed); job = 0; if (decoder) { decoder->deref(); decoder = 0; }}void XMLHttpRequest::slotRedirection(KIO::Job*, const KURL& url){ if (!urlMatchesDocumentDomain(url)) { abort(); }}#if APPLE_CHANGESvoid XMLHttpRequest::slotData( KIO::Job*, const char *data, int len )#elsevoid XMLHttpRequest::slotData(KIO::Job*, const QByteArray &_data)#endif{ if (state < Loaded) { responseHeaders = job->queryMetaData("HTTP-Headers"); changeState(Loaded); } #if !APPLE_CHANGES const char *data = (const char *)_data.data(); int len = (int)_data.size();#endif if ( decoder == NULL ) { decoder = new Decoder; if (!encoding.isNull()) decoder->setEncoding(encoding.latin1(), Decoder::EncodingFromHTTPHeader); else { // FIXME: Inherit the default encoding from the parent document? } } if (len == 0) return; if (len == -1) len = strlen(data); QString decoded = decoder->decode(data, len); response += decoded; if (!aborted) { changeState(Interactive); }}Value XMLHttpRequestProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args){ if (!thisObj.inherits(&XMLHttpRequest::info)) { Object err = Error::create(exec,TypeError); exec->setException(err); return err; } XMLHttpRequest *request = static_cast<XMLHttpRequest *>(thisObj.imp()); switch (id) { case XMLHttpRequest::Abort: request->abort(); return Undefined(); case XMLHttpRequest::GetAllResponseHeaders: if (args.size() != 0) { return Undefined(); } return request->getAllResponseHeaders(); case XMLHttpRequest::GetResponseHeader: if (args.size() != 1) { return Undefined(); } return request->getResponseHeader(args[0].toString(exec).qstring()); case XMLHttpRequest::Open: { if (args.size() < 2 || args.size() > 5) { return Undefined(); } QString method = args[0].toString(exec).qstring(); KURL url = KURL(Window::retrieveActive(exec)->part()->document().completeURL(args[1].toString(exec).qstring()).string()); bool async = true; if (args.size() >= 3) { async = args[2].toBoolean(exec); } if (args.size() >= 4) { url.setUser(args[3].toString(exec).qstring()); } if (args.size() >= 5) { url.setPass(args[4].toString(exec).qstring()); } request->open(method, url, async); return Undefined(); } case XMLHttpRequest::Send: { if (args.size() > 1) { return Undefined(); } if (request->state != Loading) { return Undefined(); } QString body; if (args.size() >= 1) { if (args[0].toObject(exec).inherits(&DOMDocument::info)) { DOM::Node docNode = static_cast<KJS::DOMDocument *>(args[0].toObject(exec).imp())->toNode(); DOM::DocumentImpl *doc = static_cast<DOM::DocumentImpl *>(docNode.handle());#if KHTML_NO_EXCEPTIONS DOM::_exceptioncode = 0; body = doc->toString().string(); // FIXME: also need to set content type, including encoding! if (DOM::_exceptioncode){ Object err = Error::create(exec, GeneralError, "Exception serializing document"); exec->setException(err); }#else try { body = doc->toString().string(); // FIXME: also need to set content type, including encoding! } catch(DOM::DOMException& e) { Object err = Error::create(exec, GeneralError, "Exception serializing document"); exec->setException(err); }#endif } else { // converting certain values (like null) to object can set an exception exec->clearException(); body = args[0].toString(exec).qstring(); } } request->send(body); return Undefined(); } case XMLHttpRequest::SetRequestHeader: if (args.size() != 2) { return Undefined(); } request->setRequestHeader(args[0].toString(exec).qstring(), args[1].toString(exec).qstring()); return Undefined(); case XMLHttpRequest::OverrideMIMEType: if (args.size() != 1) { return Undefined(); } request->MIMETypeOverride = args[0].toString(exec).qstring(); return Undefined(); } return Undefined();}}; // end namespace
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -