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/dom/BodyExtractor.h" 13 #include "mozilla/dom/TypedArray.h" 14 15 // XXX Avoid including this here by moving function bodies to the cpp file 16 #include "mozilla/dom/BlobImpl.h" 17 18 namespace mozilla { 19 namespace dom { 20 21 class Proxy; 22 class DOMString; 23 class SendRunnable; 24 class StrongWorkerRef; 25 class WorkerPrivate; 26 27 class XMLHttpRequestWorker final : public XMLHttpRequest { 28 public: 29 // This defines the xhr.response value. 30 struct ResponseData { 31 nsresult mResponseResult; 32 33 // responseType is empty or text. 34 XMLHttpRequestStringSnapshot mResponseText; 35 36 // responseType is blob 37 RefPtr<BlobImpl> mResponseBlobImpl; 38 39 // responseType is arrayBuffer; 40 RefPtr<ArrayBufferBuilder> mResponseArrayBufferBuilder; 41 42 // responseType is json 43 nsString mResponseJSON; 44 ResponseDataResponseData45 ResponseData() : mResponseResult(NS_OK) {} 46 }; 47 48 struct StateData { 49 nsString mResponseURL; 50 uint32_t mStatus; 51 nsCString mStatusText; 52 uint16_t mReadyState; 53 bool mFlagSend; 54 nsresult mStatusResult; 55 StateDataStateData56 StateData() 57 : mStatus(0), mReadyState(0), mFlagSend(false), mStatusResult(NS_OK) {} 58 }; 59 60 private: 61 RefPtr<XMLHttpRequestUpload> mUpload; 62 WorkerPrivate* mWorkerPrivate; 63 RefPtr<StrongWorkerRef> mWorkerRef; 64 RefPtr<Proxy> mProxy; 65 66 XMLHttpRequestResponseType mResponseType; 67 68 UniquePtr<StateData> mStateData; 69 70 UniquePtr<ResponseData> mResponseData; 71 RefPtr<Blob> mResponseBlob; 72 JS::Heap<JSObject*> mResponseArrayBufferValue; 73 JS::Heap<JS::Value> mResponseJSONValue; 74 75 uint32_t mTimeout; 76 77 bool mBackgroundRequest; 78 bool mWithCredentials; 79 bool mCanceled; 80 bool mFlagSendActive; 81 82 bool mMozAnon; 83 bool mMozSystem; 84 85 nsString mMimeTypeOverride; 86 87 public: 88 NS_DECL_ISUPPORTS_INHERITED 89 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(XMLHttpRequestWorker, 90 XMLHttpRequest) 91 92 static already_AddRefed<XMLHttpRequest> Construct( 93 const GlobalObject& aGlobal, const MozXMLHttpRequestParameters& aParams, 94 ErrorResult& aRv); 95 96 void Unpin(); 97 ReadyState()98 virtual uint16_t ReadyState() const override { 99 return mStateData->mReadyState; 100 } 101 Open(const nsACString & aMethod,const nsAString & aUrl,ErrorResult & aRv)102 virtual void Open(const nsACString& aMethod, const nsAString& aUrl, 103 ErrorResult& aRv) override { 104 Open(aMethod, aUrl, true, Optional<nsAString>(), Optional<nsAString>(), 105 aRv); 106 } 107 Open(const nsACString & aMethod,const nsAString & aUrl,bool aAsync,const nsAString & aUsername,const nsAString & aPassword,ErrorResult & aRv)108 virtual void Open(const nsACString& aMethod, const nsAString& aUrl, 109 bool aAsync, const nsAString& aUsername, 110 const nsAString& aPassword, ErrorResult& aRv) override { 111 Optional<nsAString> username; 112 username = &aUsername; 113 Optional<nsAString> password; 114 password = &aPassword; 115 Open(aMethod, aUrl, aAsync, username, password, aRv); 116 } 117 118 void Open(const nsACString& aMethod, const nsAString& aUrl, bool aAsync, 119 const Optional<nsAString>& aUser, 120 const Optional<nsAString>& aPassword, ErrorResult& aRv); 121 122 virtual void SetRequestHeader(const nsACString& aHeader, 123 const nsACString& aValue, 124 ErrorResult& aRv) override; 125 Timeout()126 virtual uint32_t Timeout() const override { return mTimeout; } 127 128 virtual void SetTimeout(uint32_t aTimeout, ErrorResult& aRv) override; 129 WithCredentials()130 virtual bool WithCredentials() const override { return mWithCredentials; } 131 132 virtual void SetWithCredentials(bool aWithCredentials, 133 ErrorResult& aRv) override; 134 MozBackgroundRequest()135 virtual bool MozBackgroundRequest() const override { 136 return mBackgroundRequest; 137 } 138 139 virtual void SetMozBackgroundRequest(bool aBackgroundRequest, 140 ErrorResult& aRv) override; 141 GetChannel()142 virtual nsIChannel* GetChannel() const override { 143 MOZ_CRASH("This method cannot be called on workers."); 144 } 145 146 virtual XMLHttpRequestUpload* GetUpload(ErrorResult& aRv) override; 147 148 virtual void Send( 149 const Nullable< 150 DocumentOrBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString>& 151 aData, 152 ErrorResult& aRv) override; 153 SendInputStream(nsIInputStream * aInputStream,ErrorResult & aRv)154 virtual void SendInputStream(nsIInputStream* aInputStream, 155 ErrorResult& aRv) override { 156 MOZ_CRASH("nsIInputStream is not a valid argument for XHR in workers."); 157 } 158 159 virtual void Abort(ErrorResult& aRv) override; 160 GetResponseURL(nsAString & aUrl)161 virtual void GetResponseURL(nsAString& aUrl) override { 162 aUrl = mStateData->mResponseURL; 163 } 164 GetStatus(ErrorResult & aRv)165 uint32_t GetStatus(ErrorResult& aRv) override { 166 aRv = mStateData->mStatusResult; 167 return mStateData->mStatus; 168 } 169 GetStatusText(nsACString & aStatusText,ErrorResult & aRv)170 virtual void GetStatusText(nsACString& aStatusText, 171 ErrorResult& aRv) override { 172 aStatusText = mStateData->mStatusText; 173 } 174 175 virtual void GetResponseHeader(const nsACString& aHeader, 176 nsACString& aResponseHeader, 177 ErrorResult& aRv) override; 178 179 virtual void GetAllResponseHeaders(nsACString& aResponseHeaders, 180 ErrorResult& aRv) override; 181 182 virtual void OverrideMimeType(const nsAString& aMimeType, 183 ErrorResult& aRv) override; 184 ResponseType()185 virtual XMLHttpRequestResponseType ResponseType() const override { 186 return mResponseType; 187 } 188 189 virtual void SetResponseType(XMLHttpRequestResponseType aResponseType, 190 ErrorResult& aRv) override; 191 192 virtual void GetResponse(JSContext* /* unused */, 193 JS::MutableHandle<JS::Value> aResponse, 194 ErrorResult& aRv) override; 195 196 virtual void GetResponseText(DOMString& aResponseText, 197 ErrorResult& aRv) override; 198 GetResponseXML(ErrorResult & aRv)199 virtual Document* GetResponseXML(ErrorResult& aRv) override { 200 MOZ_CRASH("This method should not be called."); 201 } 202 GetInterface(JSContext * aCx,JS::Handle<JS::Value> aIID,JS::MutableHandle<JS::Value> aRetval,ErrorResult & aRv)203 virtual void GetInterface(JSContext* aCx, JS::Handle<JS::Value> aIID, 204 JS::MutableHandle<JS::Value> aRetval, 205 ErrorResult& aRv) override { 206 aRv.Throw(NS_ERROR_FAILURE); 207 } 208 SetOriginAttributes(const mozilla::dom::OriginAttributesDictionary & aAttrs)209 virtual void SetOriginAttributes( 210 const mozilla::dom::OriginAttributesDictionary& aAttrs) override { 211 MOZ_CRASH("This method cannot be called on workers."); 212 } 213 GetUploadObjectNoCreate()214 XMLHttpRequestUpload* GetUploadObjectNoCreate() const { return mUpload; } 215 216 void UpdateState(UniquePtr<StateData>&& aStateData, 217 UniquePtr<ResponseData>&& aResponseData); 218 ErrorCode()219 virtual uint16_t ErrorCode() const override { 220 return 0; // eOK 221 } 222 MozAnon()223 virtual bool MozAnon() const override { return mMozAnon; } 224 MozSystem()225 virtual bool MozSystem() const override { return mMozSystem; } 226 SendInProgress()227 bool SendInProgress() const { return !!mWorkerRef; } 228 229 private: 230 XMLHttpRequestWorker(WorkerPrivate* aWorkerPrivate, 231 nsIGlobalObject* aGlobalObject); 232 ~XMLHttpRequestWorker(); 233 234 enum ReleaseType { Default, XHRIsGoingAway, WorkerIsGoingAway }; 235 236 void ReleaseProxy(ReleaseType aType = Default); 237 238 void MaybePin(ErrorResult& aRv); 239 240 void MaybeDispatchPrematureAbortEvents(ErrorResult& aRv); 241 242 void DispatchPrematureAbortEvent(EventTarget* aTarget, 243 const nsAString& aEventType, 244 bool aUploadTarget, ErrorResult& aRv); 245 246 void Send(JSContext* aCx, JS::Handle<JSObject*> aBody, ErrorResult& aRv); 247 248 void SendInternal(const BodyExtractorBase* aBody, ErrorResult& aRv); 249 250 void ResetResponseData(); 251 }; 252 253 } // namespace dom 254 } // namespace mozilla 255 256 #endif // mozilla_dom_workers_xmlhttprequest_h__ 257