Index: Source/core/dom/StyleEngine.cpp |
diff --git a/Source/core/dom/StyleEngine.cpp b/Source/core/dom/StyleEngine.cpp |
index 95ad29c10c4b9ba51d77e1d5a8396d3944139ce7..fceaab9afa1536587b0f9d86540d7b20811333c6 100644 |
--- a/Source/core/dom/StyleEngine.cpp |
+++ b/Source/core/dom/StyleEngine.cpp |
@@ -71,6 +71,7 @@ StyleEngine::StyleEngine(Document& document) |
// We don't need to create CSSFontSelector for imported document or |
// HTMLTemplateElement's document, because those documents have no frame. |
, m_fontSelector(document.frame() ? CSSFontSelector::create(&document) : nullptr) |
+ , m_xslStyleSheet(0) |
{ |
} |
@@ -286,7 +287,7 @@ void StyleEngine::addStyleSheetCandidateNode(Node* node, bool createdByParser) |
TreeScope& treeScope = isHTMLStyleElement(*node) ? node->treeScope() : m_document; |
ASSERT(isHTMLStyleElement(node) || treeScope == m_document); |
- |
+ ASSERT(!isXSLStyleSheet(node)); |
TreeScopeStyleSheetCollection* collection = ensureStyleSheetCollectionFor(treeScope); |
ASSERT(collection); |
collection->addStyleSheetCandidateNode(node, createdByParser); |
@@ -304,6 +305,7 @@ void StyleEngine::removeStyleSheetCandidateNode(Node* node) |
void StyleEngine::removeStyleSheetCandidateNode(Node* node, ContainerNode* scopingNode, TreeScope& treeScope) |
{ |
ASSERT(isHTMLStyleElement(node) || treeScope == m_document); |
+ ASSERT(!isXSLStyleSheet(node)); |
TreeScopeStyleSheetCollection* collection = styleSheetCollectionFor(treeScope); |
ASSERT(collection); |
@@ -313,6 +315,37 @@ void StyleEngine::removeStyleSheetCandidateNode(Node* node, ContainerNode* scopi |
m_activeTreeScopes.remove(&treeScope); |
} |
+void StyleEngine::addXSLStyleSheet(Node* node, bool createdByParser) |
esprehn
2014/05/22 18:32:20
This should just take a ProcessingInstruction*
tasak
2014/05/27 06:17:30
Done.
|
+{ |
+ if (!node->inDocument()) |
+ return; |
+ |
+ ASSERT(isXSLStyleSheet(node)); |
+ bool needToUpdate = false; |
+ if (createdByParser || !m_xslStyleSheet) { |
+ needToUpdate = !m_xslStyleSheet; |
+ } else { |
+ unsigned position = m_xslStyleSheet->compareDocumentPositionInternal(node, Node::TreatShadowTreesAsDisconnected); |
+ needToUpdate = position & Node::DOCUMENT_POSITION_FOLLOWING; |
+ } |
+ |
+ if (!needToUpdate) |
+ return; |
+ |
+ markTreeScopeDirty(m_document); |
+ m_xslStyleSheet = toProcessingInstruction(node); |
+} |
+ |
+void StyleEngine::removeXSLStyleSheet(Node* node) |
esprehn
2014/05/22 18:32:20
ditto
tasak
2014/05/27 06:17:30
Done.
|
+{ |
+ ASSERT(isXSLStyleSheet(node)); |
+ if (m_xslStyleSheet != node) |
+ return; |
+ |
+ markTreeScopeDirty(m_document); |
+ m_xslStyleSheet = 0; |
+} |
+ |
void StyleEngine::modifiedStyleSheetCandidateNode(Node* node) |
{ |
if (!node->inDocument()) |
@@ -488,6 +521,11 @@ bool StyleEngine::shouldClearResolver() const |
return !m_didCalculateResolver && !haveStylesheetsLoaded(); |
} |
+bool StyleEngine::shouldApplyXSLTransform() const |
+{ |
+ return m_xslStyleSheet && RuntimeEnabledFeatures::xsltEnabled() && !m_document.transformSourceDocument(); |
esprehn
2014/05/22 18:32:20
Early return on the runtime enabled feature.
if (
tasak
2014/05/27 06:17:30
Done.
|
+} |
+ |
StyleResolverChange StyleEngine::resolverChanged(RecalcStyleTime time, StyleResolverUpdateMode mode) |
{ |
StyleResolverChange change; |
@@ -505,6 +543,15 @@ StyleResolverChange StyleEngine::resolverChanged(RecalcStyleTime time, StyleReso |
return change; |
} |
+ if (shouldApplyXSLTransform()) { |
+ // Processing instruction (XML documents only). |
+ // We don't support linking to embedded CSS stylesheets, see <https://bugs.webkit.org/show_bug.cgi?id=49281> for discussion. |
+ // Don't apply XSL transforms to already transformed documents -- <rdar://problem/4132806> |
+ if (!m_document.parsing() && !m_xslStyleSheet->isLoading()) |
+ m_document.applyXSLTransform(m_xslStyleSheet); |
+ return change; |
+ } |
+ |
m_didCalculateResolver = true; |
if (m_document.didLayoutWithPendingStylesheets() && !hasPendingSheets()) |
change.setNeedsRepaint(); |