зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
987e7faf8e
Коммит
815d827202
|
@ -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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче