https://bugs.webkit.org/show_bug.cgi?id=77853
.:
numberOfScopedHTMLStyleChildren got moved from Element into Node.
Reviewed by Dimitri Glazkov.
* Source/autotools/symbols.filter:
Source/WebCore:
Moved registration code from Element to Node. updated Internals and build files accordingly.
Moved registration data members from ElementRareData to NodeRareData.
Forward willRemove() from host element into shadow DOM tree.
Reviewed by Dimitri Glazkov.
Test: fast/css/style-scoped/registering-shadowroot.html
* WebCore.exp.in:
* dom/Element.cpp:
(WebCore::Element::willRemove):
* dom/Element.h:
(Element):
* dom/ElementRareData.h:
(ElementRareData):
(WebCore::ElementRareData::ElementRareData):
* dom/Node.cpp:
(WebCore):
(WebCore::Node::hasScopedHTMLStyleChild):
(WebCore::Node::numberOfScopedHTMLStyleChildren):
(WebCore::Node::registerScopedHTMLStyleChild):
(WebCore::Node::unregisterScopedHTMLStyleChild):
* dom/Node.h:
(Node):
* dom/NodeRareData.h:
(WebCore::NodeRareData::NodeRareData):
(NodeRareData):
(WebCore::NodeRareData::registerScopedHTMLStyleChild):
(WebCore::NodeRareData::unregisterScopedHTMLStyleChild):
(WebCore::NodeRareData::hasScopedHTMLStyleChild):
(WebCore::NodeRareData::numberOfScopedHTMLStyleChildren):
* dom/ShadowRootList.cpp:
(WebCore::ShadowRootList::willRemove):
(WebCore):
* dom/ShadowRootList.h:
(ShadowRootList):
* html/HTMLStyleElement.cpp:
(WebCore::HTMLStyleElement::registerWithScopingNode):
(WebCore::HTMLStyleElement::unregisterWithScopingNode):
* testing/Internals.cpp:
(WebCore::Internals::numberOfScopedHTMLStyleChildren):
* testing/Internals.h:
(Internals):
* testing/Internals.idl:
Source/WebKit2:
numberOfScopedHTMLStyleChildren got moved from Element into Node.
Reviewed by Dimitri Glazkov.
* win/WebKit2.def:
* win/WebKit2CFLite.def:
LayoutTests:
Test registration of <style scoped> as a direct child of a ShadowRoot.
Reviewed by Dimitri Glazkov.
* fast/css/style-scoped/registering-shadowroot-expected.txt: Added.
* fast/css/style-scoped/registering-shadowroot.html: Added.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@107793
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2012-02-15 Roland Steiner <rolandsteiner@chromium.org>
+
+ <style scoped>: Allow <style scoped> as a direct child of a ShadowRoot
+ https://bugs.webkit.org/show_bug.cgi?id=77853
+
+ numberOfScopedHTMLStyleChildren got moved from Element into Node.
+
+ Reviewed by Dimitri Glazkov.
+
+ * Source/autotools/symbols.filter:
+
2012-02-13 Raphael Kubo da Costa <kubo@profusion.mobi>
[CMake] Merge WebKitEfl.cmake into FindEFL.cmake.
+2012-02-15 Roland Steiner <rolandsteiner@chromium.org>
+
+ <style scoped>: Allow <style scoped> as a direct child of a ShadowRoot
+ https://bugs.webkit.org/show_bug.cgi?id=77853
+
+ Test registration of <style scoped> as a direct child of a ShadowRoot.
+
+ Reviewed by Dimitri Glazkov.
+
+ * fast/css/style-scoped/registering-shadowroot-expected.txt: Added.
+ * fast/css/style-scoped/registering-shadowroot.html: Added.
+
2012-02-14 Pavel Feldman <pfeldman@chromium.org>
Web Inspector: implement redo for DOM actions.
--- /dev/null
+Test having a <style scoped> element as a direct child of a ShadowRoot.
+
+--- Initial ---
+PASS internals.numberOfScopedHTMLStyleChildren(host) is 0
+PASS internals.numberOfScopedHTMLStyleChildren(sr) is 0
+--- Attaching <style scoped> ---
+PASS internals.numberOfScopedHTMLStyleChildren(host) is 0
+PASS internals.numberOfScopedHTMLStyleChildren(sr) is 1
+--- Removing host ---
+PASS internals.numberOfScopedHTMLStyleChildren(host) is 0
+PASS internals.numberOfScopedHTMLStyleChildren(sr) is 0
+--- Inserting host ---
+PASS internals.numberOfScopedHTMLStyleChildren(host) is 0
+PASS internals.numberOfScopedHTMLStyleChildren(sr) is 1
+--- Unsetting @scoped ---
+PASS internals.numberOfScopedHTMLStyleChildren(host) is 0
+PASS internals.numberOfScopedHTMLStyleChildren(sr) is 0
+--- Setting @scoped ---
+PASS internals.numberOfScopedHTMLStyleChildren(host) is 0
+PASS internals.numberOfScopedHTMLStyleChildren(sr) is 1
+--- Detaching <style scoped> ---
+PASS internals.numberOfScopedHTMLStyleChildren(host) is 0
+PASS internals.numberOfScopedHTMLStyleChildren(sr) is 0
+--- Attaching <style scoped> under host ---
+PASS internals.numberOfScopedHTMLStyleChildren(host) is 1
+PASS internals.numberOfScopedHTMLStyleChildren(sr) is 0
+--- DONE ---
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
--- /dev/null
+<html>
+<head>
+ <link rel="stylesheet" href="../../js/resources/js-test-style.css">
+ <script src="../../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+ <p>Test having a <style scoped> element as a direct child of a ShadowRoot.</p>
+ <div id="host">
+ </div>
+ <div id="ref">
+ </div>
+
+ <div id="console"></div>
+
+ <script>
+ if (!window.internals)
+ debug("windows.internals not found!");
+ else if (!window.internals.ensureShadowRoot)
+ debug("windows.internals.ensureShadowRoot not found!");
+ else if (!window.internals.numberOfScopedHTMLStyleChildren)
+ debug("windows.internals.numberOfScopedHTMLStyleChildren not found!");
+ else {
+ var ref = document.getElementById('ref');
+ var host = document.getElementById('host');
+ var sr = internals.ensureShadowRoot(host);
+ var style = document.createElement('style');
+ style.setAttribute('scoped', 'scoped');
+
+ debug("--- Initial ---");
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(host)", "0");
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(sr)", "0"); /* <style> out of document, scoped */
+
+ debug("--- Attaching <style scoped> ---");
+ sr.appendChild(style);
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(host)", "0");
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(sr)", "1"); /* <style> in shadow, scoped */
+
+ debug("--- Removing host ---");
+ host.parentNode.removeChild(host);
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(host)", "0");
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(sr)", "0"); /* <style> out of document, scoped */
+
+ debug("--- Inserting host ---");
+ ref.parentNode.insertBefore(host, ref);
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(host)", "0");
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(sr)", "1"); /* <style> in shadow, scoped */
+
+ debug("--- Unsetting @scoped ---");
+ style.scoped = false;
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(host)", "0");
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(sr)", "0"); /* <style> in shadow, not scoped */
+
+ debug("--- Setting @scoped ---");
+ style.scoped = true;
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(host)", "0");
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(sr)", "1"); /* <style> in shadow, scoped */
+
+ debug("--- Detaching <style scoped> ---");
+ sr.removeChild(style);
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(host)", "0");
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(sr)", "0"); /* <style> out of document, scoped */
+
+ debug("--- Attaching <style scoped> under host ---");
+ host.appendChild(style);
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(host)", "1");
+ shouldBe("internals.numberOfScopedHTMLStyleChildren(sr)", "0"); /* <style> in tree, scoped */
+
+ debug("--- DONE ---");
+ }
+ var successfullyParsed = true;
+ </script>
+ <script src="../../js/resources/js-test-post.js"></script>
+</body>
+</html>
+2012-02-15 Roland Steiner <rolandsteiner@chromium.org>
+
+ <style scoped>: Allow <style scoped> as a direct child of a ShadowRoot
+ https://bugs.webkit.org/show_bug.cgi?id=77853
+
+ Moved registration code from Element to Node. updated Internals and build files accordingly.
+ Moved registration data members from ElementRareData to NodeRareData.
+ Forward willRemove() from host element into shadow DOM tree.
+
+ Reviewed by Dimitri Glazkov.
+
+ Test: fast/css/style-scoped/registering-shadowroot.html
+
+ * WebCore.exp.in:
+ * dom/Element.cpp:
+ (WebCore::Element::willRemove):
+ * dom/Element.h:
+ (Element):
+ * dom/ElementRareData.h:
+ (ElementRareData):
+ (WebCore::ElementRareData::ElementRareData):
+ * dom/Node.cpp:
+ (WebCore):
+ (WebCore::Node::hasScopedHTMLStyleChild):
+ (WebCore::Node::numberOfScopedHTMLStyleChildren):
+ (WebCore::Node::registerScopedHTMLStyleChild):
+ (WebCore::Node::unregisterScopedHTMLStyleChild):
+ * dom/Node.h:
+ (Node):
+ * dom/NodeRareData.h:
+ (WebCore::NodeRareData::NodeRareData):
+ (NodeRareData):
+ (WebCore::NodeRareData::registerScopedHTMLStyleChild):
+ (WebCore::NodeRareData::unregisterScopedHTMLStyleChild):
+ (WebCore::NodeRareData::hasScopedHTMLStyleChild):
+ (WebCore::NodeRareData::numberOfScopedHTMLStyleChildren):
+ * dom/ShadowRootList.cpp:
+ (WebCore::ShadowRootList::willRemove):
+ (WebCore):
+ * dom/ShadowRootList.h:
+ (ShadowRootList):
+ * html/HTMLStyleElement.cpp:
+ (WebCore::HTMLStyleElement::registerWithScopingNode):
+ (WebCore::HTMLStyleElement::unregisterWithScopingNode):
+ * testing/Internals.cpp:
+ (WebCore::Internals::numberOfScopedHTMLStyleChildren):
+ * testing/Internals.h:
+ (Internals):
+ * testing/Internals.idl:
+
2012-02-14 Pavel Feldman <pfeldman@chromium.org>
Web Inspector: implement redo for DOM actions.
__ZNK7WebCore20ScrollingCoordinator13scrollingTreeEv
#endif
-#if ENABLE(STYLE_SCOPED)
-__ZNK7WebCore7Element31numberOfScopedHTMLStyleChildrenEv
-#endif
+__ZNK7WebCore4Node31numberOfScopedHTMLStyleChildrenEv
if (containsFullScreenElement())
setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(false);
#endif
+ if (ShadowRootList* shadowRoots = shadowRootList())
+ shadowRoots->willRemove();
ContainerNode::willRemove();
}
return count;
}
-#if ENABLE(STYLE_SCOPED)
-bool Element::hasScopedHTMLStyleChild() const
-{
- return hasRareData() && rareData()->hasScopedHTMLStyleChild();
-}
-
-size_t Element::numberOfScopedHTMLStyleChildren() const
-{
- return hasRareData() ? rareData()->numberOfScopedHTMLStyleChildren() : 0;
-}
-
-void Element::registerScopedHTMLStyleChild()
-{
- ensureRareData()->registerScopedHTMLStyleChild();
-}
-
-void Element::unregisterScopedHTMLStyleChild()
-{
- ASSERT(hasRareData());
- if (hasRareData())
- rareData()->unregisterScopedHTMLStyleChild();
-}
-#endif
-
bool Element::webkitMatchesSelector(const String& selector, ExceptionCode& ec)
{
if (selector.isEmpty()) {
Element* nextElementSibling() const;
unsigned childElementCount() const;
-#if ENABLE(STYLE_SCOPED)
- void registerScopedHTMLStyleChild();
- void unregisterScopedHTMLStyleChild();
- bool hasScopedHTMLStyleChild() const;
- size_t numberOfScopedHTMLStyleChildren() const;
-#endif
-
bool webkitMatchesSelector(const String& selectors, ExceptionCode&);
DOMTokenList* classList();
void resetComputedStyle();
-#if ENABLE(STYLE_SCOPED)
- void registerScopedHTMLStyleChild();
- void unregisterScopedHTMLStyleChild();
- bool hasScopedHTMLStyleChild() const;
- size_t numberOfScopedHTMLStyleChildren() const;
-#endif
-
using NodeRareData::needsFocusAppearanceUpdateSoonAfterAttach;
using NodeRareData::setNeedsFocusAppearanceUpdateSoonAfterAttach;
ShadowRootList m_shadowRootList;
AtomicString m_shadowPseudoId;
-#if ENABLE(STYLE_SCOPED)
- size_t m_numberOfScopedHTMLStyleChildren;
-#endif
-
OwnPtr<DatasetDOMStringMap> m_datasetDOMStringMap;
OwnPtr<ClassList> m_classList;
}
inline ElementRareData::ElementRareData()
- : m_minimumSizeForResizing(defaultMinimumSizeForResizing())
-#if ENABLE(STYLE_SCOPED)
- , m_numberOfScopedHTMLStyleChildren(0)
-#endif
+ : NodeRareData()
+ , m_minimumSizeForResizing(defaultMinimumSizeForResizing())
, m_styleAffectedByEmpty(false)
#if ENABLE(FULLSCREEN_API)
, m_containsFullScreenElement(false)
m_computedStyle.clear();
}
-#if ENABLE(STYLE_SCOPED)
-inline void ElementRareData::registerScopedHTMLStyleChild()
-{
- ++m_numberOfScopedHTMLStyleChildren;
-}
-
-inline void ElementRareData::unregisterScopedHTMLStyleChild()
-{
- ASSERT(m_numberOfScopedHTMLStyleChildren > 0);
- if (m_numberOfScopedHTMLStyleChildren > 0)
- --m_numberOfScopedHTMLStyleChildren;
-}
-
-inline bool ElementRareData::hasScopedHTMLStyleChild() const
-{
- return m_numberOfScopedHTMLStyleChildren;
-}
-
-inline size_t ElementRareData::numberOfScopedHTMLStyleChildren() const
-{
- return m_numberOfScopedHTMLStyleChildren;
-}
-#endif
-
}
#endif // ElementRareData_h
}
#endif // ENABLE(MUTATION_OBSERVERS)
+#if ENABLE(STYLE_SCOPED)
+bool Node::hasScopedHTMLStyleChild() const
+{
+ return hasRareData() && rareData()->hasScopedHTMLStyleChild();
+}
+
+size_t Node::numberOfScopedHTMLStyleChildren() const
+{
+ return hasRareData() ? rareData()->numberOfScopedHTMLStyleChildren() : 0;
+}
+
+void Node::registerScopedHTMLStyleChild()
+{
+ ensureRareData()->registerScopedHTMLStyleChild();
+}
+
+void Node::unregisterScopedHTMLStyleChild()
+{
+ ASSERT(hasRareData());
+ if (hasRareData())
+ rareData()->unregisterScopedHTMLStyleChild();
+}
+#else
+bool Node::hasScopedHTMLStyleChild() const
+{
+ return 0;
+}
+
+size_t Node::numberOfScopedHTMLStyleChildren() const
+{
+ return 0;
+}
+#endif
void Node::handleLocalEvents(Event* event)
{
void notifyMutationObserversNodeWillDetach();
#endif // ENABLE(MUTATION_OBSERVERS)
+#if ENABLE(STYLE_SCOPED)
+ void registerScopedHTMLStyleChild();
+ void unregisterScopedHTMLStyleChild();
+#endif
+ bool hasScopedHTMLStyleChild() const;
+ size_t numberOfScopedHTMLStyleChildren() const;
+
private:
enum NodeFlags {
IsTextFlag = 1,
, m_tabIndexWasSetExplicitly(false)
, m_isFocused(false)
, m_needsFocusAppearanceUpdateSoonAfterAttach(false)
+#if ENABLE(STYLE_SCOPED)
+ , m_numberOfScopedHTMLStyleChildren(0)
+#endif
{
}
}
#endif
+#if ENABLE(STYLE_SCOPED)
+ void registerScopedHTMLStyleChild()
+ {
+ ++m_numberOfScopedHTMLStyleChildren;
+ }
+
+ void unregisterScopedHTMLStyleChild()
+ {
+ ASSERT(m_numberOfScopedHTMLStyleChildren > 0);
+ if (m_numberOfScopedHTMLStyleChildren > 0)
+ --m_numberOfScopedHTMLStyleChildren;
+ }
+
+ bool hasScopedHTMLStyleChild() const
+ {
+ return m_numberOfScopedHTMLStyleChildren;
+ }
+
+ size_t numberOfScopedHTMLStyleChildren() const
+ {
+ return m_numberOfScopedHTMLStyleChildren;
+ }
+#endif
+
bool isFocused() const { return m_isFocused; }
void setFocused(bool focused) { m_isFocused = focused; }
mutable RefPtr<DOMSettableTokenList> m_itemType;
mutable OwnPtr<HTMLPropertiesCollection> m_properties;
#endif
+
+#if ENABLE(STYLE_SCOPED)
+ size_t m_numberOfScopedHTMLStyleChildren;
+#endif
};
} // namespace WebCore
root->removedFromTree(deep);
}
+void ShadowRootList::willRemove()
+{
+ for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot())
+ root->willRemove();
+}
+
void ShadowRootList::hostChildrenChanged()
{
for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot())
void removedFromDocument();
void insertedIntoTree(bool deep);
void removedFromTree(bool deep);
+ void willRemove();
void hostChildrenChanged();
ASSERT(!m_isRegisteredWithScopingNode);
ASSERT(inDocument());
if (!m_isRegisteredWithScopingNode) {
- Element* scope = parentElement();
+ ContainerNode* scope = parentNode();
if (!scope)
return;
+ if (!scope->isElementNode() && !scope->isShadowRoot()) {
+ // DocumentFragment nodes should never be inDocument,
+ // <style> should not be a child of Document, PI or some such.
+ ASSERT_NOT_REACHED();
+ return;
+ }
scope->registerScopedHTMLStyleChild();
scope->setNeedsStyleRecalc();
// Therefore we cannot rely on scoped()!
ASSERT(m_isRegisteredWithScopingNode);
if (m_isRegisteredWithScopingNode) {
- Element* scope = parentElement();
+ ContainerNode* scope = parentNode();
ASSERT(scope);
if (scope) {
ASSERT(scope->hasScopedHTMLStyleChild());
return representation;
}
-size_t Internals::numberOfScopedHTMLStyleChildren(const Element* element, ExceptionCode& ec) const
+size_t Internals::numberOfScopedHTMLStyleChildren(const Node* scope, ExceptionCode& ec) const
{
- if (element)
+ if (scope && (scope->isElementNode() || scope->isShadowRoot()))
#if ENABLE(STYLE_SCOPED)
- return element->numberOfScopedHTMLStyleChildren();
+ return scope->numberOfScopedHTMLStyleChildren();
#else
return 0;
#endif
bool isPreloaded(Document*, const String& url);
- size_t numberOfScopedHTMLStyleChildren(const Element*, ExceptionCode&) const;
+ size_t numberOfScopedHTMLStyleChildren(const Node*, ExceptionCode&) const;
#if ENABLE(SHADOW_DOM)
typedef ShadowRoot ShadowRootIfShadowDOMEnabledOrNode;
DOMString elementRenderTreeAsText(in Element element) raises(DOMException);
boolean isPreloaded(in Document document, in DOMString url);
- unsigned long numberOfScopedHTMLStyleChildren(in Element element) raises(DOMException);
+ unsigned long numberOfScopedHTMLStyleChildren(in Node scope) raises(DOMException);
#if defined(ENABLE_SHADOW_DOM)
ShadowRoot ensureShadowRoot(in Element host) raises (DOMException);
+2012-02-15 Roland Steiner <rolandsteiner@chromium.org>
+
+ <style scoped>: Allow <style scoped> as a direct child of a ShadowRoot
+ https://bugs.webkit.org/show_bug.cgi?id=77853
+
+ numberOfScopedHTMLStyleChildren got moved from Element into Node.
+
+ Reviewed by Dimitri Glazkov.
+
+ * win/WebKit2.def:
+ * win/WebKit2CFLite.def:
+
2012-02-15 No'am Rosenthal <noam.rosenthal@nokia.com>
[Texmap] Divide TextureMapperNode.cpp to 3 files.
?markersFor@DocumentMarkerController@WebCore@@QAE?AV?$Vector@PAVDocumentMarker@WebCore@@$0A@@WTF@@PAVNode@2@VMarkerTypes@DocumentMarker@2@@Z
?observeFrame@FrameDestructionObserver@WebCore@@IAEXPAVFrame@2@@Z
?overrideUserPreferredLanguages@WebCore@@YAXABV?$Vector@VString@WTF@@$0A@@WTF@@@Z
- ; ?numberOfScopedHTMLStyleChildren@Element@WebCore@@QBEIXZ
+ ?numberOfScopedHTMLStyleChildren@Node@WebCore@@QBEIXZ
?page@Document@WebCore@@QBEPAVPage@2@XZ
?paintControlTints@FrameView@WebCore@@AAEXXZ
?rangeFromLocationAndLength@TextIterator@WebCore@@SA?AV?$PassRefPtr@VRange@WebCore@@@WTF@@PAVElement@2@HH_N@Z
?markersFor@DocumentMarkerController@WebCore@@QAE?AV?$Vector@PAVDocumentMarker@WebCore@@$0A@@WTF@@PAVNode@2@VMarkerTypes@DocumentMarker@2@@Z
?observeFrame@FrameDestructionObserver@WebCore@@IAEXPAVFrame@2@@Z
?overrideUserPreferredLanguages@WebCore@@YAXABV?$Vector@VString@WTF@@$0A@@WTF@@@Z
- ; ?numberOfScopedHTMLStyleChildren@Element@WebCore@@QBEIXZ
+ ?numberOfScopedHTMLStyleChildren@Node@WebCore@@QBEIXZ
?page@Document@WebCore@@QBEPAVPage@2@XZ
?paintControlTints@FrameView@WebCore@@AAEXXZ
?rangeFromLocationAndLength@TextIterator@WebCore@@SA?AV?$PassRefPtr@VRange@WebCore@@@WTF@@PAVElement@2@HH_N@Z
_ZN7WebCore9JSElement10putVirtualEPN3JSC9ExecStateERKNS1_10IdentifierENS1_7JSValueERNS1_15PutPropertySlotE;
_ZN7WebCore9JSElement6s_infoE;
_ZN7WebCore9toElementEN3JSC7JSValueE;
+_ZNK7WebCore4Node31numberOfScopedHTMLStyleChildrenEv;
_ZNK7WebCore12RenderObject23absoluteBoundingBoxRectEb;
_ZNK7WebCore16HTMLInputElement14suggestedValueEv;
_ZNK7WebCore17JSDOMGlobalObject22scriptExecutionContextEv;
_ZNK7WebCore26HTMLTextFormControlElement21lastChangeWasUserEditEv;
_ZNK7WebCore5Frame8settingsEv;
_ZNK7WebCore6JSNode21pushEventHandlerScopeEPN3JSC9ExecStateEPNS1_14ScopeChainNodeE;
-_ZNK7WebCore7Element31numberOfScopedHTMLStyleChildrenEv;
_ZNK7WebCore7Element13hasShadowRootEv;
_ZNK7WebCore7Element14shadowRootListEv;
_ZNK7WebCore8Document4pageEv;