Implement CSSSupportsRule
https://bugs.webkit.org/show_bug.cgi?id=104822

Patch by Pablo Flouret <pablof@motorola.com> on 2013-01-16
Reviewed by Allan Sandfeld Jensen.

Source/WebCore:

http://dev.w3.org/csswg/css3-conditional/#the-csssupportsrule-interface

Right now, @supports is not implemented as a proper CSSRule. Apart from
the CSSOM implications it gives wrong results when, for instance, an
@supports rule is nested inside a @media rule.

Test: css3/supports-cssom.html

* CMakeLists.txt:
* DerivedSources.cpp:
* DerivedSources.make:
* DerivedSources.pri:
* GNUmakefile.list.am:
* Target.pri:
* WebCore.exp.in:
* WebCore.gypi:
* WebCore.vcproj/WebCore.vcproj:
* WebCore.xcodeproj/project.pbxproj:
    Add CSSSupportsRule.* and associated files.

* bindings/js/JSCSSRuleCustom.cpp:
(WebCore::toJS):
* bindings/objc/DOMCSS.mm:
(kitClass):
* bindings/v8/custom/V8CSSRuleCustom.cpp:
(WebCore::wrap):
    Create the correct wrappers for the rule.

* css/CSSGrammar.y.in:
* css/CSSParser.cpp:
(WebCore::CSSParser::createSupportsRule):
(WebCore::CSSParser::markSupportsRuleHeaderStart):
(WebCore::CSSParser::markSupportsRuleHeaderEnd):
* css/CSSParser.h:
    Create the supports rule when parsing and add it where it corresponds,
    instead of directly adding the child rules to the stylesheet.

* css/CSSPropertySourceData.h:
* css/CSSRule.h:
* css/CSSRule.idl:
    Add SUPPORTS_RULE type to enums.

* css/CSSSupportsRule.cpp: Added.
(WebCore::CSSSupportsRule::CSSSupportsRule):
(WebCore::CSSSupportsRule::~CSSSupportsRule):
(WebCore::CSSSupportsRule::cssText):
(WebCore::CSSSupportsRule::conditionText):
* css/CSSSupportsRule.h: Added.
(WebCore::CSSSupportsRule::create):
* css/CSSSupportsRule.idl: Added.
    DOM interface.

* css/RuleSet.cpp:
(WebCore::RuleSet::addChildRules):
    Add rules included in the @supports rule.

* css/StyleResolver.cpp:
(WebCore::collectCSSOMWrappers):
    Collect CSSSupportsRule wrappers.

* css/StyleRule.cpp:
(WebCore::StyleRuleBase::reportMemoryUsage):
(WebCore::StyleRuleBase::destroy):
(WebCore::StyleRuleBase::copy):
(WebCore::StyleRuleBase::createCSSOMWrapper):
(WebCore::StyleRuleSupports::StyleRuleSupports):
* css/StyleRule.h:
(StyleRuleBase):
(WebCore::StyleRuleBase::isSupportsRule):
(StyleRuleSupports):
(WebCore::StyleRuleSupports::create):
(WebCore::StyleRuleSupports::conditionText):
(WebCore::StyleRuleSupports::conditionIsSupported):
(WebCore::StyleRuleSupports::copy):
(WebCore::toStyleRuleSupports):
    New subclass of StyleRuleBlock: StyleRuleSupports.

* css/StyleSheetContents.cpp:
(WebCore::childRulesHaveFailedOrCanceledSubresources):
* inspector/InspectorStyleSheet.cpp:
(flattenSourceData):
(WebCore::asCSSRuleList):
    Handle @supports rules where needed.

LayoutTests:

* css3/supports-cssom-expected.txt: Added.
* css3/supports-cssom.html: Added.
* css3/supports-expected.txt:
* css3/supports.html:

