Bug 1290218 Part 5: Subclass StyleSheetInfo to move the ServoStyleSheet raw sheet into its mInner.
MozReview-Commit-ID: Cu0qp3e8L5n
--- a/layout/style/ServoStyleSheet.cpp
+++ b/layout/style/ServoStyleSheet.cpp
@@ -13,23 +13,34 @@
#include "mozilla/dom/CSSRuleList.h"
#include "mozAutoDocUpdate.h"
using namespace mozilla::dom;
namespace mozilla {
+// -------------------------------
+// CSS Style Sheet Inner Data Container
+//
+
+ServoStyleSheetInner::ServoStyleSheetInner(CORSMode aCORSMode,
+ ReferrerPolicy aReferrerPolicy,
+ const SRIMetadata& aIntegrity)
+ : StyleSheetInfo(aCORSMode, aReferrerPolicy, aIntegrity)
+{
+}
+
ServoStyleSheet::ServoStyleSheet(css::SheetParsingMode aParsingMode,
CORSMode aCORSMode,
net::ReferrerPolicy aReferrerPolicy,
const dom::SRIMetadata& aIntegrity)
: StyleSheet(StyleBackendType::Servo, aParsingMode)
{
- mInner = new StyleSheetInfo(aCORSMode, aReferrerPolicy, aIntegrity);
+ mInner = new ServoStyleSheetInner(aCORSMode, aReferrerPolicy, aIntegrity);
mInner->AddSheet(this);
}
ServoStyleSheet::~ServoStyleSheet()
{
UnparentChildren();
DropRuleList();
@@ -49,17 +60,17 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(Se
NS_IMPL_CYCLE_COLLECTION_UNLINK_END_INHERITED(StyleSheet)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(ServoStyleSheet, StyleSheet)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mRuleList)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
bool
ServoStyleSheet::HasRules() const
{
- return mSheet && Servo_StyleSheet_HasRules(mSheet);
+ return Inner()->mSheet && Servo_StyleSheet_HasRules(Inner()->mSheet);
}
nsresult
ServoStyleSheet::ParseSheet(css::Loader* aLoader,
const nsAString& aInput,
nsIURI* aSheetURI,
nsIURI* aBaseURI,
nsIPrincipal* aSheetPrincipal,
@@ -70,33 +81,33 @@ ServoStyleSheet::ParseSheet(css::Loader*
RefPtr<ThreadSafePrincipalHolder> principal =
new ThreadSafePrincipalHolder(aSheetPrincipal);
nsCString baseString;
nsresult rv = aBaseURI->GetSpec(baseString);
NS_ENSURE_SUCCESS(rv, rv);
NS_ConvertUTF16toUTF8 input(aInput);
- if (!mSheet) {
- mSheet =
+ if (!Inner()->mSheet) {
+ Inner()->mSheet =
Servo_StyleSheet_FromUTF8Bytes(aLoader, this, &input, mParsingMode,
&baseString, base, referrer,
principal).Consume();
} else {
- Servo_StyleSheet_ClearAndUpdate(mSheet, aLoader, this, &input, base,
+ Servo_StyleSheet_ClearAndUpdate(Inner()->mSheet, aLoader, this, &input, base,
referrer, principal);
}
return NS_OK;
}
void
ServoStyleSheet::LoadFailed()
{
- mSheet = Servo_StyleSheet_Empty(mParsingMode).Consume();
+ Inner()->mSheet = Servo_StyleSheet_Empty(mParsingMode).Consume();
}
void
ServoStyleSheet::DropRuleList()
{
if (mRuleList) {
mRuleList->DropReference();
mRuleList = nullptr;
@@ -109,17 +120,18 @@ ServoStyleSheet::GetDOMOwnerRule() const
NS_ERROR("stylo: Don't know how to get DOM owner rule for ServoStyleSheet");
return nullptr;
}
CSSRuleList*
ServoStyleSheet::GetCssRulesInternal(ErrorResult& aRv)
{
if (!mRuleList) {
- RefPtr<ServoCssRules> rawRules = Servo_StyleSheet_GetRules(mSheet).Consume();
+ RefPtr<ServoCssRules> rawRules =
+ Servo_StyleSheet_GetRules(Inner()->mSheet).Consume();
mRuleList = new ServoCSSRuleList(this, rawRules.forget());
}
return mRuleList;
}
uint32_t
ServoStyleSheet::InsertRuleInternal(const nsAString& aRule,
uint32_t aIndex, ErrorResult& aRv)
--- a/layout/style/ServoStyleSheet.h
+++ b/layout/style/ServoStyleSheet.h
@@ -18,16 +18,30 @@ namespace mozilla {
class ServoCSSRuleList;
namespace css {
class Loader;
class Rule;
}
+// -------------------------------
+// Servo Style Sheet Inner Data Container
+//
+
+struct ServoStyleSheetInner : public StyleSheetInfo
+{
+ ServoStyleSheetInner(CORSMode aCORSMode,
+ ReferrerPolicy aReferrerPolicy,
+ const dom::SRIMetadata& aIntegrity);
+
+ RefPtr<RawServoStyleSheet> mSheet;
+};
+
+
/**
* CSS style sheet object that is a wrapper for a Servo Stylesheet.
*/
class ServoStyleSheet : public StyleSheet
{
public:
ServoStyleSheet(css::SheetParsingMode aParsingMode,
CORSMode aCORSMode,
@@ -48,48 +62,54 @@ public:
/**
* 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();
- RawServoStyleSheet* RawSheet() const { return mSheet; }
+ RawServoStyleSheet* RawSheet() const {
+ return Inner()->mSheet;
+ }
void SetSheetForImport(RawServoStyleSheet* aSheet) {
- MOZ_ASSERT(!mSheet);
- mSheet = aSheet;
+ MOZ_ASSERT(!Inner()->mSheet);
+ Inner()->mSheet = aSheet;
}
// WebIDL CSSStyleSheet API
// Can't be inline because we can't include ImportRule here. And can't be
// called GetOwnerRule because that would be ambiguous with the ImportRule
// version.
css::Rule* GetDOMOwnerRule() const final;
void WillDirty() {}
void DidDirty() {}
bool IsModified() const final { return false; }
protected:
virtual ~ServoStyleSheet();
+ ServoStyleSheetInner* Inner() const
+ {
+ return static_cast<ServoStyleSheetInner*>(mInner);
+ }
+
// Internal methods which do not have security check and completeness check.
dom::CSSRuleList* GetCssRulesInternal(ErrorResult& aRv);
uint32_t InsertRuleInternal(const nsAString& aRule,
uint32_t aIndex, ErrorResult& aRv);
void DeleteRuleInternal(uint32_t aIndex, ErrorResult& aRv);
void EnabledStateChangedInternal() {}
private:
void DropRuleList();
- RefPtr<RawServoStyleSheet> mSheet;
RefPtr<ServoCSSRuleList> mRuleList;
friend class StyleSheet;
};
} // namespace mozilla
#endif // mozilla_ServoStyleSheet_h