diff options
Diffstat (limited to 'dom/xhr/XMLHttpRequestWorker.h')
-rw-r--r-- | dom/xhr/XMLHttpRequestWorker.h | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/dom/xhr/XMLHttpRequestWorker.h b/dom/xhr/XMLHttpRequestWorker.h new file mode 100644 index 0000000000..7a06c0f309 --- /dev/null +++ b/dom/xhr/XMLHttpRequestWorker.h @@ -0,0 +1,256 @@ +/* -*- 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 "XMLHttpRequest.h" +#include "XMLHttpRequestString.h" +#include "mozilla/WeakPtr.h" +#include "mozilla/dom/BodyExtractor.h" +#include "mozilla/dom/TypedArray.h" + +// XXX Avoid including this here by moving function bodies to the cpp file +#include "mozilla/dom/BlobImpl.h" + +namespace mozilla::dom { + +class Proxy; +class DOMString; +class SendRunnable; +class StrongWorkerRef; +class WorkerPrivate; + +class XMLHttpRequestWorker final : public SupportsWeakPtr, + public XMLHttpRequest { + public: + // This defines the xhr.response value. + struct ResponseData { + nsresult mResponseResult; + + // responseType is empty or text. + XMLHttpRequestStringSnapshot mResponseText; + + // responseType is blob + RefPtr<BlobImpl> mResponseBlobImpl; + + // responseType is arrayBuffer; + RefPtr<ArrayBufferBuilder> mResponseArrayBufferBuilder; + + // responseType is json + nsString mResponseJSON; + + ResponseData() : mResponseResult(NS_OK) {} + }; + + struct StateData { + nsString mResponseURL; + uint32_t mStatus; + nsCString mStatusText; + uint16_t mReadyState; + bool mFlagSend; + nsresult mStatusResult; + + StateData() + : mStatus(0), mReadyState(0), mFlagSend(false), mStatusResult(NS_OK) {} + }; + + private: + RefPtr<XMLHttpRequestUpload> mUpload; + WorkerPrivate* mWorkerPrivate; + RefPtr<StrongWorkerRef> mWorkerRef; + RefPtr<XMLHttpRequestWorker> mPinnedSelfRef; + RefPtr<Proxy> mProxy; + + XMLHttpRequestResponseType mResponseType; + + UniquePtr<StateData> mStateData; + + UniquePtr<ResponseData> mResponseData; + RefPtr<Blob> mResponseBlob; + JS::Heap<JSObject*> mResponseArrayBufferValue; + JS::Heap<JS::Value> mResponseJSONValue; + + uint32_t mTimeout; + + bool mBackgroundRequest; + bool mWithCredentials; + bool mCanceled; + bool mFlagSendActive; + + bool mMozAnon; + bool mMozSystem; + + nsString mMimeTypeOverride; + + 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(); + + 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 XMLHttpRequestUpload* GetUpload(ErrorResult& aRv) override; + + virtual void Send( + const Nullable< + DocumentOrBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString>& + aData, + ErrorResult& aRv) override; + + virtual void SendInputStream(nsIInputStream* aInputStream, + ErrorResult& aRv) override { + MOZ_CRASH("nsIInputStream is not a valid argument for XHR in 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 Document* GetResponseXML(ErrorResult& aRv) override { + MOZ_CRASH("This method should not be called."); + } + + virtual void GetInterface(JSContext* aCx, JS::Handle<JS::Value> 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(UniquePtr<StateData>&& aStateData, + UniquePtr<ResponseData>&& aResponseData); + + virtual uint16_t ErrorCode() const override { + return 0; // eOK + } + + virtual bool MozAnon() const override { return mMozAnon; } + + virtual bool MozSystem() const override { return mMozSystem; } + + bool SendInProgress() const { return !!mWorkerRef; } + + private: + XMLHttpRequestWorker(WorkerPrivate* aWorkerPrivate, + nsIGlobalObject* aGlobalObject); + ~XMLHttpRequestWorker(); + + enum ReleaseType { Default, XHRIsGoingAway, WorkerIsGoingAway }; + + void ReleaseProxy(ReleaseType aType = Default); + + void MaybePin(ErrorResult& aRv); + + void MaybeDispatchPrematureAbortEvents(ErrorResult& aRv); + + void FireEvent(EventTarget* aTarget, const EventType& aEventType, + bool aUploadTarget, ErrorResult& aRv); + + void Send(JSContext* aCx, JS::Handle<JSObject*> aBody, ErrorResult& aRv); + + void SendInternal(const BodyExtractorBase* aBody, ErrorResult& aRv); + + void ResetResponseData(); +}; + +} // namespace mozilla::dom + +#endif // mozilla_dom_workers_xmlhttprequest_h__ |