Bug 1591579 - Move ResponseData JS objects and Blob from XMLHttpRequestWorker::ResponseData to XMLHttpRequestWorker, r=smaug

Differential Revision: https://phabricator.services.mozilla.com/D51650

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Andrea Marchesini 2019-11-04 17:46:23 +00:00
Родитель 987e7faf8e
Коммит 815d827202
2 изменённых файлов: 36 добавлений и 49 удалений

Просмотреть файл

@ -44,27 +44,6 @@
namespace mozilla { namespace mozilla {
namespace dom { namespace dom {
void XMLHttpRequestWorker::ResponseData::Unlink() {
mResponseBlobImpl = nullptr;
mResponseBlob = nullptr;
mResponseArrayBufferBuilder = nullptr;
mResponseArrayBufferValue = nullptr;
mResponseJSONValue.setUndefined();
}
void XMLHttpRequestWorker::ResponseData::Trace(const TraceCallbacks& aCallbacks,
void* aClosure) {
ResponseData* tmp = this;
NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mResponseArrayBufferValue)
NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mResponseJSONValue)
}
void XMLHttpRequestWorker::ResponseData::Traverse(
nsCycleCollectionTraversalCallback& cb) {
ResponseData* tmp = this;
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mResponseBlob)
}
/** /**
* XMLHttpRequest in workers * XMLHttpRequest in workers
* *
@ -1381,8 +1360,10 @@ void SendRunnable::RunOnMainThread(ErrorResult& aRv) {
XMLHttpRequestWorker::XMLHttpRequestWorker(WorkerPrivate* aWorkerPrivate) XMLHttpRequestWorker::XMLHttpRequestWorker(WorkerPrivate* aWorkerPrivate)
: mWorkerPrivate(aWorkerPrivate), : mWorkerPrivate(aWorkerPrivate),
mResponseType(XMLHttpRequestResponseType::_empty), mResponseType(XMLHttpRequestResponseType::_empty),
mResponseData(new ResponseData()),
mStateData(new StateData()), mStateData(new StateData()),
mResponseData(new ResponseData()),
mResponseArrayBufferValue(nullptr),
mResponseJSONValue(JS::UndefinedValue()),
mTimeout(0), mTimeout(0),
mBackgroundRequest(false), mBackgroundRequest(false),
mWithCredentials(false), mWithCredentials(false),
@ -1416,19 +1397,23 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(XMLHttpRequestWorker)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(XMLHttpRequestWorker, NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(XMLHttpRequestWorker,
XMLHttpRequestEventTarget) XMLHttpRequestEventTarget)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mUpload) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mUpload)
tmp->mResponseData->Traverse(cb); NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mResponseBlob)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(XMLHttpRequestWorker, NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(XMLHttpRequestWorker,
XMLHttpRequestEventTarget) XMLHttpRequestEventTarget)
tmp->ReleaseProxy(XHRIsGoingAway); tmp->ReleaseProxy(XHRIsGoingAway);
NS_IMPL_CYCLE_COLLECTION_UNLINK(mUpload) NS_IMPL_CYCLE_COLLECTION_UNLINK(mUpload)
tmp->mResponseData->Unlink(); tmp->mResponseData = nullptr;
tmp->mResponseBlob = nullptr;
tmp->mResponseArrayBufferValue = nullptr;
tmp->mResponseJSONValue.setUndefined();
NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(XMLHttpRequestWorker, NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(XMLHttpRequestWorker,
XMLHttpRequestEventTarget) XMLHttpRequestEventTarget)
tmp->mResponseData->Trace(aCallbacks, aClosure); NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mResponseArrayBufferValue)
NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mResponseJSONValue)
NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTION_TRACE_END
/* static */ /* static */
@ -2189,16 +2174,16 @@ void XMLHttpRequestWorker::GetResponse(JSContext* aCx,
return; return;
} }
if (!mResponseData->mResponseArrayBufferValue) { if (!mResponseArrayBufferValue) {
mResponseData->mResponseArrayBufferValue = mResponseArrayBufferValue =
mResponseData->mResponseArrayBufferBuilder->TakeArrayBuffer(aCx); mResponseData->mResponseArrayBufferBuilder->TakeArrayBuffer(aCx);
if (!mResponseData->mResponseArrayBufferValue) { if (!mResponseArrayBufferValue) {
aRv.Throw(NS_ERROR_OUT_OF_MEMORY); aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
return; return;
} }
} }
aResponse.setObject(*mResponseData->mResponseArrayBufferValue); aResponse.setObject(*mResponseArrayBufferValue);
return; return;
} }
@ -2208,13 +2193,12 @@ void XMLHttpRequestWorker::GetResponse(JSContext* aCx,
return; return;
} }
if (!mResponseData->mResponseBlob) { if (!mResponseBlob) {
mResponseData->mResponseBlob = mResponseBlob =
Blob::Create(GetOwnerGlobal(), mResponseData->mResponseBlobImpl); Blob::Create(GetOwnerGlobal(), mResponseData->mResponseBlobImpl);
} }
if (!GetOrCreateDOMReflector(aCx, mResponseData->mResponseBlob, if (!GetOrCreateDOMReflector(aCx, mResponseBlob, aResponse)) {
aResponse)) {
aResponse.setNull(); aResponse.setNull();
} }
@ -2227,21 +2211,21 @@ void XMLHttpRequestWorker::GetResponse(JSContext* aCx,
return; return;
} }
if (mResponseData->mResponseJSONValue.isUndefined()) { if (mResponseJSONValue.isUndefined()) {
// The Unicode converter has already zapped the BOM if there was one // The Unicode converter has already zapped the BOM if there was one
JS::Rooted<JS::Value> value(aCx); JS::Rooted<JS::Value> value(aCx);
if (!JS_ParseJSON(aCx, mResponseData->mResponseJSON.BeginReading(), if (!JS_ParseJSON(aCx, mResponseData->mResponseJSON.BeginReading(),
mResponseData->mResponseJSON.Length(), &value)) { mResponseData->mResponseJSON.Length(), &value)) {
JS_ClearPendingException(aCx); JS_ClearPendingException(aCx);
mResponseData->mResponseJSONValue.setNull(); mResponseJSONValue.setNull();
} else { } else {
mResponseData->mResponseJSONValue = value; mResponseJSONValue = value;
} }
mResponseData->mResponseJSON.Truncate(); mResponseData->mResponseJSON.Truncate();
} }
aResponse.set(mResponseData->mResponseJSONValue); aResponse.set(mResponseJSONValue);
return; return;
} }
@ -2276,11 +2260,18 @@ void XMLHttpRequestWorker::UpdateState(
UniquePtr<ResponseData> responseData = std::move(aResponseData); UniquePtr<ResponseData> responseData = std::move(aResponseData);
if (responseData) { if (responseData) {
ResetResponseData();
mResponseData = std::move(responseData); mResponseData = std::move(responseData);
} }
XMLHttpRequest_Binding::ClearCachedResponseTextValue(this); XMLHttpRequest_Binding::ClearCachedResponseTextValue(this);
} }
void XMLHttpRequestWorker::ResetResponseData() {
mResponseBlob = nullptr;
mResponseArrayBufferValue = nullptr;
mResponseJSONValue.setUndefined();
}
} // namespace dom } // namespace dom
} // namespace mozilla } // namespace mozilla

