Minutes from Editing TF Fukuoka TPAC Meeting, Friday, September 20th, 2019

Note: rrsagent wasn't added at the start of the meeting so these minutes are pasted from my IRC client...

Editing TF Minutes
Friday, September 20th, 2019

4:48 PM BoCupp, sanketj, jdai and grisha joined
4:52 PM <grisha> Meeting link:
4:52 PM https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fmit.webex.com%2Fmit%2Fj.php%3FMTID%3Dm5df42abcd9292df985be7611c92745a2&amp;data=02%7C01%7CGrisha.Lyukshin%40microsoft.com%7Cc827ed82629b410895cb08d73d5bf3cc%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637045337979339532&amp;sdata=ZjttIWAclOAlKlC3pkL7pfP87l9XiEX%2BHxXe6etiq%2BI%3D&amp;reserved=0

4:52 PM Meeting number: 648 666 327
4:52 PM Password: tpac
4:52 PM Host key: 602241
4:52 PM → darwin and johanneswilm joined
4:58 PM <grisha> Johannes: here is the agenda - https://github.com/w3c/editing/blob/gh-pages/TPAC/2019/Agenda.md and let's do introductions
4:59 PM Johannes: let's jump right in editContext
5:00 PM Bo: 1st part intro and 2nd part describing functionality and we want feedback
5:01 PM Bo: editContext: https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/master/EditContext/explainer.md

5:01 PM but let's talk about philosophy
5:01 PM Bo: few editing surfaces
5:02 PM CE, Text Area, inputs
5:02 PM Bo: each comes with a set of technologies that are not available to JS as stand alone capabilities
5:03 PM Bo: and here is the EditContext API that provides basic input functionality
5:03 PM Bo: giving example of monaco editor
5:06 PM → GameMaker, yosin and yoichio_ joined
5:07 PM <grisha> Bo: describing the problems in Accessibility when hidden text area is used since it is being primary surface for accessibility
5:08 PM Bo: Issues with collaboration for IME scenarios
5:09 PM Bo: all approaches have limitations.
5:09 PM → mustaq joined (~sid37448@public.cloak)
5:12 PM <grisha> Bo: for example, Word example when composing IME at the end of the page where composition jumps around because JS editor can't gracefully control composition.
5:12 PM Bo: so the proposal is to decouple edit view from the dom
5:14 PM Bo; OS has advanced input capabilites: inking, emoji window, shape-writing , IME. This is done with set of specialized APIs.
5:15 PM Bo: we should be able to provide the same for the web.
5:16 PM Bo: and so EditContext is the set of web projections  of native APIs
5:18 PM Bo: we provide coordinates of selection, input mode (the same as input attribute). It is the same as editbale surface but without an attachment to the dom
5:18 PM EnterKeyHint, inputPolicy, more than one editContext
5:18 PM Bo: author gets text updates and is expected to update the view
5:19 PM Bo: are there any question
5:19 PM Gary: how do screen readers work with EditContext, do they ignore it?
5:19 PM Bo: they still do
5:23 PM Bo: in the spirit of the minimal viable editor, edtiContext is not meant to replace hidden text area authors use today, it is aims to cover the use cases (shown in the explainer).
5:23 PM (Showing the sequence of events from the explainer)
5:23 PM Johnnes: what is the text format update?
5:24 PM Bo: textupdates come with styling request in compositions. That's used to show how active composition is styled.
5:25 PM → tink and saschanaz joined
5:25 PM <tink> present+ Léonie (tink)
5:25 PM <grisha> Johannes: so EditContext requests for specicif style?
5:25 PM Bo: yep
5:26 PM Bo: showing idl from the explainer
5:27 PM Mustaq: question: why should editcontext should worry about updatelayout
5:28 PM Bo: b/c of interaction with text input UI (IME candidate window)
5:28 PM → Lan joined (~Lan@public.cloak)
5:28 PM <grisha> Mustaq: what coordinates are we using?
5:29 PM Bo: api coordinates
5:29 PM Navid: coordinates like screen coordinates?
5:30 PM Bo; yes, all of the conversion happens in the browser but this is an API to send coordinates
5:30 PM Dawson: is there a cross-platform story?
5:30 PM Bo: yes
5:30 PM Bo: API surface looks remarkably similar
5:31 PM Olli: updatelayout is a bit confusing
5:32 PM Johannes: how would author know what formats to use on  different platforms?
5:33 PM <garykac> Gary Kacmarcik present+
5:33 PM <grisha> Johannes: would be useful to have what each platform does in terms of formatting
5:34 PM <sanketj> present+
5:34 PM <grisha> Wenson: that's the whole idea behind input event?
5:34 PM Bo: not sure if ime formatting is used for  that?
5:35 PM Jason; why even send this info:
5:36 PM Megan: b/s each platform has a specific way to highlight IME composition
5:38 PM → aboxhall_ joined (~uid20617@public.cloak)
5:39 PM <grisha> Ryoske: some of that formatting has some semantic meaning
5:40 PM Ryoske: also, there is no standard to across different imes
5:42 PM Ryoske: (showing Japanese compositions)
5:43 PM — Travis can tell that rniwa is passionate about this!
5:43 PM <grisha> Johannes: conclusion is we can't mess with IME related formats.
5:47 PM Johannes: together with format updates browser should indicate that this is is IME related formatting
5:48 PM Ryoske: I think, for IME we need far more information
5:50 PM Gary: sounds like we need to test out bunch of IMEs
5:51 PM Ryoske: Other cases,  dictation and shapewriting, etc...
5:51 PM ⇐ GameMaker quit (~textual@public.cloak) "My MacBook has gone to sleep. ZZZzzz…"
5:54 PM <mustaq> present+ Mustaq Ahmed (Google)
5:54 PM ⇐ yoichio_ quit (~yoichio@public.cloak) Ping timeout: 180 seconds
6:06 PM <whsieh> Wenson Hsieh present+ Wenson Hsieh
6:07 PM <garykac> Gary Kacmarcik How do we turn this API on? What is its scope?
6:07 PM Bo is talking...
6:08 PM Spellcheck - there is no API which gives ranges of spellcheck issues. What about a new Spellcheck API. That's what we're gravitating towards
6:08 PM There are privacy concerns, but we're looking into it
6:08 PM → GameMaker joined (~textual@public.cloak)
6:13 PM <garykac> Gary Kacmarcik Platform UI conficlts with app ui
6:14 PM there's a need on the editcontect to show the broeser where to show the browser toolbar editing ui. There should be an option to not show it at all.
6:14 PM There is also an option to merge with the browser UI through a menu element
6:15 PM johannes: ability to disable items from menu. The 2nd part that is useful is to be able to add elements to menu
6:16 PM wensen: Need to be able to indicate where so that it doesn't overlap with the native UI. We need to be able to coordinate.
6:16 PM Perhaps define an "avoidance area". If the entire page is an avoidance area, then that means not to show anything.
6:17 PM Now we can move on to Undo
6:17 PM Bo: My understanding is that most editors ignore the undo stack today. And write their own.
6:18 PM Note that there is an UndoManager proposal which will be covered lateer
6:18 PM Another issue: You lose the built-in editing commands.
6:19 PM If this is about exexcommand, then this is not a concern.
6:21 PM → rniwa joined (~rniwa@public.cloak)
6:21 PM <garykac> Gary Kacmarcik Example: Email with To/From/BCC. Could be a single editcontext that is reset for each field; or it could be 3 separate editcontexts that are switched between.
6:24 PM When you get focusin on an element, then you activate the corresponding editcontext to enable the editing services.
6:27 PM ryosuke: need to focus on the a11y issues. because the browser doesn't know where things are, it can place things in the wrong place. This is tricky, but hopefully we can identify the part of the page involved with editing so that we can place elements appropriately.
6:28 PM Bo: Next issue: Loss of native caret and selection
6:30 PM johannes: devs are worried about losing the native caret. too much work to handle their own selection.
6:30 PM <darwin> present+ Darwin Huang
6:30 PM <garykac> Gary Kacmarcik johannes: can you have a contenteditable with listeners for DOM mutations?
6:31 PM wensen: MS word currently does this. They have a hybrid model.
6:32 PM Bo: Word renders their own because they need to cross paragraph boundaries
6:33 PM ryosuke: perhaps something like: website provides a bunch of rects for the ranges, just show the selection around this rect.
6:34 PM That would allow sites to use the browser native selection. Big win because this is difficult to recreate.
6:36 PM johannes: we talked about "content editable caret only" a number of years ago
6:41 PM What about a11y? How do apps communicate where the insertion point when they're not using the native insertion point?
6:41 PM Bo: we should add something to allow that
6:42 PM Do we need contenteditable if editcontext exists? Can it be deprecated?
6:43 PM We probably don't want to improve/improve contenteditable at all.
6:43 PM We should focus on improving editcontext so that we don't need contenteditable.
6:43 PM johannes: Yes, if we can get editcontext supported everywhere. But we'll see how long that takes. cf. input evnets which are still not implemented everywhere.
6:44 PM So we can't trash CE not.
6:45 PM Bo: we can't deprecate it now, but we can have a new focus on editcontext
6:45 PM rniwa: there's too much content out there to deprecate it anytime soon.
6:46 PM There are many things on that web that we'd like to get rid of, but we can't because they are still in use
6:46 PM ...but we can dream...
6:47 PM johannes: if it's going to take 6-8 years until we have a replacement, then we should consider continuing with CE features.
6:47 PM Bo: we can burn those bridges when we come to them.
6:49 PM Bo: other things missing: beforeinput is not fired on readonly elements. could bring it back when editcontext is focused. is that necessary?
6:50 PM also change in editing heuristics. and changes in cut/copy/paste behavior.
6:50 PM DEMO!
6:53 PM demo is linked in the document: https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/master/EditContext/edit_context_demo.html

