summaryrefslogtreecommitdiff
path: root/Source/WebCore/css/WebKitCSSKeyframesRule.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-05-07 11:21:11 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-05-07 11:21:11 +0200
commit2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47 (patch)
tree988e8c5b116dd0466244ae2fe5af8ee9be926d76 /Source/WebCore/css/WebKitCSSKeyframesRule.cpp
parentdd91e772430dc294e3bf478c119ef8d43c0a3358 (diff)
downloadqtwebkit-2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47.tar.gz
Imported WebKit commit 7e538425aa020340619e927792f3d895061fb54b (http://svn.webkit.org/repository/webkit/trunk@116286)
Diffstat (limited to 'Source/WebCore/css/WebKitCSSKeyframesRule.cpp')
-rw-r--r--Source/WebCore/css/WebKitCSSKeyframesRule.cpp169
1 files changed, 111 insertions, 58 deletions
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 <wtf/text/StringBuilder.h>
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<StyleKeyframe> keyframe)
+{
+ if (!keyframe)
+ return;
+ m_keyframes.append(keyframe);
+}
+
+void StyleRuleKeyframes::wrapperAppendKeyframe(PassRefPtr<StyleKeyframe> 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<WebKitCSSKeyframeRule*>(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<const WebKitCSSKeyframeRule*>(rule);
-}
+ ASSERT(m_childRuleCSSOMWrappers.size() == m_keyframesRule->keyframes().size());
-void WebKitCSSKeyframesRule::append(WebKitCSSKeyframeRule* rule)
-{
- if (!rule)
+ CSSParser parser(parserContext());
+ CSSStyleSheet* styleSheet = parentStyleSheet();
+ RefPtr<StyleKeyframe> 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<WebKitCSSKeyframeRule> 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<WebKitCSSKeyframeRule>& rule = m_childRuleCSSOMWrappers[index];
+ if (!rule)
+ rule = adoptRef(new WebKitCSSKeyframeRule(m_keyframesRule->keyframes()[index].get(), const_cast<WebKitCSSKeyframesRule*>(this)));
- result += "}";
- return result;
+ return rule.get();
+}
+
+CSSRuleList* WebKitCSSKeyframesRule::cssRules()
+{
+ if (!m_ruleListCSSOMWrapper)
+ m_ruleListCSSOMWrapper = adoptPtr(new LiveCSSRuleList<WebKitCSSKeyframesRule>(this));
+ return m_ruleListCSSOMWrapper.get();
}
} // namespace WebCore