Add CSSConditionRule and CSSGroupingRule
https://bugs.webkit.org/show_bug.cgi?id=216855

Reviewed by Sam Weinig.

LayoutTests/imported/w3c:

* web-platform-tests/css/conditional/idlharness-expected.txt:
* web-platform-tests/css/cssom/MediaList-expected.txt:
* web-platform-tests/css/cssom/cssimportrule-expected.txt:
* web-platform-tests/css/cssom/idlharness-expected.txt:
Updated expectations to expect more tests to pass.

Source/WebCore:

* CMakeLists.txt: Added CSSConditionRule.idl and CSSGroupingRule.idl.

* DerivedSources-input.xcfilelist: Updated.
* DerivedSources-output.xcfilelist: Updated.

* DerivedSources.make: Added CSSConditionRule.idl and CSSGroupingRule.idl.
* Headers.cmake: Added CSSConditionRule.h.
* Sources.txt: Add CSSConditionRule.cpp, JSCSSConditioRule.cpp,
and JSCSSGroupingRule.cpp.

* WebCore.xcodeproj/project.pbxproj: Added all the files.

* css/CSSConditionRule.cpp: Added.
* css/CSSConditionRule.h: Added.
* css/CSSConditionRule.idl: Added.

* css/CSSGroupingRule.cpp:
(WebCore::CSSGroupingRule::~CSSGroupingRule): Use a range-based for loop
and nullptr.
(WebCore::CSSGroupingRule::appendCSSTextForItems const): Use variadic
append to clean this up a bit.
(WebCore::CSSGroupingRule::item const): Use auto.

* css/CSSGroupingRule.h: Made m_groupRule private instead of protected.
Did some other tweaks.

* css/CSSGroupingRule.idl: Added.

* css/CSSImportRule.idl: Added [Exposed=Window], changed href to be a
USVString, added [SameObject, PutForwards=mediaText] to media
and [SameObject] to styleSheet.

* css/CSSMediaRule.cpp:
(WebCore::CSSMediaRule::CSSMediaRule): Derive from CSSConditionRule.
(WebCore::CSSMediaRule::mediaQueries const): Return a reference.
(WebCore::CSSMediaRule::cssText const): Streamline since we don't need a
null check.
(WebCore::CSSMediaRule::conditionText const): Added.
(WebCore::CSSMediaRule::setConditionText): Added.
(WebCore::CSSMediaRule::media const): Streamline since we don't need a
null check.
(WebCore::CSSMediaRule::reattach): Ditto.

* css/CSSMediaRule.h: Derive from CSSConditionRule.

* css/CSSMediaRule.idl: Derive from CSSConditionRule. Added
[Exposed=Window]. Added [SameObject, PutForwards=mediaText] to media.
Removed insertRule and deleteRule since they are now inherited from
CSSGroupingRule.

* css/CSSRule.h: Added MARGIN_RULE constant even though we don't have
that rule type. Moved inline functions out of the class body to help
clarity a bit.

* css/CSSRule.idl: Added [Exposed=Window], changed a few things to match
the specification.

* css/CSSStyleRule.idl: Added [Exposed=Window]. Added [SameObject]
to style.

* css/CSSStyleSheet.idl: Added [Exposed=Window].

* css/CSSSupportsRule.cpp:
(WebCore::CSSSupportsRule::CSSSupportsRule): Derive from CSSConditionRule.
(WebCore::CSSSupportsRule::create): Added.
(WebCore::CSSSupportsRule::cssText const): Use variadic append.
(WebCore::CSSSupportsRule::conditionText const): Updated to use groupRule.
(WebCore::CSSSupportsRule::setConditionText): Added. Not implemented yet.

* css/CSSSupportsRule.h: Derive from CSSConditionRule.

* css/CSSSupportsRule.idl: Derive from CSSConditionRule.
Added [Exposed=Window].

* css/MediaList.cpp:
(WebCore::MediaQuerySet::set): Use move instead of swap.

* css/MediaList.idl: Added [Exposed=Window] and marked mediaText as
the stringifier.

* css/StyleRule.cpp:
(WebCore::StyleRule::create): Moved here from the header.
(WebCore::StyleRule::copy const): Ditto.
(WebCore::StyleRulePage::create): Ditto.
(WebCore::StyleRuleGroup::StyleRuleGroup): Use move instead of swap.
(WebCore::StyleRuleMedia::create): Use move instead of swap.
(WebCore::StyleRuleMedia::copy const): Moved out of the header.
(WebCore::StyleRuleSupports::StyleRuleSupports): Ditto.
(WebCore::StyleRuleSupports::create): Ditto.
(WebCore::StyleRuleNamespace::StyleRuleNamespace): Ditto.
(WebCore::StyleRuleNamespace::create): Ditto.

