Skip to content
  • Rune Lillesveen's avatar
    Implement lazy (re-)attachment of whitespace. · 7c44da72
    Rune Lillesveen authored
    The existing implementation of re-attachment of whitespace nodes had
    performance issues because it tried to re-attach whitepace nodes as
    early as possible, leading to multiple re-attachments of the same node
    and multiple sibling-walks past the same out-of-flow elements.
    
    Instead, this CL stores the last seen text node in a new
    WhitespaceAttacher object and delays the re-attachment of that text
    node until we know its need for a LayoutObject for the current layout
    tree rebuild. In particular, we don't re-attach the whitespace node
    when previous siblings are/become display:none or out-of-flow.
    
    Contrary to what last_text_node did, the WhitespaceAttacher persist
    the last seen text node in the flat tree order and across
    display:contents and slot/content element which fixes various
    correctness issues in addition to performance issues.
    
    In addition to the last visited text node, we also store the last
    seen display:contents element and only walk the display:contents
    subtree when needed to find its first in-flow whitespace descendant.
    
    BUG=349395,399816,705525,686016,648931,650168
    
    Change-Id: Id397986c49a4bc75e831da1ff8b679f2043873c3
    Reviewed-on: https://chromium-review.googlesource.com/517940
    
    
    Commit-Queue: Rune Lillesveen <rune@opera.com>
    Reviewed-by: default avatarHayato Ito <hayato@chromium.org>
    Reviewed-by: default avatarmeade_UTC10 <meade@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#483683}
    7c44da72