6:59 PM navid: question about handling focus with multiple editcontexts. and changing focus from element to editcontext.
7:00 PM → jcraig joined (~sid363695@public.cloak)
7:00 PM <garykac> Gary Kacmarcik Bo: when you switch, the old EC gets a blur so only the one that is focused last wins
7:03 PM Leonie: Do we need chairs for this taskforce? If so, then Johannes and Grisha
7:03 PM We'll need to update the WG and the charter
7:04 PM Need a doc with mission, scope, how we communicate, ...
7:04 PM The chairs will create that doc.
7:05 PM They'll come up with a draft doc.
7:05 PM <tink> Example TF work statement: https://w3c.github.io/jlreq/charter/

7:05 PM <garykac> Gary Kacmarcik rniwa: We'll want people more familiar with assistant tech to review the feature proposal
7:06 PM <tink> No need to use that exact format etc. but the document the TF uses as its work statement should aim to include those bits of information - scope, chairs, communication etc.
7:06 PM <garykac> Gary Kacmarcik Biggest problem we have with contenteditable is how poorly it interacts with assistive tech
7:06 PM jcraig: says jcraig (Apple) and aboxhall (Google) are good people to include.
7:07 PM ⇐ rniwa and Lan quit
7:11 PM <jcraig> s/assistant tech/assistive tech (accessibility)/
7:20 PM → rniwa joined (~rniwa@public.cloak)
7:25 PM <grisha> Johannes: contenteditable-disabled
7:26 PM Johannes: this proposal is aimed to control disabling formatting and other UI on editing sites
7:28 PM Johannes: what existing proposal misses is adding menu items. Including browser and OS formatting panes
7:28 PM → Lan joined
7:30 PM <grisha> Bo: have you considered classifiers instead of turning commands on/off, individually?
7:31 PM ⇐ Lan quit (~Lan@public.cloak) "Page closed"
7:32 PM <grisha> Johannes: we talked about white-listing vs blacklisting few years ago. Browsers would opt-in for white-listing by default. There were concerns around finger printing. Also, what about adding commands that are not there.
7:32 PM → Lan joined (~Lan@public.cloak)
7:33 PM <grisha> Bo: so you would enumerate everything that is supported in my web app.
7:34 PM Bo: so sites could potentially add buttons for behavior not supported by platform
7:35 PM Johannes: it is still better
7:35 PM Wenson: we don't want to make it easy for developers to shoot themselves in the foot
7:37 PM Wenson: we do have a precedence of disabling by class. formatJustified
7:38 PM Ryoske: another reason for diabling commands was that we were not on the hook to define the behavior
7:39 PM Wenson: looks like we are converging on fine-grained api but also with elements of classes
7:39 PM <garykac> Gary Kacmarcik rniwa: original assumption with contenteditable-disabled is that most editors would want to support most of the editing commands
7:40 PM Bo: revisit the block vs. allow list
7:42 PM <grisha> Bo: what is the example of breakage of disallow-list breakage?
7:43 PM Sanket: new feature like table insertion that would break existing behavior in  editor
7:45 PM Johannes:editors could be testing and say why do i need this new feature? And then disable.
7:45 PM <garykac> Gary Kacmarcik Bo: how does the token list solve the problem with allow/deny lists?
7:46 PM <grisha> Wenson: at the end of the day, developer should choose what's right for their app.
7:49 PM <garykac> Gary Kacmarcik rniwa: 2 different scenarios to support : (1) rich editor that supports most operations, (2) limited editor (like markdown), need to restrict to limited set of operatons
7:49 PM johannes: we've had this conversation every year for the past 5 years.
7:49 PM there is no perfect solution
7:50 PM Bo: new context this year: how to enable UI for readonly elements?
7:51 PM johannes: 3 things: (1) remove history (undo manager); (2) add some combinations (grouping) of formatting options, (3) how to make it work with edit context
7:53 PM clipboard options need to be included in the list of "formatting" options: cut/copy/paste
7:55 PM Bo: merging the UI. no popup vs 2 popups.
7:55 PM johannes: disabling elements is easy. adding new items is hard because sometimes it's menu, or touchbar, or ...
8:01 PM johannes: need someone to create a grouping of the commands
8:05 PM → yosi joined  ⇐ GameMaker, johanneswilm and yosin quit  ↔ rniwa and whsieh nipped out
9:09 PM <garykac> Gary Kacmarcik Bo: summary from lunch discussion: it's needs some more thinking...
9:09 PM ⇐ Lan quit (~Lan@public.cloak) Ping timeout: 180 seconds
9:13 PM <garykac> Gary Kacmarcik Bo: for contenteditable-disabled. it needs more work. we're willing to engage in discussions, but we won't be able to focus on this in the short term.
9:14 PM rniwa: note that you can press and hold keys to get popup to select accented characters on OSX. We need to make sure this plays well with editcontext
9:14 PM → koji joined (~sid53200@public.cloak)
9:14 PM <sanketj> https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/master/highlight/explainer.md

9:15 PM <garykac> Gary Kacmarcik Now: Highlight API
9:15 PM <Travis> sanketj: Might be a repeat for folks who were in CSS...
9:15 PM Scribe: Travis
9:16 PM .. hightlight API, allows for arbitrary styling of text
9:17 PM .. existing feature ::selection, ::spelling-error, and ::grammar-error
9:17 PM .. useful for web editors, e.g., grammarly
9:17 PM .. review of shape of API
9:18 PM .. In CSS OM this proposal adds HighlightRangeGroup, allows group/batch styling.
9:18 PM .. HighlightRangeMap keeps the range groups together.
9:18 PM .. adds `CSS.highlights`
9:19 PM .. ranges must be in a group and in a map to be styleable
9:19 PM .. adding a new CSS selector ::highlight( <range group name> )
9:19 PM .. also `rangegroup.style.`
9:20 PM .. some complexity in highlight range overlapping.
9:20 PM <garykac> Gary Kacmarcik Priority: when you have overlapping highlight group. determine which renders on top of the other
9:21 PM By default, no default priority set. tiebreaker is timestamp order - last one added wins
9:21 PM <Travis> .. timestamp order is the tie-breaker (time in which the group was added to the map)
9:21 PM <garykac> Gary Kacmarcik But you can assign priority to be explicit about which one wins
9:21 PM <Travis> florian: was discussing the priority in CSS
9:22 PM .. wondering if it shoudl be in some sort of list...
9:22 PM .. other variant.
9:22 PM .. this pre-exists in built-in ones, so this is still necessary to figure out.
9:22 PM .. (notion pre-exists)
9:22 PM → johanneswilm joined (~johanneswilm@public.cloak)
9:22 PM <Travis> .. how to handle; e.g., could be contraints "x must be above y" regardless
9:23 PM smaug: Can one range group contain overlaps?
9:23 PM .. is like selection api
9:23 PM <garykac> Gary Kacmarcik olli: What if we didn't allow overlapping ranges?
9:23 PM <Travis> .. selection api doesn't allow overlapping selections (end-points will be moved so they're not overlapping)
9:24 PM florian: if you create overlapping, then adjust, and start adding content... lots of corner cases...
9:24 PM NavidZ_: styling and fonts? can both apply?
9:24 PM <garykac> Gary Kacmarcik Styles are are merged as long as they don't conflict
9:25 PM <Travis> florian: highlighting is being aligned to what the builtins should be.
9:25 PM q?
9:25 PM → Zakim joined (zakim@public.cloak)
9:25 PM <Travis> q?
9:25 PM — Zakim sees no one on the speaker queue
9:26 PM → johanneswilm1 joined (~uid392357@public.cloak)
9:26 PM <garykac> Gary Kacmarcik Q: Can a highlight group have multiple ranges?
9:26 PM A: Yes
9:26 PM <Travis> smaug: Why do we want a new API instead of Selection API?
9:26 PM .. different sections for highlight, selection, spellchecker?
9:26 PM .. seems similar to selection.
9:27 PM sanketj: Selection API does have support for multiple ranges
9:27 PM .. if you implement this, you'd need to support multiple ranges anyway.
9:27 PM q
9:27 PM q?
9:27 PM — Zakim sees no one on the speaker queue
9:28 PM <BoCupp> Bo Cupp q+
9:28 PM — Zakim sees BoCupp on the speaker queue
9:28 PM → florian joined (~florianriv@public.cloak)
9:28 PM <Travis> sanketj: Two notion of selection, public visible, and implementation.
9:29 PM .. thinking impl detail.
9:29 PM smaug: already have existing API.
9:29 PM q?
9:29 PM — Zakim sees BoCupp on the speaker queue
9:29 PM <rniwa> q+
9:29 PM — Zakim sees BoCupp, rniwa on the speaker queue
9:29 PM <Travis> ack BoCupp
9:29 PM — Zakim sees rniwa on the speaker queue
9:30 PM <Travis> BoCupp: Clarifying question...
9:30 PM <florian> @florian:rivoal.net q+
9:30 PM — Zakim sees rniwa, florian on the speaker queue
9:30 PM <Travis> .. semantically there are behaviors applied to selection... caret, highlighted range, copy/paste, etc.
9:30 PM .. at a min we'd need to differentiate between selection, spelling, etc.
9:31 PM <smaug> Smaug q+
9:31 PM — Zakim sees rniwa, florian, smaug on the speaker queue
9:31 PM <Travis> .. putting all those things into 'selection' API seems troubling. That's the reason we went with API.
9:31 PM <NavidZ_> Navid Zolghadr q+
9:31 PM — Zakim sees rniwa, florian, smaug, NavidZ_ on the speaker queue
9:31 PM <smaug> Smaug q-
9:31 PM — Zakim sees rniwa, florian, NavidZ_ on the speaker queue
9:31 PM <Travis> smaug: API behavior seems similar.
9:31 PM rniwa: Has delete from document.
9:31 PM <NavidZ_> Navid Zolghadr q-
9:31 PM — Zakim sees rniwa, florian on the speaker queue
9:31 PM <Travis> .. purpose is to see highlight.
9:32 PM q-
9:32 PM — Zakim sees rniwa, florian on the speaker queue
9:32 PM <Travis> rniwa: Why range and not static range.
9:32 PM ack rniwa
9:32 PM — Zakim sees florian on the speaker queue
9:33 PM <Travis> rniwa: selection has base/extent focus/anchor this may not translate well.
9:33 PM .. lots of assumption about single range.
9:33 PM .. also see your argument; maybe have DOM selection API inherit?
9:33 PM smaug: a possibility
9:33 PM <smaug> Smaug q-
9:33 PM — Zakim sees florian on the speaker queue
9:33 PM <Travis> rniwa: multi-range object, etc.
9:33 PM ack florian
9:33 PM — Zakim sees no one on the speaker queue
9:34 PM <Travis> florian: I think getSelection API doesn't make sense, but the Selection object makes more sense.
9:34 PM <smaug> Smaug q+
9:34 PM — Zakim sees smaug on the speaker queue
9:34 PM <Travis> .. some methods are not as desired here... like delete
9:34 PM .. also multi-range is there that is weird. Agree inherit from a common thing.
9:34 PM .. there are some commonalities yes.
9:35 PM → GameMaker joined (~textual@public.cloak)
9:35 PM <Travis> smaug: collapse and delete: this is exactly what you may want to do.
9:35 PM .. you implement your own spell-checker and may want to manage the selection.
9:35 PM q?
9:35 PM — Zakim sees smaug on the speaker queue
9:35 PM <Travis> ack smaug
9:35 PM — Zakim sees no one on the speaker queue
9:36 PM <smaug> Smaug q-
9:36 PM — Zakim sees no one on the speaker queue
9:36 PM <Travis> sanketj: Moving on to hightlight events
9:36 PM .. may want to add features on top
9:36 PM .. e.g., popup-ui with replacement text on click.
9:37 PM .. when user clicks on find-result, author may want to move selection.
9:37 PM <sanketj> https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/master/highlight/events-explainer.md

