[Webkit-unassigned] [Bug 87805] [Shadow DOM] <style> inside Shadow subtree should be scoped inside the subtree.

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Thu Jun 7 14:50:14 PDT 2012


https://bugs.webkit.org/show_bug.cgi?id=87805





--- Comment #7 from Dimitri Glazkov (Google) <dglazkov at chromium.org>  2012-06-07 14:50:13 PST ---
(In reply to comment #6)
> Thank you for reviewing.
> 
> I will recreate a patch. However I would like to ask one question. We cannot rely on inDocument() to determine whether style elements are registered or not?

I am not sure what you mean by "style elements are registered" here. If you mean "registered with a scoping node", then obviously no. when inDocument() == false, the node should not be registered with any scoping node, but when inDocument() == true, it may or may not be registered with a scoping node.

If you mean something else, you may have to explain it a bit more :)

> If using scoped() and m_isRegisteredWithScopingNode in the same way (=the original code's way), I think, we cannot determine where the style was registered when scoped attribute is changed to be true. I tested this by the following example:
> 
>    <style id="mystyle" scoped>div { color: red };</style>
> 
>    var style = document.getElementById("mystyle");
>    style.setAttribute("scoped", "a"); // parseAttribute is invoked with !value.isNull
>    style.setAttribute("scoped", "b"); // parseAttribute is invoked with !value.isNull
>    style.setAttribute("scoped", "c"); // parseAttribute is invoked with !value.isNull
>    style.setAttribute("scoped", "d"); // parseAttribute is invoked with !value.isNull

I don't understand what you're testing here. Can you explain a bit more?

> 
> During HTMLStyleElement::parseAttribute, we can only know whether currently scoped or not and whether currently in shadow tree or not. So we cannot determine:
> 
>   (a) [old] in shadow DOM subtree and not scoped --> [new] in shadow DOM subtree and scoped
>   (b) [old] in shadow DOM subtree and scoped --> [new] in shadow DOM subtree and scoped
> 
> In the case (b), we don't need to update. But in the case (a), we have to remove the style from shadow root. However in the both case, m_isRegisteredWithScopingNode is true, scoped() is true and isInShadowTree() is true.

So, what you need is a knowledge of how the scoping came about: whether by virtue of just being in shadow DOM subtree, or with a scoped attribute. I think I understand.

> 
> This is the reason why I removed m_isRegisteredWithScopingNode and I added the layout test, setAttribute("scoped", "scoped") for already scoped style.
> 
> I think, there are several ways to fix the above issue:
> (1) modifying scoped() to see m_scoped, i.e. bool scoped() { return m_scoped; }

This is wrong. scoped() should always reflect the attribute value.

> (2) modifying the type of m_isRegisteredWithScopingNode from bool to enum { NotRegistered, RegisteredAsScoped, RegisteredInShadowTree }.

This seems good.

> (3) adding a new boolean flag to find where a style element was registered, e.g. m_isRegisteredInShadowRoot or something.

Here, you will always have one invalid combination, which seems like a bad thing.

Thank you for explaining this! I am glad you're tackling such complex problem and making progress. Keep going! :)

-- 
Configure bugmail: https://bugs.webkit.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.



More information about the webkit-unassigned mailing list