diff options
Diffstat (limited to 'parser/html/nsHtml5SpeculativeLoad.cpp')
-rw-r--r-- | parser/html/nsHtml5SpeculativeLoad.cpp | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/parser/html/nsHtml5SpeculativeLoad.cpp b/parser/html/nsHtml5SpeculativeLoad.cpp new file mode 100644 index 0000000000..f7994495a6 --- /dev/null +++ b/parser/html/nsHtml5SpeculativeLoad.cpp @@ -0,0 +1,158 @@ +/* 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/. */ + +#include "nsHtml5SpeculativeLoad.h" +#include "mozilla/Encoding.h" +#include "nsHtml5TreeOpExecutor.h" + +using namespace mozilla; + +nsHtml5SpeculativeLoad::nsHtml5SpeculativeLoad() + : mOpCode(eSpeculativeLoadUninitialized), + mIsAsync(false), + mIsDefer(false), + mIsLinkPreload(false), + mIsError(false), + mEncoding(nullptr) { + MOZ_COUNT_CTOR(nsHtml5SpeculativeLoad); + new (&mCharsetOrSrcset) nsString; +} + +nsHtml5SpeculativeLoad::~nsHtml5SpeculativeLoad() { + MOZ_COUNT_DTOR(nsHtml5SpeculativeLoad); + NS_ASSERTION(mOpCode != eSpeculativeLoadUninitialized, + "Uninitialized speculative load."); + if (!(mOpCode == eSpeculativeLoadSetDocumentCharset || + mOpCode == eSpeculativeLoadMaybeComplainAboutCharset)) { + mCharsetOrSrcset.~nsString(); + } +} + +void nsHtml5SpeculativeLoad::Perform(nsHtml5TreeOpExecutor* aExecutor) { + switch (mOpCode) { + case eSpeculativeLoadBase: + aExecutor->SetSpeculationBase(mUrlOrSizes); + break; + case eSpeculativeLoadCSP: + aExecutor->AddSpeculationCSP( + mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity); + break; + case eSpeculativeLoadMetaReferrer: + aExecutor->UpdateReferrerInfoFromMeta(mReferrerPolicyOrIntegrity); + break; + case eSpeculativeLoadImage: + aExecutor->PreloadImage( + mUrlOrSizes, mCrossOrigin, mMedia, mCharsetOrSrcset, + mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, + mReferrerPolicyOrIntegrity, mIsLinkPreload, mInitTimestamp); + break; + case eSpeculativeLoadOpenPicture: + aExecutor->PreloadOpenPicture(); + break; + case eSpeculativeLoadEndPicture: + aExecutor->PreloadEndPicture(); + break; + case eSpeculativeLoadPictureSource: + aExecutor->PreloadPictureSource( + mCharsetOrSrcset, mUrlOrSizes, + mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, + mMedia); + break; + case eSpeculativeLoadScript: + aExecutor->PreloadScript( + mUrlOrSizes, mCharsetOrSrcset, + mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, + mCrossOrigin, mMedia, mReferrerPolicyOrIntegrity, + mScriptReferrerPolicy, false, mIsAsync, mIsDefer, false, + mIsLinkPreload); + break; + case eSpeculativeLoadScriptFromHead: + aExecutor->PreloadScript( + mUrlOrSizes, mCharsetOrSrcset, + mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, + mCrossOrigin, mMedia, mReferrerPolicyOrIntegrity, + mScriptReferrerPolicy, true, mIsAsync, mIsDefer, false, + mIsLinkPreload); + break; + case eSpeculativeLoadNoModuleScript: + aExecutor->PreloadScript( + mUrlOrSizes, mCharsetOrSrcset, + mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, + mCrossOrigin, mMedia, mReferrerPolicyOrIntegrity, + mScriptReferrerPolicy, false, mIsAsync, mIsDefer, true, + mIsLinkPreload); + break; + case eSpeculativeLoadNoModuleScriptFromHead: + aExecutor->PreloadScript( + mUrlOrSizes, mCharsetOrSrcset, + mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, + mCrossOrigin, mMedia, mReferrerPolicyOrIntegrity, + mScriptReferrerPolicy, true, mIsAsync, mIsDefer, true, + mIsLinkPreload); + break; + case eSpeculativeLoadStyle: + aExecutor->PreloadStyle( + mUrlOrSizes, mCharsetOrSrcset, mCrossOrigin, mMedia, + mReferrerPolicyOrIntegrity, + mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, + mIsLinkPreload); + break; + case eSpeculativeLoadManifest: + // TODO: remove this + break; + case eSpeculativeLoadSetDocumentCharset: { + MOZ_ASSERT(mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity + .Length() == 1, + "Unexpected charset source string"); + nsCharsetSource enumSource = + (nsCharsetSource) + mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity + .First(); + aExecutor->SetDocumentCharsetAndSource(WrapNotNull(mEncoding), + enumSource); + if (mCommitEncodingSpeculation) { + aExecutor->CommitToInternalEncoding(); + } + } break; + case eSpeculativeLoadSetDocumentMode: { + NS_ASSERTION(mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity + .Length() == 1, + "Unexpected document mode string"); + nsHtml5DocumentMode mode = + (nsHtml5DocumentMode) + mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity + .First(); + aExecutor->SetDocumentMode(mode); + } break; + case eSpeculativeLoadPreconnect: + aExecutor->Preconnect(mUrlOrSizes, mCrossOrigin); + break; + case eSpeculativeLoadFont: + aExecutor->PreloadFont(mUrlOrSizes, mCrossOrigin, mMedia, + mReferrerPolicyOrIntegrity); + break; + case eSpeculativeLoadFetch: + aExecutor->PreloadFetch(mUrlOrSizes, mCrossOrigin, mMedia, + mReferrerPolicyOrIntegrity); + break; + case eSpeculativeLoadMaybeComplainAboutCharset: { + MOZ_ASSERT(mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity + .Length() == 2, + "Unexpected line number string"); + uint32_t high = + (uint32_t) + mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity + .CharAt(0); + uint32_t low = + (uint32_t) + mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity + .CharAt(1); + uint32_t line = (high << 16) | low; + aExecutor->MaybeComplainAboutCharset(mMsgId, mIsError, (int32_t)line); + } break; + default: + MOZ_ASSERT_UNREACHABLE("Bogus speculative load."); + break; + } +} |