RESOLVED FIXED 57813
Support a list of nodes at the top level of a shadow DOM tree
https://bugs.webkit.org/show_bug.cgi?id=57813
Summary Support a list of nodes at the top level of a shadow DOM tree
Dominic Cooney
Reported 2011-04-04 21:37:54 PDT
Element::setShadowRoot takes an Node. However Element is already a container, so it should permit multiple nodes at the top level of a shadow. This is more flexible for internal shadow (validation message could use this) and required to implement an XBL-style component model.
Attachments
WIP (39.31 KB, patch)
2011-04-04 21:42 PDT, Dominic Cooney
no flags
Patch (54.88 KB, patch)
2011-04-06 22:12 PDT, Dominic Cooney
no flags
Patch (53.87 KB, patch)
2011-04-07 11:44 PDT, Dominic Cooney
no flags
Patch (54.29 KB, patch)
2011-04-07 13:26 PDT, Dominic Cooney
no flags
Patch (54.77 KB, patch)
2011-04-07 13:36 PDT, Dominic Cooney
no flags
Patch (54.73 KB, patch)
2011-04-07 13:53 PDT, Dominic Cooney
no flags
Patch (56.16 KB, patch)
2011-04-07 14:52 PDT, Dominic Cooney
no flags
Patch (56.67 KB, patch)
2011-04-07 15:04 PDT, Dominic Cooney
dglazkov: review+
commit-queue: commit-queue-
Dominic Cooney
Comment 1 2011-04-04 21:42:32 PDT
Dominic Cooney
Comment 2 2011-04-04 21:43:14 PDT
Comment on attachment 88182 [details] WIP (Yes, no ChangeLog. Work in progress.)
Dominic Cooney
Comment 3 2011-04-04 21:45:39 PDT
This patch breaks shadow pseudo-element selectors; still looking into that. Based on r82748.
Dominic Cooney
Comment 4 2011-04-06 22:12:22 PDT
Build Bot
Comment 5 2011-04-06 22:52:40 PDT
Dimitri Glazkov (Google)
Comment 6 2011-04-07 09:21:23 PDT
Comment on attachment 88572 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=88572&action=review I wonder if to minimize impact, the first patch should retain shadowRoot as Node* and internalize creation and managing of ShadowRoot inside setShadowRoot? We need to look at SVGShadowTreeRootElement and consider converting it to ShadowRoot. Not right now, but as some next step. > Source/WebCore/dom/Element.cpp:1053 > + bool hasParentStyle = parentNodeForRendering() ? parentNodeForRendering()->renderStyle() : false; Because it's here, I wonder if -ForRendering is the wrong suffix. It's more like ForRenderingAndStyle. > Source/WebCore/dom/Element.cpp:1145 > +Node* Element::shadowRoot() const Return ShadowRoot*? > Source/WebCore/dom/Element.cpp:1150 > void Element::setShadowRoot(PassRefPtr<Node> node) Can this just take ShadowRoot? > Source/WebCore/dom/Node.cpp:1425 > + || (!parentRenderer->canHaveChildren() > + && !(isShadowRoot() || parentNode()->isShadowBoundary())) Keep this one one line. > Source/WebCore/dom/Node.h:206 > + // FIXME: remove this when all shadow roots are ShadowRoots Period at the end of a sentence. > Source/WebCore/html/HTMLKeygenElement.cpp:81 > + shadow->parserAddChild(select); We are not the parser. We shouldn't be calling this. Use appendChild. > Source/WebCore/html/HTMLMeterElement.cpp:235 > + shadow->parserAddChild(bar); Ditto. > Source/WebCore/html/HTMLProgressElement.cpp:141 > + bar->parserAddChild(m_value); Ditto. > Source/WebCore/html/HTMLProgressElement.cpp:143 > + shadow->parserAddChild(bar); Ditto. > Source/WebCore/html/RangeInputType.cpp:201 > + shadow->parserAddChild(SliderThumbElement::create(element()->document())); Use appendChild. > Source/WebCore/rendering/RenderSlider.cpp:181 > + return toSliderThumbElement(static_cast<Element*>(node())->shadowRoot()->firstChild()); Probably need to check for shadowRoot existence here first. > Source/WebKit/mac/DOM/WebDOMOperations.mm:48 > +#import <WebCore/ShadowFragment.h> ShadowRoot? > Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleNodeHandle.cpp:43 > +#include <WebCore/ShadowFragment.h> ShadowRoot?
Dominic Cooney
Comment 7 2011-04-07 10:43:45 PDT
(In reply to comment #6) > (From update of attachment 88572 [details]) > View in context: https://bugs.webkit.org/attachment.cgi?id=88572&action=review > > I wonder if to minimize impact, the first patch should retain shadowRoot as Node* and internalize creation and managing of ShadowRoot inside setShadowRoot? I could do this, but I like it this way because now internal shadows can start to use multiple children in shadows. Also, if we make setShadowRoot() create the ShadowRoot, that breaks symmetry with shadowRoot(). We could make shadowRoot() do [ShadowRoot instance]->firstChild(), but it feels like back to square one. > We need to look at SVGShadowTreeRootElement and consider converting it to ShadowRoot. Not right now, but as some next step. +1 > > > Source/WebCore/dom/Element.cpp:1053 > > + bool hasParentStyle = parentNodeForRendering() ? parentNodeForRendering()->renderStyle() : false; > > Because it's here, I wonder if -ForRendering is the wrong suffix. It's more like ForRenderingAndStyle. Done > > Source/WebCore/dom/Element.cpp:1145 > > +Node* Element::shadowRoot() const > > Return ShadowRoot*? I would like to, but per your comments on the first patch, the patch bloats a bit if I do this, because shadowRoot() callers need to #include "ShadowRoot.h" to grok ShadowRoot* is assignable to Node*. Happy to make it so… WDYT? > > Source/WebCore/dom/Element.cpp:1150 > > void Element::setShadowRoot(PassRefPtr<Node> node) > > Can this just take ShadowRoot? Done. Does it make sense to make shadowRoot return ShadowRoot* for symmetry? > > Source/WebCore/dom/Node.cpp:1425 > > + || (!parentRenderer->canHaveChildren() > > + && !(isShadowRoot() || parentNode()->isShadowBoundary())) > > Keep this one one line. Done. > > Source/WebCore/dom/Node.h:206 > > + // FIXME: remove this when all shadow roots are ShadowRoots > > Period at the end of a sentence. Done. > > Source/WebCore/html/HTMLKeygenElement.cpp:81 > > + shadow->parserAddChild(select); > > We are not the parser. We shouldn't be calling this. Use appendChild. Done. > > Source/WebCore/html/HTMLMeterElement.cpp:235 > > + shadow->parserAddChild(bar); > > Ditto. Done. > > Source/WebCore/html/HTMLProgressElement.cpp:141 > > + bar->parserAddChild(m_value); > > Ditto. Done. > > Source/WebCore/html/HTMLProgressElement.cpp:143 > > + shadow->parserAddChild(bar); > > Ditto. Done. > > Source/WebCore/html/RangeInputType.cpp:201 > > + shadow->parserAddChild(SliderThumbElement::create(element()->document())); > > Use appendChild. Done. > > Source/WebCore/rendering/RenderSlider.cpp:181 > > + return toSliderThumbElement(static_cast<Element*>(node())->shadowRoot()->firstChild()); > > Probably need to check for shadowRoot existence here first. Done. Added an assertion to HTMLKeygenElement::shadowSelect, since that should always exist. > > Source/WebKit/mac/DOM/WebDOMOperations.mm:48 > > +#import <WebCore/ShadowFragment.h> > > ShadowRoot? My hair just turned white. I will do a clean build and rebuild the test shells. > > Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleNodeHandle.cpp:43 > > +#include <WebCore/ShadowFragment.h> > > ShadowRoot? Done. New patch soon.
Dominic Cooney
Comment 8 2011-04-07 11:44:15 PDT
Build Bot
Comment 9 2011-04-07 13:13:44 PDT
Build Bot
Comment 10 2011-04-07 13:20:01 PDT
Dominic Cooney
Comment 11 2011-04-07 13:26:52 PDT
Dominic Cooney
Comment 12 2011-04-07 13:36:54 PDT
Dimitri Glazkov (Google)
Comment 13 2011-04-07 13:37:21 PDT
Comment on attachment 88682 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=88682&action=review Super close! One more rinse cycle. > Source/WebCore/dom/ShadowRoot.cpp:35 > +PassRefPtr<ShadowRoot> ShadowRoot::create(Document* document) > +{ > + return adoptRef(new ShadowRoot(document)); > +} This can be inlined in the header. See http://codesearch.google.com/codesearch/p#OAMlx_jo-ck/src/third_party/WebKit/Source/WebCore/html/shadow/SliderThumbElement.h&l=76. > Source/WebCore/html/HTMLKeygenElement.cpp:130 > + return static_cast<HTMLSelectElement*>(shadowRoot()->firstChild()); I'd do the same check for shadowRoot() here as you did for slider thumb. > Source/WebCore/html/RangeInputType.cpp:200 > + RefPtr<ShadowRoot> shadow = ShadowRoot::create(element()->document()); Whoops. This one's not used anymore.
Dominic Cooney
Comment 14 2011-04-07 13:53:19 PDT
Dominic Cooney
Comment 15 2011-04-07 14:09:51 PDT
Comment on attachment 88689 [details] Patch I believe this one is good to go.
WebKit Review Bot
Comment 16 2011-04-07 14:24:05 PDT
Dominic Cooney
Comment 17 2011-04-07 14:35:03 PDT
Comment on attachment 88689 [details] Patch Breaks chromium…
Build Bot
Comment 18 2011-04-07 14:44:45 PDT
Roland Steiner
Comment 19 2011-04-07 14:50:39 PDT
Drive-by minor nit: CMakeLists.txt is not listed in the ChangeLog
Dominic Cooney
Comment 20 2011-04-07 14:52:01 PDT
Dominic Cooney
Comment 21 2011-04-07 15:04:59 PDT
Created attachment 88712 [details] Patch Do not break Windows.
Dimitri Glazkov (Google)
Comment 22 2011-04-07 20:17:08 PDT
Comment on attachment 88712 [details] Patch ok, let's give it a whirl.
WebKit Commit Bot
Comment 23 2011-04-07 21:04:07 PDT
Comment on attachment 88712 [details] Patch Rejecting attachment 88712 [details] from commit-queue. Failed to run "['./Tools/Scripts/webkit-patch', '--status-host=queues.webkit.org', '--bot-id=cr-jail-8', 'apply-..." exit_code: 2 Last 500 characters of output: ng file Source/WebCore/html/shadow/SliderThumbElement.h patching file Source/WebCore/rendering/MediaControlElements.cpp patching file Source/WebCore/rendering/RenderSlider.cpp patching file Source/WebCore/rendering/RenderSlider.h patching file Source/WebKit/chromium/ChangeLog Hunk #1 succeeded at 1 with fuzz 3. patching file Source/WebKit/chromium/src/WebElement.cpp Failed to run "[u'/mnt/git/webkit-commit-queue/Tools/Scripts/svn-apply', u'--reviewer', u'Dimitri Glazkov', u'--..." exit_code: 1 Full output: http://queues.webkit.org/results/8346842
WebKit Review Bot
Comment 24 2011-04-08 01:05:35 PDT
http://trac.webkit.org/changeset/83256 might have broken SnowLeopard Intel Release (WebKit2 Tests) The following tests are not passing: fast/dom/HTMLKeygenElement/keygen.html
Dominic Cooney
Comment 25 2011-04-08 01:11:00 PDT
Bug 58121 filed for WK2 test break. Bug 58119 filed for GTK test break.
Kent Tamura
Comment 26 2011-04-08 09:22:54 PDT
(In reply to comment #24) > http://trac.webkit.org/changeset/83256 might have broken SnowLeopard Intel Release (WebKit2 Tests) > The following tests are not passing: > fast/dom/HTMLKeygenElement/keygen.html I forgot to mention that I landed the patch as r83256 :-)
Note You need to log in before you can comment on or make changes to this bug.