[webkit-changes] [WebKit/WebKit] 21d657: Coalesce ContainerNode::childrenChanged in fast pa...

Ryosuke Niwa noreply at github.com
Mon Jan 29 20:44:56 PST 2024


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 21d657acd1bac107e61954490567c7685c20ee57
      https://github.com/WebKit/WebKit/commit/21d657acd1bac107e61954490567c7685c20ee57
  Author: Ryosuke Niwa <rniwa at webkit.org>
  Date:   2024-01-29 (Mon, 29 Jan 2024)

  Changed paths:
    M Source/WebCore/dom/ContainerNode.cpp
    M Source/WebCore/dom/ContainerNode.h
    M Source/WebCore/dom/Document.cpp
    M Source/WebCore/dom/Element.cpp
    M Source/WebCore/dom/Node.h
    M Source/WebCore/html/parser/HTMLDocumentParserFastPath.cpp

  Log Message:
  -----------
  Coalesce ContainerNode::childrenChanged in fast parser
https://bugs.webkit.org/show_bug.cgi?id=268324

Reviewed by Yusuke Suzuki.

This PR adds a new member function parserAppendChildIntoIsolatedTree to ContainerNode which inserts
child nodes without calling childrenChanged on the parent, and deploys it in HTMLFastPathParser.
childrenChanged gets called later in Element::finishParsingChildren via ContainerNode's
parserNotifyChildrenChanged. Newly introduced StateFlag::HeldBackChildrenChanged keeps track of
whether we held back childrenChanged calls when inserting child nodes or not.

Delaying calls to childrenChanged this way is safe in HTMLFastPathParser because the parsed tree
isn't exposed to scripts until the parsing ends so there won't be any event listeners that run
synchronously in response to DOM mutations.

Inspired by https://github.com/chromium/chromium/commit/b366b305efb5289f3bcf3bbbe549cbad82fc0daf

* Source/WebCore/dom/ContainerNode.cpp:
(WebCore::executeParserNodeInsertionIntoIsolatedTreeWithoutNotifyingParent): Added.
(WebCore::ContainerNode::parserAppendChildIntoIsolatedTree): Added.
(WebCore::ContainerNode::parserNotifyChildrenChanged): Added.
* Source/WebCore/dom/ContainerNode.h:
* Source/WebCore/dom/Document.cpp:
(WebCore::Document::setMarkupUnsafe):
* Source/WebCore/dom/Element.cpp:
(WebCore::Element::finishParsingChildren):
* Source/WebCore/dom/Node.h:
(WebCore::Node::hasHeldBackChildrenChanged const): Added.
(WebCore::Node::setHasHeldBackChildrenChanged): Added.
(WebCore::Node::clearHasHeldBackChildrenChanged): Added.
* Source/WebCore/html/parser/HTMLDocumentParserFastPath.cpp:
(WebCore::HTMLFastPathParser::parseChildren): Uses parserAppendChildIntoIsolatedTree now.
(WebCore::HTMLFastPathParser::parseContainerElement): Ditto.
(WebCore::HTMLFastPathParser::parseVoidElement): Ditto.

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




More information about the webkit-changes mailing list