tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }