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..4f240e9e00879ce63d095ec90c5b5929586f6245 100644 |
| --- a/Source/core/css/StyleSheetContents.cpp |
| +++ b/Source/core/css/StyleSheetContents.cpp |
| @@ -75,6 +75,7 @@ StyleSheetContents::StyleSheetContents(const StyleSheetContents& o) |
| : m_ownerRule(nullptr) |
| , m_originalURL(o.m_originalURL) |
| , m_importRules(o.m_importRules.size()) |
| + , m_namespaceRules(o.m_namespaceRules.size()) |
| , m_childRules(o.m_childRules.size()) |
| , m_namespaces(o.m_namespaces) |
| , m_hasSyntacticallyValidCSSHeader(o.m_hasSyntacticallyValidCSSHeader) |
| @@ -156,10 +157,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 other than |
| + // import/namespace/charset rules |
|
Timothy Loh
2015/09/04 01:35:50
not sure you want to write namespace here
ramya.v
2015/09/07 09:06:28
Done.
|
| ASSERT(m_childRules.isEmpty()); |
| StyleRuleNamespace& namespaceRule = toStyleRuleNamespace(*rule); |
| parserAddNamespace(namespaceRule.prefix(), namespaceRule.uri()); |
| + m_namespaceRules.append(&namespaceRule); |
| return; |
| } |
| @@ -184,12 +187,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 +208,7 @@ void StyleSheetContents::clearRules() |
| m_importRules[i]->clearParentStyleSheet(); |
| } |
| m_importRules.clear(); |
| + m_namespaceRules.clear(); |
| m_childRules.clear(); |
| } |
| @@ -231,13 +241,32 @@ 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; |
| + // Inserting @namespace rule when rules other than import/namespace/charset are present is not allowed. |
| + if (m_childRules.size() > 0) |
| + return false; |
| + |
| + StyleRuleNamespace* namespaceRule = toStyleRuleNamespace(rule.get()); |
| + m_namespaceRules.insert(index, namespaceRule); |
| + parserAddNamespace(namespaceRule->prefix(), namespaceRule->uri()); |
|
Timothy Loh
2015/09/04 01:35:50
parserAddNamespace won't do what you want here. If
ramya.v
2015/09/07 05:28:23
Hi Tim just one doubt.
As per spec it was given
If
|
| + return true; |
| + } |
| + |
| + if (rule->isNamespaceRule()) |
| + return false; |
| + |
| + index -= m_namespaceRules.size(); |
| + |
| if (rule->isFontFaceRule()) |
| setHasFontFaceRule(true); |
| m_childRules.insert(index, rule); |
| return true; |
| } |
| -void StyleSheetContents::wrapperDeleteRule(unsigned index) |
| +bool StyleSheetContents::wrapperDeleteRule(unsigned index) |
| { |
| ASSERT(m_isMutable); |
| ASSERT_WITH_SECURITY_IMPLICATION(index < ruleCount()); |
| @@ -247,13 +276,22 @@ void StyleSheetContents::wrapperDeleteRule(unsigned index) |
| if (m_importRules[index]->isFontFaceRule()) |
| notifyRemoveFontFaceRule(toStyleRuleFontFace(m_importRules[index].get())); |
| m_importRules.remove(index); |
| - return; |
| + return true; |
| } |
| index -= m_importRules.size(); |
| + if (index < m_namespaceRules.size()) { |
| + if (m_childRules.size() > 0) |
|
Timothy Loh
2015/09/04 01:35:50
!m_childRules.isEmpty() probably reads better
ramya.v
2015/09/07 09:06:28
Done.
|
| + return false; |
| + m_namespaceRules.remove(index); |
| + return true; |
| + } |
| + index -= m_namespaceRules.size(); |
| + |
| if (m_childRules[index]->isFontFaceRule()) |
| notifyRemoveFontFaceRule(toStyleRuleFontFace(m_childRules[index].get())); |
| m_childRules.remove(index); |
| + return true; |
| } |
| void StyleSheetContents::parserAddNamespace(const AtomicString& prefix, const AtomicString& uri) |
| @@ -624,6 +662,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); |