* platform/chromium/TestExpectations:
* platform/efl/TestExpectations:
* platform/gtk/TestExpectations:
* platform/mac/TestExpectations:
* platform/qt/TestExpectations:
* platform/win/TestExpectations:
* platform/wincairo/TestExpectations:
* platform/wk2/TestExpectations:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@139866 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/css/StyleRule.cpp b/Source/WebCore/css/StyleRule.cpp
index 43e6a5e..b437933 100644
--- a/Source/WebCore/css/StyleRule.cpp
+++ b/Source/WebCore/css/StyleRule.cpp
@@ -28,6 +28,7 @@
 #include "CSSMediaRule.h"
 #include "CSSPageRule.h"
 #include "CSSStyleRule.h"
+#include "CSSSupportsRule.h"
 #include "CSSUnknownRule.h"
 #include "StyleRuleImport.h"
 #include "WebCoreMemoryInstrumentation.h"
@@ -81,6 +82,9 @@
     case Keyframes:
         static_cast<const StyleRuleKeyframes*>(this)->reportDescendantMemoryUsage(memoryObjectInfo);
         return;
+#if ENABLE(CSS3_CONDITIONAL_RULES)
+    case Supports:
+#endif
 #if ENABLE(SHADOW_DOM)
     case Host:
         static_cast<const StyleRuleBlock*>(this)->reportDescendantMemoryUsage(memoryObjectInfo);
@@ -118,6 +122,11 @@
     case Media:
         delete static_cast<StyleRuleMedia*>(this);
         return;
+#if ENABLE(CSS3_CONDITIONAL_RULES)
+    case Supports:
+        delete static_cast<StyleRuleSupports*>(this);
+        return;
+#endif
 #if ENABLE(CSS_REGIONS)
     case Region:
         delete static_cast<StyleRuleRegion*>(this);
@@ -162,6 +171,10 @@
         return static_cast<const StyleRuleFontFace*>(this)->copy();
     case Media:
         return static_cast<const StyleRuleMedia*>(this)->copy();
+#if ENABLE(CSS3_CONDITIONAL_RULES)
+    case Supports:
+        return static_cast<const StyleRuleSupports*>(this)->copy();
+#endif
 #if ENABLE(CSS_REGIONS)
     case Region:
         return static_cast<const StyleRuleRegion*>(this)->copy();
@@ -210,6 +223,11 @@
     case Media:
         rule = CSSMediaRule::create(static_cast<StyleRuleMedia*>(self), parentSheet);
         break;
+#if ENABLE(CSS3_CONDITIONAL_RULES)
+    case Supports:
+        rule = CSSSupportsRule::create(static_cast<StyleRuleSupports*>(self), parentSheet);
+        break;
+#endif
 #if ENABLE(CSS_REGIONS)
     case Region:
         rule = WebKitCSSRegionRule::create(static_cast<StyleRuleRegion*>(self), parentSheet);
@@ -404,6 +422,23 @@
     info.addMember(m_mediaQueries);
 }
 
+
+#if ENABLE(CSS3_CONDITIONAL_RULES)
+StyleRuleSupports::StyleRuleSupports(const String& conditionText, bool conditionIsSupported, Vector<RefPtr<StyleRuleBase> >& adoptRules)
+    : StyleRuleBlock(Supports, adoptRules)
+    , m_conditionText(conditionText)
+    , m_conditionIsSupported(conditionIsSupported)
+{
+}
+
+StyleRuleSupports::StyleRuleSupports(const StyleRuleSupports& o)
+    : StyleRuleBlock(o)
+    , m_conditionText(o.m_conditionText)
+    , m_conditionIsSupported(o.m_conditionIsSupported)
+{
+}
+#endif
+
 StyleRuleRegion::StyleRuleRegion(Vector<OwnPtr<CSSParserSelector> >* selectors, Vector<RefPtr<StyleRuleBase> >& adoptRules)
     : StyleRuleBlock(Region, adoptRules)
 {