Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 2575438ca004115ca5cf1c3225c27a6312b7027d
      
https://github.com/WebKit/WebKit/commit/2575438ca004115ca5cf1c3225c27a6312b7027d
  Author: Wenson Hsieh <[email protected]>
  Date:   2023-10-24 (Tue, 24 Oct 2023)

  Changed paths:
    M Source/WebCore/dom/UserGestureIndicator.cpp
    M Source/WebCore/dom/UserGestureIndicator.h
    M Source/WebCore/page/EventHandler.cpp
    M Source/WebCore/page/LocalFrame.cpp
    M Source/WebCore/page/Quirks.cpp
    M Source/WebCore/page/Quirks.h

  Log Message:
  -----------
  Pressing ⌘V pastes content twice in text fields on Tableau analytics dashboard
https://bugs.webkit.org/show_bug.cgi?id=263590
rdar://105750465

Reviewed by Ryosuke Niwa.

In Tableau's analytics tool, pressing ⌘V to paste in any focused editable areas 
pastes content
twice after showing a Paste menu item, if the user clicks "Paste" on this item. 
This is because
Tableau's script does something akin to the following:

```
textField.addEventListener("keydown", event => {
    if (event.key === "v" && event.metaKey)
        document.execCommand("Paste");
});
```

...which triggers a programmatic paste upon `keydown`, without preventing 
default. This means that
if the programmatic DOM paste is accepted, we'll end up triggering two paste 
commands: (1) due to
the `execCommand`, and (2) due to the default behavior of ⌘V.

While this is ostensibly a website bug, it works fine in other browsers 
(Firefox, Chrome) because
they don't support DOM paste at all, so we just end up silently failing the 
programmatic paste
before performing the real paste.

For now, fix this by adding a quirk for Tableau's analytics page which disables 
DOM paste access
triggered by key events. Making this a quirk limits risk in the short term, 
since it's possible that
there are other web apps and frameworks that already assume (based on user 
agent/engine checks) that
Safari/WebKit will show DOM paste prompts on key events.

* Source/WebCore/dom/UserGestureIndicator.cpp:
(WebCore::UserGestureToken::UserGestureToken):
(WebCore::UserGestureIndicator::UserGestureIndicator):
* Source/WebCore/dom/UserGestureIndicator.h:

Add a new enum flag to determine whether or not we should allow DOM paste 
requests under the user
gesture token.

(WebCore::UserGestureToken::create):
(WebCore::UserGestureToken::canRequestDOMPaste const):
* Source/WebCore/page/EventHandler.cpp:
(WebCore::EventHandler::internalKeyEvent):

Pass in `CanRequestDOMPaste::No` if the quirk is enabled.

* Source/WebCore/page/LocalFrame.cpp:
(WebCore::LocalFrame::requestDOMPasteAccess):
* Source/WebCore/page/Quirks.cpp:
(WebCore::Quirks::needsDisableDOMPasteAccessQuirk const):

Add the quirk; check `window.tableauPrep` instead of a domain, to fix other 
(non-Apple-internal)
Tableau instances which would also encounter this same issue.

* Source/WebCore/page/Quirks.h:

Canonical link: https://commits.webkit.org/269736@main


_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to