Просмотреть файл

@ -31,24 +31,14 @@ class XMLHttpRequestWorker final : public XMLHttpRequest {
// responseType is blob // responseType is blob
RefPtr<BlobImpl> mResponseBlobImpl; RefPtr<BlobImpl> mResponseBlobImpl;
RefPtr<Blob> mResponseBlob;
// responseType is arrayBuffer; // responseType is arrayBuffer;
RefPtr<ArrayBufferBuilder> mResponseArrayBufferBuilder; RefPtr<ArrayBufferBuilder> mResponseArrayBufferBuilder;
JS::Heap<JSObject*> mResponseArrayBufferValue;
// responseType is json // responseType is json
nsString mResponseJSON; nsString mResponseJSON;
JS::Heap<JS::Value> mResponseJSONValue;
ResponseData() ResponseData() : mResponseResult(NS_OK) {}
: mResponseResult(NS_OK),
mResponseArrayBufferValue(nullptr),
mResponseJSONValue(JS::UndefinedValue()) {}
void Unlink();
void Trace(const TraceCallbacks& aCallbacks, void* aClosure);
void Traverse(nsCycleCollectionTraversalCallback& aCb);
}; };
struct StateData { struct StateData {
@ -71,9 +61,13 @@ class XMLHttpRequestWorker final : public XMLHttpRequest {
XMLHttpRequestResponseType mResponseType; XMLHttpRequestResponseType mResponseType;
UniquePtr<ResponseData> mResponseData;
UniquePtr<StateData> mStateData; UniquePtr<StateData> mStateData;
UniquePtr<ResponseData> mResponseData;
RefPtr<Blob> mResponseBlob;
JS::Heap<JSObject*> mResponseArrayBufferValue;
JS::Heap<JS::Value> mResponseJSONValue;
uint32_t mTimeout; uint32_t mTimeout;
bool mBackgroundRequest; bool mBackgroundRequest;
@ -247,6 +241,8 @@ class XMLHttpRequestWorker final : public XMLHttpRequest {
void Send(JSContext* aCx, JS::Handle<JSObject*> aBody, ErrorResult& aRv); void Send(JSContext* aCx, JS::Handle<JSObject*> aBody, ErrorResult& aRv);
void SendInternal(SendRunnable* aRunnable, ErrorResult& aRv); void SendInternal(SendRunnable* aRunnable, ErrorResult& aRv);
void ResetResponseData();
}; };
} // namespace dom } // namespace dom