Bug 1358993 - (Part 1) Make stylo support reusable style sheets.
MozReview-Commit-ID: Fjo1TICAElx
--- a/layout/style/Loader.cpp
+++ b/layout/style/Loader.cpp
@@ -2201,18 +2201,16 @@ Loader::LoadChildSheet(StyleSheet* aPare
ImportRule* aGeckoParentRule,
const RawServoStyleSheet* aServoChildSheet,
LoaderReusableStyleSheets* aReusableSheets)
{
LOG(("css::Loader::LoadChildSheet"));
NS_PRECONDITION(aURL, "Must have a URI to load");
NS_PRECONDITION(aParentSheet, "Must have a parent sheet");
- // Servo doesn't support reusable sheets.
- MOZ_ASSERT_IF(aReusableSheets, aParentSheet->IsGecko());
MOZ_ASSERT_IF(aParentSheet->IsGecko(), aGeckoParentRule && !aServoChildSheet);
MOZ_ASSERT_IF(aParentSheet->IsServo(), aServoChildSheet && !aGeckoParentRule);
if (!mEnabled) {
LOG_WARN((" Not enabled"));
return NS_ERROR_NOT_AVAILABLE;
}
--- a/layout/style/ServoBindingList.h
+++ b/layout/style/ServoBindingList.h
@@ -35,17 +35,18 @@ SERVO_BINDING_FUNC(Servo_StyleSheet_From
nsCompatibility quirks_mode)
SERVO_BINDING_FUNC(Servo_StyleSheet_ClearAndUpdate,
void,
RawServoStyleSheetBorrowed stylesheet,
mozilla::css::Loader* loader,
mozilla::ServoStyleSheet* gecko_stylesheet,
const nsACString* data,
RawGeckoURLExtraData* extra_data,
- uint32_t line_number_offset)
+ uint32_t line_number_offset,
+ mozilla::css::LoaderReusableStyleSheets* reusable_sheets)
SERVO_BINDING_FUNC(Servo_StyleSheet_HasRules, bool,
RawServoStyleSheetBorrowed sheet)
SERVO_BINDING_FUNC(Servo_StyleSheet_GetRules, ServoCssRulesStrong,
RawServoStyleSheetBorrowed sheet)
SERVO_BINDING_FUNC(Servo_StyleSheet_Clone, RawServoStyleSheetStrong,
RawServoStyleSheetBorrowed sheet)
SERVO_BINDING_FUNC(Servo_StyleSheet_SizeOfIncludingThis, size_t,
mozilla::MallocSizeOf malloc_size_of, RawServoStyleSheetBorrowed sheet)
--- a/layout/style/ServoBindings.cpp
+++ b/layout/style/ServoBindings.cpp
@@ -2182,16 +2182,17 @@ Gecko_GetAppUnitsPerPhysicalInch(RawGeck
{
nsPresContext* presContext = const_cast<nsPresContext*>(aPresContext);
return presContext->DeviceContext()->AppUnitsPerPhysicalInch();
}
void
Gecko_LoadStyleSheet(css::Loader* aLoader,
ServoStyleSheet* aParent,
+ css::LoaderReusableStyleSheets* aReusableSheets,
RawServoStyleSheetBorrowed aChildSheet,
RawGeckoURLExtraData* aBaseURLData,
const uint8_t* aURLString,
uint32_t aURLStringLength,
RawServoMediaListStrong aMediaList)
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aLoader, "Should've catched this before");
@@ -2209,17 +2210,17 @@ Gecko_LoadStyleSheet(css::Loader* aLoade
if (NS_FAILED(rv)) {
// Servo and Gecko have different ideas of what a valid URL is, so we might
// get in here with a URL string that NS_NewURI can't handle. If so,
// silently do nothing. Eventually we should be able to assert that the
// NS_NewURI succeeds, here.
return;
}
- aLoader->LoadChildSheet(aParent, uri, media, nullptr, aChildSheet, nullptr);
+ aLoader->LoadChildSheet(aParent, uri, media, nullptr, aChildSheet, aReusableSheets);
}
const nsMediaFeature*
Gecko_GetMediaFeatures()
{
return nsMediaFeatures::features;
}
--- a/layout/style/ServoBindings.h
+++ b/layout/style/ServoBindings.h
@@ -37,16 +37,17 @@ namespace mozilla {
enum FontFamilyType : uint32_t;
enum class CSSPseudoElementType : uint8_t;
struct Keyframe;
enum Side;
struct StyleTransition;
namespace css {
struct URLValue;
struct ImageValue;
+ class LoaderReusableStyleSheets;
};
namespace dom {
enum class IterationCompositeOperation : uint8_t;
};
enum class UpdateAnimationsTasks : uint8_t;
struct LangGroupFontPrefs;
class ServoStyleSheet;
class ServoElementSnapshotTable;
@@ -132,16 +133,17 @@ RawGeckoNodeBorrowedOrNull Gecko_GetPrev
RawGeckoNodeBorrowedOrNull Gecko_GetNextSibling(RawGeckoNodeBorrowed node);
RawGeckoElementBorrowedOrNull Gecko_GetFirstChildElement(RawGeckoElementBorrowed element);
RawGeckoElementBorrowedOrNull Gecko_GetLastChildElement(RawGeckoElementBorrowed element);
RawGeckoElementBorrowedOrNull Gecko_GetPrevSiblingElement(RawGeckoElementBorrowed element);
RawGeckoElementBorrowedOrNull Gecko_GetNextSiblingElement(RawGeckoElementBorrowed element);
RawGeckoElementBorrowedOrNull Gecko_GetDocumentElement(RawGeckoDocumentBorrowed document);
void Gecko_LoadStyleSheet(mozilla::css::Loader* loader,
mozilla::ServoStyleSheet* parent,
+ mozilla::css::LoaderReusableStyleSheets* reusable_sheets,
RawServoStyleSheetBorrowed child_sheet,
RawGeckoURLExtraData* base_url_data,
const uint8_t* url_bytes,
uint32_t url_length,
RawServoMediaListStrong media_list);
// By default, Servo walks the DOM by traversing the siblings of the DOM-view
// first child. This generally works, but misses anonymous children, which we
--- a/layout/style/ServoBindings.toml
+++ b/layout/style/ServoBindings.toml
@@ -42,16 +42,17 @@ args = [
[structs]
headers = [
"nsStyleStruct.h",
"mozilla/ServoPropPrefList.h",
"mozilla/StyleAnimationValue.h",
"gfxFontConstants.h",
"nsThemeConstants.h",
+ "mozilla/css/Loader.h",
"mozilla/dom/AnimationEffectReadOnlyBinding.h",
"mozilla/dom/KeyframeEffectBinding.h",
"mozilla/AnimationPropertySegment.h",
"mozilla/ComputedTiming.h",
"mozilla/ComputedTimingFunction.h",
"mozilla/Keyframe.h",
"mozilla/ServoElementSnapshot.h",
"mozilla/ServoElementSnapshotTable.h",
@@ -422,16 +423,17 @@ structs-types = [
"nsStyleVariables",
"nsStyleVisibility",
"nsStyleXUL",
"nsTimingFunction",
"nscolor",
"nscoord",
"nsresult",
"Loader",
+ "LoaderReusableStyleSheets",
"ServoStyleSheet",
"EffectCompositor_CascadeLevel",
"UpdateAnimationsTasks",
"ParsingMode",
"InheritTarget",
"URLMatchingFunction",
"StyleRuleInclusion",
]
--- a/layout/style/ServoStyleSheet.cpp
+++ b/layout/style/ServoStyleSheet.cpp
@@ -9,16 +9,17 @@
#include "mozilla/css/Rule.h"
#include "mozilla/StyleBackendType.h"
#include "mozilla/ServoBindings.h"
#include "mozilla/ServoMediaList.h"
#include "mozilla/ServoCSSRuleList.h"
#include "mozilla/css/GroupRule.h"
#include "mozilla/dom/CSSRuleList.h"
#include "mozilla/dom/MediaList.h"
+#include "Loader.h"
#include "mozAutoDocUpdate.h"
#include "nsIDOMCSSStyleSheet.h"
using namespace mozilla::dom;
namespace mozilla {
@@ -136,17 +137,18 @@ ServoStyleSheet::HasRules() const
nsresult
ServoStyleSheet::ParseSheet(css::Loader* aLoader,
const nsAString& aInput,
nsIURI* aSheetURI,
nsIURI* aBaseURI,
nsIPrincipal* aSheetPrincipal,
uint32_t aLineNumber,
- nsCompatibility aCompatMode)
+ nsCompatibility aCompatMode,
+ css::LoaderReusableStyleSheets* aReusableSheets)
{
MOZ_ASSERT_IF(mMedia, mMedia->IsServo());
RefPtr<URLExtraData> extraData =
new URLExtraData(aBaseURI, aSheetURI, aSheetPrincipal);
NS_ConvertUTF16toUTF8 input(aInput);
if (!Inner()->mSheet) {
auto* mediaList = static_cast<ServoMediaList*>(mMedia.get());
@@ -157,17 +159,18 @@ ServoStyleSheet::ParseSheet(css::Loader*
aLoader, this, &input, mParsingMode, media, extraData,
aLineNumber, aCompatMode
).Consume();
} else {
// TODO(emilio): Once we have proper inner cloning (which we don't right
// now) we should update the mediaList here too, though it's slightly
// tricky.
Servo_StyleSheet_ClearAndUpdate(Inner()->mSheet, aLoader,
- this, &input, extraData, aLineNumber);
+ this, &input, extraData, aLineNumber,
+ aReusableSheets);
}
Inner()->mURLData = extraData.forget();
return NS_OK;
}
void
ServoStyleSheet::LoadFailed()
--- a/layout/style/ServoStyleSheet.h
+++ b/layout/style/ServoStyleSheet.h
@@ -17,16 +17,17 @@
#include "nsStringFwd.h"
namespace mozilla {
class ServoCSSRuleList;
namespace css {
class Loader;
+class LoaderReusableStyleSheets;
}
// -------------------------------
// Servo Style Sheet Inner Data Container
//
struct ServoStyleSheetInner : public StyleSheetInfo
{
@@ -79,17 +80,18 @@ public:
bool HasRules() const;
MOZ_MUST_USE nsresult ParseSheet(css::Loader* aLoader,
const nsAString& aInput,
nsIURI* aSheetURI,
nsIURI* aBaseURI,
nsIPrincipal* aSheetPrincipal,
uint32_t aLineNumber,
- nsCompatibility aCompatMode);
+ nsCompatibility aCompatMode,
+ css::LoaderReusableStyleSheets* aReusableSheets = nullptr);
/**
* Called instead of ParseSheet to initialize the Servo stylesheet object
* for a failed load. Either ParseSheet or LoadFailed must be called before
* adding a ServoStyleSheet to a ServoStyleSet.
*/
void LoadFailed();