WebCore/ChangeLog

 12010-11-16 Dimitri Glazkov <dglazkov@chromium.org>
 2
 3 Reviewed by NOBODY (OOPS!).
 4
 5 Provide means to store shadow DOM nodes on Element
 6 https://bugs.webkit.org/show_bug.cgi?id=48697
 7
 8 Adds shadow DOM awareness to the standard Node attach/detach,
 9 document and tree insertion and removal cycle.
 10
 11 No new tests, because the code is not yet used.
 12
 13 * dom/Element.cpp:
 14 (WebCore::Element::insertedIntoDocument): Added logic to cascade down to shadow DOM, if present.
 15 (WebCore::Element::removedFromDocument): Ditto.
 16 (WebCore::Element::insertedIntoTree): Ditto.
 17 (WebCore::Element::removedFromTree): Ditto.
 18 (WebCore::Element::attach): Ditto.
 19 (WebCore::Element::detach): Ditto.
 20 (WebCore::Element::recalcStyle):
 21 (WebCore::Element::shadowRoot): Added.
 22 (WebCore::Element::setShadowRoot): Added.
 23 (WebCore::Element::clearShadowRoot): Added.
 24 * dom/Element.h: Added decls.
 25 * dom/ElementRareData.h: Added a member to hold a RefPtr to the shadow DOM root for the element.
 26
1272010-11-16 Pavel Feldman <pfeldman@chromium.org>
228
329 Reviewed by Yury Semikhatsky.

WebCore/dom/Element.cpp

@@void Element::insertedIntoDocument()
856856 // need to do superclass processing first so inDocument() is true
857857 // by the time we reach updateId
858858 ContainerNode::insertedIntoDocument();
 859 if (Node* shadow = shadowRoot())
 860 shadow->insertedIntoDocument();
859861
860862 if (hasID()) {
861863 if (m_attributeMap) {

@@void Element::removedFromDocument()
877879 }
878880
879881 ContainerNode::removedFromDocument();
 882 if (Node* shadow = shadowRoot())
 883 shadow->removedFromDocument();
 884}
 885
 886void Element::insertedIntoTree(bool deep)
 887{
 888 ContainerNode::insertedIntoTree(deep);
 889 if (!deep)
 890 return;
 891 if (Node* shadow = shadowRoot())
 892 shadow->insertedIntoTree(true);
 893}
 894
 895void Element::removedFromTree(bool deep)
 896{
 897 ContainerNode::removedFromTree(deep);
 898 if (!deep)
 899 return;
 900 if (Node* shadow = shadowRoot())
 901 shadow->removedFromTree(true);
880902}
881903
882904void Element::attach()

@@void Element::attach()
886908
887909 createRendererIfNeeded();
888910 ContainerNode::attach();
 911 if (Node* shadow = shadowRoot())
 912 shadow->attach();
889913 if (hasRareData()) {
890914 ElementRareData* data = rareData();
891915 if (data->needsFocusAppearanceUpdateSoonAfterAttach()) {

@@void Element::detach()
907931 if (hasRareData())
908932 rareData()->resetComputedStyle();
909933 ContainerNode::detach();
 934 if (Node* shadow = shadowRoot())
 935 shadow->detach();
910936
911937 RenderWidget::resumeWidgetHierarchyUpdates();
912938}

@@void Element::recalcStyle(StyleChange change)
960986 bool hasPositionalRules = needsStyleRecalc() && currentStyle && currentStyle->childrenAffectedByPositionalRules();
961987 bool hasDirectAdjacentRules = currentStyle && currentStyle->childrenAffectedByDirectAdjacentRules();
962988
963 #if ENABLE(SVG)
964  if (!hasParentStyle && isShadowNode() && isSVGElement())
 989 if (!hasParentStyle && isShadowNode())
965990 hasParentStyle = true;
966 #endif
967991
968992 if ((change > NoChange || needsStyleRecalc())) {
969993 if (hasRareData())

@@void Element::recalcStyle(StyleChange change)
10421066 if (n->isElementNode())
10431067 forceCheckOfNextElementSibling = childRulesChanged && hasDirectAdjacentRules;
10441068 }
 1069 // FIXME: This does not care about sibling combinators. Will be necessary in XBL2 world.
 1070 if (Node* shadow = shadowRoot()) {
 1071 if (change >= Inherit || shadow->isTextNode() || shadow->childNeedsStyleRecalc() || shadow->needsStyleRecalc())
 1072 shadow->recalcStyle(change);
 1073 }
10451074
10461075 clearNeedsStyleRecalc();
10471076 clearChildNeedsStyleRecalc();
10481077}
10491078
 1079Node* Element::shadowRoot()
 1080{
 1081 return hasRareData() ? rareData()->m_shadowRoot.get() : 0;
 1082}
 1083
 1084void Element::setShadowRoot(PassRefPtr<Node> node)
 1085{
 1086 ASSERT(node);
 1087
 1088 // FIXME: Once all instances of shadow DOM are converted to use this code, add setting of shadow host (shadowParent) on node.
 1089 ensureRareData()->m_shadowRoot = node;
 1090}
 1091
 1092void Element::clearShadowRoot()
 1093{
 1094 if (!hasRareData())
 1095 return;
 1096
 1097 RefPtr<Node> shadowRoot = rareData()->m_shadowRoot.release();
 1098 document()->removeFocusedNodeOfSubtree(shadowRoot.get());
 1099 // FIXME: Once all instances of shadow DOM are converted to use this code, add clearing of shadow host (shadowParent).
 1100 if (shadowRoot->inDocument())
 1101 shadowRoot->removedFromDocument();
 1102 else
 1103 shadowRoot->removedFromTree(true);
 1104}
 1105
10501106bool Element::childTypeAllowed(NodeType type)
10511107{
10521108 switch (type) {

WebCore/dom/Element.h

@@public:
225225 virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
226226 virtual void recalcStyle(StyleChange = NoChange);
227227
 228 Node* shadowRoot();
 229 void setShadowRoot(PassRefPtr<Node>);
 230 void clearShadowRoot();
 231
228232 RenderStyle* computedStyle(PseudoId = NOPSEUDO);
229233
230234 AtomicString computeInheritedLanguage() const;

@@protected:
337341
338342 virtual void insertedIntoDocument();
339343 virtual void removedFromDocument();
 344 virtual void insertedIntoTree(bool);
 345 virtual void removedFromTree(bool);
340346 virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
341347
342348 // The implementation of Element::attributeChanged() calls the following two functions.

WebCore/dom/ElementRareData.h

@@public:
4141
4242 IntSize m_minimumSizeForResizing;
4343 RefPtr<RenderStyle> m_computedStyle;
 44 RefPtr<Node> m_shadowRoot;
4445
4546 OwnPtr<DatasetDOMStringMap> m_datasetDOMStringMap;
4647 OwnPtr<ClassList> m_classList;