Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: bc0fb06c1c57d1718e0e663baa4f99130afb07a6
      
https://github.com/WebKit/WebKit/commit/bc0fb06c1c57d1718e0e663baa4f99130afb07a6
  Author: Wenson Hsieh <[email protected]>
  Date:   2025-01-23 (Thu, 23 Jan 2025)

  Changed paths:
    M 
LayoutTests/editing/pasteboard/data-transfer-get-data-on-drop-rich-text-expected.txt
    M 
LayoutTests/editing/pasteboard/data-transfer-get-data-on-paste-rich-text-expected.txt
    M LayoutTests/fast/events/ondrop-text-html-expected.txt
    M LayoutTests/platform/ios/editing/pasteboard/onpaste-text-html-expected.txt
    M LayoutTests/platform/mac/editing/pasteboard/onpaste-text-html-expected.txt
    M LayoutTests/platform/mac/fast/events/ondrop-text-html-expected.txt
    M Source/WebCore/editing/markup.cpp
    M Source/WebCore/editing/markup.h
    M Source/WebCore/loader/archive/cf/LegacyWebArchive.cpp
    M Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
    A Tools/TestWebKitAPI/Tests/WebKit/rtl-bidi-text.html
    M Tools/TestWebKitAPI/Tests/WebKitCocoa/CopyHTML.mm

  Log Message:
  -----------
  REGRESSION (iPadOS 18): Right-to-left text pasted from Safari into Pages is 
left aligned
https://bugs.webkit.org/show_bug.cgi?id=286404
rdar://139029945

Reviewed by Abrar Rahman Protyasha.

In iOS 17.4 and iPadOS 18, copying text within a single RTL paragraph in Safari 
and pasting into
Pages results in LTR text being inserted. This is because BrowserEngineKit 
adoption
(`async_text_input_i(phone|pad)`) is enabled since these updates, which causes 
WebKit to stop
directly converting selected text content into attributed string data upon 
copying; instead, we now
just write web archive and HTML data to the system pasteboard, which is lazily 
converted into
`NSAttributedString` by the destination app, if needed. This conversion relies 
on UIFoundation,
which (through `nsattributedstringagent`) loads a web view using the web 
archive data, and then uses
WebKit APIs to obtain an `NSAttributedString` from the web view.

Previously, WebKit would've written an attributed string directly to the 
pasteboard, where the
attributes of the text contain an `NSParagraphStyle` that has RTL base writing 
direction; Pages
would then honor this by inserting an RTL paragraph. However, after enabling 
lazy attributed string
conversion, the resulting attributed string (derived from web archive data) no 
longer has a base
writing direction set. That's because the web archive markup contains only a 
single inline `span`
element which doesn't have any `direction` set, since the selection doesn't 
(fully) encompass any
block-level elements, which means any information about paragraph writing 
direction is lost upon
copying:

=> Copied markup: `<head><meta charset='utf-8'></head><span>كتروني هو</span>`

While we could fix this by wrapping the web archive markup with a block-level 
`div` or `p` element
that carries over the `direction`, this could cause us to paste an extra 
paragraph, when the copied
content should really be treated as inline content (added to an existing 
paragraph):

=> `<head><meta charset='utf-8'></head><div dir='rtl'>كتروني هو</div>`

Instead, this patch addresses the issue by wrapping the web archive data in a 
`body` element. During
sanitization, instead of implicitly generating a `body` element, we'll parse 
the `body` element from
markup, along with the `dir='rtl'` attribute. The contents of the body then 
properly contain RTL
text, which allows attributed string conversion to produce paragraph styles 
with an RTL base writing
direction set.

=> `<head><meta charset='utf-8'></head><body dir='rtl'><span>كتروني 
هو</span></body>`

* 
LayoutTests/editing/pasteboard/data-transfer-get-data-on-drop-rich-text-expected.txt:
* 
LayoutTests/editing/pasteboard/data-transfer-get-data-on-paste-rich-text-expected.txt:
* LayoutTests/fast/events/ondrop-text-html-expected.txt:
* LayoutTests/platform/ios/editing/pasteboard/onpaste-text-html-expected.txt:
* LayoutTests/platform/mac/editing/pasteboard/onpaste-text-html-expected.txt:
* LayoutTests/platform/mac/fast/events/ondrop-text-html-expected.txt:
* Source/WebCore/editing/markup.cpp:

Rebaseline several layout tests.

* LayoutTests/platform/mac/fast/events/ondrop-text-html-expected.txt:
* Source/WebCore/editing/markup.cpp:
(WebCore::serializePreservingVisualAppearanceInternal):

See description above.

(WebCore::serializePreservingVisualAppearance):
(WebCore::sanitizedMarkupForFragmentInDocument):
* Source/WebCore/editing/markup.h:
* Source/WebCore/loader/archive/cf/LegacyWebArchive.cpp:
(WebCore::LegacyWebArchive::createFromSelection):

Pass in `PreserveDirectionForInlineText::Yes`.

* Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WebKit/rtl-bidi-text.html: Added.
* Tools/TestWebKitAPI/Tests/WebKitCocoa/CopyHTML.mm:
(copyAndLoadAttributedStringUsingWebArchive):
(TEST(CopyHTML, SanitizationPreservesRelativeURLInAttributedString)):
(TEST(CopyHTML, CopyingRightToLeftTextPreservesDirection)):

Add an API test to exercise the fix, by:
- Copying selected RTL text.
- Using the copied web archive to generate an attributed string.
- Verifying that the attributed string has a RTL base writing direction.

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



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to