9:37 PM https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/master/highlight/explainer.md

9:37 PM <Travis> .. will show proposal as-in, but caveat--many discussions have taken place since then with good feedback.
9:37 PM .. add new type of pointer event to be dispatched on range-groups.
9:38 PM .. (shows code sample)
9:38 PM <garykac> Gary Kacmarcik q+
9:38 PM — Zakim sees garykac on the speaker queue
9:38 PM <Travis> .. key points we wanted: how this differs from pointer events fired on elements.
9:38 PM .. certify that events firing on highlight ranges doesn't break compat for events on elements.
9:39 PM .. if we add events from regular flow, target doesn't make sense.
9:39 PM <rniwa> q?
9:39 PM — Zakim sees garykac on the speaker queue
9:39 PM <rniwa> q+
9:39 PM — Zakim sees garykac, rniwa on the speaker queue
9:39 PM <Travis> .. so two separate events.
9:39 PM .. feedback from smaug and hober that there should be coordination between highlight event and element.
9:40 PM .. highlight might elipse and prevent navigation on hyperlink
9:40 PM .. event for highlight range group should prevent event for element.
9:40 PM <florian> @florian:rivoal.net q?
9:40 PM — Zakim sees garykac, rniwa on the speaker queue
9:40 PM <florian> @florian:rivoal.net q+
9:40 PM — Zakim sees garykac, rniwa, florian on the speaker queue
9:41 PM <Travis> ack garykac
9:41 PM — Zakim sees rniwa, florian on the speaker queue
9:41 PM <smaug> Smaug q+
9:41 PM — Zakim sees rniwa, florian, smaug on the speaker queue
9:41 PM <Travis> garykac: Do these events make sense for the proper Selection API? If not, leads to potential division..
9:41 PM sanketj: got feedback on how we can expand these events to other elements; open question? Would love use cases.
9:42 PM .. for selection, if you want event on custom selection, might want to add effect.
9:42 PM ack florian
9:42 PM — Zakim sees rniwa, smaug on the speaker queue
9:43 PM <Travis> florian: long-standing desire to attach events to pseudos. this causes a lot of concerns for folks.
9:43 PM <NavidZ_> Navid Zolghadr q+
9:43 PM — Zakim sees rniwa, smaug, NavidZ_ on the speaker queue
9:43 PM <Travis> .. this leads us to what to fix the entire problem.
9:43 PM garykac: Next few years?
9:43 PM florian: this is the driver to fix.
9:43 PM sanketj: share scenarios?
9:43 PM florian: `:before` etc., are used for lots of reason.. hard to say why, but they do it anyway.
9:44 PM .. these lead to frustration. Doesn't really matter why.
9:44 PM .. scenarios when pseudos should be in DOM but not?
9:44 PM sanketj: Not sure we could put those in the same event path as the element (even if we do solve.)
9:45 PM <smaug> Smaug q-
9:45 PM — Zakim sees rniwa, NavidZ_ on the speaker queue
9:45 PM <Travis> smaug: Should add pseudoTarget to event, can also handle shadow DOM
9:45 PM florian: proposal for events on pseudos?
9:45 PM fantasai: no not yet; happy to see one!
9:46 PM sanketj: if highlight is just a pseudo, then this could just work.
9:46 PM smaug: I think we want a pointer to the range...
9:46 PM florian: If you're working with multiple, you'll want to know which was clicked...
9:46 PM fantasai: you have one pseduo per element in the tree; you can know where it's boundary is--and if the range crosses, it splits.
9:47 PM .. if two ranges are disconnected within same element, can currently distinguish between the two sections.
9:47 PM .. would need a representation for parts of the element.
9:47 PM florian: yes, but that's not an API specific to the range.
9:47 PM smaug: What's the OM represntation shoudl be?
9:48 PM fantasai: there is a pseudo element object, but it's very basic at the moment.
9:48 PM q?
9:48 PM — Zakim sees rniwa, NavidZ_ on the speaker queue
9:48 PM <Travis> ack rniwa
9:48 PM — Zakim sees NavidZ_ on the speaker queue
9:48 PM <Travis> rniwa: Generic solution for pseudo will be awkward.
9:48 PM → cbiesinger joined (~sid8099@public.cloak)
9:48 PM <florian> @florian:rivoal.net q?
9:48 PM — Zakim sees NavidZ_ on the speaker queue
9:49 PM <florian> @florian:rivoal.net q+
9:49 PM — Zakim sees NavidZ_, florian on the speaker queue
9:49 PM <Travis> .. dispatch event on group, with event target is the range?
9:49 PM .. Seems awkward that the range is not a sub-type of event target--
9:49 PM sanketj: two pieces:
9:50 PM .. 1) valuable to listen to the event on the range group, rather than range. In Find on page scenario and want to change color, you have to add handlers to every group.
9:51 PM .. for multiple highlight range groups.. if you have highlight range for spelling, etc., bubble the event from group to group.
9:51 PM .. both app and extension want to show popups... lack of coordination of who should go first.
9:51 PM rniwa: Doesn't change on where you target the event.
9:51 PM <BoCupp> Bo Cupp q+
9:51 PM — Zakim sees NavidZ_, florian, BoCupp on the speaker queue
9:52 PM <Travis> ack NavidZ_
9:52 PM — Zakim sees florian, BoCupp on the speaker queue
9:52 PM <Travis> NavidZ_: Idea of extend pointer events:
9:52 PM .. you're only sending events types that have already been sent.
9:52 PM .. click, touch events won't be sent.
9:53 PM .. tomorrow if someone wants a wheel event, will you duplicate taht event too?
9:53 PM .. leads to duplication...
9:54 PM .. seems like highlight world is different from element world
9:54 PM BoCupp: We need to have pointers to the range and the group.
9:54 PM .. what about detail?
9:54 PM NavidZ_: Has some overlapping purposes...
9:54 PM .. click count could be overloaded.
9:54 PM ack BoCupp
9:54 PM — Zakim sees florian on the speaker queue
9:55 PM <Travis> range can exist in multiple range groups, that's why we don't have a cascading bubbling.
9:55 PM .. same range might be seen more than once.
9:55 PM .. leaning toward simplest thing: just hit the one in front, others can query with `getRangeFromPoint`
9:56 PM NavidZ_: Why do we need the same range object in different groups?
9:56 PM BoCupp: We don't throw there, but could?...
9:56 PM .. issue opened about find, with different find results.
9:57 PM .. if we wanted to add bubbling and this was blockiing, then we might drop, but want to simplify.
9:57 PM ack florian
9:57 PM — Zakim sees no one on the speaker queue
9:57 PM <Travis> florian: Actually, I mispoke, noted that pesudo-elements do have a thing that returns an eventtarget.
9:57 PM .. current restricted to limited set of pseudos.
9:58 PM .. `CSSPseudoElement`
9:58 PM <florian> @florian:rivoal.net https://drafts.csswg.org/css-pseudo-4/#cssom

