XMLHttpRequestWorker.h (8611B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef mozilla_dom_XMLHttpRequestWorker_h 8 #define mozilla_dom_XMLHttpRequestWorker_h 9 10 #include "XMLHttpRequest.h" 11 #include "XMLHttpRequestString.h" 12 #include "mozilla/WeakPtr.h" 13 #include "mozilla/dom/BodyExtractor.h" 14 #include "mozilla/dom/TypedArray.h" 15 16 // XXX Avoid including this here by moving function bodies to the cpp file 17 #include "mozilla/dom/BlobImpl.h" 18 19 namespace mozilla::dom { 20 21 class Proxy; 22 class DOMString; 23 class SendRunnable; 24 class ThreadSafeWorkerRef; 25 class WorkerPrivate; 26 27 class XMLHttpRequestWorker final : public SupportsWeakPtr, 28 public XMLHttpRequest { 29 public: 30 // This defines the xhr.response value. 31 struct ResponseData { 32 nsresult mResponseResult; 33 34 // responseType is empty or text. 35 XMLHttpRequestStringSnapshot mResponseText; 36 37 // responseType is blob 38 RefPtr<BlobImpl> mResponseBlobImpl; 39 40 // responseType is arrayBuffer; 41 RefPtr<ArrayBufferBuilder> mResponseArrayBufferBuilder; 42 43 // responseType is json 44 nsString mResponseJSON; 45 46 ResponseData() : mResponseResult(NS_OK) {} 47 }; 48 49 struct StateData { 50 nsCString mResponseURL; 51 uint32_t mStatus{0}; 52 nsCString mStatusText; 53 uint16_t mReadyState{0}; 54 nsresult mStatusResult{NS_OK}; 55 }; 56 57 private: 58 RefPtr<XMLHttpRequestUpload> mUpload; 59 60 // This is set by SendRunnable::RunOnMainThread when the send process starts 61 // and is cleared by Proxy::Teardown and is held for the duration of the send. 62 // Additionally, it will be temporarily saved off by various sync runnables 63 // and replaced with their own reference to make a ThreadSafeWorkerRef 64 // available to the proxy for the duration of the sync runnables. 65 // They will restore the state when their sync runnable completes its main 66 // thread work. 67 RefPtr<ThreadSafeWorkerRef> mWorkerRef; 68 RefPtr<XMLHttpRequestWorker> mPinnedSelfRef; 69 RefPtr<Proxy> mProxy; 70 71 XMLHttpRequestResponseType mResponseType; 72 73 UniquePtr<StateData> mStateData; 74 75 UniquePtr<ResponseData> mResponseData; 76 RefPtr<Blob> mResponseBlob; 77 JS::Heap<JSObject*> mResponseArrayBufferValue; 78 JS::Heap<JS::Value> mResponseJSONValue; 79 80 uint32_t mEventStreamId{0}; 81 uint32_t mTimeout; 82 83 bool mBackgroundRequest; 84 bool mWithCredentials; 85 bool mCanceled; 86 bool mFlagSend{false}; // spec flag 87 bool mFlagSendActive; 88 89 bool mMozAnon; 90 bool mMozSystem; 91 92 nsString mMimeTypeOverride; 93 94 public: 95 NS_DECL_ISUPPORTS_INHERITED 96 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(XMLHttpRequestWorker, 97 XMLHttpRequest) 98 99 static already_AddRefed<XMLHttpRequest> Construct( 100 const GlobalObject& aGlobal, const MozXMLHttpRequestParameters& aParams, 101 ErrorResult& aRv); 102 103 void Unpin(); 104 105 virtual uint16_t ReadyState() const override; 106 107 virtual void Open(const nsACString& aMethod, const nsACString& aUrl, 108 ErrorResult& aRv) override { 109 Open(aMethod, aUrl, true, Optional<nsACString>(), Optional<nsACString>(), 110 aRv); 111 } 112 113 uint32_t EventStreamId() const { return mEventStreamId; } 114 115 virtual void Open(const nsACString& aMethod, const nsACString& aUrl, 116 bool aAsync, const nsACString& aUsername, 117 const nsACString& aPassword, ErrorResult& aRv) override { 118 Optional<nsACString> username; 119 username = &aUsername; 120 Optional<nsACString> password; 121 password = &aPassword; 122 Open(aMethod, aUrl, aAsync, username, password, aRv); 123 } 124 125 void Open(const nsACString& aMethod, const nsACString& aUrl, bool aAsync, 126 const Optional<nsACString>& aUser, 127 const Optional<nsACString>& aPassword, ErrorResult& aRv); 128 129 virtual void SetRequestHeader(const nsACString& aHeader, 130 const nsACString& aValue, 131 ErrorResult& aRv) override; 132 133 virtual uint32_t Timeout() const override { return mTimeout; } 134 135 virtual void SetTimeout(uint32_t aTimeout, ErrorResult& aRv) override; 136 137 virtual bool WithCredentials() const override { return mWithCredentials; } 138 139 virtual void SetWithCredentials(bool aWithCredentials, 140 ErrorResult& aRv) override; 141 142 virtual bool MozBackgroundRequest() const override { 143 return mBackgroundRequest; 144 } 145 146 virtual void SetMozBackgroundRequest(bool aBackgroundRequest, 147 ErrorResult& aRv) override; 148 149 virtual nsIChannel* GetChannel() const override { 150 MOZ_CRASH("This method cannot be called on workers."); 151 } 152 153 virtual XMLHttpRequestUpload* GetUpload(ErrorResult& aRv) override; 154 155 virtual void Send( 156 const Nullable< 157 DocumentOrBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString>& 158 aData, 159 ErrorResult& aRv) override; 160 161 virtual void SendInputStream(nsIInputStream* aInputStream, 162 ErrorResult& aRv) override { 163 MOZ_CRASH("nsIInputStream is not a valid argument for XHR in workers."); 164 } 165 166 virtual void Abort(ErrorResult& aRv) override; 167 168 virtual void GetResponseURL(nsACString& aUrl) override { 169 aUrl = mStateData->mResponseURL; 170 } 171 172 uint32_t GetStatus(ErrorResult& aRv) override { 173 aRv = mStateData->mStatusResult; 174 return mStateData->mStatus; 175 } 176 177 virtual void GetStatusText(nsACString& aStatusText, 178 ErrorResult& aRv) override { 179 aStatusText = mStateData->mStatusText; 180 } 181 182 virtual void GetResponseHeader(const nsACString& aHeader, 183 nsACString& aResponseHeader, 184 ErrorResult& aRv) override; 185 186 virtual void GetAllResponseHeaders(nsACString& aResponseHeaders, 187 ErrorResult& aRv) override; 188 189 virtual void OverrideMimeType(const nsAString& aMimeType, 190 ErrorResult& aRv) override; 191 192 virtual XMLHttpRequestResponseType ResponseType() const override { 193 return mResponseType; 194 } 195 196 virtual void SetResponseType(XMLHttpRequestResponseType aResponseType, 197 ErrorResult& aRv) override; 198 199 virtual void GetResponse(JSContext* /* unused */, 200 JS::MutableHandle<JS::Value> aResponse, 201 ErrorResult& aRv) override; 202 203 virtual void GetResponseText(DOMString& aResponseText, 204 ErrorResult& aRv) override; 205 206 virtual Document* GetResponseXML(ErrorResult& aRv) override { 207 MOZ_CRASH("This method should not be called."); 208 } 209 210 virtual void GetInterface(JSContext* aCx, JS::Handle<JS::Value> aIID, 211 JS::MutableHandle<JS::Value> aRetval, 212 ErrorResult& aRv) override { 213 aRv.Throw(NS_ERROR_FAILURE); 214 } 215 216 virtual void SetOriginAttributes( 217 const mozilla::dom::OriginAttributesDictionary& aAttrs) override { 218 MOZ_CRASH("This method cannot be called on workers."); 219 } 220 221 XMLHttpRequestUpload* GetUploadObjectNoCreate() const { return mUpload; } 222 223 void UpdateState(UniquePtr<StateData>&& aStateData, 224 UniquePtr<ResponseData>&& aResponseData); 225 226 virtual uint16_t ErrorCode() const override { 227 return 0; // eOK 228 } 229 230 virtual bool MozAnon() const override { return mMozAnon; } 231 232 virtual bool MozSystem() const override { return mMozSystem; } 233 234 bool SendInProgress() const { return !!mWorkerRef; } 235 236 private: 237 XMLHttpRequestWorker(WorkerPrivate* aWorkerPrivate, 238 nsIGlobalObject* aGlobalObject); 239 ~XMLHttpRequestWorker(); 240 241 enum ReleaseType { Default, XHRIsGoingAway, WorkerIsGoingAway }; 242 243 void ReleaseProxy(ReleaseType aType = Default); 244 245 void MaybePin(ErrorResult& aRv); 246 247 void SetResponseToNetworkError(); 248 249 void RequestErrorSteps(ErrorResult& aRv, 250 const ErrorProgressEventType& aEventType, 251 nsresult aException = NS_ERROR_DOM_INVALID_STATE_ERR); 252 253 bool FireEvent(EventTarget* aTarget, const EventType& aEventType, 254 bool aUploadTarget, ErrorResult& aRv); 255 256 void Send(JSContext* aCx, JS::Handle<JSObject*> aBody, ErrorResult& aRv); 257 258 void SendInternal(const BodyExtractorBase* aBody, ErrorResult& aRv); 259 260 void ResetResponseData(); 261 }; 262 263 } // namespace mozilla::dom 264 265 #endif // mozilla_dom_workers_xmlhttprequest_h__