[webkit-changes] [WebKit/WebKit] 947777: Live Text text selection in image goes offscreen i...

Richard Robinson noreply at github.com
Wed May 17 10:13:49 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 9477772ce229c822b9fffd49ea9889569cd9496f
      https://github.com/WebKit/WebKit/commit/9477772ce229c822b9fffd49ea9889569cd9496f
  Author: Richard Robinson <richard_robinson2 at apple.com>
  Date:   2023-05-17 (Wed, 17 May 2023)

  Changed paths:
    A LayoutTests/fast/images/text-recognition/image-overlay-with-attachment-element-expected.txt
    A LayoutTests/fast/images/text-recognition/image-overlay-with-attachment-element.html
    M Source/WebCore/dom/ImageOverlay.cpp

  Log Message:
  -----------
  Live Text text selection in image goes offscreen in Mail
https://bugs.webkit.org/show_bug.cgi?id=256772
rdar://108597859

Reviewed by Wenson Hsieh.

In `ImageOverlay::updateWithTextRecognitionResult`, the `sizeBeforeTransform` is empty in the case
of selecting text in an image in Mail. This is because the renderer returned by `textContainer->renderBoxModelObject()`
is `nullptr`, so `sizeBeforeTransform` is never set.

This renderer is null because it is never created, because `shouldCreateRenderer` returns `false`,
ultimately because `RenderImage::hasShadowContent` returns `false`. This method returns `false`
because `m_hasImageOverlay` is `false`.

In the constructor of `RenderImage`, `m_hasImageOverlay` is initialized to the result of
`ImageOverlay::hasOverlay`. _This_ method returns `false` because the shadow root has no element
who's id is that of `imageOverlayElementIdentifier`.

`updateSubtree` in `ImageOverlay` is what is responsible for setting the id of the root shadow
element to `imageOverlayElementIdentifier`.

In the case of Safari, `updateSubtree` is called first, and then the constructor of `RenderImage`
is called, which ensures that the renderer is ultimately created. However, in Mail, the `RenderImage`
constructor is called first, and so at that time there's no `imageOverlayElementIdentifier` element,
which leads to the renderer never being created.

This PR fixes this by ensuring that `RenderImage::hasShadowContent` returns `true` if the element
has a shadow root in `updateSubtree`, by setting `RenderImage::setHasImageOverlay`.

* LayoutTests/fast/images/text-recognition/image-overlay-with-attachment-element-expected.txt: Added.
* LayoutTests/fast/images/text-recognition/image-overlay-with-attachment-element.html: Added.
* Source/WebCore/dom/ImageOverlay.cpp:
(WebCore::ImageOverlay::updateSubtree):

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




More information about the webkit-changes mailing list