From 2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Mon, 7 May 2012 11:21:11 +0200 Subject: Imported WebKit commit 7e538425aa020340619e927792f3d895061fb54b (http://svn.webkit.org/repository/webkit/trunk@116286) --- Source/WebCore/css/WebKitCSSKeyframesRule.cpp | 169 +++++++++++++++++--------- 1 file changed, 111 insertions(+), 58 deletions(-) (limited to 'Source/WebCore/css/WebKitCSSKeyframesRule.cpp') diff --git a/Source/WebCore/css/WebKitCSSKeyframesRule.cpp b/Source/WebCore/css/WebKitCSSKeyframesRule.cpp index 39492f5e5..cbf97d5fa 100644 --- a/Source/WebCore/css/WebKitCSSKeyframesRule.cpp +++ b/Source/WebCore/css/WebKitCSSKeyframesRule.cpp @@ -31,110 +31,163 @@ #include "StylePropertySet.h" #include "StyleSheet.h" #include "WebKitCSSKeyframeRule.h" +#include namespace WebCore { -WebKitCSSKeyframesRule::WebKitCSSKeyframesRule(CSSStyleSheet* parent) +StyleRuleKeyframes::StyleRuleKeyframes() + : StyleRuleBase(Keyframes, 0) +{ +} + +StyleRuleKeyframes::StyleRuleKeyframes(const StyleRuleKeyframes& o) + : StyleRuleBase(o) + , m_keyframes(o.m_keyframes) + , m_name(o.m_name) +{ +} + +StyleRuleKeyframes::~StyleRuleKeyframes() +{ +} + +void StyleRuleKeyframes::parserAppendKeyframe(PassRefPtr keyframe) +{ + if (!keyframe) + return; + m_keyframes.append(keyframe); +} + +void StyleRuleKeyframes::wrapperAppendKeyframe(PassRefPtr keyframe) +{ + m_keyframes.append(keyframe); +} + +void StyleRuleKeyframes::wrapperRemoveKeyframe(unsigned index) +{ + m_keyframes.remove(index); +} + +int StyleRuleKeyframes::findKeyframeIndex(const String& key) const +{ + String percentageString; + if (equalIgnoringCase(key, "from")) + percentageString = "0%"; + else if (equalIgnoringCase(key, "to")) + percentageString = "100%"; + else + percentageString = key; + + for (unsigned i = 0; i < m_keyframes.size(); ++i) { + if (m_keyframes[i]->keyText() == percentageString) + return i; + } + return -1; +} + +WebKitCSSKeyframesRule::WebKitCSSKeyframesRule(StyleRuleKeyframes* keyframesRule, CSSStyleSheet* parent) : CSSRule(parent, CSSRule::WEBKIT_KEYFRAMES_RULE) - , m_lstCSSRules(CSSRuleList::create()) + , m_keyframesRule(keyframesRule) + , m_childRuleCSSOMWrappers(keyframesRule->keyframes().size()) { } WebKitCSSKeyframesRule::~WebKitCSSKeyframesRule() { - for (unsigned i = 0; i < length(); ++i) { - WebKitCSSKeyframeRule* rule = item(i); - rule->setParentRule(0); + ASSERT(m_childRuleCSSOMWrappers.size() == m_keyframesRule->keyframes().size()); + + for (unsigned i = 0; i < m_childRuleCSSOMWrappers.size(); ++i) { + if (m_childRuleCSSOMWrappers[i]) + m_childRuleCSSOMWrappers[i]->setParentRule(0); } } void WebKitCSSKeyframesRule::setName(const String& name) { - m_name = name; + m_keyframesRule->setName(name); - // Since the name is used in the keyframe map list in CSSStyleSelector, we need + // Since the name is used in the keyframe map list in StyleResolver, we need // to recompute the style sheet to get the updated name. if (CSSStyleSheet* styleSheet = parentStyleSheet()) styleSheet->styleSheetChanged(); } -WebKitCSSKeyframeRule* WebKitCSSKeyframesRule::item(unsigned index) -{ - CSSRule* rule = m_lstCSSRules->item(index); - ASSERT(rule->isKeyframeRule()); - return static_cast(rule); -} - -const WebKitCSSKeyframeRule* WebKitCSSKeyframesRule::item(unsigned index) const +void WebKitCSSKeyframesRule::insertRule(const String& ruleText) { - const CSSRule* rule = m_lstCSSRules->item(index); - ASSERT(rule->isKeyframeRule()); - return static_cast(rule); -} + ASSERT(m_childRuleCSSOMWrappers.size() == m_keyframesRule->keyframes().size()); -void WebKitCSSKeyframesRule::append(WebKitCSSKeyframeRule* rule) -{ - if (!rule) + CSSParser parser(parserContext()); + CSSStyleSheet* styleSheet = parentStyleSheet(); + RefPtr keyframe = parser.parseKeyframeRule(styleSheet ? styleSheet->internal() : 0, ruleText); + if (!keyframe) return; - m_lstCSSRules->append(rule); - rule->setParentRule(this); -} + m_keyframesRule->wrapperAppendKeyframe(keyframe); -void WebKitCSSKeyframesRule::insertRule(const String& rule) -{ - CSSParser p(useStrictParsing()); - RefPtr newRule = p.parseKeyframeRule(parentStyleSheet(), rule); - if (newRule) - append(newRule.get()); + m_childRuleCSSOMWrappers.grow(length()); } void WebKitCSSKeyframesRule::deleteRule(const String& s) { - int i = findRuleIndex(s); + ASSERT(m_childRuleCSSOMWrappers.size() == m_keyframesRule->keyframes().size()); + + int i = m_keyframesRule->findKeyframeIndex(s); if (i < 0) return; - WebKitCSSKeyframeRule* rule = item(i); - rule->setParentRule(0); - m_lstCSSRules->deleteRule(i); + m_keyframesRule->wrapperRemoveKeyframe(i); + + if (m_childRuleCSSOMWrappers[i]) + m_childRuleCSSOMWrappers[i]->setParentRule(0); + m_childRuleCSSOMWrappers.remove(i); } WebKitCSSKeyframeRule* WebKitCSSKeyframesRule::findRule(const String& s) { - int i = findRuleIndex(s); + int i = m_keyframesRule->findKeyframeIndex(s); return (i >= 0) ? item(i) : 0; } -int WebKitCSSKeyframesRule::findRuleIndex(const String& key) const +String WebKitCSSKeyframesRule::cssText() const { - String percentageString; - if (equalIgnoringCase(key, "from")) - percentageString = "0%"; - else if (equalIgnoringCase(key, "to")) - percentageString = "100%"; - else - percentageString = key; - - for (unsigned i = 0; i < length(); ++i) { - if (item(i)->keyText() == percentageString) - return i; + StringBuilder result; + result.append("@-webkit-keyframes "); + result.append(name()); + result.append(" { \n"); + + unsigned size = length(); + for (unsigned i = 0; i < size; ++i) { + result.append(" "); + result.append(m_keyframesRule->keyframes()[i]->cssText()); + result.append("\n"); } + result.append("}"); + return result.toString(); +} - return -1; +unsigned WebKitCSSKeyframesRule::length() const +{ + return m_keyframesRule->keyframes().size(); } -String WebKitCSSKeyframesRule::cssText() const -{ - String result = "@-webkit-keyframes "; - result += m_name; - result += " { \n"; +WebKitCSSKeyframeRule* WebKitCSSKeyframesRule::item(unsigned index) const +{ + if (index >= length()) + return 0; - if (m_lstCSSRules) - result += m_lstCSSRules->rulesText(); + ASSERT(m_childRuleCSSOMWrappers.size() == m_keyframesRule->keyframes().size()); + RefPtr& rule = m_childRuleCSSOMWrappers[index]; + if (!rule) + rule = adoptRef(new WebKitCSSKeyframeRule(m_keyframesRule->keyframes()[index].get(), const_cast(this))); - result += "}"; - return result; + return rule.get(); +} + +CSSRuleList* WebKitCSSKeyframesRule::cssRules() +{ + if (!m_ruleListCSSOMWrapper) + m_ruleListCSSOMWrapper = adoptPtr(new LiveCSSRuleList(this)); + return m_ruleListCSSOMWrapper.get(); } } // namespace WebCore -- cgit v1.2.1