9:58 PM <Travis> .. some work to do still.
9:58 PM q?
9:58 PM — Zakim sees no one on the speaker queue
9:59 PM <Travis> .. would want to flesh out the above, rather than have two duplicate efforts.
9:59 PM rniwa: frowns more on the CSS one then other other, but willing to work with it.
9:59 PM .. e.g., when is this created, destroyed, etc. Is a CSS WG issue...
10:00 PM florian: goal is to fix if needed.
10:00 PM .. we're aware of the lifecycle issues.
10:00 PM rniwa: until it's defined, then...
10:00 PM <BoCupp> Bo Cupp q+
10:00 PM — Zakim sees BoCupp on the speaker queue
10:00 PM <Travis> ack BoCupp
10:00 PM — Zakim sees no one on the speaker queue
10:01 PM <Travis> BoCupp: we do have static ranges.. (missed)
10:02 PM → fantasai joined  ⇐ rniwa quit
10:02 PM <BoCupp> Bo Cupp pseudo could be considered static like the StaticRange to help address the queestion of lifetime
10:03 PM <fantasai> - discussion about identity of PseudoElement https://github.com/w3c/csswg-drafts/issues/3607

10:03 PM <Travis> five minute break; returning at 2:08
10:04 PM <fantasai> - https://www.w3.org/TR/web-animations-1/#extensions-to-the-pseudoelement-interface

10:07 PM https://drafts.csswg.org/web-animations-1/

10:07 PM Web Animations is the only place I know that's using PseudoElement right now
10:10 PM <Travis> sanketj: One option is to have event flow through various groups...
10:10 PM .. but if this is disallowed. Only one range group gets it.
10:11 PM <NavidZ_> Navid Zolghadr q+
10:11 PM — Zakim sees NavidZ_ on the speaker queue
10:11 PM <Travis> .. only the range group and only the range in the top layer gets the event.
10:12 PM yoichio: is an array of ranges
10:12 PM sanketj: it's a set.
10:12 PM ack NavidZ_
10:12 PM — Zakim sees no one on the speaker queue
10:12 PM <koji> q+
10:12 PM — Zakim sees koji on the speaker queue
10:12 PM <BoCupp> Bo Cupp q+
10:12 PM — Zakim sees koji, BoCupp on the speaker queue
10:12 PM <Travis> NavidZ_: how does one get all the events (as an extension)
10:13 PM .. there should be a listener somewhere...
10:13 PM → yoichio_ joined (~yoichio@public.cloak)
10:13 PM <Travis> BoCupp: key is they don't see the event.
10:14 PM .. is it important that my find is more important than the other... ?? not sure. We might be overcomplicated.
10:14 PM rniwa: what do you mean by extension?
10:15 PM <johanneswilm1> +q
10:15 PM — Zakim sees koji, BoCupp, johanneswilm on the speaker queue
10:15 PM <Travis> ack koji
10:15 PM — Zakim sees BoCupp, johanneswilm on the speaker queue
10:15 PM <Travis> koji: one group? means no other actor can recieve the event?
10:15 PM sanketj: only highest pri group and highest range.
10:15 PM BoCupp: All event listeners on the group fires.
10:15 PM <florian> @florian:rivoal.net q+
10:15 PM — Zakim sees BoCupp, johanneswilm, florian on the speaker queue
10:16 PM <Travis> rniwa: could be an issue for any other script code on the page; this is more relevant to standards.
10:16 PM koji: I like the simplification.
10:16 PM q?
10:16 PM — Zakim sees BoCupp, johanneswilm, florian on the speaker queue
10:16 PM <Travis> ack BoCupp
10:16 PM — Zakim sees johanneswilm, florian on the speaker queue
10:17 PM <Travis> johanneswilm1: randomly starting and changing stuff doesn't work. If you want to make this work, Google/Microosft could come up with common API and grammarly could then work with that.
10:17 PM — Travis that can happen??
10:17 PM <Travis> koji: Even in native app, not every command is available on selection
10:18 PM florian: it doesn't really matter where that other actor comes from... if it's multiple things, the author has the responsibility to coordination
10:18 PM rniwa: if this extends to keyboard events, same line of text has spelling and grammar issues...
10:18 PM .. chaining seems pretty useful.
10:18 PM q?
10:18 PM — Zakim sees johanneswilm, florian on the speaker queue
10:19 PM <Travis> ack johanneswilm1
10:19 PM — Zakim sees johanneswilm, florian on the speaker queue
10:19 PM <Travis> ack johanneswilm
10:19 PM — Zakim sees florian on the speaker queue
10:19 PM <Travis> ack florian
10:19 PM — Zakim sees no one on the speaker queue
10:20 PM → cmp joined (~sid311987@public.cloak)
10:20 PM <Travis> sanketj: proposal is only targeting pointer.. might need to consider key, other events.
10:20 PM sanketj: topic: static range
10:21 PM .. is Range the right representation of author-defined highlights.
10:21 PM .. problem 1) they are live and adjust with mutations
10:21 PM <johanneswilm> +q
10:21 PM — Zakim sees johanneswilm on the speaker queue
10:21 PM <Travis> .. that can be useful sometimes... but we understand that for editors, the auto-adjust is not sufficient.
10:22 PM .. (scenario described)
10:22 PM .. additionally normalize around white-space removal, more things.
10:22 PM .. we think editors would benefit from StaticRange
10:22 PM <florian> @florian:rivoal.net q+
10:22 PM — Zakim sees johanneswilm, florian on the speaker queue
10:22 PM <Travis> .. only used in before input
10:23 PM .. also has a constructor.
10:23 PM .. node/offset may be invalid.
10:23 PM .. if we start using static range in highlight api.
10:23 PM .. this will require highlight rendering checking... leaves some ranges stale.
10:23 PM <garykac> Gary Kacmarcik q+
10:23 PM — Zakim sees johanneswilm, florian, garykac on the speaker queue
10:24 PM <Travis> .. could be expensive.
10:24 PM <florian> @florian:rivoal.net q-
10:24 PM — Zakim sees johanneswilm, garykac on the speaker queue
10:24 PM <koji> q+
10:24 PM — Zakim sees johanneswilm, garykac, koji on the speaker queue
10:24 PM <Travis> ack johanneswilm
10:24 PM — Zakim sees garykac, koji on the speaker queue
10:24 PM <Travis> johanneswilm: In editing frameworks, this looks like a "decoration" and maps semantically well.
10:24 PM .. using a normal range, this would not be helpful, because mapping would not be helpful.
10:24 PM .. adjust might be simple (1 char moving)
10:24 PM <smaug> Smaug q+
10:24 PM — Zakim sees garykac, koji, smaug on the speaker queue
10:25 PM <Travis> .. or, could expand and adjust all other ranges in a spellchecking adjust.
10:25 PM .. +1 to staticrange
10:25 PM ack garykac
10:25 PM — Zakim sees koji, smaug on the speaker queue
10:25 PM <Travis> garykac: other option is abstract range.
10:25 PM .. author could choose.
10:25 PM sanketj: Seems interesting to discuss.
10:26 PM <sanketj> https://github.com/MicrosoftEdge/MSEdgeExplainers/issues/66

