Commit 2f5607b8 authored by Emilio Cobos Álvarez's avatar Emilio Cobos Álvarez
Browse files

Bug 1642221 - Rename SheetLoadData::mLoaderPrincipal to mTriggeringPrincipal. r=jwatt

I'm about to introduce the concept of "Loader principal" (as in "the
principal of the CSS loader"), and SheetLoadData already has an
mLoaderPrincipal.

However SheetLoadData's principal is just the triggering principal (the
principal that initiated the load). So name it that with consistency
with SheetInfo::mTriggeringPrincipal etc.

Differential Revision: https://phabricator.services.mozilla.com/D77613
parent 1ba1fb1c
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "mozilla/dom/Element.h" #include "mozilla/dom/Element.h"
#include "mozilla/dom/CSSStyleRule.h" #include "mozilla/dom/CSSStyleRule.h"
#include "mozilla/dom/InspectorUtilsBinding.h" #include "mozilla/dom/InspectorUtilsBinding.h"
#include "mozilla/dom/LinkStyle.h"
#include "mozilla/dom/ToJSValue.h" #include "mozilla/dom/ToJSValue.h"
#include "nsCSSProps.h" #include "nsCSSProps.h"
#include "nsCSSValue.h" #include "nsCSSValue.h"
......
...@@ -254,7 +254,7 @@ class SheetLoadDataHashKey : public nsURIHashKey { ...@@ -254,7 +254,7 @@ class SheetLoadDataHashKey : public nsURIHashKey {
SheetLoadDataHashKey::SheetLoadDataHashKey(css::SheetLoadData& aLoadData) SheetLoadDataHashKey::SheetLoadDataHashKey(css::SheetLoadData& aLoadData)
: nsURIHashKey(aLoadData.mURI), : nsURIHashKey(aLoadData.mURI),
mPrincipal(aLoadData.mLoaderPrincipal), mPrincipal(aLoadData.mTriggeringPrincipal),
mReferrerInfo(aLoadData.ReferrerInfo()), mReferrerInfo(aLoadData.ReferrerInfo()),
mCORSMode(aLoadData.mSheet->GetCORSMode()), mCORSMode(aLoadData.mSheet->GetCORSMode()),
mParsingMode(aLoadData.mSheet->ParsingMode()), mParsingMode(aLoadData.mSheet->ParsingMode()),
...@@ -278,7 +278,7 @@ SheetLoadData::SheetLoadData(Loader* aLoader, const nsAString& aTitle, ...@@ -278,7 +278,7 @@ SheetLoadData::SheetLoadData(Loader* aLoader, const nsAString& aTitle,
nsINode* aOwningNode, IsAlternate aIsAlternate, nsINode* aOwningNode, IsAlternate aIsAlternate,
MediaMatched aMediaMatches, IsPreload aIsPreload, MediaMatched aMediaMatches, IsPreload aIsPreload,
nsICSSLoaderObserver* aObserver, nsICSSLoaderObserver* aObserver,
nsIPrincipal* aLoaderPrincipal, nsIPrincipal* aTriggeringPrincipal,
nsIReferrerInfo* aReferrerInfo, nsIReferrerInfo* aReferrerInfo,
nsINode* aRequestingNode) nsINode* aRequestingNode)
: mLoader(aLoader), : mLoader(aLoader),
...@@ -305,7 +305,7 @@ SheetLoadData::SheetLoadData(Loader* aLoader, const nsAString& aTitle, ...@@ -305,7 +305,7 @@ SheetLoadData::SheetLoadData(Loader* aLoader, const nsAString& aTitle,
mIsPreload(aIsPreload), mIsPreload(aIsPreload),
mOwningNode(aOwningNode), mOwningNode(aOwningNode),
mObserver(aObserver), mObserver(aObserver),
mLoaderPrincipal(aLoaderPrincipal), mTriggeringPrincipal(aTriggeringPrincipal),
mReferrerInfo(aReferrerInfo), mReferrerInfo(aReferrerInfo),
mRequestingNode(aRequestingNode), mRequestingNode(aRequestingNode),
mPreloadEncoding(nullptr) { mPreloadEncoding(nullptr) {
...@@ -317,7 +317,7 @@ SheetLoadData::SheetLoadData(Loader* aLoader, const nsAString& aTitle, ...@@ -317,7 +317,7 @@ SheetLoadData::SheetLoadData(Loader* aLoader, const nsAString& aTitle,
SheetLoadData::SheetLoadData(Loader* aLoader, nsIURI* aURI, StyleSheet* aSheet, SheetLoadData::SheetLoadData(Loader* aLoader, nsIURI* aURI, StyleSheet* aSheet,
SheetLoadData* aParentData, SheetLoadData* aParentData,
nsICSSLoaderObserver* aObserver, nsICSSLoaderObserver* aObserver,
nsIPrincipal* aLoaderPrincipal, nsIPrincipal* aTriggeringPrincipal,
nsIReferrerInfo* aReferrerInfo, nsIReferrerInfo* aReferrerInfo,
nsINode* aRequestingNode) nsINode* aRequestingNode)
: mLoader(aLoader), : mLoader(aLoader),
...@@ -344,7 +344,7 @@ SheetLoadData::SheetLoadData(Loader* aLoader, nsIURI* aURI, StyleSheet* aSheet, ...@@ -344,7 +344,7 @@ SheetLoadData::SheetLoadData(Loader* aLoader, nsIURI* aURI, StyleSheet* aSheet,
mIsPreload(IsPreload::No), mIsPreload(IsPreload::No),
mOwningNode(nullptr), mOwningNode(nullptr),
mObserver(aObserver), mObserver(aObserver),
mLoaderPrincipal(aLoaderPrincipal), mTriggeringPrincipal(aTriggeringPrincipal),
mReferrerInfo(aReferrerInfo), mReferrerInfo(aReferrerInfo),
mRequestingNode(aRequestingNode), mRequestingNode(aRequestingNode),
mPreloadEncoding(nullptr) { mPreloadEncoding(nullptr) {
...@@ -361,7 +361,7 @@ SheetLoadData::SheetLoadData( ...@@ -361,7 +361,7 @@ SheetLoadData::SheetLoadData(
Loader* aLoader, nsIURI* aURI, StyleSheet* aSheet, bool aSyncLoad, Loader* aLoader, nsIURI* aURI, StyleSheet* aSheet, bool aSyncLoad,
UseSystemPrincipal aUseSystemPrincipal, IsPreload aIsPreload, UseSystemPrincipal aUseSystemPrincipal, IsPreload aIsPreload,
const Encoding* aPreloadEncoding, nsICSSLoaderObserver* aObserver, const Encoding* aPreloadEncoding, nsICSSLoaderObserver* aObserver,
nsIPrincipal* aLoaderPrincipal, nsIReferrerInfo* aReferrerInfo, nsIPrincipal* aTriggeringPrincipal, nsIReferrerInfo* aReferrerInfo,
nsINode* aRequestingNode) nsINode* aRequestingNode)
: mLoader(aLoader), : mLoader(aLoader),
mEncoding(nullptr), mEncoding(nullptr),
...@@ -386,7 +386,7 @@ SheetLoadData::SheetLoadData( ...@@ -386,7 +386,7 @@ SheetLoadData::SheetLoadData(
mIsPreload(aIsPreload), mIsPreload(aIsPreload),
mOwningNode(nullptr), mOwningNode(nullptr),
mObserver(aObserver), mObserver(aObserver),
mLoaderPrincipal(aLoaderPrincipal), mTriggeringPrincipal(aTriggeringPrincipal),
mReferrerInfo(aReferrerInfo), mReferrerInfo(aReferrerInfo),
mRequestingNode(aRequestingNode), mRequestingNode(aRequestingNode),
mPreloadEncoding(aPreloadEncoding) { mPreloadEncoding(aPreloadEncoding) {
...@@ -539,10 +539,10 @@ static void AssertIncompleteSheetMatches(const SheetLoadData& aData, ...@@ -539,10 +539,10 @@ static void AssertIncompleteSheetMatches(const SheetLoadData& aData,
const SheetLoadDataHashKey& aKey) { const SheetLoadDataHashKey& aKey) {
#ifdef DEBUG #ifdef DEBUG
bool debugEqual; bool debugEqual;
MOZ_ASSERT((!aKey.GetPrincipal() && !aData.mLoaderPrincipal) || MOZ_ASSERT((!aKey.GetPrincipal() && !aData.mTriggeringPrincipal) ||
(aKey.GetPrincipal() && aData.mLoaderPrincipal && (aKey.GetPrincipal() && aData.mTriggeringPrincipal &&
NS_SUCCEEDED(aKey.GetPrincipal()->Equals( NS_SUCCEEDED(aKey.GetPrincipal()->Equals(
aData.mLoaderPrincipal, &debugEqual)) && aData.mTriggeringPrincipal, &debugEqual)) &&
debugEqual), debugEqual),
"Principals should be the same"); "Principals should be the same");
#endif #endif
...@@ -954,9 +954,9 @@ nsresult SheetLoadData::VerifySheetReadyToParse(nsresult aStatus, ...@@ -954,9 +954,9 @@ nsresult SheetLoadData::VerifySheetReadyToParse(nsresult aStatus,
mSheet->SetPrincipal(principal); mSheet->SetPrincipal(principal);
if (mLoaderPrincipal && mSheet->GetCORSMode() == CORS_NONE) { if (mTriggeringPrincipal && mSheet->GetCORSMode() == CORS_NONE) {
bool subsumed; bool subsumed;
result = mLoaderPrincipal->Subsumes(principal, &subsumed); result = mTriggeringPrincipal->Subsumes(principal, &subsumed);
if (NS_FAILED(result) || !subsumed) { if (NS_FAILED(result) || !subsumed) {
mIsCrossOriginNoCORS = true; mIsCrossOriginNoCORS = true;
} }
...@@ -997,9 +997,9 @@ nsresult SheetLoadData::VerifySheetReadyToParse(nsresult aStatus, ...@@ -997,9 +997,9 @@ nsresult SheetLoadData::VerifySheetReadyToParse(nsresult aStatus,
uint32_t errorFlag; uint32_t errorFlag;
bool sameOrigin = true; bool sameOrigin = true;
if (mLoaderPrincipal) { if (mTriggeringPrincipal) {
bool subsumed; bool subsumed;
result = mLoaderPrincipal->Subsumes(principal, &subsumed); result = mTriggeringPrincipal->Subsumes(principal, &subsumed);
if (NS_FAILED(result) || !subsumed) { if (NS_FAILED(result) || !subsumed) {
sameOrigin = false; sameOrigin = false;
} }
...@@ -1147,10 +1147,10 @@ nsresult Loader::CheckContentPolicy(nsIPrincipal* aLoadingPrincipal, ...@@ -1147,10 +1147,10 @@ nsresult Loader::CheckContentPolicy(nsIPrincipal* aLoadingPrincipal,
* the result of CreateSheet(). * the result of CreateSheet().
*/ */
std::tuple<RefPtr<StyleSheet>, Loader::SheetState> Loader::CreateSheet( std::tuple<RefPtr<StyleSheet>, Loader::SheetState> Loader::CreateSheet(
nsIURI* aURI, nsIContent* aLinkingContent, nsIPrincipal* aLoaderPrincipal, nsIURI* aURI, nsIContent* aLinkingContent,
css::SheetParsingMode aParsingMode, CORSMode aCORSMode, nsIPrincipal* aTriggeringPrincipal, css::SheetParsingMode aParsingMode,
nsIReferrerInfo* aLoadingReferrerInfo, const nsAString& aIntegrity, CORSMode aCORSMode, nsIReferrerInfo* aLoadingReferrerInfo,
bool aSyncLoad, IsPreload aIsPreload) { const nsAString& aIntegrity, bool aSyncLoad, IsPreload aIsPreload) {
MOZ_ASSERT(aURI, "This path is not taken for inline stylesheets"); MOZ_ASSERT(aURI, "This path is not taken for inline stylesheets");
LOG(("css::Loader::CreateSheet(%s)", aURI->GetSpecOrDefault().get())); LOG(("css::Loader::CreateSheet(%s)", aURI->GetSpecOrDefault().get()));
...@@ -1170,7 +1170,7 @@ std::tuple<RefPtr<StyleSheet>, Loader::SheetState> Loader::CreateSheet( ...@@ -1170,7 +1170,7 @@ std::tuple<RefPtr<StyleSheet>, Loader::SheetState> Loader::CreateSheet(
SRICheck::IntegrityMetadata(aIntegrity, sourceUri, mReporter, &sriMetadata); SRICheck::IntegrityMetadata(aIntegrity, sourceUri, mReporter, &sriMetadata);
} }
SheetLoadDataHashKey key(aURI, aLoaderPrincipal, aLoadingReferrerInfo, SheetLoadDataHashKey key(aURI, aTriggeringPrincipal, aLoadingReferrerInfo,
aCORSMode, aParsingMode, sriMetadata, aIsPreload); aCORSMode, aParsingMode, sriMetadata, aIsPreload);
auto cacheResult = mSheets->Lookup(key, aSyncLoad); auto cacheResult = mSheets->Lookup(key, aSyncLoad);
if (const auto& [styleSheet, sheetState] = cacheResult; styleSheet) { if (const auto& [styleSheet, sheetState] = cacheResult; styleSheet) {
...@@ -1400,10 +1400,10 @@ nsresult Loader::LoadSheet(SheetLoadData& aLoadData, SheetState aSheetState) { ...@@ -1400,10 +1400,10 @@ nsresult Loader::LoadSheet(SheetLoadData& aLoadData, SheetState aSheetState) {
// This is because of a case where the node is the document being styled and // This is because of a case where the node is the document being styled and
// the principal is the stylesheet (perhaps from a different origin) that is // the principal is the stylesheet (perhaps from a different origin) that is
// applying the styles. // applying the styles.
if (aLoadData.mRequestingNode && aLoadData.mLoaderPrincipal) { if (aLoadData.mRequestingNode && aLoadData.mTriggeringPrincipal) {
rv = NS_NewChannelWithTriggeringPrincipal( rv = NS_NewChannelWithTriggeringPrincipal(
getter_AddRefs(channel), aLoadData.mURI, aLoadData.mRequestingNode, getter_AddRefs(channel), aLoadData.mURI, aLoadData.mRequestingNode,
aLoadData.mLoaderPrincipal, securityFlags, contentPolicyType); aLoadData.mTriggeringPrincipal, securityFlags, contentPolicyType);
} else { } else {
// either we are loading something inside a document, in which case // either we are loading something inside a document, in which case
// we should always have a requestingNode, or we are loading something // we should always have a requestingNode, or we are loading something
...@@ -1543,10 +1543,10 @@ nsresult Loader::LoadSheet(SheetLoadData& aLoadData, SheetState aSheetState) { ...@@ -1543,10 +1543,10 @@ nsresult Loader::LoadSheet(SheetLoadData& aLoadData, SheetState aSheetState) {
// and a principal. This is because of a case where the node is the document // and a principal. This is because of a case where the node is the document
// being styled and the principal is the stylesheet (perhaps from a different // being styled and the principal is the stylesheet (perhaps from a different
// origin) that is applying the styles. // origin) that is applying the styles.
if (aLoadData.mRequestingNode && aLoadData.mLoaderPrincipal) { if (aLoadData.mRequestingNode && aLoadData.mTriggeringPrincipal) {
rv = NS_NewChannelWithTriggeringPrincipal( rv = NS_NewChannelWithTriggeringPrincipal(
getter_AddRefs(channel), aLoadData.mURI, aLoadData.mRequestingNode, getter_AddRefs(channel), aLoadData.mURI, aLoadData.mRequestingNode,
aLoadData.mLoaderPrincipal, securityFlags, contentPolicyType, aLoadData.mTriggeringPrincipal, securityFlags, contentPolicyType,
/* PerformanceStorage */ nullptr, loadGroup); /* PerformanceStorage */ nullptr, loadGroup);
} else { } else {
// either we are loading something inside a document, in which case // either we are loading something inside a document, in which case
......
...@@ -338,10 +338,10 @@ class Loader final { ...@@ -338,10 +338,10 @@ class Loader final {
}; };
std::tuple<RefPtr<StyleSheet>, SheetState> CreateSheet( std::tuple<RefPtr<StyleSheet>, SheetState> CreateSheet(
const SheetInfo& aInfo, nsIPrincipal* aLoaderPrincipal, const SheetInfo& aInfo, nsIPrincipal* aTriggeringPrincipal,
css::SheetParsingMode aParsingMode, bool aSyncLoad, css::SheetParsingMode aParsingMode, bool aSyncLoad,
IsPreload aIsPreload) { IsPreload aIsPreload) {
return CreateSheet(aInfo.mURI, aInfo.mContent, aLoaderPrincipal, return CreateSheet(aInfo.mURI, aInfo.mContent, aTriggeringPrincipal,
aParsingMode, aInfo.mCORSMode, aInfo.mReferrerInfo, aParsingMode, aInfo.mCORSMode, aInfo.mReferrerInfo,
aInfo.mIntegrity, aSyncLoad, aIsPreload); aInfo.mIntegrity, aSyncLoad, aIsPreload);
} }
...@@ -350,9 +350,10 @@ class Loader final { ...@@ -350,9 +350,10 @@ class Loader final {
// must be non-null then. The loader principal must never be null // must be non-null then. The loader principal must never be null
// if aURI is not null. // if aURI is not null.
std::tuple<RefPtr<StyleSheet>, SheetState> CreateSheet( std::tuple<RefPtr<StyleSheet>, SheetState> CreateSheet(
nsIURI* aURI, nsIContent* aLinkingContent, nsIPrincipal* aLoaderPrincipal, nsIURI* aURI, nsIContent* aLinkingContent,
css::SheetParsingMode, CORSMode, nsIReferrerInfo* aLoadingReferrerInfo, nsIPrincipal* aTriggeringPrincipal, css::SheetParsingMode, CORSMode,
const nsAString& aIntegrity, bool aSyncLoad, IsPreload aIsPreload); nsIReferrerInfo* aLoadingReferrerInfo, const nsAString& aIntegrity,
bool aSyncLoad, IsPreload aIsPreload);
// Pass in either a media string or the MediaList from the CSSParser. Don't // Pass in either a media string or the MediaList from the CSSParser. Don't
// pass both. // pass both.
......
...@@ -50,20 +50,21 @@ class SheetLoadData final : public nsIRunnable, public nsIThreadObserver { ...@@ -50,20 +50,21 @@ class SheetLoadData final : public nsIRunnable, public nsIThreadObserver {
StyleSheet* aSheet, bool aSyncLoad, nsINode* aOwningNode, StyleSheet* aSheet, bool aSyncLoad, nsINode* aOwningNode,
IsAlternate aIsAlternate, MediaMatched aMediaMatched, IsAlternate aIsAlternate, MediaMatched aMediaMatched,
IsPreload aIsPreload, nsICSSLoaderObserver* aObserver, IsPreload aIsPreload, nsICSSLoaderObserver* aObserver,
nsIPrincipal* aLoaderPrincipal, nsIReferrerInfo* aReferrerInfo, nsIPrincipal* aTriggeringPrincipal,
nsINode* aRequestingNode); nsIReferrerInfo* aReferrerInfo, nsINode* aRequestingNode);
// Data for loading a sheet linked from an @import rule // Data for loading a sheet linked from an @import rule
SheetLoadData(Loader* aLoader, nsIURI* aURI, StyleSheet* aSheet, SheetLoadData(Loader* aLoader, nsIURI* aURI, StyleSheet* aSheet,
SheetLoadData* aParentData, nsICSSLoaderObserver* aObserver, SheetLoadData* aParentData, nsICSSLoaderObserver* aObserver,
nsIPrincipal* aLoaderPrincipal, nsIReferrerInfo* aReferrerInfo, nsIPrincipal* aTriggeringPrincipal,
nsINode* aRequestingNode); nsIReferrerInfo* aReferrerInfo, nsINode* aRequestingNode);
// Data for loading a non-document sheet // Data for loading a non-document sheet
SheetLoadData(Loader* aLoader, nsIURI* aURI, StyleSheet* aSheet, SheetLoadData(Loader* aLoader, nsIURI* aURI, StyleSheet* aSheet,
bool aSyncLoad, UseSystemPrincipal, IsPreload, bool aSyncLoad, UseSystemPrincipal, IsPreload,
const Encoding* aPreloadEncoding, const Encoding* aPreloadEncoding,
nsICSSLoaderObserver* aObserver, nsIPrincipal* aLoaderPrincipal, nsICSSLoaderObserver* aObserver,
nsIPrincipal* aTriggeringPrincipal,
nsIReferrerInfo* aReferrerInfo, nsINode* aRequestingNode); nsIReferrerInfo* aReferrerInfo, nsINode* aRequestingNode);
nsIReferrerInfo* ReferrerInfo() { return mReferrerInfo; } nsIReferrerInfo* ReferrerInfo() { return mReferrerInfo; }
...@@ -193,7 +194,7 @@ class SheetLoadData final : public nsIRunnable, public nsIThreadObserver { ...@@ -193,7 +194,7 @@ class SheetLoadData final : public nsIRunnable, public nsIThreadObserver {
const nsCOMPtr<nsICSSLoaderObserver> mObserver; const nsCOMPtr<nsICSSLoaderObserver> mObserver;
// The principal that identifies who started loading us. // The principal that identifies who started loading us.
const nsCOMPtr<nsIPrincipal> mLoaderPrincipal; const nsCOMPtr<nsIPrincipal> mTriggeringPrincipal;
// Referrer info of the load. // Referrer info of the load.
const nsCOMPtr<nsIReferrerInfo> mReferrerInfo; const nsCOMPtr<nsIReferrerInfo> mReferrerInfo;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "PreloadHashKey.h" #include "PreloadHashKey.h"
#include "mozilla/dom/Element.h" // StringToCORSMode #include "mozilla/dom/Element.h" // StringToCORSMode
#include "mozilla/css/SheetLoadData.h"
#include "nsIPrincipal.h" #include "nsIPrincipal.h"
#include "nsIReferrerInfo.h" #include "nsIReferrerInfo.h"
...@@ -117,7 +118,7 @@ PreloadHashKey PreloadHashKey::CreateAsStyle( ...@@ -117,7 +118,7 @@ PreloadHashKey PreloadHashKey::CreateAsStyle(
// static // static
PreloadHashKey PreloadHashKey::CreateAsStyle( PreloadHashKey PreloadHashKey::CreateAsStyle(
css::SheetLoadData& aSheetLoadData) { css::SheetLoadData& aSheetLoadData) {
return CreateAsStyle(aSheetLoadData.mURI, aSheetLoadData.mLoaderPrincipal, return CreateAsStyle(aSheetLoadData.mURI, aSheetLoadData.mTriggeringPrincipal,
aSheetLoadData.ReferrerInfo(), aSheetLoadData.ReferrerInfo(),
aSheetLoadData.mSheet->GetCORSMode(), aSheetLoadData.mSheet->GetCORSMode(),
aSheetLoadData.mSheet->ParsingMode()); aSheetLoadData.mSheet->ParsingMode());
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
#define PreloadHashKey_h__ #define PreloadHashKey_h__
#include "mozilla/CORSMode.h" #include "mozilla/CORSMode.h"
#include "mozilla/css/SheetLoadData.h" #include "mozilla/css/SheetParsingMode.h"
#include "mozilla/dom/ReferrerPolicyBinding.h" #include "mozilla/dom/ReferrerPolicyBinding.h"
#include "mozilla/dom/ScriptKind.h" #include "mozilla/dom/ScriptKind.h"
#include "nsURIHashKey.h" #include "nsURIHashKey.h"
...@@ -16,6 +16,10 @@ class nsIReferrerInfo; ...@@ -16,6 +16,10 @@ class nsIReferrerInfo;
namespace mozilla { namespace mozilla {
namespace css {
class SheetLoadData;
}
/** /**
* This key is used for coalescing and lookup of preloading or regular * This key is used for coalescing and lookup of preloading or regular
* speculative loads. It consists of: * speculative loads. It consists of:
...@@ -54,7 +58,7 @@ class PreloadHashKey : public nsURIHashKey { ...@@ -54,7 +58,7 @@ class PreloadHashKey : public nsURIHashKey {
nsIReferrerInfo* aReferrerInfo, nsIReferrerInfo* aReferrerInfo,
CORSMode aCORSMode, CORSMode aCORSMode,
css::SheetParsingMode aParsingMode); css::SheetParsingMode aParsingMode);
static PreloadHashKey CreateAsStyle(css::SheetLoadData& aSheetLoadData); static PreloadHashKey CreateAsStyle(css::SheetLoadData&);
// Construct key for "image" // Construct key for "image"
static PreloadHashKey CreateAsImage( static PreloadHashKey CreateAsImage(
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment