polyfills icon indicating copy to clipboard operation
polyfills copied to clipboard

Missing DocumentOrShadowRoot interface implementation

Open bedeoverend opened this issue 7 years ago • 14 comments

Doesn't appear implement the DocumentOrShadowRoot interface - or only activeElement property seems to be implemented. Particularly for dealing with selections and ranges this is needed. I'm trying to use Prosemirror inside a component but this causes it to break - any chance some, if not all this interface will get implemented?

bedeoverend avatar Mar 17 '17 01:03 bedeoverend

Worth noting it seems only Chrome has implemented this - WebKit has an open bug

bedeoverend avatar Mar 17 '17 01:03 bedeoverend

I think at least some subset of the range/selection api could be implemented. It will likely be significant code and therefore, I'd imagine making it opt-in. The focus currently is on getting the core functionality of the library production ready rather than adding more advanced features.

sorvell avatar Apr 04 '17 00:04 sorvell

Hi guys, meanwhile this get fixed, is there any realiable way of getting the caret position in a contenteditable inside a shadyRoot ? Can I use window.getSelection() ?

dam0vm3nt avatar Jun 26 '17 08:06 dam0vm3nt

@sorvell There is there any progress on implementing the full interface for the DocumentOrShadowRoot interface? I think the full support for it is required for any WYSIWYG editors which are based on the "contenteditable" elements.

Also note that there is an attempt to implement "shadowRoot.getSelection()" polyfill already. See shadow-selection-polyfill

olegomon avatar May 04 '18 14:05 olegomon

I have recently done some investigation regarding getSelection API, sharing the results.

Short summary

Only Chrome supports getSelection() on the Shadow Root. Neither Firefox 63 beta, nor Safari have it enabled. In Firefox 63 global API still works, Safari 10+ needs a polyfill.

Long Story

Original issue is being discussed here: w3c/webcomponents#79 There is no final agreement around it yet, although we might hear some news in the end of October: https://github.com/w3c/webcomponents/issues/763#issuecomment-426514447

There is an unofficial polyfill by one guy from Google, which only covers part of functionality: https://github.com/GoogleChromeLabs/shadow-selection-polyfill

Especially, it is not designed to emulate the whole getSelection() API , but only implements getSelection().getRangeAt(0) which appears to be working nice, still it needs to be properly tested, preferably covered by automated tests (as much as possible).

This issue is affects lots of WYSIWYG editors relying on window.getSelection() (or document.getSelection() which is the same), when those are placed inside of the shadow root:

  • Quill: quilljs/quill#2021
  • Trix: basecamp/trix#403
  • CKEditor: ckeditor/ckeditor5-engine#692
  • Prosemirror: ProseMirror/prosemirror#476
  • Squire: neilj/Squire#327

Below goes the result of testing window.getSelection() API in the browsers lacking it on shadow root:

Firefox 63 beta

https://bugzilla.mozilla.org/show_bug.cgi?id=1430308

  • getSelection() not implemented on shadow root
  • window.getSelection() returns nodes from shadow trees (leaking as if they were not in shadow)
  • window.getSelection().addRange() applies the selection when passing range with start and end nodes from the inside of shadow tree
  • window.getSelection().removeAllRanges() works

Summary: Firefox 63 beta could be using global API for now, but this might break in future

Safari 11

https://trac.webkit.org/browser/webkit/trunk/Source/WebCore/dom/DocumentOrShadowRoot.idl#L30 https://bugs.webkit.org/show_bug.cgi?id=163921

  • getSelection() is not implemented on shadow root
  • window.getSelection() does not leak nodes from shadow trees (reporting node as body)
  • window.getSelection().addRange() works when passing range with start and end nodes from shadow tree (so using global API seems to work here)
  • window.getSelection().removeAllRanges() works

Expecting both Safari 10 and 12 versions to behave the same.

web-padawan avatar Oct 04 '18 15:10 web-padawan

FYI I wrote a disgusting polyfill for .getSelection inside a Shadow Root here: https://github.com/GoogleChromeLabs/shadow-selection-polyfill

samthor avatar Jun 07 '19 23:06 samthor

@azakus @sorvell this issue appears to be closed by accident, most likely in progress of migrating to monorepo. The actual issue is still valid, so please reopen.

Also, the opt-in implementation for this would be highly appreciated.

web-padawan avatar Aug 30 '19 06:08 web-padawan

@bicknellr @aomarks as you currently work on the polyfills, do you mind reopening this?

web-padawan avatar Jun 12 '20 16:06 web-padawan

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

stale[bot] avatar Jun 13 '21 10:06 stale[bot]

Is there any chance to implement a proper polyfill based on the one created by @samthor?

web-padawan avatar Jun 13 '21 17:06 web-padawan

It stopped working on the latest Safari; I wouldn't recommend trying to bring it back, sorry.

samthor avatar Jun 13 '21 22:06 samthor

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

stale[bot] avatar Jun 23 '22 04:06 stale[bot]

For anyone interested, we ended up with adding a new shadow selection shim to our Quill fork, see https://github.com/vaadin/quill/pull/2.

web-padawan avatar Jan 04 '23 13:01 web-padawan

Hey guys, just stopping by to see if anyone knew what the status is for implementing Selection API consistently across browsers was, at least within a shadow root? Not even expecting to cross shadow boundaries yet, but at least within the same root. Any information would help, thanks!

luijar avatar Sep 06 '23 13:09 luijar