From 132c48cbbfa4f094fe65ab567f809a706ac97881 Mon Sep 17 00:00:00 2001 From: Fedor Date: Thu, 12 Mar 2020 20:40:33 +0300 Subject: [PATCH] Implement non-standard legacy CSSStyleSheet rules. --- dom/webidl/CSSStyleSheet.webidl | 8 ++++++++ layout/style/StyleSheet.cpp | 26 ++++++++++++++++++++++++++ layout/style/StyleSheet.h | 3 +++ 3 files changed, 37 insertions(+) diff --git a/dom/webidl/CSSStyleSheet.webidl b/dom/webidl/CSSStyleSheet.webidl index 15c110b8b..677d3ec52 100644 --- a/dom/webidl/CSSStyleSheet.webidl +++ b/dom/webidl/CSSStyleSheet.webidl @@ -26,4 +26,12 @@ interface CSSStyleSheet : StyleSheet { unsigned long insertRule(DOMString rule, optional unsigned long index = 0); [Throws, NeedsSubjectPrincipal] void deleteRule(unsigned long index); + + // Non-standard WebKit things, see https://github.com/w3c/csswg-drafts/pull/3900. + [Throws, NeedsSubjectPrincipal, BinaryName="cssRules"] + readonly attribute CSSRuleList rules; + [Throws, NeedsSubjectPrincipal, BinaryName="deleteRule"] + void removeRule(optional unsigned long index = 0); + [Throws, NeedsSubjectPrincipal] + long addRule(optional DOMString selector = "undefined", optional DOMString style = "undefined", optional unsigned long index); }; diff --git a/layout/style/StyleSheet.cpp b/layout/style/StyleSheet.cpp index 9ff90b8d2..f307f3918 100644 --- a/layout/style/StyleSheet.cpp +++ b/layout/style/StyleSheet.cpp @@ -259,6 +259,32 @@ StyleSheet::DeleteRule(uint32_t aIndex, FORWARD_INTERNAL(DeleteRuleInternal, (aIndex, aRv)) } +int32_t +StyleSheet::AddRule(const nsAString& aSelector, const nsAString& aBlock, + const Optional& aIndex, + nsIPrincipal& aSubjectPrincipal, ErrorResult& aRv) +{ + if (!AreRulesAvailable(aSubjectPrincipal, aRv)) { + return -1; + } + + nsAutoString rule; + rule.Append(aSelector); + rule.AppendLiteral(" { "); + if (!aBlock.IsEmpty()) { + rule.Append(aBlock); + rule.Append(' '); + } + rule.Append('}'); + + auto index = + aIndex.WasPassed() ? aIndex.Value() : GetCssRules(aSubjectPrincipal, aRv)->Length(); + + FORWARD_INTERNAL(InsertRuleInternal, (rule, index, aRv)); + // As per Microsoft documentation, always return -1. + return -1; +} + #undef FORWARD_INTERNAL void diff --git a/layout/style/StyleSheet.h b/layout/style/StyleSheet.h index f21a6d648..863f6d22f 100644 --- a/layout/style/StyleSheet.h +++ b/layout/style/StyleSheet.h @@ -143,6 +143,9 @@ public: void DeleteRule(uint32_t aIndex, nsIPrincipal& aSubjectPrincipal, ErrorResult& aRv); + int32_t AddRule(const nsAString& aSelector, const nsAString& aBlock, + const dom::Optional& aIndex, + nsIPrincipal& aSubjectPrincipal, ErrorResult& aRv); // WebIDL miscellaneous bits inline dom::ParentObject GetParentObject() const;