Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: third_party/WebKit/Source/core/dom/ContainerNode.cpp

Issue 2836753002: Rebuild layout tree in flat tree order. (Closed)
Patch Set: Rebased Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc. All rights 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc. All rights
6 * reserved. 6 * reserved.
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 1298 matching lines...) Expand 10 before | Expand all | Expand 10 after
1309 } else if (child->IsElementNode()) { 1309 } else if (child->IsElementNode()) {
1310 Element* element = ToElement(child); 1310 Element* element = ToElement(child);
1311 if (element->ShouldCallRecalcStyle(change)) 1311 if (element->ShouldCallRecalcStyle(change))
1312 element->RecalcStyle(change); 1312 element->RecalcStyle(change);
1313 else if (element->SupportsStyleSharing()) 1313 else if (element->SupportsStyleSharing())
1314 style_resolver.AddToStyleSharingList(*element); 1314 style_resolver.AddToStyleSharingList(*element);
1315 } 1315 }
1316 } 1316 }
1317 } 1317 }
1318 1318
1319 void ContainerNode::RebuildLayoutTreeForChild(Node* child,
1320 Text*& next_text_sibling) {
1321 bool rebuild_child =
1322 child->NeedsReattachLayoutTree() || child->ChildNeedsReattachLayoutTree();
1323
1324 if (child->IsTextNode()) {
1325 Text* text_node = ToText(child);
1326 if (rebuild_child)
1327 text_node->RebuildTextLayoutTree(next_text_sibling);
1328 next_text_sibling = text_node;
1329 return;
1330 }
1331
1332 if (!child->IsElementNode())
1333 return;
1334
1335 Element* element = ToElement(child);
1336 if (rebuild_child)
1337 element->RebuildLayoutTree(next_text_sibling);
1338 if (element->GetLayoutObject())
1339 next_text_sibling = nullptr;
1340 }
1341
1319 void ContainerNode::RebuildChildrenLayoutTrees(Text*& next_text_sibling) { 1342 void ContainerNode::RebuildChildrenLayoutTrees(Text*& next_text_sibling) {
1320 DCHECK(!NeedsReattachLayoutTree()); 1343 DCHECK(!NeedsReattachLayoutTree());
1321 1344
1345 if (IsActiveSlotOrActiveInsertionPoint()) {
1346 if (isHTMLSlotElement(this))
1347 toHTMLSlotElement(this)->RebuildDistributedChildrenLayoutTrees();
1348 else
1349 ToInsertionPoint(this)->RebuildDistributedChildrenLayoutTrees();
1350 }
1351
1322 // This loop is deliberately backwards because we use insertBefore in the 1352 // This loop is deliberately backwards because we use insertBefore in the
1323 // layout tree, and want to avoid a potentially n^2 loop to find the insertion 1353 // layout tree, and want to avoid a potentially n^2 loop to find the insertion
1324 // point while building the layout tree. Having us start from the last child 1354 // point while building the layout tree. Having us start from the last child
1325 // and work our way back means in the common case, we'll find the insertion 1355 // and work our way back means in the common case, we'll find the insertion
1326 // point in O(1) time. See crbug.com/288225 1356 // point in O(1) time. See crbug.com/288225
1327 for (Node* child = lastChild(); child; child = child->previousSibling()) { 1357 for (Node* child = lastChild(); child; child = child->previousSibling())
1328 bool rebuild_child = child->NeedsReattachLayoutTree() || 1358 RebuildLayoutTreeForChild(child, next_text_sibling);
1329 child->ChildNeedsReattachLayoutTree(); 1359
1330 if (child->IsTextNode()) { 1360 // This is done in ContainerNode::AttachLayoutTree but will never be cleared
1331 Text* text_node = ToText(child); 1361 // if we don't enter ContainerNode::AttachLayoutTree so we do it here.
1332 if (rebuild_child)
1333 text_node->RebuildTextLayoutTree(next_text_sibling);
1334 next_text_sibling = text_node;
1335 } else if (child->IsElementNode()) {
1336 Element* element = ToElement(child);
1337 if (rebuild_child)
1338 element->RebuildLayoutTree(next_text_sibling);
1339 if (element->GetLayoutObject())
1340 next_text_sibling = nullptr;
1341 }
1342 }
1343 // This is done in ContainerNode::attachLayoutTree but will never be cleared
1344 // if we don't enter ContainerNode::attachLayoutTree so we do it here.
1345 ClearChildNeedsStyleRecalc(); 1362 ClearChildNeedsStyleRecalc();
1346 ClearChildNeedsReattachLayoutTree(); 1363 ClearChildNeedsReattachLayoutTree();
1347 } 1364 }
1348 1365
1349 void ContainerNode::CheckForSiblingStyleChanges(SiblingCheckType change_type, 1366 void ContainerNode::CheckForSiblingStyleChanges(SiblingCheckType change_type,
1350 Element* changed_element, 1367 Element* changed_element,
1351 Node* node_before_change, 1368 Node* node_before_change,
1352 Node* node_after_change) { 1369 Node* node_after_change) {
1353 if (!InActiveDocument() || GetDocument().HasPendingForcedStyleRecalc() || 1370 if (!InActiveDocument() || GetDocument().HasPendingForcedStyleRecalc() ||
1354 GetStyleChangeType() >= kSubtreeStyleChange) 1371 GetStyleChangeType() >= kSubtreeStyleChange)
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
1520 return true; 1537 return true;
1521 1538
1522 if (node->IsElementNode() && ToElement(node)->Shadow()) 1539 if (node->IsElementNode() && ToElement(node)->Shadow())
1523 return true; 1540 return true;
1524 1541
1525 return false; 1542 return false;
1526 } 1543 }
1527 #endif 1544 #endif
1528 1545
1529 } // namespace blink 1546 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/ContainerNode.h ('k') | third_party/WebKit/Source/core/dom/Node.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698