10:26 PM <johanneswilm> +q
10:26 PM — Zakim sees koji, smaug, johanneswilm on the speaker queue
10:26 PM <Travis> .. where range adjust adjust might work.
10:28 PM florian: in case where range is determined by app logic... but when range is determined by user action...
10:28 PM florian: the user asked for the range... so that works.
10:28 PM q?
10:28 PM — Zakim sees koji, smaug, johanneswilm on the speaker queue
10:28 PM <Travis> ack koji
10:28 PM — Zakim sees smaug, johanneswilm on the speaker queue
10:30 PM <Travis> koji: see that sometimes range makes sense, but users can often leave ranges in non-GC states. Want Static Range by default. Want to make static range case easy.
10:30 PM rniwa: describes how range count hurts performance.
10:30 PM q?
10:30 PM — Zakim sees smaug, johanneswilm on the speaker queue
10:30 PM <Travis> ack smaug
10:30 PM — Zakim sees johanneswilm on the speaker queue
10:31 PM <Travis> smaug: See the issue in live ranges... yes. (Gecko has some optimizations here)
10:31 PM .. I'm worried about painting speed with the time to validate the static range.
10:32 PM .. it seems this is the most critical performance path.
10:32 PM <yosi> q+
10:32 PM — Zakim sees johanneswilm, yosi on the speaker queue
10:32 PM <Travis> hober: There are clear tradeoffs in both cases.
10:32 PM koji: implementation detail is to keep it live...
10:33 PM smaug: then what's the performance issue?
10:33 PM koji: getSelection, then store result, and the local variable isn't GC'd.
10:34 PM ?
10:34 PM q?
10:34 PM — Zakim sees johanneswilm, yosi on the speaker queue
10:34 PM <Travis> smaug: live ranges need to observe all the time. Static ranges must be validated?
10:35 PM BoCupp: as you traverse the boxes you're going to paint.
10:35 PM <smaug> Smaug q-
10:35 PM — Zakim sees johanneswilm, yosi on the speaker queue
10:35 PM <Travis> ack johanneswilm
10:35 PM — Zakim sees yosi on the speaker queue
10:36 PM <Travis> johanneswilm: It may be true that the live range does the right thing... but browser interop could be a problem.
10:36 PM <smaug> Smaug q+
10:36 PM — Zakim sees yosi, smaug on the speaker queue
10:36 PM <smaug> Smaug q-
10:36 PM — Zakim sees yosi on the speaker queue
10:37 PM <Travis> johanneswilm: if it's DOM, then wait for Mutation Observers, then wait, then diff DOM, then use that as the input to the algorithm.
10:38 PM .. then for decorations, you verify and apply them as needed.
10:38 PM .. not sure about the cost in implementation.
10:38 PM ack yosi
10:38 PM — Zakim sees no one on the speaker queue
10:39 PM <Travis> yosi: I'm supportive of static range. But `set` API, whould be snapshot over live ranges.
10:39 PM .. maybe specify that ...
10:39 PM <BoCupp> Bo Cupp q+
10:39 PM — Zakim sees BoCupp on the speaker queue
10:39 PM <Travis> .. suggesting getting an API of highlight ranges.
10:40 PM .. in blink, highlight ranges, this is maintained in text node and offset only.
10:40 PM <koji> q+
10:40 PM — Zakim sees BoCupp, koji on the speaker queue
10:40 PM <Travis> .. this would mean we need to maintain ranges for highlight and other...?
10:41 PM BoCupp: In customer discusions, we found most customers recomputed the locations anyway.
10:41 PM ack BoCupp
10:41 PM — Zakim sees koji on the speaker queue
10:41 PM <Travis> ack koji
10:41 PM — Zakim sees no one on the speaker queue
10:42 PM <Travis> rniwa: I image most complicated apps (docs, MS), I imagine these apps fluch all highlight and recompute.
10:42 PM s/fluch/flush
10:42 PM .. I expect range automatic updates would just be annoying.
10:43 PM florian: also think components that everyone uses also do this.
10:43 PM q?
10:43 PM — Zakim sees no one on the speaker queue
10:43 PM <Travis> 15 minute break.
10:43 PM back at 3pm Japan time
10:46 PM ⇐ GameMaker and yoichio_ quit
11:03 PM <BoCupp> Bo Cupp ScribeNick: BoCupp
11:03 PM Topic: UndoManager
11:04 PM <whsieh> https://whsieh.github.io/UndoManager, https://rniwa.github.io/undo-api

11:04 PM → Mek joined (~quassel@public.cloak)
11:04 PM <BoCupp> Bo Cupp whsieh: presenting UndoManager
11:04 PM Most rch text editors control their own undo stacks
11:04 PM ... they use CTRL+Z to trigger undo
11:05 PM ... there are many other pieces of UI for triggering undo
11:05 PM ... triggering the unhandled path can misbehave (do nothing, get out of sync with app, etc)
11:06 PM ... UndoManager is API that can undo app-specific things (like drawing)
11:06 PM .... UndoManager (UM) has undo/redo API for callbacs
11:06 PM ... U M has items with labels to control UI
11:06 PM UM lives on the document
11:07 PM .... you can also scope UM under a subtree
11:07 PM ... you don't want to hit undo multiple times and then have it undo things from unrelated scope
11:07 PM ... some contention about label string and localization
11:08 PM ... should we redcuce number of places where there are strings supplied by the page that are exposed in browser UI (due to loc)
11:08 PM ... cross platform applicability of the label string
11:08 PM ... Windows and Mac
11:09 PM ... should we drop from the API?
11:10 PM → GameMaker joined (~textual@public.cloak)
11:10 PM <BoCupp> Bo Cupp ... if we were to ship API like this, instead of simply adding items they would need to add multiple items, immediately trigger an undo that is a no-op, for collab editing situations
11:11 PM → GameMake_ joined (~textual@public.cloak)
11:12 PM <BoCupp> Bo Cupp ... UA may know more about what can be undone than the editor
11:13 PM johanneswilm: apps use beforeinput event handles all the multiple ways undo can be triggered
11:13 PM ... problem is the UI may be disabled
11:13 PM ... to ensure the UI is enabled you may need placeholder undo items just to light up UI
11:13 PM koji: when browser changes something does it get added?
11:13 PM ryuske: yes that's handled
11:14 PM yosi: how about iframes?
11:14 PM ryuske: its up to API as to whether its treated global or local to iframe
11:14 PM whsieh: existing problem is leaking undo due to its global nature
11:15 PM yosi: Chrome has per iframe undo stack
11:15 PM whsieh: each document has UM so its consistent with the Chrome view
11:15 PM ryuske: up to UA if each iframe has its own undo manager
11:16 PM whsieh: undo scope is determined by activeElement ancestor
11:17 PM ryuske: if you write editing with undo using execCommand can't
11:17 PM ... this API would give a way to do it
11:17 PM ⇐ GameMaker quit (~textual@public.cloak) Ping timeout: 180 seconds
11:17 PM <BoCupp> Bo Cupp johanneswilm: if you're typing does it add automatically?
11:17 PM johanneswilm: how about react changes, will that cause confusion for this API?
11:17 PM johanneswilm: is all that in the API?
11:18 PM whsieh: that won't work with browser today
11:18 PM johanneswilm: I type 'a' and it gets added to an editable element and goes in undo stack
11:19 PM johanneswilm: then script runs to path the DOM with some adjustment specific to the editor
11:19 PM whsieh: you'd need to remove it
11:20 PM ryuske: alternatively you remember how to undo that step and merge it with what the browser did
11:20 PM ryuske: you could preventdefault the browsers original addition
11:21 PM glyuk: what do you need to track to make that happen?
11:21 PM glyuk: all the indices?
11:21 PM <yosi> q+
11:21 PM — Zakim sees yosi on the speaker queue
11:21 PM <BoCupp> Bo Cupp ack yosi
11:21 PM — Zakim sees no one on the speaker queue
11:21 PM <BoCupp> Bo Cupp yosi: difficult to do this type of merging
11:22 PM ... maybe editor wants to do some merging of compound commands
11:22 PM ryuske: when do you create group?
11:23 PM yosi: app creates group maybe marks start and end of transaction
11:23 PM ryuske: typing batch may be open and app doesn't know it
11:24 PM yosi: give them API to query it
11:24 PM rysuke: merge is problem for typing
11:24 PM yosi: I'm talking more about compound operations, how to handle?
11:25 PM rysuke: make a group and keep adding commands to group
11:25 PM yosi: you may want to use execCommand and then have merged units
11:26 PM koji: you can do this by remember the length and then regrouping items
11:27 PM <sanketj> Scribe:sanketj
11:27 PM <BoCupp> Bo Cupp q+
11:27 PM — Zakim sees BoCupp on the speaker queue
11:28 PM <sanketj> megan/ryosuke/wenson: imagining way to create group
11:28 PM Bo: can you clarify interaction between user defined units and scripted units?
11:28 PM <yosi> UndoGroup impl in Chrome: https://cs.chromium.org/chromium/src/components/undo/undo_manager.h?type=cs&q=undomanager&g=0&l=56

