nsHtml5SpeculativeLoad.cpp (5587B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #include "nsHtml5SpeculativeLoad.h" 6 #include "mozilla/Encoding.h" 7 #include "nsHtml5TreeOpExecutor.h" 8 9 using namespace mozilla; 10 11 nsHtml5SpeculativeLoad::nsHtml5SpeculativeLoad() 12 : mOpCode(eSpeculativeLoadUninitialized), 13 mIsAsync(false), 14 mIsDefer(false), 15 mIsLinkPreload(false), 16 mIsError(false), 17 mEncoding(nullptr) { 18 MOZ_COUNT_CTOR(nsHtml5SpeculativeLoad); 19 new (&mCharsetOrSrcset) nsString; 20 } 21 22 nsHtml5SpeculativeLoad::~nsHtml5SpeculativeLoad() { 23 MOZ_COUNT_DTOR(nsHtml5SpeculativeLoad); 24 NS_ASSERTION(mOpCode != eSpeculativeLoadUninitialized, 25 "Uninitialized speculative load."); 26 if (!(mOpCode == eSpeculativeLoadSetDocumentCharset || 27 mOpCode == eSpeculativeLoadMaybeComplainAboutCharset)) { 28 mCharsetOrSrcset.~nsString(); 29 } 30 } 31 32 void nsHtml5SpeculativeLoad::Perform(nsHtml5TreeOpExecutor* aExecutor) { 33 switch (mOpCode) { 34 case eSpeculativeLoadBase: 35 aExecutor->SetSpeculationBase(mUrlOrSizes); 36 break; 37 case eSpeculativeLoadCSP: 38 aExecutor->AddSpeculationCSP( 39 mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity); 40 break; 41 case eSpeculativeLoadMetaReferrer: 42 aExecutor->UpdateReferrerInfoFromMeta(mReferrerPolicyOrIntegrity); 43 break; 44 case eSpeculativeLoadImage: 45 aExecutor->PreloadImage( 46 mUrlOrSizes, mCrossOrigin, mMedia, mCharsetOrSrcset, 47 mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, 48 mReferrerPolicyOrIntegrity, mIsLinkPreload, mFetchPriority, 49 mNonceOrType); 50 break; 51 case eSpeculativeLoadOpenPicture: 52 aExecutor->PreloadOpenPicture(); 53 break; 54 case eSpeculativeLoadEndPicture: 55 aExecutor->PreloadEndPicture(); 56 break; 57 case eSpeculativeLoadPictureSource: 58 aExecutor->PreloadPictureSource( 59 mCharsetOrSrcset, mUrlOrSizes, 60 mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, 61 mMedia); 62 break; 63 case eSpeculativeLoadScript: 64 aExecutor->PreloadScript( 65 mUrlOrSizes, mCharsetOrSrcset, 66 mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, 67 mCrossOrigin, mMedia, mNonceOrType, mFetchPriority, 68 mReferrerPolicyOrIntegrity, mScriptReferrerPolicy, false, mIsAsync, 69 mIsDefer, mIsLinkPreload); 70 break; 71 case eSpeculativeLoadScriptFromHead: 72 aExecutor->PreloadScript( 73 mUrlOrSizes, mCharsetOrSrcset, 74 mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, 75 mCrossOrigin, mMedia, mNonceOrType, mFetchPriority, 76 mReferrerPolicyOrIntegrity, mScriptReferrerPolicy, true, mIsAsync, 77 mIsDefer, mIsLinkPreload); 78 break; 79 case eSpeculativeLoadStyle: 80 aExecutor->PreloadStyle( 81 mUrlOrSizes, mCharsetOrSrcset, mCrossOrigin, mMedia, 82 mReferrerPolicyOrIntegrity, mNonceOrType, 83 mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity, 84 mIsLinkPreload, mFetchPriority); 85 break; 86 case eSpeculativeLoadManifest: 87 // TODO: remove this 88 break; 89 case eSpeculativeLoadSetDocumentCharset: { 90 MOZ_ASSERT(mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity 91 .Length() == 1, 92 "Unexpected charset source string"); 93 nsCharsetSource enumSource = 94 (nsCharsetSource) 95 mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity 96 .First(); 97 aExecutor->SetDocumentCharsetAndSource(WrapNotNull(mEncoding), 98 enumSource); 99 if (mCommitEncodingSpeculation) { 100 aExecutor->CommitToInternalEncoding(); 101 } 102 } break; 103 case eSpeculativeLoadSetDocumentMode: { 104 NS_ASSERTION(mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity 105 .Length() == 1, 106 "Unexpected document mode string"); 107 nsHtml5DocumentMode mode = 108 (nsHtml5DocumentMode) 109 mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity 110 .First(); 111 aExecutor->SetDocumentMode(mode); 112 } break; 113 case eSpeculativeLoadPreconnect: 114 aExecutor->Preconnect(mUrlOrSizes, mCrossOrigin); 115 break; 116 case eSpeculativeLoadFont: 117 aExecutor->PreloadFont(mUrlOrSizes, mCrossOrigin, mMedia, 118 mReferrerPolicyOrIntegrity, mFetchPriority); 119 break; 120 case eSpeculativeLoadFetch: 121 aExecutor->PreloadFetch(mUrlOrSizes, mCrossOrigin, mMedia, 122 mReferrerPolicyOrIntegrity, mFetchPriority); 123 break; 124 case eSpeculativeLoadMaybeComplainAboutCharset: { 125 MOZ_ASSERT(mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity 126 .Length() == 2, 127 "Unexpected line number string"); 128 uint32_t high = 129 (uint32_t) 130 mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity 131 .CharAt(0); 132 uint32_t low = 133 (uint32_t) 134 mTypeOrCharsetSourceOrDocumentModeOrMetaCSPOrSizesOrIntegrity 135 .CharAt(1); 136 uint32_t line = (high << 16) | low; 137 aExecutor->MaybeComplainAboutCharset(mMsgId, mIsError, (int32_t)line); 138 } break; 139 default: 140 MOZ_ASSERT_UNREACHABLE("Bogus speculative load."); 141 break; 142 } 143 }