Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Unified Diff: Source/core/xml/XMLHttpRequest.cpp

Issue 18883002: Add Streams API support to XMLHttpRequest (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: kinuko's comment Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/xml/XMLHttpRequest.h ('k') | Source/core/xml/XMLHttpRequest.idl » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/xml/XMLHttpRequest.cpp
diff --git a/Source/core/xml/XMLHttpRequest.cpp b/Source/core/xml/XMLHttpRequest.cpp
index 71627ee6f45e57e2cc2395ef4415db2cb27693a3..402491b01e679dc5a3deee0069fb3726463d41be 100644
--- a/Source/core/xml/XMLHttpRequest.cpp
+++ b/Source/core/xml/XMLHttpRequest.cpp
@@ -24,6 +24,7 @@
#include "core/xml/XMLHttpRequest.h"
#include "FetchInitiatorTypeNames.h"
+#include "RuntimeEnabledFeatures.h"
#include "bindings/v8/ExceptionMessages.h"
#include "bindings/v8/ExceptionState.h"
#include "core/dom/ContextFeatures.h"
@@ -36,6 +37,7 @@
#include "core/fetch/TextResourceDecoder.h"
#include "core/fileapi/Blob.h"
#include "core/fileapi/File.h"
+#include "core/fileapi/Stream.h"
#include "core/html/DOMFormData.h"
#include "core/html/HTMLDocument.h"
#include "core/inspector/InspectorInstrumentation.h"
@@ -318,6 +320,16 @@ ArrayBuffer* XMLHttpRequest::responseArrayBuffer()
return m_responseArrayBuffer.get();
}
+Stream* XMLHttpRequest::responseStream()
+{
+ ASSERT(m_responseTypeCode == ResponseTypeStream);
+
+ if (m_error || (m_state != LOADING && m_state != DONE))
+ return 0;
+
+ return m_responseStream.get();
+}
+
void XMLHttpRequest::setTimeout(unsigned long timeout, ExceptionState& es)
{
// FIXME: Need to trigger or update the timeout Timer here, if needed. http://webkit.org/b/98156
@@ -345,20 +357,26 @@ void XMLHttpRequest::setResponseType(const String& responseType, ExceptionState&
return;
}
- if (responseType == "")
+ if (responseType == "") {
m_responseTypeCode = ResponseTypeDefault;
- else if (responseType == "text")
+ } else if (responseType == "text") {
m_responseTypeCode = ResponseTypeText;
- else if (responseType == "json")
+ } else if (responseType == "json") {
m_responseTypeCode = ResponseTypeJSON;
- else if (responseType == "document")
+ } else if (responseType == "document") {
m_responseTypeCode = ResponseTypeDocument;
- else if (responseType == "blob")
+ } else if (responseType == "blob") {
m_responseTypeCode = ResponseTypeBlob;
- else if (responseType == "arraybuffer")
+ } else if (responseType == "arraybuffer") {
m_responseTypeCode = ResponseTypeArrayBuffer;
- else
+ } else if (responseType == "stream") {
+ if (RuntimeEnabledFeatures::streamEnabled())
+ m_responseTypeCode = ResponseTypeStream;
+ else
+ return;
+ } else {
ASSERT_NOT_REACHED();
+ }
}
String XMLHttpRequest::responseType()
@@ -376,6 +394,8 @@ String XMLHttpRequest::responseType()
return "blob";
case ResponseTypeArrayBuffer:
return "arraybuffer";
+ case ResponseTypeStream:
+ return "stream";
}
return "";
}
@@ -825,15 +845,19 @@ void XMLHttpRequest::internalAbort(DropProtection async)
InspectorInstrumentation::didFailXHRLoading(scriptExecutionContext(), this);
- if (m_loader) {
- m_loader->cancel();
- m_loader = 0;
+ if (m_responseStream && m_state != DONE)
+ m_responseStream->abort();
- if (async == DropProtectionAsync)
- dropProtectionSoon();
- else
- dropProtection();
- }
+ if (!m_loader)
+ return;
+
+ m_loader->cancel();
+ m_loader = 0;
+
+ if (async == DropProtectionAsync)
+ dropProtectionSoon();
+ else
+ dropProtection();
}
void XMLHttpRequest::clearResponse()
@@ -849,6 +873,7 @@ void XMLHttpRequest::clearResponseBuffers()
m_createdDocument = false;
m_responseDocument = 0;
m_responseBlob = 0;
+ m_responseStream = 0;
m_binaryResponseBuilder.clear();
m_responseArrayBuffer.clear();
}
@@ -1096,6 +1121,9 @@ void XMLHttpRequest::didFinishLoading(unsigned long identifier, double)
if (m_decoder)
m_responseText = m_responseText.concatenateWith(m_decoder->flush());
+ if (m_responseStream)
+ m_responseStream->finalize();
+
InspectorInstrumentation::didFinishXHRLoading(scriptExecutionContext(), this, identifier, m_responseText, m_url, m_lastSendURL, m_lastSendLineNumber);
// Prevent dropProtection releasing the last reference, and retain |this| until the end of this method.
@@ -1172,13 +1200,17 @@ void XMLHttpRequest::didReceiveData(const char* data, int len)
if (len == -1)
len = strlen(data);
- if (useDecoder)
+ if (useDecoder) {
m_responseText = m_responseText.concatenateWith(m_decoder->decode(data, len));
- else if (m_responseTypeCode == ResponseTypeArrayBuffer || m_responseTypeCode == ResponseTypeBlob) {
+ } else if (m_responseTypeCode == ResponseTypeArrayBuffer || m_responseTypeCode == ResponseTypeBlob) {
// Buffer binary data.
if (!m_binaryResponseBuilder)
m_binaryResponseBuilder = SharedBuffer::create();
m_binaryResponseBuilder->append(data, len);
+ } else if (m_responseTypeCode == ResponseTypeStream) {
+ if (!m_responseStream)
+ m_responseStream = Stream::create(responseMIMEType());
+ m_responseStream->addData(data, len);
}
if (!m_error) {
« no previous file with comments | « Source/core/xml/XMLHttpRequest.h ('k') | Source/core/xml/XMLHttpRequest.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698