mirror of
https://github.com/roytam1/UXP.git
synced 2026-05-26 13:58:49 +00:00
3fa4aabfad
This makes sure we don't block body-referred sub-resources by head-referenced defer and async scripts. This is important for all script loads, not just modules, but is added here because it was run into while implementing modules.
94 lines
3.2 KiB
C++
94 lines
3.2 KiB
C++
/* 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 "nsHtml5TreeOpExecutor.h"
|
|
|
|
nsHtml5SpeculativeLoad::nsHtml5SpeculativeLoad()
|
|
:
|
|
#ifdef DEBUG
|
|
mOpCode(eSpeculativeLoadUninitialized),
|
|
#endif
|
|
mIsAsync(false),
|
|
mIsDefer(false)
|
|
{
|
|
MOZ_COUNT_CTOR(nsHtml5SpeculativeLoad);
|
|
}
|
|
|
|
nsHtml5SpeculativeLoad::~nsHtml5SpeculativeLoad()
|
|
{
|
|
MOZ_COUNT_DTOR(nsHtml5SpeculativeLoad);
|
|
NS_ASSERTION(mOpCode != eSpeculativeLoadUninitialized,
|
|
"Uninitialized speculative load.");
|
|
}
|
|
|
|
void
|
|
nsHtml5SpeculativeLoad::Perform(nsHtml5TreeOpExecutor* aExecutor)
|
|
{
|
|
switch (mOpCode) {
|
|
case eSpeculativeLoadBase:
|
|
aExecutor->SetSpeculationBase(mUrl);
|
|
break;
|
|
case eSpeculativeLoadCSP:
|
|
aExecutor->AddSpeculationCSP(mMetaCSP);
|
|
break;
|
|
case eSpeculativeLoadMetaReferrer:
|
|
aExecutor->SetSpeculationReferrerPolicy(mReferrerPolicy);
|
|
break;
|
|
case eSpeculativeLoadImage:
|
|
aExecutor->PreloadImage(mUrl, mCrossOrigin, mSrcset, mSizes, mReferrerPolicy);
|
|
break;
|
|
case eSpeculativeLoadOpenPicture:
|
|
aExecutor->PreloadOpenPicture();
|
|
break;
|
|
case eSpeculativeLoadEndPicture:
|
|
aExecutor->PreloadEndPicture();
|
|
break;
|
|
case eSpeculativeLoadPictureSource:
|
|
aExecutor->PreloadPictureSource(mSrcset, mSizes, mTypeOrCharsetSourceOrDocumentMode,
|
|
mMedia);
|
|
break;
|
|
case eSpeculativeLoadScript:
|
|
aExecutor->PreloadScript(mUrl, mCharset, mTypeOrCharsetSourceOrDocumentMode,
|
|
mCrossOrigin, mIntegrity, false,
|
|
mIsAsync, mIsDefer);
|
|
break;
|
|
case eSpeculativeLoadScriptFromHead:
|
|
aExecutor->PreloadScript(mUrl, mCharset, mTypeOrCharsetSourceOrDocumentMode,
|
|
mCrossOrigin, mIntegrity, true,
|
|
mIsAsync, mIsDefer);
|
|
break;
|
|
case eSpeculativeLoadStyle:
|
|
aExecutor->PreloadStyle(mUrl, mCharset, mCrossOrigin, mIntegrity);
|
|
break;
|
|
case eSpeculativeLoadManifest:
|
|
aExecutor->ProcessOfflineManifest(mUrl);
|
|
break;
|
|
case eSpeculativeLoadSetDocumentCharset: {
|
|
nsAutoCString narrowName;
|
|
CopyUTF16toUTF8(mCharset, narrowName);
|
|
NS_ASSERTION(mTypeOrCharsetSourceOrDocumentMode.Length() == 1,
|
|
"Unexpected charset source string");
|
|
int32_t intSource = (int32_t)mTypeOrCharsetSourceOrDocumentMode.First();
|
|
aExecutor->SetDocumentCharsetAndSource(narrowName,
|
|
intSource);
|
|
}
|
|
break;
|
|
case eSpeculativeLoadSetDocumentMode: {
|
|
NS_ASSERTION(mTypeOrCharsetSourceOrDocumentMode.Length() == 1,
|
|
"Unexpected document mode string");
|
|
nsHtml5DocumentMode mode =
|
|
(nsHtml5DocumentMode)mTypeOrCharsetSourceOrDocumentMode.First();
|
|
aExecutor->SetDocumentMode(mode);
|
|
}
|
|
break;
|
|
case eSpeculativeLoadPreconnect:
|
|
aExecutor->Preconnect(mUrl, mCrossOrigin);
|
|
break;
|
|
default:
|
|
NS_NOTREACHED("Bogus speculative load.");
|
|
break;
|
|
}
|
|
}
|