[webkit-changes] [WebKit/WebKit] 1b4675: [iPadOS 18] Unable to include header row when copy...

Wenson Hsieh noreply at github.com
Thu Oct 10 13:51:02 PDT 2024


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 1b4675b62ba332657e2461a9e45e6068c391a3df
      https://github.com/WebKit/WebKit/commit/1b4675b62ba332657e2461a9e45e6068c391a3df
  Author: Wenson Hsieh <wenson_hsieh at apple.com>
  Date:   2024-10-10 (Thu, 10 Oct 2024)

  Changed paths:
    M Source/WebCore/editing/cocoa/EditorCocoa.mm
    M Source/WebCore/editing/cocoa/HTMLConverter.h
    M Source/WebCore/editing/cocoa/HTMLConverter.mm
    M Source/WebCore/editing/mac/EditorMac.mm
    M Source/WebKit/WebProcess/WebPage/Cocoa/WebPageCocoa.mm
    M Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm
    M Source/WebKitLegacy/mac/WebCoreSupport/WebSelectionServiceController.mm
    M Source/WebKitLegacy/mac/WebView/WebHTMLView.mm
    M Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebViewGetContents.mm

  Log Message:
  -----------
  [iPadOS 18] Unable to include header row when copy and pasting table from confluence to Notes
https://bugs.webkit.org/show_bug.cgi?id=281230
rdar://137088450

Reviewed by Aditya Keerthi.

On Confluence, table header content is styled with `-webkit-user-select: none;`, which (in addition
to text selection) normally prevents the text from being serialized when writing content to the
system pasteboard when copying. This policy decision is overridden by a site-specific quirk (added
in 265939 at main) which makes us *not* ignore `user-select: none;` when copying on this website. This
quirk works by detecting Confluence via the presence of a `meta` tag with `confluence-request-time`
and making `HTMLConverter` and `serializePreservingVisualAppearance` not ignore content inside of
`-webkit-user-select: none;` subtrees. When pasting into Notes, Notes asks for attributed string
data, which contains this `user-select: none;` content when copied from Confluence.

On iPad running iOS 18 and later, however, we no longer write `NSAttributedString` data directly to
the pasteboard when copying in WebKit apps, and instead defer to `UIFoundation` to perform this
conversion only if needed when pasting. Underneath the hood, this ultimately still uses WebKit
through `nsattributedstringagent`, which receives either web archive or HTML markup data and
generates an equivalent `NSAttributedString` / RTF data. Because the offscreen web view in
`nsattributedstringagent` only converts web archive data to an attributed string (and importantly,
doesn't load Confluence), it doesn't enable the aforementioned quirk, and so table header content
ends up getting dropped from the converted attributed string.

To fix this, we adjust `-[WKWebView _getContentsAsAttributedStringWithCompletionHandler:]` (and all
upstream API/SPIs) to *not* ignore `-webkit-user-select: none;` when converting webpage content
into attributed strings.

* Source/WebCore/editing/cocoa/EditorCocoa.mm:
(WebCore::selectionAsAttributedString):
* Source/WebCore/editing/cocoa/HTMLConverter.h:
* Source/WebCore/editing/cocoa/HTMLConverter.mm:
(HTMLConverter::HTMLConverter):
(WebCore::attributedString):

Add more plumbing for the `IgnoreUserSelectNone` flag, through attributed string serialization
codepaths.

* Source/WebCore/editing/mac/EditorMac.mm:
(WebCore::Editor::dataSelectionForPasteboard):
* Source/WebKit/WebProcess/WebPage/Cocoa/WebPageCocoa.mm:

Implement the fix by passing `IgnoreUserSelectNone::No` into `attributedString()`. See above for
more details.

(WebKit::WebPage::getContentsAsAttributedString):
* Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm:
(WebKit::WebPage::handleSelectionServiceClick):
* Source/WebKitLegacy/mac/WebCoreSupport/WebSelectionServiceController.mm:
(WebSelectionServiceController::handleSelectionServiceClick):
* Source/WebKitLegacy/mac/WebView/WebHTMLView.mm:
(-[WebHTMLView _legacyAttributedStringFrom:offset:to:offset:]):
(-[WebHTMLView attributedString]):
(-[WebHTMLView selectedAttributedString]):
* Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebViewGetContents.mm:
(TEST(WKWebView, AttributedStringIncludesUserSelectNoneContent)):

Add an API test to exercise the new behavior (see above for more details).

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



To unsubscribe from these emails, change your notification settings at https://github.com/WebKit/WebKit/settings/notifications


More information about the webkit-changes mailing list