From 5f8de423f190bbb79a62f804151bc24824fa32d8 Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Fri, 2 Feb 2018 04:16:08 -0500 Subject: Add m-esr52 at 52.6.0 --- parser/html/nsHtml5SpeculativeLoad.h | 263 +++++++++++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 parser/html/nsHtml5SpeculativeLoad.h (limited to 'parser/html/nsHtml5SpeculativeLoad.h') diff --git a/parser/html/nsHtml5SpeculativeLoad.h b/parser/html/nsHtml5SpeculativeLoad.h new file mode 100644 index 000000000..575f6186d --- /dev/null +++ b/parser/html/nsHtml5SpeculativeLoad.h @@ -0,0 +1,263 @@ +/* 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