Bug 1250379 - Create css::Loaders for specific style backend types. r=dholbert

This commit is contained in:
Cameron McCormack
2016-02-24 18:01:12 +11:00
parent 381916b362
commit 1b2002825d
8 changed files with 80 additions and 33 deletions

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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;