/* 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_FetchService_h #define _mozilla_dom_FetchService_h
// The MozPromise interface intentionally does not expose synchronous access // to the internal resolved/rejected state. Instead, we track whether or not // we've called Resolve on the FetchServicePromises. bool mAvailablePromiseResolved = false; bool mTimingPromiseResolved = false; bool mEndPromiseResolved = false;
};
/** * FetchService is a singleton object which designed to be used in parent * process main thread only. It is used to handle the special fetch requests * from ServiceWorkers(by Navigation Preload) and PFetch. * * FetchService creates FetchInstance internally to represent each Fetch * request. It supports an asynchronous fetching, FetchServicePromises is * created when a Fetch starts, once the response is ready or any error happens, * the FetchServicePromises would be resolved or rejected. The promises * consumers can set callbacks to handle the Fetch result.
*/ class FetchService final : public nsIObserver { public:
NS_DECL_ISUPPORTS
NS_DECL_NSIOBSERVER
// Used for ServiceWorkerNavigationPreload struct NavigationPreloadArgs {
SafeRefPtr<InternalRequest> mRequest;
nsCOMPtr<nsIChannel> mChannel;
};
// Used for content process main thread fetch() // Currently this is just used for keepalive request // This would be further used for sending all main thread fetch requests // through PFetch // See Bug 1897129. struct MainThreadFetchArgs {
SafeRefPtr<InternalRequest> mRequest;
mozilla::ipc::PrincipalInfo mPrincipalInfo;
Maybe<net::CookieJarSettingsArgs> mCookieJarSettings; bool mNeedOnDataAvailable;
nsCOMPtr<nsICSPEventListener> mCSPEventListener;
uint64_t mAssociatedBrowsingContextID;
nsCOMPtr<nsISerialEventTarget> mEventTarget;
nsID mActorID; bool mIsThirdPartyContext{false};
};
struct UnknownArgs {};
using FetchArgs = Variant<NavigationPreloadArgs, WorkerFetchArgs,
MainThreadFetchArgs, UnknownArgs>;
// This method creates a FetchInstance to trigger fetch. // The created FetchInstance is saved in mFetchInstanceTable
RefPtr<FetchServicePromises> Fetch(FetchArgs&& aArgs);
private: /** * FetchInstance is an internal representation for each Fetch created by * FetchService. * FetchInstance is also a FetchDriverObserver which has responsibility to * resolve/reject the FetchServicePromises. * FetchInstance triggers fetch by instancing a FetchDriver with proper * initialization. The general usage flow of FetchInstance is as follows * * RefPtr<FetchInstance> fetch = MakeRefPtr<FetchInstance>(); * fetch->Initialize(FetchArgs args); * RefPtr<FetchServicePromises> fetch->Fetch();
*/ class FetchInstance final : public FetchDriverObserver { public:
FetchInstance() = default;
// Check if the number of pending keepalive fetch requests exceeds the // configured limit // We limit the number of pending keepalive requests on two levels: // 1. per origin - controlled by pref // dom.fetchKeepalive.request_limit_per_origin) // 2. per browser instance - controlled by pref // dom.fetchKeepalive.total_request_limit bool DoesExceedsKeepaliveResourceLimits(const nsACString& aOrigin);
// This is a container to manage the generated fetches.
nsTHashMap<nsRefPtrHashKey<FetchServicePromises>, RefPtr<FetchInstance> >
mFetchInstanceTable; bool mObservingNetwork{false}; bool mOffline{false};
// map to key origin to number of pending keepalive fetch requests
nsTHashMap<nsCStringHashKey, uint32_t> mPendingKeepAliveRequestsPerOrigin;
// total pending keepalive fetch requests per browser instance
uint32_t mTotalKeepAliveRequests{0};
};
} // namespace mozilla::dom
#endif// _mozilla_dom_FetchService_h
¤ Dauer der Verarbeitung: 0.17 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.