Re: Behavior of matches() and closest() with :scope()

Sean Hogan <[email protected]>
Newsgroups gmane.comp.web.dom.general,gmane.comp.web.css.general
Message-ID <[email protected]>
On 24/09/14 6:32 AM, Tab Atkins Jr. wrote:
> On Tue, Sep 23, 2014 at 1:05 PM, Sean Hogan <[email protected]> wrote:
>> On 23/09/14 5:32 PM, Anne van Kesteren wrote:
>>> On Mon, Sep 22, 2014 at 11:54 AM, Sean Hogan <[email protected]>
>>> wrote:
>>>> No. I am also saying that if there is no explicit scope reference node
>>>> passed in then the implied scope reference node is document (or some
>>>> equivalent for elements not in document). I believe that currently the
>>>> implied scope reference node is the element itself.
>>>>
>>>> Currently:
>>>>       E.matches(':scope') -> true
>>>>       E.matches(':scope ul li') -> false
>>>>
>>>> Should be:
>>>>       E.matches(':scope') -> false
>>>>       E.matches(':scope ul li') -> true if E.matches('ul li') is true
>>> Why would that be better? As far as the :scope pseudo-element is
>>> concerned, the current semantics seem much more intuitive. I could see
>>> how you maybe want to rebind :scope, or restrict the tree traversed,
>>> but not why you want to change the way :scope works.
>>>
>>>
>>      E.matches(':scope')
>>      E.closest(':has(:scope)')
>> are not selectors anyone would write.
>> They do not have to be useful.
>>
>> They should be consistent. e.g.
>>      A.query(':scope > li > a[href]').matches(':scope > li > a[href]', A); //
>> potentially true
>>      document.query(':scope body').matches(':scope body'); // probably true
>>
>> Scoping is defining a boundary (not a reference node).
> Correct, but irrelevant.  :scope is not directly related to selector
> scoping, despite the name.  (The scoping elements are *one* source of
> default :scope elements, though.)

If :scope doesn't mean scope then it's a bit of a stretch to claim any 
usage is intuitive.
Has any browser implemented :scope in CSS? Does it still mean scope there?

I don't think dom traversal should be blurring the term to mean
     "reference-node which is sometimes the scope".
If someone starts with the dom definition that :scope mean reference-node
will they be confused in CSS where :scope means scope?

Is it too late for dom traversal to use a different pseudo-class?


>> In the DOM, a single node can define a boundary for all the nodes *below*
>> it.
>> That's why in
>>      A.queryAll(':scope > li > a[href]')
>>      A.queryAll('> li > a[href]')
>> the scope is naturally A, because queryAll() can find all nodes *below* A.
> No, it can find nodes outside of A.  `A.queryAll("+ li > a[href]")`
> can return an answer.  The arguments to query/queryAll are *not*
> scoped selectors, they are relative selectors with a :scope element.

I was surprised by that. The :scope is A but the scope is document (or 
equivalent).
I would not be surprised by say
     A.ownerDocument.querySelectorAll(':ref-node + li > a[href]', A)
if qSA could be passed reference nodes. The :ref-node is A and the scope 
is document.

>> SImilarly in
>>      E.closest(':scope > li > a[href]', A);
>> the scope is naturally A, because the search can find an element *below* A.
> This is assuming a future extension where you explicitly provide a
> reference element, right?  Yes, if you explicitly specify what :scope
> should match, :scope should match it.

A bit more than that.
If A is the scope then
     a) it must be an ancestor of E and
     b) it will provide an exclusive limit to upwards dom traversal in 
the search.
If A is just a reference node then neither of those apply.

A reference node is more flexible but I can't think of any real-world 
use-cases.
I suspect ":scope always means scope" is sufficient.
But isn't blurring scope and reference node just going to make specs and 
implementations more complex?
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.