Bug 792808 - Migrate XMLHttpRequestWorker from using the nsIVariant send() XHR method; r?baku draft
authorThomas Wisniewski <wisniewskit@gmail.com>
Thu, 28 Sep 2017 17:24:32 -0400
changeset 756152 6c8f3383e9126a098eef3392cef5707182974345
parent 756151 0b7e6ba8b303286542d756e9522345f86d5df06d
child 756153 7cd6cf0b06dc970402564e3b98beee0700a898fc
push id99394
push userwisniewskit@gmail.com
push dateFri, 16 Feb 2018 14:37:01 +0000
reviewersbaku
bugs792808
milestone60.0a1
Bug 792808 - Migrate XMLHttpRequestWorker from using the nsIVariant send() XHR method; r?baku MozReview-Commit-ID: DGSy3kdh8uH
dom/xhr/XMLHttpRequestWorker.cpp
--- 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 &&