summaryrefslogtreecommitdiffstats
path: root/dom/xhr/XMLHttpRequestWorker.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/xhr/XMLHttpRequestWorker.h')
-rw-r--r--dom/xhr/XMLHttpRequestWorker.h334
1 files changed, 334 insertions, 0 deletions
diff --git a/dom/xhr/XMLHttpRequestWorker.h b/dom/xhr/XMLHttpRequestWorker.h
new file mode 100644
index 000000000..90232fe85
--- /dev/null
+++ b/dom/xhr/XMLHttpRequestWorker.h
@@ -0,0 +1,334 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_XMLHttpRequestWorker_h
+#define mozilla_dom_XMLHttpRequestWorker_h
+
+#include "WorkerHolder.h"
+#include "XMLHttpRequest.h"
+#include "XMLHttpRequestString.h"
+#include "mozilla/dom/TypedArray.h"
+
+namespace mozilla {
+namespace dom {
+
+class Proxy;
+class SendRunnable;
+class DOMString;
+
+namespace workers {
+class WorkerPrivate;
+}
+
+class XMLHttpRequestWorker final : public XMLHttpRequest,
+ public workers::WorkerHolder
+{
+public:
+ struct StateData
+ {
+ XMLHttpRequestStringSnapshot mResponseText;
+ nsString mResponseURL;
+ uint32_t mStatus;
+ nsCString mStatusText;
+ uint16_t mReadyState;
+ JS::Heap<JS::Value> mResponse;
+ nsresult mResponseTextResult;
+ nsresult mStatusResult;
+ nsresult mResponseResult;
+
+ StateData()
+ : mStatus(0), mReadyState(0), mResponse(JS::UndefinedValue()),
+ mResponseTextResult(NS_OK), mStatusResult(NS_OK),
+ mResponseResult(NS_OK)
+ { }
+
+ void trace(JSTracer* trc);
+ };
+
+private:
+ RefPtr<XMLHttpRequestUpload> mUpload;
+ workers::WorkerPrivate* mWorkerPrivate;
+ RefPtr<Proxy> mProxy;
+ XMLHttpRequestResponseType mResponseType;
+ StateData mStateData;
+
+ uint32_t mTimeout;
+
+ bool mRooted;
+ bool mBackgroundRequest;
+ bool mWithCredentials;
+ bool mCanceled;
+
+ bool mMozAnon;
+ bool mMozSystem;
+
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(XMLHttpRequestWorker,
+ XMLHttpRequest)
+
+
+ static already_AddRefed<XMLHttpRequest>
+ Construct(const GlobalObject& aGlobal,
+ const MozXMLHttpRequestParameters& aParams,
+ ErrorResult& aRv);
+
+ void
+ Unpin();
+
+ bool
+ Notify(workers::Status aStatus) override;
+
+ virtual uint16_t
+ ReadyState() const override
+ {
+ return mStateData.mReadyState;
+ }
+
+ virtual void
+ Open(const nsACString& aMethod, const nsAString& aUrl,
+ ErrorResult& aRv) override
+ {
+ Open(aMethod, aUrl, true, Optional<nsAString>(),
+ Optional<nsAString>(), aRv);
+ }
+
+ virtual void
+ Open(const nsACString& aMethod, const nsAString& aUrl, bool aAsync,
+ const nsAString& aUsername, const nsAString& aPassword,
+ ErrorResult& aRv) override
+ {
+ Optional<nsAString> username;
+ username = &aUsername;
+ Optional<nsAString> password;
+ password = &aPassword;
+ Open(aMethod, aUrl, aAsync, username, password, aRv);
+ }
+
+ void
+ Open(const nsACString& aMethod, const nsAString& aUrl,
+ bool aAsync, const Optional<nsAString>& aUser,
+ const Optional<nsAString>& aPassword, ErrorResult& aRv);
+
+ virtual void
+ SetRequestHeader(const nsACString& aHeader, const nsACString& aValue,
+ ErrorResult& aRv) override;
+
+ virtual uint32_t
+ Timeout() const override
+ {
+ return mTimeout;
+ }
+
+ virtual void
+ SetTimeout(uint32_t aTimeout, ErrorResult& aRv) override;
+
+ virtual bool
+ WithCredentials() const override
+ {
+ return mWithCredentials;
+ }
+
+ virtual void
+ SetWithCredentials(bool aWithCredentials, ErrorResult& aRv) override;
+
+ virtual bool
+ MozBackgroundRequest() const override
+ {
+ return mBackgroundRequest;
+ }
+
+ virtual void
+ SetMozBackgroundRequest(bool aBackgroundRequest, ErrorResult& aRv) override;
+
+ virtual nsIChannel*
+ GetChannel() const override
+ {
+ MOZ_CRASH("This method cannot be called on workers.");
+ }
+
+ virtual void
+ GetNetworkInterfaceId(nsACString& aId) const override
+ {
+ MOZ_CRASH("This method cannot be called on workers.");
+ }
+
+ virtual void
+ SetNetworkInterfaceId(const nsACString& aId) override
+ {
+ MOZ_CRASH("This method cannot be called on workers.");
+ }
+
+ virtual XMLHttpRequestUpload*
+ GetUpload(ErrorResult& aRv) override;
+
+ virtual void
+ Send(JSContext* aCx, ErrorResult& aRv) override;
+
+ virtual void
+ Send(JSContext* aCx, const nsAString& aBody, ErrorResult& aRv) override;
+
+ virtual void
+ Send(JSContext* aCx, nsIInputStream* aStream, ErrorResult& aRv) override
+ {
+ MOZ_CRASH("This method cannot be called on workers.");
+ }
+
+ virtual void
+ Send(JSContext* aCx, Blob& aBody, ErrorResult& aRv) override;
+
+ virtual void
+ Send(JSContext* aCx, FormData& aBody, ErrorResult& aRv) override;
+
+ virtual void
+ Send(JSContext* aCx, const ArrayBuffer& aBody, ErrorResult& aRv) override;
+
+ virtual void
+ Send(JSContext* aCx, const ArrayBufferView& aBody, ErrorResult& aRv) override;
+
+ virtual void
+ Send(JSContext* aCx, URLSearchParams& aBody, ErrorResult& aRv) override;
+
+ virtual void
+ Send(JSContext* aCx, nsIDocument& aDoc, ErrorResult& aRv) override
+ {
+ MOZ_CRASH("This method cannot be called on workers.");
+ }
+
+ virtual void
+ Abort(ErrorResult& aRv) override;
+
+ virtual void
+ GetResponseURL(nsAString& aUrl) override
+ {
+ aUrl = mStateData.mResponseURL;
+ }
+
+ uint32_t
+ GetStatus(ErrorResult& aRv) override
+ {
+ aRv = mStateData.mStatusResult;
+ return mStateData.mStatus;
+ }
+
+ virtual void
+ GetStatusText(nsACString& aStatusText, ErrorResult& aRv) override
+ {
+ aStatusText = mStateData.mStatusText;
+ }
+
+ virtual void
+ GetResponseHeader(const nsACString& aHeader, nsACString& aResponseHeader,
+ ErrorResult& aRv) override;
+
+ virtual void
+ GetAllResponseHeaders(nsACString& aResponseHeaders,
+ ErrorResult& aRv) override;
+
+ virtual void
+ OverrideMimeType(const nsAString& aMimeType, ErrorResult& aRv) override;
+
+ virtual XMLHttpRequestResponseType
+ ResponseType() const override
+ {
+ return mResponseType;
+ }
+
+ virtual void
+ SetResponseType(XMLHttpRequestResponseType aResponseType,
+ ErrorResult& aRv) override;
+
+ virtual void
+ GetResponse(JSContext* /* unused */, JS::MutableHandle<JS::Value> aResponse,
+ ErrorResult& aRv) override;
+
+ virtual void
+ GetResponseText(DOMString& aResponseText, ErrorResult& aRv) override;
+
+ virtual nsIDocument*
+ GetResponseXML(ErrorResult& aRv) override
+ {
+ MOZ_CRASH("This method should not be called.");
+ }
+
+ virtual void
+ GetInterface(JSContext* aCx, nsIJSID* aIID,
+ JS::MutableHandle<JS::Value> aRetval,
+ ErrorResult& aRv) override
+ {
+ aRv.Throw(NS_ERROR_FAILURE);
+ }
+
+ virtual void
+ SetOriginAttributes(const mozilla::dom::OriginAttributesDictionary& aAttrs) override
+ {
+ MOZ_CRASH("This method cannot be called on workers.");
+ }
+
+ XMLHttpRequestUpload*
+ GetUploadObjectNoCreate() const
+ {
+ return mUpload;
+ }
+
+ void
+ UpdateState(const StateData& aStateData, bool aUseCachedArrayBufferResponse);
+
+ void
+ NullResponseText()
+ {
+ mStateData.mResponseText.SetVoid();
+ mStateData.mResponse.setNull();
+ }
+
+ virtual bool MozAnon() const override
+ {
+ return mMozAnon;
+ }
+
+ virtual bool MozSystem() const override
+ {
+ return mMozSystem;
+ }
+
+ bool
+ SendInProgress() const
+ {
+ return mRooted;
+ }
+
+private:
+ explicit XMLHttpRequestWorker(workers::WorkerPrivate* aWorkerPrivate);
+ ~XMLHttpRequestWorker();
+
+ enum ReleaseType { Default, XHRIsGoingAway, WorkerIsGoingAway };
+
+ void
+ ReleaseProxy(ReleaseType aType = Default);
+
+ void
+ MaybePin(ErrorResult& aRv);
+
+ void
+ MaybeDispatchPrematureAbortEvents(ErrorResult& aRv);
+
+ void
+ DispatchPrematureAbortEvent(EventTarget* aTarget,
+ const nsAString& aEventType, bool aUploadTarget,
+ ErrorResult& aRv);
+
+ void
+ Send(JSContext* aCx, JS::Handle<JSObject*> aBody, ErrorResult& aRv);
+
+ void
+ SendInternal(SendRunnable* aRunnable,
+ ErrorResult& aRv);
+};
+
+} // dom namespace
+} // mozilla namespace
+
+#endif // mozilla_dom_workers_xmlhttprequest_h__