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)
{