Bug 611647 - Use stringbuffer when creating responseText for XMLHttpRequest, r=bz, a=benjamin

--HG--
extra : rebase_source : ad7ee03e9e6f7fe6e0ecdc9952d3896cbb942960
This commit is contained in:
Olli Pettay 2010-11-23 18:49:12 +02:00
parent e0e2698968
commit eaad6195a8

View File

@ -100,6 +100,7 @@
#include "nsIContentSecurityPolicy.h"
#include "nsAsyncRedirectVerifyHelper.h"
#include "jstypedarray.h"
#include "nsStringBuffer.h"
#define LOAD_STR "load"
#define ERROR_STR "error"
@ -1174,13 +1175,14 @@ nsXMLHttpRequest::ConvertBodyToText(nsAString& aOutBuffer)
if (NS_FAILED(rv))
return rv;
PRUnichar * outBuffer =
static_cast<PRUnichar*>(nsMemory::Alloc((outBufferLength + 1) *
sizeof(PRUnichar)));
if (!outBuffer) {
nsStringBuffer* buf =
nsStringBuffer::Alloc((outBufferLength + 1) * sizeof(PRUnichar));
if (!buf) {
return NS_ERROR_OUT_OF_MEMORY;
}
PRUnichar* outBuffer = static_cast<PRUnichar*>(buf->Data());
PRInt32 totalChars = 0,
outBufferIndex = 0,
outLen = outBufferLength;
@ -1212,10 +1214,18 @@ nsXMLHttpRequest::ConvertBodyToText(nsAString& aOutBuffer)
}
} while ( NS_FAILED(rv) && (dataLen > 0) );
mResponseBodyUnicode.Assign(outBuffer, totalChars);
// Use the string buffer if it is small, or doesn't contain
// too much extra data.
if (outBufferLength < 127 ||
(outBufferLength * 0.9) < totalChars) {
outBuffer[totalChars] = PRUnichar(0);
// Move ownership to mResponseBodyUnicode.
buf->ToString(totalChars, mResponseBodyUnicode, PR_TRUE);
} else {
mResponseBodyUnicode.Assign(outBuffer, totalChars);
buf->Release();
}
aOutBuffer = mResponseBodyUnicode;
nsMemory::Free(outBuffer);
return NS_OK;
}