11:29 PM <darwin> q+
11:29 PM — Zakim sees BoCupp, darwin on the speaker queue
11:29 PM <koji> q+
11:29 PM — Zakim sees BoCupp, darwin, koji on the speaker queue
11:29 PM <sanketj> Bo: Specifically, does the undo/redo history get re-written on scripted interactions?
11:29 PM Wenson: No adjustment. Undo/redo fails gracefully.
11:31 PM Megan: Author can maintain the undo/redo stack themselves.
11:31 PM Ryosuke: Undo/redo command behavior not spec'ed clearly.
11:32 PM Bo: Will it be difficult for browsers that compensate for scripted interactions to support user customizations to the undo/redo stack.
11:32 PM <johanneswilm> +q
11:32 PM — Zakim sees BoCupp, darwin, koji, johanneswilm on the speaker queue
11:32 PM <BoCupp> Bo Cupp ack BoCupp
11:32 PM — Zakim sees darwin, koji, johanneswilm on the speaker queue
11:33 PM <sanketj> darwin: are these blocking operations? could these be async?
11:33 PM ack darwin
11:33 PM — Zakim sees koji, johanneswilm on the speaker queue
11:33 PM <sanketj> whsieh: Not async currently.
11:34 PM cmp: Difficult to turn a sync operation into async operation later.
11:34 PM ryosuke: no reason why website need to treat this async
11:34 PM whsieh: key is that it isn't sync with respect to renderer
11:35 PM Bo: but it is right?
11:35 PM ryosuke: undo is sync, async part is about updating browser UI
11:35 PM ack koji
11:35 PM — Zakim sees johanneswilm on the speaker queue
11:36 PM <sanketj> koji: Idea about merged unit use case. Merged/mutable?
11:36 PM whsieh: Could work.
11:36 PM <yosi> q+
11:36 PM — Zakim sees johanneswilm, yosi on the speaker queue
11:36 PM <sanketj> ack johanneswilm
11:36 PM — Zakim sees yosi on the speaker queue
11:37 PM <BoCupp> Bo Cupp q+
11:37 PM — Zakim sees yosi, BoCupp on the speaker queue
11:38 PM <sanketj> johanneswilm: Editors will maintain their own undo stack, or let the browser handle it. No need to worry about use cases where the two are mixed. If that does happen, then it is fine to let the undo take place without any effect. (Examples of where that would be okay.)
11:38 PM .... main editor will not rely on the browser's undo stack
11:38 PM ... some small editor/widget may
11:39 PM ryosuke: consider form controls scenario where group of controls need to be undone together
11:39 PM johanneswilm: Within one element scope, common undo stack may make sense.
11:40 PM <BoCupp> Bo Cupp q+ Travis
11:40 PM — Zakim sees yosi, BoCupp, Travis on the speaker queue
11:40 PM <sanketj> ryosuke: (gives counter example with input type text values)
11:41 PM johanneswilm: i get the use case now, but leave room for some element scope to handle their own while other elements can use the browsers
11:41 PM johanneswilm: about async, typing itself is slow, takes some time for user to move hand to undo
11:41 PM ... some optimizations needed elsewhere not needed in text writing
11:42 PM ... when performing large undo/redo, editor supporting that can handle its own async behavior and continue using the undo manager API async
11:42 PM ack yosi
11:42 PM — Zakim sees BoCupp, Travis on the speaker queue
11:42 PM <sanketj> yosi: should execcommand undo/redo call UndoManager undo/redo?
11:42 PM ryosuke: yes
11:43 PM ryosuke: comment is spec about that
11:43 PM ack BoCupp
11:43 PM — Zakim sees Travis on the speaker queue
11:43 PM <sanketj> BoCupp: can you turn off browser's additions to the stack?
11:43 PM whsieh: Yes
11:43 PM BoCupp: could you add a property like "UA-undo=disabled"?
11:44 PM whsieh: Yes it could.
11:44 PM *we could
11:44 PM BoCupp: also wondering about mixing of undo units
11:45 PM ... ckeditor use browser mutations sometimes, sometimes their own
11:45 PM ... but manage undo on their own
11:45 PM ... would be hard for them to capture the browser's mutations in custom undo stack
11:45 PM <johanneswilm> +q
11:45 PM — Zakim sees Travis, johanneswilm on the speaker queue
11:45 PM <sanketj> whsieh: [point taken]
11:45 PM ack Travis
11:45 PM — Zakim sees johanneswilm on the speaker queue
11:46 PM <sanketj> Travis: Can you articulate the use case?
11:46 PM ... that this unlocks
11:46 PM <johanneswilm> q-
11:46 PM — Zakim sees no one on the speaker queue
11:46 PM <sanketj> whsieh: ability to customize the browser's undo stack, which isn't possible today
11:47 PM whsieh: (show demo of how to undo drawing)
11:47 PM ryosuke: helps accessibility as AT could know what label does
11:53 PM ⇐ johanneswilm quit (~johanneswilm@public.cloak) Ping timeout: 180 seconds
12:05 AM → carlosil and rniwa joined
12:05 AM <sanketj> Scribe:sanketj
12:05 AM Topic: Spellcheck API
12:06 AM <Travis> https://usercontent.irccloud-cdn.com/file/2c45GIrY/image.png

12:06 AM <sanketj> grisha: EditContext takes away ability to spellcheck, Johannes/Piotrek also expressed interest in spellcheck API
12:06 AM ... today, there are two solutions
12:07 AM ... one, JS framework upload own dictionary and own proofing engine, and other is cloud spellcheck
12:07 AM ... both are not ideal, cloud spellcheck is expensive, upload own dictionary is also not an option
12:08 AM ... increases size of author-defined dictionary
12:09 AM travis: can use lang attribute to change spellchecking language
12:09 AM bo: not possible in edgehtml
12:09 AM yosi: possible in blink
12:09 AM grisha: thoughts not proposal
12:10 AM grisha: i understand there are privacy concerns about giving JS authors easy access to user's dictionary
12:10 AM <Travis> q?
12:10 AM — Zakim sees no one on the speaker queue
12:11 AM → Lan joined (~Lan@public.cloak)
12:11 AM <sanketj> johannes: problem with internal spellchecker, author knows what language it is, but it is not in the user's dictionary
12:11 AM johannes: languages may be close (ex. en-US vs en-UK), and spelling corrections are incorrect
12:12 AM <Travis> s/en-UK/en-GB
12:12 AM <sanketj> johannes: problem with client side dictionary is it lacks information about english region
12:13 AM grisha: how do you know in your app what the region is?
12:13 AM — Travis thinks that the user sitting at the keyboard knows what the language should be best :)
12:13 AM <sanketj> johannes: template based, author of template has specified language and region
12:13 AM ... multiple language scenarios also defined through template
12:13 AM — Travis and never, never, never try to mix languages together in one edit box!
12:14 AM <sanketj> ... point is that multiple authors may be writing their own chapters in a book and need to specify lang/region info explicitly
12:14 AM <Travis> q?
12:14 AM — Zakim sees no one on the speaker queue
12:14 AM <yosi> language detector in Chrome: https://chromium.googlesource.com/external/github.com/google/cld_3.git/+/HEAD/README.md

12:15 AM <whsieh> q?
12:15 AM — Zakim sees no one on the speaker queue
12:15 AM <johanneswilm1> +q
12:15 AM — Zakim sees johanneswilm on the speaker queue
12:15 AM <whsieh> +q
12:15 AM — Zakim sees johanneswilm, whsieh on the speaker queue
12:15 AM <Travis> q+
12:15 AM — Zakim sees johanneswilm, whsieh, Travis on the speaker queue
12:15 AM <BoCupp> Bo Cupp q+
12:15 AM — Zakim sees johanneswilm, whsieh, Travis, BoCupp on the speaker queue
12:16 AM <sanketj> BoCupp: key ask...want to be able to spellcheck text not in the DOM, pass in a string to an API and get back a collection of spelling errors (ex. misspelled word, range info, alternatives)
12:16 AM ... allow author to choose langs in which the spellcheck should occur
12:17 AM ... controlled by permissions API
12:18 AM q?
12:18 AM — Zakim sees johanneswilm, whsieh, Travis, BoCupp on the speaker queue
12:18 AM <sanketj> ack johanneswilm
12:18 AM — Zakim sees whsieh, Travis, BoCupp on the speaker queue
12:19 AM <sanketj> johanneswilm: from the perspective of the JS app, if the security problem is that local spellchecker has private info, it would be a big improvement to just have non-custom dictionary
12:19 AM <Travis> q?
12:19 AM — Zakim sees whsieh, Travis, BoCupp on the speaker queue
12:19 AM <sanketj> grisha: definitely an improvement and a viable option
12:19 AM <Travis> ack whsieh
12:19 AM — Zakim sees Travis, BoCupp on the speaker queue
12:19 AM <sanketj> whsieh: same question about security..
12:19 AM ... could be solved by ignoring custom suggestions
12:19 AM <smaug> Smaug q+
12:19 AM — Zakim sees Travis, BoCupp, smaug on the speaker queue
12:20 AM <sanketj> ... other thing, is there a distinction between spellchecking and autocorrection? know which things are misspelled and which are marked for suggestions
12:21 AM ryosuke: on mac, you can perform spellcheck/grammercheck, and another option for autocorrect
12:21 AM grisha: same on windows
12:21 AM BoCupp: not sure if there is distinct API surface for differentiating between autocorrect or spellcheck, but there could be an autocorrect flag that would be an indicator.
12:22 AM Ryosuke: should be consistent with other apps
12:22 AM ack Travis
12:22 AM — Zakim sees BoCupp, smaug on the speaker queue
12:22 AM <sanketj> Travis: make this as minimal viable as possible
12:22 AM → pwnall joined (~pwnall@public.cloak)
12:22 AM <sanketj> ... provides minimal info to author, author will handle the rest
12:22 AM ack BoCupp
12:22 AM — Zakim sees smaug on the speaker queue
12:22 AM <pwnall> present+ Victor Costan (Google)
12:23 AM <sanketj> BoCupp: in terms of security concerns: lang packs and custom dictionaries
12:23 AM — Travis TOR (The Onion Router)
12:23 AM <sanketj> smaug: TOR want all browser users to look the same so custom dictionary is not okay
12:23 AM <smaug> Smaug q-
12:23 AM — Zakim sees no one on the speaker queue
12:24 AM <sanketj> BoCupp: position on permissions API?
12:24 AM smaug: no position yet
12:24 AM Topic: Raw Clipboard Access
12:25 AM Presenter: darwin
12:25 AM q?
12:25 AM — Zakim sees no one on the speaker queue
12:25 AM <sanketj> darwin: current spec status...
12:26 AM ... sync clipboard API including document.execCommand, based on DOM
12:26 AM ... also DataTransfer
12:26 AM ...new async clipboard API added in 2016
12:26 AM ... completed spec of navigator.clipboard.{read,write} in early 2019
12:27 AM ... created new clipboard transfer object to allow for async read, write
12:27 AM ... some problems with this new set of APIs is that many missing formats
12:27 AM — Travis notes that you can remind yourself what you'd like to say when you queue by typing `q+ to [...]` where [...] is what you want the queue to remember.
12:27 AM <sanketj> ... Figma wanted access to image formats
12:28 AM ... GIMP also
12:28 AM .. metadata about clipboard formats may also be valuable
12:28 AM ... another customer: Sketchup (or other CAD apps)
12:29 AM ... need specialized formats that could be proprietary
12:29 AM ... google also has a potential proprietary format
12:29 AM ... long tail of niche formats
12:30 AM ... not possible to standardize proprietary and not worth standardizing niche formats
12:30 AM ...design:
12:30 AM <pwnall> Raw Clipboard Access slides: https://docs.google.com/presentation/d/1HCueQhlUjUux7Y5KqT0VrSRLrI629KnT49gEa7ZgPHA/

