Bug 1250379 - Create css::Loaders for specific style backend types. r=dholbert
This commit is contained in:
@@ -4363,7 +4363,7 @@ nsDocument::LoadAdditionalStyleSheet(additionalSheetType aType,
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
|
||||
// Loading the sheet sync.
|
||||
RefPtr<css::Loader> loader = new css::Loader();
|
||||
RefPtr<css::Loader> loader = new css::Loader(GetStyleBackendType());
|
||||
|
||||
css::SheetParsingMode parsingMode;
|
||||
switch (aType) {
|
||||
|
||||
@@ -2237,7 +2237,8 @@ nsDocumentViewer::CreateStyleSet(nsIDocument* aDocument,
|
||||
nsAutoString sheets;
|
||||
elt->GetAttribute(NS_LITERAL_STRING("usechromesheets"), sheets);
|
||||
if (!sheets.IsEmpty() && baseURI) {
|
||||
RefPtr<mozilla::css::Loader> cssLoader = new mozilla::css::Loader();
|
||||
RefPtr<mozilla::css::Loader> cssLoader =
|
||||
new mozilla::css::Loader(backendType);
|
||||
|
||||
char *str = ToNewCString(sheets);
|
||||
char *newStr = str;
|
||||
|
||||
@@ -211,7 +211,9 @@ nsStyleSheetService::LoadAndRegisterSheetInternal(nsIURI *aSheetURI,
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
||||
RefPtr<css::Loader> loader = new css::Loader();
|
||||
// XXXheycam We'll need to load and register both a Gecko- and Servo-backed
|
||||
// style sheet.
|
||||
RefPtr<css::Loader> loader = new css::Loader(StyleBackendType::Gecko);
|
||||
|
||||
StyleSheetHandle::RefPtr sheet;
|
||||
nsresult rv = loader->LoadSheetSync(aSheetURI, parsingMode, true, &sheet);
|
||||
@@ -265,7 +267,7 @@ nsStyleSheetService::PreloadSheet(nsIURI *aSheetURI, uint32_t aSheetType,
|
||||
// XXXheycam PreloadSheet can't support ServoStyleSheets until they implement
|
||||
// nsIDOMStyleSheet.
|
||||
|
||||
RefPtr<css::Loader> loader = new css::Loader();
|
||||
RefPtr<css::Loader> loader = new css::Loader(StyleBackendType::Gecko);
|
||||
|
||||
StyleSheetHandle::RefPtr sheet;
|
||||
nsresult rv = loader->LoadSheetSync(aSheetURI, parsingMode, true, &sheet);
|
||||
|
||||
@@ -2244,7 +2244,7 @@ CSSStyleSheet::ReparseSheet(const nsAString& aInput)
|
||||
loader = mDocument->CSSLoader();
|
||||
NS_ASSERTION(loader, "Document with no CSS loader!");
|
||||
} else {
|
||||
loader = new css::Loader();
|
||||
loader = new css::Loader(StyleBackendType::Gecko);
|
||||
}
|
||||
|
||||
mozAutoDocUpdate updateBatch(mDocument, UPDATE_STYLE, true);
|
||||
|
||||
@@ -532,10 +532,11 @@ LoaderReusableStyleSheets::FindReusableStyleSheet(nsIURI* aURL,
|
||||
* Loader Implementation *
|
||||
*************************/
|
||||
|
||||
Loader::Loader(void)
|
||||
Loader::Loader(StyleBackendType aType)
|
||||
: mDocument(nullptr)
|
||||
, mDatasToNotifyOn(0)
|
||||
, mCompatMode(eCompatibility_FullStandards)
|
||||
, mStyleBackendType(Some(aType))
|
||||
, mEnabled(true)
|
||||
#ifdef DEBUG
|
||||
, mSyncCallback(false)
|
||||
@@ -1088,7 +1089,7 @@ Loader::CreateSheet(nsIURI* aURI,
|
||||
*aIsAlternate = IsAlternate(aTitle, aHasAlternateRel);
|
||||
|
||||
// XXXheycam Cached sheets currently must be CSSStyleSheets.
|
||||
if (aURI) {
|
||||
if (aURI && GetStyleBackendType() == StyleBackendType::Gecko) {
|
||||
aSheetState = eSheetComplete;
|
||||
StyleSheetHandle::RefPtr sheet;
|
||||
|
||||
@@ -2628,5 +2629,17 @@ Loader::SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
|
||||
return n;
|
||||
}
|
||||
|
||||
StyleBackendType
|
||||
Loader::GetStyleBackendType() const
|
||||
{
|
||||
MOZ_ASSERT(mStyleBackendType || mDocument,
|
||||
"you must construct a Loader with a document or set a "
|
||||
"StyleBackendType on it before calling GetStyleBackendType");
|
||||
if (mStyleBackendType) {
|
||||
return *mStyleBackendType;
|
||||
}
|
||||
return mDocument->GetStyleBackendType();
|
||||
}
|
||||
|
||||
} // namespace css
|
||||
} // namespace mozilla
|
||||
|
||||
@@ -21,7 +21,9 @@
|
||||
#include "mozilla/Attributes.h"
|
||||
#include "mozilla/CORSMode.h"
|
||||
#include "mozilla/CSSStyleSheet.h"
|
||||
#include "mozilla/Maybe.h"
|
||||
#include "mozilla/MemoryReporting.h"
|
||||
#include "mozilla/StyleBackendType.h"
|
||||
#include "mozilla/StyleSheetHandle.h"
|
||||
#include "mozilla/net/ReferrerPolicy.h"
|
||||
|
||||
@@ -188,7 +190,7 @@ class Loader final {
|
||||
typedef mozilla::net::ReferrerPolicy ReferrerPolicy;
|
||||
|
||||
public:
|
||||
Loader();
|
||||
explicit Loader(StyleBackendType aType);
|
||||
explicit Loader(nsIDocument*);
|
||||
|
||||
private:
|
||||
@@ -199,6 +201,19 @@ public:
|
||||
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(Loader)
|
||||
NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(Loader)
|
||||
|
||||
/**
|
||||
* Returns the StyleBackendType that will be used for style sheets created
|
||||
* by this Loader. If SetStyleBackendType has been called, that value
|
||||
* will be returned by GetStyleBackendType. For Loaders created with the
|
||||
* nsIDocument* constructor and which haven't had SetStyleBackendType
|
||||
* called on them, the document's StyleBackendType will be returned.
|
||||
*/
|
||||
StyleBackendType GetStyleBackendType() const;
|
||||
|
||||
void SetStyleBackendType(StyleBackendType aType) {
|
||||
mStyleBackendType = Some(aType);
|
||||
}
|
||||
|
||||
void DropDocumentReference(); // notification that doc is going away
|
||||
|
||||
void SetCompatibilityMode(nsCompatibility aCompatMode)
|
||||
@@ -573,6 +588,8 @@ private:
|
||||
nsCompatibility mCompatMode;
|
||||
nsString mPreferredSheet; // title of preferred sheet
|
||||
|
||||
mozilla::Maybe<StyleBackendType> mStyleBackendType;
|
||||
|
||||
bool mEnabled; // is enabled to load new styles
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
@@ -243,7 +243,8 @@ nsLayoutStylesheetCache::DesignModeSheet()
|
||||
void
|
||||
nsLayoutStylesheetCache::Shutdown()
|
||||
{
|
||||
NS_IF_RELEASE(gCSSLoader);
|
||||
gCSSLoader_Gecko = nullptr;
|
||||
gCSSLoader_Servo = nullptr;
|
||||
gStyleCache_Gecko = nullptr;
|
||||
gStyleCache_Servo = nullptr;
|
||||
}
|
||||
@@ -290,7 +291,8 @@ nsLayoutStylesheetCache::SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf
|
||||
|
||||
// Measurement of the following members may be added later if DMD finds it is
|
||||
// worthwhile:
|
||||
// - gCSSLoader
|
||||
// - gCSSLoader_Gecko
|
||||
// - gCSSLoader_Servo
|
||||
|
||||
return n;
|
||||
}
|
||||
@@ -406,7 +408,7 @@ nsLayoutStylesheetCache::InitFromProfile()
|
||||
LoadSheetFile(chromeFile, mUserChromeSheet, eUserSheetFeatures);
|
||||
}
|
||||
|
||||
/* static */ void
|
||||
void
|
||||
nsLayoutStylesheetCache::LoadSheetURL(const char* aURL,
|
||||
StyleSheetHandle::RefPtr& aSheet,
|
||||
SheetParsingMode aParsingMode)
|
||||
@@ -735,20 +737,22 @@ nsLayoutStylesheetCache::LoadSheet(nsIURI* aURI,
|
||||
return;
|
||||
}
|
||||
|
||||
if (!gCSSLoader) {
|
||||
gCSSLoader = new mozilla::css::Loader();
|
||||
NS_IF_ADDREF(gCSSLoader);
|
||||
if (!gCSSLoader) {
|
||||
auto& loader = mBackendType == StyleBackendType::Gecko ?
|
||||
gCSSLoader_Gecko :
|
||||
gCSSLoader_Servo;
|
||||
|
||||
if (!loader) {
|
||||
loader = new mozilla::css::Loader(mBackendType);
|
||||
if (!loader) {
|
||||
ErrorLoadingBuiltinSheet(aURI, "no Loader");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef MOZ_CRASHREPORTER
|
||||
nsZipArchive::sFileCorruptedReason = nullptr;
|
||||
#endif
|
||||
nsresult rv = gCSSLoader->LoadSheetSync(aURI, aParsingMode, true, &aSheet);
|
||||
nsresult rv = loader->LoadSheetSync(aURI, aParsingMode, true, &aSheet);
|
||||
if (NS_FAILED(rv)) {
|
||||
ErrorLoadingBuiltinSheet(aURI,
|
||||
nsPrintfCString("LoadSheetSync failed with error %x", rv).get());
|
||||
@@ -759,7 +763,8 @@ nsLayoutStylesheetCache::LoadSheet(nsIURI* aURI,
|
||||
nsLayoutStylesheetCache::InvalidateSheet(StyleSheetHandle::RefPtr* aGeckoSheet,
|
||||
StyleSheetHandle::RefPtr* aServoSheet)
|
||||
{
|
||||
MOZ_ASSERT(gCSSLoader, "pref changed before we loaded a sheet?");
|
||||
MOZ_ASSERT(gCSSLoader_Gecko || gCSSLoader_Servo,
|
||||
"pref changed before we loaded a sheet?");
|
||||
|
||||
// Make sure sheets have the expected types
|
||||
MOZ_ASSERT(!aGeckoSheet || (*aGeckoSheet)->IsGecko());
|
||||
@@ -778,7 +783,12 @@ nsLayoutStylesheetCache::InvalidateSheet(StyleSheetHandle::RefPtr* aGeckoSheet,
|
||||
return;
|
||||
}
|
||||
|
||||
gCSSLoader->ObsoleteSheet(uri);
|
||||
if (gCSSLoader_Gecko) {
|
||||
gCSSLoader_Gecko->ObsoleteSheet(uri);
|
||||
}
|
||||
if (gCSSLoader_Servo) {
|
||||
gCSSLoader_Servo->ObsoleteSheet(uri);
|
||||
}
|
||||
if (aGeckoSheet) {
|
||||
*aGeckoSheet = nullptr;
|
||||
}
|
||||
@@ -794,9 +804,9 @@ nsLayoutStylesheetCache::DependentPrefChanged(const char* aPref, void* aData)
|
||||
"pref changed after shutdown?");
|
||||
|
||||
// Cause any UA style sheets whose parsing depends on the value of prefs
|
||||
// to be re-parsed by dropping the sheet from gCSSLoader's cache then
|
||||
// setting our cached sheet pointer to null. This will only work for sheets
|
||||
// that are loaded lazily.
|
||||
// to be re-parsed by dropping the sheet from gCSSLoader_{Gecko,Servo}'s cache
|
||||
// then setting our cached sheet pointer to null. This will only work for
|
||||
// sheets that are loaded lazily.
|
||||
|
||||
#define INVALIDATE(sheet_) \
|
||||
InvalidateSheet(gStyleCache_Gecko ? &gStyleCache_Gecko->sheet_ : nullptr, \
|
||||
@@ -934,5 +944,8 @@ nsLayoutStylesheetCache::gStyleCache_Gecko;
|
||||
mozilla::StaticRefPtr<nsLayoutStylesheetCache>
|
||||
nsLayoutStylesheetCache::gStyleCache_Servo;
|
||||
|
||||
mozilla::css::Loader*
|
||||
nsLayoutStylesheetCache::gCSSLoader = nullptr;
|
||||
mozilla::StaticRefPtr<mozilla::css::Loader>
|
||||
nsLayoutStylesheetCache::gCSSLoader_Gecko;
|
||||
|
||||
mozilla::StaticRefPtr<mozilla::css::Loader>
|
||||
nsLayoutStylesheetCache::gCSSLoader_Servo;
|
||||
|
||||
@@ -75,14 +75,14 @@ private:
|
||||
|
||||
void InitFromProfile();
|
||||
void InitMemoryReporter();
|
||||
static void LoadSheetURL(const char* aURL,
|
||||
mozilla::StyleSheetHandle::RefPtr& aSheet,
|
||||
mozilla::css::SheetParsingMode aParsingMode);
|
||||
static void LoadSheetFile(nsIFile* aFile,
|
||||
mozilla::StyleSheetHandle::RefPtr& aSheet,
|
||||
mozilla::css::SheetParsingMode aParsingMode);
|
||||
static void LoadSheet(nsIURI* aURI, mozilla::StyleSheetHandle::RefPtr& aSheet,
|
||||
mozilla::css::SheetParsingMode aParsingMode);
|
||||
void LoadSheetURL(const char* aURL,
|
||||
mozilla::StyleSheetHandle::RefPtr& aSheet,
|
||||
mozilla::css::SheetParsingMode aParsingMode);
|
||||
void LoadSheetFile(nsIFile* aFile,
|
||||
mozilla::StyleSheetHandle::RefPtr& aSheet,
|
||||
mozilla::css::SheetParsingMode aParsingMode);
|
||||
void LoadSheet(nsIURI* aURI, mozilla::StyleSheetHandle::RefPtr& aSheet,
|
||||
mozilla::css::SheetParsingMode aParsingMode);
|
||||
static void InvalidateSheet(mozilla::StyleSheetHandle::RefPtr* aGeckoSheet,
|
||||
mozilla::StyleSheetHandle::RefPtr* aServoSheet);
|
||||
static void DependentPrefChanged(const char* aPref, void* aData);
|
||||
@@ -91,7 +91,8 @@ private:
|
||||
|
||||
static mozilla::StaticRefPtr<nsLayoutStylesheetCache> gStyleCache_Gecko;
|
||||
static mozilla::StaticRefPtr<nsLayoutStylesheetCache> gStyleCache_Servo;
|
||||
static mozilla::css::Loader* gCSSLoader;
|
||||
static mozilla::StaticRefPtr<mozilla::css::Loader> gCSSLoader_Gecko;
|
||||
static mozilla::StaticRefPtr<mozilla::css::Loader> gCSSLoader_Servo;
|
||||
mozilla::StyleBackendType mBackendType;
|
||||
mozilla::StyleSheetHandle::RefPtr mChromePreferenceSheet;
|
||||
mozilla::StyleSheetHandle::RefPtr mContentEditableSheet;
|
||||
|
||||
Reference in New Issue
Block a user