Chromium Code Reviews| Index: Source/core/css/StyleSheetContents.cpp |
| diff --git a/Source/core/css/StyleSheetContents.cpp b/Source/core/css/StyleSheetContents.cpp |
| index 8769973ac24db5e64a08a10153db03957ce0627b..d6475d62fe5a6f768642a53bc894bda2f2952ef0 100644 |
| --- a/Source/core/css/StyleSheetContents.cpp |
| +++ b/Source/core/css/StyleSheetContents.cpp |
| @@ -156,10 +156,12 @@ void StyleSheetContents::parserAppendRule(PassRefPtrWillBeRawPtr<StyleRuleBase> |
| } |
| if (rule->isNamespaceRule()) { |
| - // Parser enforces that @namespace rules come before anything else |
| + // Parser enforces that @namespace rules come before all rules except for import |
| + // or namespace rules |
|
Timothy Loh
2015/09/02 04:45:14
namespace -> charset?
ramya.v
2015/09/02 09:20:54
Done.
|
| ASSERT(m_childRules.isEmpty()); |
| StyleRuleNamespace& namespaceRule = toStyleRuleNamespace(*rule); |
| parserAddNamespace(namespaceRule.prefix(), namespaceRule.uri()); |
| + m_namespaceRules.append(&namespaceRule); |
| return; |
| } |
| @@ -184,12 +186,18 @@ StyleRuleBase* StyleSheetContents::ruleAt(unsigned index) const |
| return m_importRules[index].get(); |
| index -= m_importRules.size(); |
| + |
| + if (index < m_namespaceRules.size()) |
| + return m_namespaceRules[index].get(); |
| + |
| + index -= m_namespaceRules.size(); |
| + |
| return m_childRules[index].get(); |
| } |
| unsigned StyleSheetContents::ruleCount() const |
| { |
| - return m_importRules.size() + m_childRules.size(); |
| + return m_importRules.size() + m_namespaceRules.size() + m_childRules.size(); |
| } |
| void StyleSheetContents::clearRules() |
| @@ -199,6 +207,7 @@ void StyleSheetContents::clearRules() |
| m_importRules[i]->clearParentStyleSheet(); |
| } |
| m_importRules.clear(); |
| + m_namespaceRules.clear(); |
| m_childRules.clear(); |
| } |
| @@ -231,6 +240,21 @@ bool StyleSheetContents::wrapperInsertRule(PassRefPtrWillBeRawPtr<StyleRuleBase> |
| index -= m_importRules.size(); |
| + if (index < m_namespaceRules.size() || (index == m_namespaceRules.size() && rule->isNamespaceRule())) { |
| + // Inserting non-namespace rules other than import rule before @namespace is not allowed. |
| + if (!rule->isNamespaceRule()) |
| + return false; |
| + |
| + StyleRuleNamespace* namespaceRule = toStyleRuleNamespace(rule.get()); |
| + m_namespaceRules.insert(index, namespaceRule); |
|
Timothy Loh
2015/09/02 04:45:14
..don't we need to also update m_namespaces? Curre
ramya.v
2015/09/02 09:20:54
Done.
|
| + return true; |
| + } |
| + |
| + if (rule->isNamespaceRule()) |
| + return false; |
| + |
| + index -= m_namespaceRules.size(); |
| + |
| if (rule->isFontFaceRule()) |
| setHasFontFaceRule(true); |
| m_childRules.insert(index, rule); |
| @@ -251,6 +275,12 @@ void StyleSheetContents::wrapperDeleteRule(unsigned index) |
| } |
| index -= m_importRules.size(); |
| + if (index < m_namespaceRules.size()) { |
|
Timothy Loh
2015/09/02 04:45:14
From the spec:
If old rule is an @namespace at-rul
ramya.v
2015/09/02 09:20:54
Done.
|
| + m_namespaceRules.remove(index); |
| + return; |
| + } |
| + index -= m_namespaceRules.size(); |
| + |
| if (m_childRules[index]->isFontFaceRule()) |
| notifyRemoveFontFaceRule(toStyleRuleFontFace(m_childRules[index].get())); |
| m_childRules.remove(index); |
| @@ -624,6 +654,7 @@ DEFINE_TRACE(StyleSheetContents) |
| #if ENABLE(OILPAN) |
| visitor->trace(m_ownerRule); |
| visitor->trace(m_importRules); |
| + visitor->trace(m_namespaceRules); |
| visitor->trace(m_childRules); |
| visitor->trace(m_loadingClients); |
| visitor->trace(m_completedClients); |