12:30 AM <sanketj> s/design/goal
12:31 AM → staphany joined (~staphany@public.cloak)
12:31 AM <sanketj> ...provide web apps with access to raw clipboard, low-level API providing raw blobs to OS
12:31 AM → jsbell joined (~sid6276@public.cloak)
12:31 AM <sanketj> ... still recommend existing sanitized APIs for general use
12:31 AM <jsbell> present+
12:31 AM <sanketj> q?
12:31 AM — Zakim sees no one on the speaker queue
12:31 AM <sanketj> (shows example of existing write)
12:32 AM s/example/examples
12:32 AM ⇐ carlosil quit (~carlosil@public.cloak) Ping timeout: 180 seconds
12:34 AM <rniwa> q?
12:34 AM — Zakim sees no one on the speaker queue
12:34 AM <rniwa> q+
12:34 AM — Zakim sees rniwa on the speaker queue
12:34 AM <sanketj> ... introducing new way to detect platform (navigator.clipboard.platform)
12:35 AM (shows example of existing read)
12:35 AM s/example/examples
12:35 AM <smaug> Smaug q+
12:35 AM — Zakim sees rniwa, smaug on the speaker queue
12:36 AM <BoCupp> Bo Cupp q+
12:36 AM — Zakim sees rniwa, smaug, BoCupp on the speaker queue
12:36 AM <sanketj> ... navigator.clipboard.platform better than navigator.platform because latter does hacky regex matching
12:37 AM ... basic protection: secure context, active frame only, permissions check that is consistent with other clipboard APIs
12:37 AM ... limit amount of formats available per origin, 32 types of origin, 4096 total per UA
12:37 AM ... limit type lengths to 1024
12:38 AM ... UA should provide protection like safe browsing
12:38 AM <saschanaz> q+
12:38 AM — Zakim sees rniwa, smaug, BoCupp, saschanaz on the speaker queue
12:38 AM <Travis> q+ to ask about relationship to share systems
12:38 AM — Zakim sees rniwa, smaug, BoCupp, saschanaz, Travis on the speaker queue
12:38 AM <sanketj> ... privacy concerns:
12:38 AM ... MS word may provide version number, email etc. on read
12:39 AM ... some photo formats provide metadata with GPS coords
12:39 AM .. and location
12:40 AM ... navigator.clipboard.write -> concerns with arbitrary code execution
12:40 AM q?
12:40 AM — Zakim sees rniwa, smaug, BoCupp, saschanaz, Travis on the speaker queue
12:40 AM <sanketj> ack rniwa
12:40 AM — Zakim sees smaug, BoCupp, saschanaz, Travis on the speaker queue
12:40 AM <pwnall> q+
12:40 AM — Zakim sees smaug, BoCupp, saschanaz, Travis, pwnall on the speaker queue
12:41 AM <sanketj> rniwa: navigator.clipboard.platform is just crazy
12:41 AM ... should not suggest new APIs require platform checks by authors
12:41 AM darwin: to satisfy the use cases, this is necessary
12:41 AM ... different APIs represent their APIs differently
12:42 AM ⇐ staphany and Lan quit
12:42 AM <sanketj> pwnall: need to add this because we want to diff between multiple clipboard backends on the user's machine
12:42 AM → carlosil joined (~carlosil@public.cloak)
12:43 AM <johanneswilm1> +q
12:43 AM — Zakim sees smaug, BoCupp, saschanaz, Travis, pwnall, johanneswilm on the speaker queue
12:43 AM <sanketj> ... no choice!
12:43 AM darwin: considered mime type prefixs instead...issue is that does not work with interop use cases because apps wouldn't update clipboard info to support this
12:43 AM q?
12:43 AM — Zakim sees smaug, BoCupp, saschanaz, Travis, pwnall, johanneswilm on the speaker queue
12:43 AM <sanketj> ack smaug
12:43 AM — Zakim sees BoCupp, saschanaz, Travis, pwnall, johanneswilm on the speaker queue
12:44 AM <rniwa> q+
12:44 AM — Zakim sees BoCupp, saschanaz, Travis, pwnall, johanneswilm, rniwa on the speaker queue
12:44 AM <sanketj> swaug: this is exposing too many security bugs, we can't do this
12:44 AM darwin: we do this with downloads right?
12:44 AM s/swaug/smaug
12:45 AM rniwa: there are native apps on Mac OS that would do abritrary code execution in response to arbitrary code written to clipboard
12:46 AM pwnall: would it be possible to have a sanitizer in the browser/OS to deal with this
12:46 AM <Travis> q?
12:46 AM — Zakim sees BoCupp, saschanaz, Travis, pwnall, johanneswilm, rniwa on the speaker queue
12:46 AM <sanketj> rniwa: no, because we wouldn't know when to sanitize
12:46 AM ack BoCupp
12:46 AM — Zakim sees saschanaz, Travis, pwnall, johanneswilm, rniwa on the speaker queue
12:46 AM <sanketj> BoCupp: functionality question
12:46 AM ... data type is missing multi part format?
12:47 AM <pwnall> q-
12:47 AM — Zakim sees saschanaz, Travis, johanneswilm, rniwa on the speaker queue
12:47 AM <sanketj> ... why not data transfer, also...functionality lost for multi part formats, browsers used to do that at least, and spec present
12:48 AM darwin: this is low level API, so if they want to handle image formats, they can do so themselves
12:48 AM BoCupp: how would reference to image be fulfilled?
12:48 AM darwin: web app would handle it
12:49 AM BoCupp: how? describes example of file references pointing to temp directory
12:50 AM ... needs to be the ability to copy/paste multiple formats together
12:50 AM rniwa
12:51 AM rniwa: solved this problem by combining images as blobs and html [fix this if this is wrong]
12:51 AM rniwa: specifically it is a blob URl
12:51 AM <Travis> q?
12:51 AM — Zakim sees saschanaz, Travis, johanneswilm, rniwa on the speaker queue
12:51 AM <sanketj> BoCupp: that sounds good
12:51 AM ... how to identify? GUID?
12:51 AM rniwa: yes
12:52 AM q?
12:52 AM — Zakim sees saschanaz, Travis, johanneswilm, rniwa on the speaker queue
12:52 AM <sanketj> .. comment applies to async clipboard, not just raw clipboard
12:52 AM garykac: spec for text/html should cover this (hopefully)
12:52 AM ack saschanaz
12:52 AM — Zakim sees Travis, johanneswilm, rniwa on the speaker queue
12:52 AM <BoCupp> Bo Cupp q+
12:52 AM — Zakim sees Travis, johanneswilm, rniwa, BoCupp on the speaker queue
12:54 AM <sanketj> saschanaz: what if don't use "raw: true" and allow arbitrary mime types?
12:54 AM ... what's the purpose of the flag?
12:55 AM darwin: raw flag defaults to false, if true will be raw write
12:55 AM ... property on clipboard item
12:55 AM q?
12:55 AM — Zakim sees Travis, johanneswilm, rniwa, BoCupp on the speaker queue
12:55 AM <Travis> q-
12:55 AM — Zakim sees johanneswilm, rniwa, BoCupp on the speaker queue
12:56 AM <sanketj> Travis: i would be more comfortable if this became an opt-in for native apps
12:57 AM <pwnall> q+
12:57 AM — Zakim sees johanneswilm, rniwa, BoCupp, pwnall on the speaker queue
12:57 AM <sanketj> ... also restrict set of formats like we did for web bluetooth?
12:57 AM darwin: one of the alternatives considered
12:57 AM ... new MIME type prefix
12:58 AM ... would require opt-in by native apps
12:58 AM Travis: did you consider using a share instead of clipboard?
12:58 AM darwin: mobile share or native app?
12:58 AM Travis: more like web share
12:58 AM Travis: workaround is save file to file system and read it from there
12:59 AM darwin: need to think more
12:59 AM Travis: may or may not work, just something to think about
1:00 AM darwin: i assume web share would not write to platform clipboard, in which case it would not work
1:00 AM Alex Russell: could be a second action from web share
1:00 AM <BoCupp> Bo Cupp ack johanneswilm
1:00 AM — Zakim sees rniwa, BoCupp, pwnall on the speaker queue
1:01 AM <sanketj> johannes: exporting to different formats on different platforms would make it very difficult for framework authors
1:01 AM ... need to make it framework work with different formats/platforms, and need to convince web app authors who build on top
1:01 AM — Travis rather.. "what I understood was..."
1:02 AM <sanketj> q?
1:02 AM — Zakim sees rniwa, BoCupp, pwnall on the speaker queue
1:03 AM <sanketj> rniwa: forward compatibility problem
1:03 AM <Travis> johanneswilm: devs working on a specific platform will have a tendancy to forget to support other less-popular platforms, and apps written in those less popular platforms will be left out.
1:04 AM <sanketj> ack rniwa
1:04 AM — Zakim sees BoCupp, pwnall on the speaker queue
1:04 AM <sanketj> rniwa: echoing smaug, for security, this will not work
1:04 AM .. also echo Travis that this should be opt-in
1:05 AM Alex Russell: Why is this a security problem if we continue to allow downloads?
1:05 AM rniwa: clipboard often used by system native apps for housekeeping purposes and could be vulnerable to arbitrary code execution
1:05 AM AlexRussell: So they are vulnerable to their peer apps?
1:05 AM rniwa: yes!
1:07 AM AlexRussell: if i install any app on Mac OS, can it attack any system app through clipboard? if so, why is this less trustworthy?
1:07 AM whsieh: no way to elevate trust for web apps, get real estate on screen
1:08 AM Travis: if you install a native app that can read/write clipboard, and you trust it because you downloaded it yourself
1:08 AM ... the website you may trust because...?
1:08 AM s/may/may not
1:09 AM rniwa: security model for native apps vs web apps may be different
1:10 AM AlexRussell: can we agree on shape of API, some would implement it and some would not?
1:10 AM rniwa: sure
1:10 AM ... but other objections still stand, like new navigation.clipboard.platform
1:11 AM BoCupp: question for rniwa...if apps place NS objects on the clipboard, is it different to the download because they never touch the file?
1:12 AM rniwa: downloaded files have a mark
1:12 AM darwin: related proposal coming next...
1:13 AM <saschanaz> q?
1:13 AM — Zakim sees BoCupp, pwnall on the speaker queue
1:13 AM <Travis> rniwa: what about a roaming clipboard case? The two parties may not be able to properly negotiate...
1:13 AM ack BoCupp
1:13 AM — Zakim sees pwnall on the speaker queue
1:14 AM <Travis> BoCupp: Could the same speed bump be placed on paste? e.g., show a super-scary notice...
1:15 AM rniwa: Can't imagine our users would understand (might be confused)
1:15 AM BoCupp: We could put a similar speedbump.
1:16 AM rniwa: it is conceivable...
1:16 AM <sanketj> ack pwnall
1:16 AM — Zakim sees no one on the speaker queue
1:16 AM <saschanaz> q+
1:16 AM — Zakim sees saschanaz on the speaker queue
1:17 AM <Travis> pwnall: if the web was successful and all apps were web apps, we wouldn't need it.
1:17 AM .. we need to nudge toward web apps.
1:17 AM .. we need the big vision to land, copy/paste, drag/drop, etc.
1:17 AM .. should make them safer overall.
1:17 AM <johanneswilm1> +q
1:17 AM — Zakim sees saschanaz, johanneswilm on the speaker queue
1:18 AM <Travis> .. also, having trouble understanding downloads, when I save from web, then the finder on OSX renders a preview.
1:18 AM .. so in this flow bytes from the web are read by native without road block.
1:20 AM ⇐ rniwa quit (~rniwa@public.cloak) "My MacBook has gone to sleep. ZZZzzz…"
1:20 AM <sanketj> q?
1:20 AM — Zakim sees saschanaz, johanneswilm on the speaker queue
1:20 AM → rniwa joined  ⇐ pwnall quit
1:20 AM <Travis> .. when we copy, by the time the bits hit the clipboard we think they can be secured.
1:20 AM saschanaz: api shape question
1:20 AM .. when the bool flag is passed + mime types, and only some are supported by browser and the other is random...
1:21 AM .. if you opt in to raw, does the browser skip all sanitization?
1:21 AM .. or just those for which aren't known?
1:22 AM darwin: could possibly mix, but would require more code.
1:23 AM <sanketj> q?
1:23 AM — Zakim sees saschanaz, johanneswilm on the speaker queue
1:23 AM <sanketj> ack saschanaz
1:23 AM — Zakim sees johanneswilm on the speaker queue
1:23 AM <Travis> ack johanneswilm
1:23 AM — Zakim sees no one on the speaker queue
1:24 AM <Travis> johanneswilm1: Why is this downloaded content more annoying... it downloads, I have to find it, open it, etc.
1:24 AM .. what if I could just copy from what I just downloaded to the clipboard?
1:24 AM darwin: Seems pretty hacky...?
1:25 AM .. might not translate a part of a doc...
1:26 AM pwnall: I like how you were thinking; follows the model we'd like to establish.
1:26 AM <sanketj> q?
1:26 AM — Zakim sees no one on the speaker queue
1:26 AM <rniwa> q?
1:26 AM — Zakim sees no one on the speaker queue
1:26 AM <Travis> whsieh: Would break continuity, copy and one device and paste on another.
1:27 AM ⇐ carlosil quit (~carlosil@public.cloak) "Page closed"
1:27 AM <Travis> darwin: Hear a good amount of opposition.
1:27 AM .. suggestion to use opt-in
1:28 AM .. want to clarify that we'd provide the same defenses.. and other protection for binary data.
1:28 AM rniwa: Asking for permission, then falling back.
1:28 AM .. maybe in case where permission does fail, you can fall back to sanitization.
1:28 AM .. don't want it to always fail.
1:28 AM slightlyoff: will need the async result to tell you that.
1:29 AM darwin: A good minimal option is to reject immediately if the web app tries to call raw...otherwise then await for the sanitize.
1:30 AM rniwa: Another reason to do fall back is to avoid two round-trips to get the content.
1:30 AM darwin: We also want to ensure web apps don't sniff user-agent string.
1:31 AM .. web apps might be stuck behind a library that doesn't update.
1:31 AM .. feature detection vs. browser detection.
1:32 AM rniwa: Don't decouple browser permission from action.
1:32 AM ⇐ GameMake_ and rniwa quit
1:45 AM <Travis> darwin: Thanks for the 'constructive' feedback; it could have been worse.
1:45 AM .. Topic: MOTW (Mark of the Web)
1:45 AM .. for clipboard
1:45 AM .. desire to allow MOTW on the web clipboard without degraded security/privacy
1:46 AM <whsieh> link here: https://github.com/dway123/clip-motw/blob/master/explainer.md

