/* 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 nsHtml5SpeculativeLoad_h #define nsHtml5SpeculativeLoad_h #include "nsString.h" #include "nsContentUtils.h" class nsHtml5TreeOpExecutor; enum eHtml5SpeculativeLoad { #ifdef DEBUG eSpeculativeLoadUninitialized, #endif eSpeculativeLoadBase, eSpeculativeLoadCSP, eSpeculativeLoadMetaReferrer, eSpeculativeLoadImage, eSpeculativeLoadOpenPicture, eSpeculativeLoadEndPicture, eSpeculativeLoadPictureSource, eSpeculativeLoadScript, eSpeculativeLoadScriptFromHead, eSpeculativeLoadStyle, eSpeculativeLoadManifest, eSpeculativeLoadSetDocumentCharset, eSpeculativeLoadSetDocumentMode, eSpeculativeLoadPreconnect }; class nsHtml5SpeculativeLoad { public: nsHtml5SpeculativeLoad(); ~nsHtml5SpeculativeLoad(); inline void InitBase(const nsAString& aUrl) { NS_PRECONDITION(mOpCode == eSpeculativeLoadUninitialized, "Trying to reinitialize a speculative load!"); mOpCode = eSpeculativeLoadBase; mUrl.Assign(aUrl); } inline void InitMetaCSP(const nsAString& aCSP) { NS_PRECONDITION(mOpCode == eSpeculativeLoadUninitialized, "Trying to reinitialize a speculative load!"); mOpCode = eSpeculativeLoadCSP; mMetaCSP.Assign( nsContentUtils::TrimWhitespace(aCSP)); } inline void InitMetaReferrerPolicy(const nsAString& aReferrerPolicy) { NS_PRECONDITION(mOpCode == eSpeculativeLoadUninitialized, "Trying to reinitialize a speculative load!"); mOpCode = eSpeculativeLoadMetaReferrer; mReferrerPolicy.Assign( nsContentUtils::TrimWhitespace(aReferrerPolicy)); } inline void InitImage(const nsAString& aUrl, const nsAString& aCrossOrigin, const nsAString& aReferrerPolicy, const nsAString& aSrcset, const nsAString& aSizes) { NS_PRECONDITION(mOpCode == eSpeculativeLoadUninitialized, "Trying to reinitialize a speculative load!"); mOpCode = eSpeculativeLoadImage; mUrl.Assign(aUrl); mCrossOrigin.Assign(aCrossOrigin); mReferrerPolicy.Assign( nsContentUtils::TrimWhitespace(aReferrerPolicy)); mSrcset.Assign(aSrcset); mSizes.Assign(aSizes); } // elements have multiple nodes followed by an , // where we use the first valid source, which may be the img. Because we // can't determine validity at this point without parsing CSS and getting // main thread state, we push preload operations for picture pushed and // popped, so that the target of the preload ops can determine what picture // and nesting level each source/img from the main preloading code exists // at. inline void InitOpenPicture() { NS_PRECONDITION(mOpCode == eSpeculativeLoadUninitialized, "Trying to reinitialize a speculative load!"); mOpCode = eSpeculativeLoadOpenPicture; } inline void InitEndPicture() { NS_PRECONDITION(mOpCode == eSpeculativeLoadUninitialized, "Trying to reinitialize a speculative load!"); mOpCode = eSpeculativeLoadEndPicture; } inline void InitPictureSource(const nsAString& aSrcset, const nsAString& aSizes, const nsAString& aType, const nsAString& aMedia) { NS_PRECONDITION(mOpCode == eSpeculativeLoadUninitialized, "Trying to reinitialize a speculative load!"); mOpCode = eSpeculativeLoadPictureSource; mSrcset.Assign(aSrcset); mSizes.Assign(aSizes); mTypeOrCharsetSourceOrDocumentMode.Assign(aType); mMedia.Assign(aMedia); } inline void InitScript(const nsAString& aUrl, const nsAString& aCharset, const nsAString& aType, const nsAString& aCrossOrigin, const nsAString& aIntegrity, bool aParserInHead) { NS_PRECONDITION(mOpCode == eSpeculativeLoadUninitialized, "Trying to reinitialize a speculative load!"); mOpCode = aParserInHead ? eSpeculativeLoadScriptFromHead : eSpeculativeLoadScript; mUrl.Assign(aUrl); mCharset.Assign(aCharset); mTypeOrCharsetSourceOrDocumentMode.Assign(aType); mCrossOrigin.Assign(aCrossOrigin); mIntegrity.Assign(aIntegrity); } inline void InitStyle(const nsAString& aUrl, const nsAString& aCharset, const nsAString& aCrossOrigin, const nsAString& aIntegrity) { NS_PRECONDITION(mOpCode == eSpeculativeLoadUninitialized, "Trying to reinitialize a speculative load!"); mOpCode = eSpeculativeLoadStyle; mUrl.Assign(aUrl); mCharset.Assign(aCharset); mCrossOrigin.Assign(aCrossOrigin); mIntegrity.Assign(aIntegrity); } /** * "Speculative" manifest loads aren't truly speculative--if a manifest * gets loaded, we are committed to it. There can never be a