[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-10851-g50815da
dglazkov at chromium.org
dglazkov at chromium.org
Wed Dec 22 17:53:56 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit 5db261d58133bda589827f18242d4359322433b9
Author: dglazkov at chromium.org <dglazkov at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Thu Dec 2 09:15:00 2010 +0000
2010-12-02 Dimitri Glazkov <dglazkov at chromium.org>
Reviewed by Kent Tamura.
Provide means to store shadow DOM nodes on Element
https://bugs.webkit.org/show_bug.cgi?id=48697
Adds shadow DOM awareness to the standard Node attach/detach,
document and tree insertion and removal cycle.
No new tests, because the code is not yet used.
* dom/Element.cpp:
(WebCore::Element::insertedIntoDocument): Added logic to cascade down to shadow DOM, if present.
(WebCore::Element::removedFromDocument): Ditto.
(WebCore::Element::insertedIntoTree): Ditto.
(WebCore::Element::removedFromTree): Ditto.
(WebCore::Element::attach): Ditto.
(WebCore::Element::detach): Ditto.
(WebCore::Element::recalcStyle):
(WebCore::Element::shadowRoot): Added.
(WebCore::Element::setShadowRoot): Added.
(WebCore::Element::clearShadowRoot): Added.
* dom/Element.h: Added decls.
* dom/ElementRareData.h: Added a member to hold a RefPtr to the shadow DOM root for the element.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@73114 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 5ddc688..a5d2ec0 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,29 @@
+2010-12-02 Dimitri Glazkov <dglazkov at chromium.org>
+
+ Reviewed by Kent Tamura.
+
+ Provide means to store shadow DOM nodes on Element
+ https://bugs.webkit.org/show_bug.cgi?id=48697
+
+ Adds shadow DOM awareness to the standard Node attach/detach,
+ document and tree insertion and removal cycle.
+
+ No new tests, because the code is not yet used.
+
+ * dom/Element.cpp:
+ (WebCore::Element::insertedIntoDocument): Added logic to cascade down to shadow DOM, if present.
+ (WebCore::Element::removedFromDocument): Ditto.
+ (WebCore::Element::insertedIntoTree): Ditto.
+ (WebCore::Element::removedFromTree): Ditto.
+ (WebCore::Element::attach): Ditto.
+ (WebCore::Element::detach): Ditto.
+ (WebCore::Element::recalcStyle):
+ (WebCore::Element::shadowRoot): Added.
+ (WebCore::Element::setShadowRoot): Added.
+ (WebCore::Element::clearShadowRoot): Added.
+ * dom/Element.h: Added decls.
+ * dom/ElementRareData.h: Added a member to hold a RefPtr to the shadow DOM root for the element.
+
2010-12-02 Adam Barth <abarth at webkit.org>
Reviewed by Eric Seidel.
diff --git a/WebCore/dom/Element.cpp b/WebCore/dom/Element.cpp
index 8581e69..be400b8 100644
--- a/WebCore/dom/Element.cpp
+++ b/WebCore/dom/Element.cpp
@@ -856,6 +856,8 @@ void Element::insertedIntoDocument()
// need to do superclass processing first so inDocument() is true
// by the time we reach updateId
ContainerNode::insertedIntoDocument();
+ if (Node* shadow = shadowRoot())
+ shadow->insertedIntoDocument();
if (hasID()) {
if (m_attributeMap) {
@@ -877,6 +879,26 @@ void Element::removedFromDocument()
}
ContainerNode::removedFromDocument();
+ if (Node* shadow = shadowRoot())
+ shadow->removedFromDocument();
+}
+
+void Element::insertedIntoTree(bool deep)
+{
+ ContainerNode::insertedIntoTree(deep);
+ if (!deep)
+ return;
+ if (Node* shadow = shadowRoot())
+ shadow->insertedIntoTree(true);
+}
+
+void Element::removedFromTree(bool deep)
+{
+ ContainerNode::removedFromTree(deep);
+ if (!deep)
+ return;
+ if (Node* shadow = shadowRoot())
+ shadow->removedFromTree(true);
}
void Element::attach()
@@ -886,6 +908,8 @@ void Element::attach()
createRendererIfNeeded();
ContainerNode::attach();
+ if (Node* shadow = shadowRoot())
+ shadow->attach();
if (hasRareData()) {
ElementRareData* data = rareData();
if (data->needsFocusAppearanceUpdateSoonAfterAttach()) {
@@ -907,6 +931,8 @@ void Element::detach()
if (hasRareData())
rareData()->resetComputedStyle();
ContainerNode::detach();
+ if (Node* shadow = shadowRoot())
+ shadow->detach();
RenderWidget::resumeWidgetHierarchyUpdates();
}
@@ -960,10 +986,8 @@ void Element::recalcStyle(StyleChange change)
bool hasPositionalRules = needsStyleRecalc() && currentStyle && currentStyle->childrenAffectedByPositionalRules();
bool hasDirectAdjacentRules = currentStyle && currentStyle->childrenAffectedByDirectAdjacentRules();
-#if ENABLE(SVG)
- if (!hasParentStyle && isShadowNode() && isSVGElement())
+ if (!hasParentStyle && isShadowNode())
hasParentStyle = true;
-#endif
if ((change > NoChange || needsStyleRecalc())) {
if (hasRareData())
@@ -1042,11 +1066,43 @@ void Element::recalcStyle(StyleChange change)
if (n->isElementNode())
forceCheckOfNextElementSibling = childRulesChanged && hasDirectAdjacentRules;
}
+ // FIXME: This does not care about sibling combinators. Will be necessary in XBL2 world.
+ if (Node* shadow = shadowRoot()) {
+ if (change >= Inherit || shadow->isTextNode() || shadow->childNeedsStyleRecalc() || shadow->needsStyleRecalc())
+ shadow->recalcStyle(change);
+ }
clearNeedsStyleRecalc();
clearChildNeedsStyleRecalc();
}
+Node* Element::shadowRoot()
+{
+ return hasRareData() ? rareData()->m_shadowRoot.get() : 0;
+}
+
+void Element::setShadowRoot(PassRefPtr<Node> node)
+{
+ ASSERT(node);
+
+ // FIXME: Once all instances of shadow DOM are converted to use this code, add setting of shadow host (shadowParent) on node.
+ ensureRareData()->m_shadowRoot = node;
+}
+
+void Element::clearShadowRoot()
+{
+ if (!hasRareData())
+ return;
+
+ RefPtr<Node> shadowRoot = rareData()->m_shadowRoot.release();
+ document()->removeFocusedNodeOfSubtree(shadowRoot.get());
+ // FIXME: Once all instances of shadow DOM are converted to use this code, add clearing of shadow host (shadowParent).
+ if (shadowRoot->inDocument())
+ shadowRoot->removedFromDocument();
+ else
+ shadowRoot->removedFromTree(true);
+}
+
bool Element::childTypeAllowed(NodeType type)
{
switch (type) {
diff --git a/WebCore/dom/Element.h b/WebCore/dom/Element.h
index 7d4b94c..8432f82 100644
--- a/WebCore/dom/Element.h
+++ b/WebCore/dom/Element.h
@@ -225,6 +225,10 @@ public:
virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
virtual void recalcStyle(StyleChange = NoChange);
+ Node* shadowRoot();
+ void setShadowRoot(PassRefPtr<Node>);
+ void clearShadowRoot();
+
RenderStyle* computedStyle(PseudoId = NOPSEUDO);
AtomicString computeInheritedLanguage() const;
@@ -337,6 +341,8 @@ protected:
virtual void insertedIntoDocument();
virtual void removedFromDocument();
+ virtual void insertedIntoTree(bool);
+ virtual void removedFromTree(bool);
virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
// The implementation of Element::attributeChanged() calls the following two functions.
diff --git a/WebCore/dom/ElementRareData.h b/WebCore/dom/ElementRareData.h
index 06bfe0c..f7f30bb 100644
--- a/WebCore/dom/ElementRareData.h
+++ b/WebCore/dom/ElementRareData.h
@@ -41,6 +41,7 @@ public:
IntSize m_minimumSizeForResizing;
RefPtr<RenderStyle> m_computedStyle;
+ RefPtr<Node> m_shadowRoot;
OwnPtr<DatasetDOMStringMap> m_datasetDOMStringMap;
OwnPtr<ClassList> m_classList;
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list