1:47 AM <Travis> .. the clipboard would add meta-data to content written from the web to indicate it came from the web.
1:47 AM .. adding URL is a privacy concern, which is privacy violation.
1:47 AM .. this is where we landed.
1:47 AM .. this is a parallel format.
1:48 AM .. idea: user sends data and expects just that to be sent, but as we have seen, this is not always the case.
1:48 AM .. would add another part that is not meant for user consumption (it's for Defense-in-depth)
1:48 AM <garykac> Gary Kacmarcik q+
1:48 AM — Zakim sees garykac on the speaker queue
1:48 AM <Travis> .. also if native or installed web apps wanted to do this, they could.
1:49 AM → pwnall joined (~pwnall@public.cloak)
1:49 AM <Travis> .. does give away the status that it came from web.
1:49 AM <whsieh> q+
1:49 AM — Zakim sees garykac, whsieh on the speaker queue
1:49 AM <sanketj> ack garykac
1:49 AM — Zakim sees whsieh on the speaker queue
1:49 AM <Travis> garykac: If we pickled web content, isn't that MOTW
1:49 AM <pwnall> q+
1:49 AM — Zakim sees whsieh, pwnall on the speaker queue
1:49 AM <Travis> .. I think that solves the same problems?
1:50 AM <BoCupp> Bo Cupp q+
1:50 AM — Zakim sees whsieh, pwnall, BoCupp on the speaker queue
1:50 AM <Travis> darwin: hmm. I guess it could work.
1:50 AM <sanketj> ack whsieh
1:50 AM — Zakim sees pwnall, BoCupp on the speaker queue
1:50 AM <pwnall> present+ Victor Costan (Google)
1:50 AM <Travis> whsieh: This is a nicer way of expose information, if we agreed on 'pickling'
1:50 AM rniwa: I think this is largely an OS-level concern.
1:51 AM .. if doing this, Apple might add support like this to the system clipboard itself.
1:51 AM darwin: Is this what is done for downloads?
1:51 AM .. Any downside to separately standardize.
1:52 AM BoCupp: How is this meant to affect the user experience?
1:52 AM .. other apps would just potentially ignore this?
1:53 AM darwin: It's a signal that I could know that the thing came from the web.
1:53 AM BoCupp: How does it affect Word? (native apps)?
1:53 AM .. Oh, with pickling you have to opt-in, this doesn't need it.
1:54 AM darwin: Most OS don't check MOTW, but it's there. AV apps can still choose to do it.
1:54 AM .. is low cost to implement.
1:54 AM <sanketj> q?
1:54 AM — Zakim sees pwnall, BoCupp on the speaker queue
1:56 AM <Travis> BoCupp: If there's something we could do to mitigate security concerns.
1:56 AM <sanketj> ack pwnall
1:56 AM — Zakim sees BoCupp on the speaker queue
1:56 AM <Travis> close the queue
1:56 AM <sanketj> how to close queue?
1:56 AM <Travis> zakim, close the queue
1:56 AM <Zakim> ok, Travis, the speaker queue is closed
1:57 AM <sanketj> q?
1:57 AM — Zakim sees BoCupp on the speaker queue
1:57 AM <garykac> Gary Kacmarcik q+
1:57 AM — Zakim whispers to garykac that the speaker queue has been closed
1:57 AM <garykac> Gary Kacmarcik (I had to try)
1:57 AM <Travis> darwin: Pickling does add a lot of overhead
1:57 AM <sanketj> ack BoCupp
1:57 AM — Zakim sees no one on the speaker queue
1:58 AM <Travis> ack BoCupp
1:58 AM — Zakim sees no one on the speaker queue
1:58 AM ← jsbell and fantasai left  ⇐ whsieh, pwnall, yosi, aboxhall_ and grisha quit
4:45 AM — Zakim excuses himself; his presence no longer seems to be needed
4:45 AM ← Zakim left  ⇐ saschanaz quit
8:47 AM ↔ GameMaker popped in
8:54 AM ↔ jarryd popped in
8:54 AM ← cmp left (~sid311987@public.cloak)

Received on Thursday, 3 October 2019 02:46:04 UTC