/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* 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_FetchDriver_h #define mozilla_dom_FetchDriver_h #include "nsAutoPtr.h" #include "nsIAsyncVerifyRedirectCallback.h" #include "nsIChannelEventSink.h" #include "nsIInterfaceRequestor.h" #include "nsIStreamListener.h" #include "nsRefPtr.h" #include "mozilla/DebugOnly.h" #include "mozilla/net/ReferrerPolicy.h" class nsIOutputStream; class nsILoadGroup; class nsIPrincipal; namespace mozilla { namespace dom { class BlobSet; class InternalRequest; class InternalResponse; class FetchDriverObserver { public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(FetchDriverObserver); virtual void OnResponseAvailable(InternalResponse* aResponse) = 0; virtual void OnResponseEnd() { }; protected: virtual ~FetchDriverObserver() { }; }; class FetchDriver MOZ_FINAL : public nsIStreamListener, public nsIChannelEventSink, public nsIInterfaceRequestor, public nsIAsyncVerifyRedirectCallback { public: NS_DECL_ISUPPORTS NS_DECL_NSIREQUESTOBSERVER NS_DECL_NSISTREAMLISTENER NS_DECL_NSICHANNELEVENTSINK NS_DECL_NSIINTERFACEREQUESTOR NS_DECL_NSIASYNCVERIFYREDIRECTCALLBACK explicit FetchDriver(InternalRequest* aRequest, nsIPrincipal* aPrincipal, nsILoadGroup* aLoadGroup); NS_IMETHOD Fetch(FetchDriverObserver* aObserver); void SetReferrerPolicy(net::ReferrerPolicy aPolicy) { // Cannot set policy after Fetch() has been called. MOZ_ASSERT(mFetchRecursionCount == 0); mReferrerPolicy = aPolicy; } private: nsCOMPtr mPrincipal; nsCOMPtr mLoadGroup; nsRefPtr mRequest; nsRefPtr mResponse; nsCOMPtr mPipeOutputStream; nsRefPtr mObserver; nsCOMPtr mNotificationCallbacks; nsCOMPtr mRedirectCallback; nsCOMPtr mOldRedirectChannel; nsCOMPtr mNewRedirectChannel; uint32_t mFetchRecursionCount; net::ReferrerPolicy mReferrerPolicy; DebugOnly mResponseAvailableCalled; FetchDriver() = delete; FetchDriver(const FetchDriver&) = delete; FetchDriver& operator=(const FetchDriver&) = delete; ~FetchDriver(); nsresult Fetch(bool aCORSFlag); nsresult ContinueFetch(bool aCORSFlag); nsresult BasicFetch(); nsresult HttpFetch(bool aCORSFlag = false, bool aCORSPreflightFlag = false, bool aAuthenticationFlag = false); nsresult ContinueHttpFetchAfterNetworkFetch(); // Returns the filtered response sent to the observer. already_AddRefed BeginAndGetFilteredResponse(InternalResponse* aResponse); // Utility since not all cases need to do any post processing of the filtered // response. void BeginResponse(InternalResponse* aResponse); nsresult FailWithNetworkError(); nsresult SucceedWithResponse(); nsresult DoesNotRequirePreflight(nsIChannel* aChannel); }; } // namespace dom } // namespace mozilla #endif // mozilla_dom_FetchDriver_h