Bug 792808 - Migrate XMLHttpRequestWorker from using the nsIVariant send() XHR method; r?baku
MozReview-Commit-ID: DGSy3kdh8uH
--- a/dom/xhr/XMLHttpRequestWorker.cpp
+++ b/dom/xhr/XMLHttpRequestWorker.cpp
@@ -16,26 +16,26 @@
#include "js/TracingAPI.h"
#include "js/GCPolicyAPI.h"
#include "mozilla/ArrayUtils.h"
#include "mozilla/dom/Exceptions.h"
#include "mozilla/dom/File.h"
#include "mozilla/dom/FormData.h"
#include "mozilla/dom/ProgressEvent.h"
#include "mozilla/dom/StructuredCloneHolder.h"
+#include "mozilla/dom/UnionConversions.h"
#include "mozilla/dom/URLSearchParams.h"
#include "mozilla/dom/WorkerScope.h"
#include "mozilla/dom/WorkerPrivate.h"
#include "mozilla/dom/WorkerRunnable.h"
#include "mozilla/Telemetry.h"
#include "nsComponentManagerUtils.h"
#include "nsContentUtils.h"
#include "nsJSUtils.h"
#include "nsThreadUtils.h"
-#include "nsVariant.h"
#include "XMLHttpRequestUpload.h"
#include "mozilla/UniquePtr.h"
namespace mozilla {
namespace dom {
@@ -1450,25 +1450,22 @@ OpenRunnable::MainThreadRunInternal()
}
return NS_OK;
}
void
SendRunnable::RunOnMainThread(ErrorResult& aRv)
{
- nsCOMPtr<nsIVariant> variant;
+ Nullable<DocumentOrBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString> payload;
if (HasData()) {
AutoSafeJSContext cx;
JSAutoRequest ar(cx);
- nsIXPConnect* xpc = nsContentUtils::XPConnect();
- MOZ_ASSERT(xpc);
-
JS::Rooted<JSObject*> globalObject(cx, JS::CurrentGlobalOrNull(cx));
if (NS_WARN_IF(!globalObject)) {
aRv.Throw(NS_ERROR_FAILURE);
return;
}
nsCOMPtr<nsIGlobalObject> parent = xpc::NativeGlobal(globalObject);
if (NS_WARN_IF(!parent)) {
@@ -1477,29 +1474,40 @@ SendRunnable::RunOnMainThread(ErrorResul
}
JS::Rooted<JS::Value> body(cx);
Read(parent, cx, &body, aRv);
if (NS_WARN_IF(aRv.Failed())) {
return;
}
- aRv = xpc->JSValToVariant(cx, body, getter_AddRefs(variant));
- if (NS_WARN_IF(aRv.Failed())) {
+ Maybe<DocumentOrBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVStringArgument> holder;
+ holder.emplace(payload.SetValue());
+ bool done = false, failed = false, tryNext;
+
+ if (body.isObject()) {
+ done = (failed = !holder.ref().TrySetToDocument(cx, &body, tryNext, false)) || !tryNext ||
+ (failed = !holder.ref().TrySetToBlob(cx, &body, tryNext, false)) || !tryNext ||
+ (failed = !holder.ref().TrySetToArrayBufferView(cx, &body, tryNext, false)) || !tryNext ||
+ (failed = !holder.ref().TrySetToArrayBuffer(cx, &body, tryNext, false)) || !tryNext ||
+ (failed = !holder.ref().TrySetToFormData(cx, &body, tryNext, false)) || !tryNext ||
+ (failed = !holder.ref().TrySetToURLSearchParams(cx, &body, tryNext, false)) || !tryNext;
+ }
+
+ if (!done) {
+ done = (failed = !holder.ref().TrySetToUSVString(cx, &body, tryNext)) || !tryNext;
+ }
+ if (failed || !done) {
+ aRv.Throw(NS_ERROR_FAILURE);
return;
}
}
else {
- RefPtr<nsVariant> wvariant = new nsVariant();
-
- if (NS_FAILED(wvariant->SetAsAString(mStringBody))) {
- MOZ_ASSERT(false, "This should never fail!");
- }
-
- variant = wvariant;
+ DocumentOrBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString& ref = payload.SetValue();
+ ref.SetAsUSVString().Rebind(mStringBody.Data(), mStringBody.Length());
}
// Send() has been already called, reset the proxy.
if (mProxy->mWorkerPrivate) {
mProxy->Reset();
}
mProxy->mWorkerPrivate = mWorkerPrivate;
@@ -1515,17 +1523,17 @@ SendRunnable::RunOnMainThread(ErrorResul
MOZ_ASSERT(false, "This should never fail!");
}
}
mProxy->mArrayBufferResponseWasTransferred = false;
mProxy->mInnerChannelId++;
- aRv = mProxy->mXHR->Send(variant);
+ mProxy->mXHR->Send(nullptr, payload, aRv);
if (!aRv.Failed()) {
mProxy->mOutstandingSendCount++;
if (!mHasUploadListeners) {
// Send() can be called more than once before failure,
// so don't attach the upload listeners more than once.
if (!mProxy->mUploadEventListenersAttached &&