* css/StyleRule.h: Moved function bodies out of the class
defintiion for clarity.

* css/StyleSheet.idl: Added [Exposed=Window] and
[SameObject, PutForwards=mediaText] for media.

* css/StyleSheetContents.cpp:
(WebCore::StyleSheetContents::parserAppendRule): Updated since
mediaQueries returns a reference.

* css/StyleSheetList.idl: Added [Exposed=Window].

* css/parser/CSSParserImpl.cpp:
(WebCore::CSSParserImpl::consumeMediaRule): Use WTFMove since
the create function now takes an rvalue reference.
(WebCore::CSSParserImpl::consumeSupportsRule): Ditto.

* style/RuleSet.cpp:
(WebCore::Style::RuleSet::addChildRules): Updated since mediaQueries
returns a reference.
* style/UserAgentStyle.cpp:
(WebCore::Style::UserAgentStyle::addToDefaultStyle): Ditto.

Source/WebKitLegacy/mac:

* DOM/DOMCSS.mm:
(kitClass): Added a default case since we don't intend to list every single rule type here.

LayoutTests:

* fast/dom/domListEnumeration-expected.txt:
* fast/dom/domListEnumeration.html:
Updated since toString is now implemented and enumerable.

* fast/dom/non-numeric-values-numeric-parameters-expected.txt:
* fast/dom/non-numeric-values-numeric-parameters.html:
Updated test and expectations since CSSMediaRule's deleteRule no longer allows omitting
the index to delete rule 0 (both non-standard and inconsistent with CSSStyleSheet).

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@267576 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/css/StyleRule.cpp b/Source/WebCore/css/StyleRule.cpp
index ab53273..c83ca82 100644
--- a/Source/WebCore/css/StyleRule.cpp
+++ b/Source/WebCore/css/StyleRule.cpp
@@ -1,7 +1,7 @@
 /*
  * (C) 1999-2003 Lars Knoll (knoll@kde.org)
  * (C) 2002-2003 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2002, 2005, 2006, 2008, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2002-2020 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -187,6 +187,16 @@
 
 StyleRule::~StyleRule() = default;
 
+Ref<StyleRule> StyleRule::create(Ref<StylePropertiesBase>&& properties, bool hasDocumentSecurityOrigin, CSSSelectorList&& selectors)
+{
+    return adoptRef(*new StyleRule(WTFMove(properties), hasDocumentSecurityOrigin, WTFMove(selectors)));
+}
+
+Ref<StyleRule> StyleRule::copy() const
+{
+    return adoptRef(*new StyleRule(*this));
+}
+
 const StyleProperties& StyleRule::properties() const
 {
     if (m_properties->type() == DeferredPropertiesType)
@@ -253,6 +263,11 @@
 
 StyleRulePage::~StyleRulePage() = default;
 
+Ref<StyleRulePage> StyleRulePage::create(Ref<StyleProperties>&& properties, CSSSelectorList&& selectors)
+{
+    return adoptRef(*new StyleRulePage(WTFMove(properties), WTFMove(selectors)));
+}
+
 MutableStyleProperties& StyleRulePage::mutableProperties()
 {
     if (!is<MutableStyleProperties>(m_properties.get()))
@@ -299,15 +314,15 @@
     m_parser->parseKeyframeList(m_tokens, keyframesRule);
 }
     
-StyleRuleGroup::StyleRuleGroup(StyleRuleType type, Vector<RefPtr<StyleRuleBase>>& adoptRule)
+StyleRuleGroup::StyleRuleGroup(StyleRuleType type, Vector<RefPtr<StyleRuleBase>>&& rules)
     : StyleRuleBase(type)
+    , m_childRules(WTFMove(rules))
 {
-    m_childRules.swap(adoptRule);
 }
 
-StyleRuleGroup::StyleRuleGroup(StyleRuleType type, std::unique_ptr<DeferredStyleGroupRuleList>&& deferredRules)
+StyleRuleGroup::StyleRuleGroup(StyleRuleType type, std::unique_ptr<DeferredStyleGroupRuleList>&& rules)
     : StyleRuleBase(type)
-    , m_deferredRules(WTFMove(deferredRules))
+    , m_deferredRules(WTFMove(rules))
 {
 }
 
@@ -346,35 +361,48 @@
     m_deferredRules = nullptr;
 }
     
-StyleRuleMedia::StyleRuleMedia(Ref<MediaQuerySet>&& media, Vector<RefPtr<StyleRuleBase>>& adoptRules)
-    : StyleRuleGroup(StyleRuleType::Media, adoptRules)
+StyleRuleMedia::StyleRuleMedia(Ref<MediaQuerySet>&& media, Vector<RefPtr<StyleRuleBase>>&& rules)
+    : StyleRuleGroup(StyleRuleType::Media, WTFMove(rules))
     , m_mediaQueries(WTFMove(media))
 {
 }
 
-StyleRuleMedia::StyleRuleMedia(Ref<MediaQuerySet>&& media, std::unique_ptr<DeferredStyleGroupRuleList>&& deferredRules)
-    : StyleRuleGroup(StyleRuleType::Media, WTFMove(deferredRules))
+StyleRuleMedia::StyleRuleMedia(Ref<MediaQuerySet>&& media, std::unique_ptr<DeferredStyleGroupRuleList>&& rules)
+    : StyleRuleGroup(StyleRuleType::Media, WTFMove(rules))
     , m_mediaQueries(WTFMove(media))
 {
 }
 
-StyleRuleMedia::StyleRuleMedia(const StyleRuleMedia& o)
-    : StyleRuleGroup(o)
+StyleRuleMedia::StyleRuleMedia(const StyleRuleMedia& other)
+    : StyleRuleGroup(other)
+    , m_mediaQueries(other.m_mediaQueries->copy())
 {
-    if (o.m_mediaQueries)
-        m_mediaQueries = o.m_mediaQueries->copy();
 }
 
+Ref<StyleRuleMedia> StyleRuleMedia::create(Ref<MediaQuerySet>&& media, Vector<RefPtr<StyleRuleBase>>&& rules)
+{
+    return adoptRef(*new StyleRuleMedia(WTFMove(media), WTFMove(rules)));
+}
 
-StyleRuleSupports::StyleRuleSupports(const String& conditionText, bool conditionIsSupported, Vector<RefPtr<StyleRuleBase>>& adoptRules)
-    : StyleRuleGroup(StyleRuleType::Supports, adoptRules)
+Ref<StyleRuleMedia> StyleRuleMedia::create(Ref<MediaQuerySet>&& media, std::unique_ptr<DeferredStyleGroupRuleList>&& deferredChildRules)
+{
+    return adoptRef(*new StyleRuleMedia(WTFMove(media), WTFMove(deferredChildRules)));
+}
+
+Ref<StyleRuleMedia> StyleRuleMedia::copy() const
+{
+    return adoptRef(*new StyleRuleMedia(*this));
+}
+
+StyleRuleSupports::StyleRuleSupports(const String& conditionText, bool conditionIsSupported, Vector<RefPtr<StyleRuleBase>>&& rules)
+    : StyleRuleGroup(StyleRuleType::Supports, WTFMove(rules))
     , m_conditionText(conditionText)
     , m_conditionIsSupported(conditionIsSupported)
 {
 }
 
-StyleRuleSupports::StyleRuleSupports(const String& conditionText, bool conditionIsSupported, std::unique_ptr<DeferredStyleGroupRuleList>&& deferredRules)
-    : StyleRuleGroup(StyleRuleType::Supports, WTFMove(deferredRules))
+StyleRuleSupports::StyleRuleSupports(const String& conditionText, bool conditionIsSupported, std::unique_ptr<DeferredStyleGroupRuleList>&& rules)
+    : StyleRuleGroup(StyleRuleType::Supports, WTFMove(rules))
     , m_conditionText(conditionText)
     , m_conditionIsSupported(conditionIsSupported)
 {
@@ -387,6 +415,16 @@
 {
 }
 
+Ref<StyleRuleSupports> StyleRuleSupports::create(const String& conditionText, bool conditionIsSupported, Vector<RefPtr<StyleRuleBase>>&& rules)
+{
+    return adoptRef(*new StyleRuleSupports(conditionText, conditionIsSupported, WTFMove(rules)));
+}
+
+Ref<StyleRuleSupports> StyleRuleSupports::create(const String& conditionText, bool conditionIsSupported, std::unique_ptr<DeferredStyleGroupRuleList>&& rules)
+{
+    return adoptRef(*new StyleRuleSupports(conditionText, conditionIsSupported, WTFMove(rules)));
+}
+
 StyleRuleCharset::StyleRuleCharset()
     : StyleRuleBase(StyleRuleType::Charset)
 {
@@ -397,9 +435,7 @@
 {
 }
 
-StyleRuleCharset::~StyleRuleCharset() = default;
-
-StyleRuleNamespace::StyleRuleNamespace(AtomString prefix, AtomString uri)
+StyleRuleNamespace::StyleRuleNamespace(const AtomString& prefix, const AtomString& uri)
     : StyleRuleBase(StyleRuleType::Namespace)
     , m_prefix(prefix)
     , m_uri(uri)
@@ -415,4 +451,9 @@
 
 StyleRuleNamespace::~StyleRuleNamespace() = default;
 
+Ref<StyleRuleNamespace> StyleRuleNamespace::create(const AtomString& prefix, const AtomString& uri)
+{
+    return adoptRef(*new StyleRuleNamespace(prefix, uri));
+}
+
 } // namespace WebCore