New ext-dom features

php.internals

Niels Dossche

2 years ago
Hi internals After (and if) my current in-voting RFC about spec-compliance DOM passes, some features become more easily possible to implement due to the necessary building blocks becoming in place in the extension code. I would like to start implementing those. Therefore, I'd like to gauge the opinion of the community on the following two features before making an actual RFC and sitting through the process again. 1) Helper functions for CSS classes (i.e. classList). Requested here: https://github.com/php/php-src/issues/11688 This feature would add the DOMTokenList class along with the classList property to the Element class. It exists to ease the managing of CSS classes on elements, i.e. it deals with whitespace, duplicate class names, etc all for you using a simple set-like API. I expect that implementing this into the DOM extension is not too difficult, as the spec steps are really straight-forward [1] and we just have to reuse the internal APIs to manage attributes. 2) Built-in CSS selector API support In particular, Element::querySelector(All), Element::matches, and Element::closest support. For "old DOM" there is a trick to at least implement querySelector(All) in userland, and that is to translate the selector to XPath and use XPath queries internally. However, that's slower and more cumbersome than a native implementation. It's also just silly to not have this natively available since it's so commonly used. I have a prototype implementation of this already actually, because I got bored while fixing spec-compliance issues and wanted some funner stuff to do. It's based on Lexbor's CSS support. Kind regards Niels [1] https://dom.spec.whatwg.org/#interface-domtokenlist

Larry Garfield

2 years ago
On Sat, Feb 17, 2024, at 5:11 PM, Niels Dossche wrote:
> Hi internals > > After (and if) my current in-voting RFC about spec-compliance DOM > passes, some features become more easily possible to implement due to > the necessary building blocks becoming in place in the extension code. > > I would like to start implementing those. Therefore, I'd like to gauge > the opinion of the community on the following two features before > making an actual RFC and sitting through the process again. > > 1) Helper functions for CSS classes (i.e. classList). Requested here: > https://github.com/php/php-src/issues/11688 > > This feature would add the DOMTokenList class along with the classList > property to the Element class. > It exists to ease the managing of CSS classes on elements, i.e. it > deals with whitespace, duplicate class names, etc all for you using a > simple set-like API. > > I expect that implementing this into the DOM extension is not too > difficult, as the spec steps are really straight-forward [1] and we > just have to reuse the internal APIs to manage attributes. > > 2) Built-in CSS selector API support > > In particular, Element::querySelector(All), Element::matches, and > Element::closest support. > For "old DOM" there is a trick to at least implement querySelector(All) > in userland, and that is to translate the selector to XPath and use > XPath queries internally. However, that's slower and more cumbersome > than a native implementation. It's also just silly to not have this > natively available since it's so commonly used. > > I have a prototype implementation of this already actually, because I > got bored while fixing spec-compliance issues and wanted some funner > stuff to do. It's based on Lexbor's CSS support. > > > Kind regards > Niels > > [1] https://dom.spec.whatwg.org/#interface-domtokenlist
I feel like the CSS-based querySelector() was discussed not that long ago. Was it by you? Lexbor sounds familiar. Either way, I'm +1 on including a CSS selector natively. --Larry Garfield

Niels Dossche

2 years ago
Hi Larry On 18/02/2024 18:25, Larry Garfield wrote:
> On Sat, Feb 17, 2024, at 5:11 PM, Niels Dossche wrote: >> Hi internals >> >> After (and if) my current in-voting RFC about spec-compliance DOM >> passes, some features become more easily possible to implement due to >> the necessary building blocks becoming in place in the extension code. >> >> I would like to start implementing those. Therefore, I'd like to gauge >> the opinion of the community on the following two features before >> making an actual RFC and sitting through the process again. >> >> 1) Helper functions for CSS classes (i.e. classList). Requested here: >> https://github.com/php/php-src/issues/11688 >> >> This feature would add the DOMTokenList class along with the classList >> property to the Element class. >> It exists to ease the managing of CSS classes on elements, i.e. it >> deals with whitespace, duplicate class names, etc all for you using a >> simple set-like API. >> >> I expect that implementing this into the DOM extension is not too >> difficult, as the spec steps are really straight-forward [1] and we >> just have to reuse the internal APIs to manage attributes. >> >> 2) Built-in CSS selector API support >> >> In particular, Element::querySelector(All), Element::matches, and >> Element::closest support. >> For "old DOM" there is a trick to at least implement querySelector(All) >> in userland, and that is to translate the selector to XPath and use >> XPath queries internally. However, that's slower and more cumbersome >> than a native implementation. It's also just silly to not have this >> natively available since it's so commonly used. >> >> I have a prototype implementation of this already actually, because I >> got bored while fixing spec-compliance issues and wanted some funner >> stuff to do. It's based on Lexbor's CSS support. >> >> >> Kind regards >> Niels >> >> [1] https://dom.spec.whatwg.org/#interface-domtokenlist > > I feel like the CSS-based querySelector() was discussed not that long ago. Was it by you? Lexbor sounds familiar.
I have mentioned it in the past, I couldn't find another discussion specifically about it on externals.io. So it was probably me :-) As for Lexbor, I did mention it both in my current RFC and previous RFC. In short: it's the library allowing us to have HTML5 support. Cheers Niels