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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp

Issue 2176043002: Collapse away nested anonymous blocks (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@467579-3
Patch Set: Created 4 years, 4 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
« no previous file with comments | « third_party/WebKit/LayoutTests/fast/block/collapse-nested-anonymous-block-expected.html ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 2385 matching lines...) Expand 10 before | Expand all | Expand 10 after
2396 // Skip the LayoutBlock override, since that one deals with anonymous child insertion in a way 2396 // Skip the LayoutBlock override, since that one deals with anonymous child insertion in a way
2397 // that isn't sufficient for us, and can only cause trouble at this point. 2397 // that isn't sufficient for us, and can only cause trouble at this point.
2398 LayoutBox::addChild(newChild, beforeChild); 2398 LayoutBox::addChild(newChild, beforeChild);
2399 2399
2400 if (madeBoxesNonInline && parent() && isAnonymousBlock() && parent()->isLayo utBlock()) { 2400 if (madeBoxesNonInline && parent() && isAnonymousBlock() && parent()->isLayo utBlock()) {
2401 toLayoutBlock(parent())->removeLeftoverAnonymousBlock(this); 2401 toLayoutBlock(parent())->removeLeftoverAnonymousBlock(this);
2402 // |this| may be dead now. 2402 // |this| may be dead now.
2403 } 2403 }
2404 } 2404 }
2405 2405
2406 static bool isMergeableAnonymousBlock(const LayoutBlockFlow* block)
2407 {
2408 return block->isAnonymousBlock() && !block->continuation() && !block->beingD estroyed() && !block->isRubyRun() && !block->isRubyBase();
2409 }
2410
2406 void LayoutBlockFlow::removeChild(LayoutObject* oldChild) 2411 void LayoutBlockFlow::removeChild(LayoutObject* oldChild)
2407 { 2412 {
2408 // No need to waste time in merging or removing empty anonymous blocks. 2413 // No need to waste time in merging or removing empty anonymous blocks.
2409 // We can just bail out if our document is getting destroyed. 2414 // We can just bail out if our document is getting destroyed.
2410 if (documentBeingDestroyed()) { 2415 if (documentBeingDestroyed()) {
2411 LayoutBox::removeChild(oldChild); 2416 LayoutBox::removeChild(oldChild);
2412 return; 2417 return;
2413 } 2418 }
2414 2419
2415 // If this child is a block, and if our previous and next siblings are 2420 // If this child is a block, and if our previous and next siblings are
2416 // both anonymous blocks with inline content, then we can go ahead and 2421 // both anonymous blocks with inline content, then we can go ahead and
2417 // fold the inline content back together. 2422 // fold the inline content back together.
2418 LayoutObject* prev = oldChild->previousSibling(); 2423 LayoutObject* prev = oldChild->previousSibling();
2419 LayoutObject* next = oldChild->nextSibling(); 2424 LayoutObject* next = oldChild->nextSibling();
2420 bool mergedAnonymousBlocks = false; 2425 bool mergedAnonymousBlocks = false;
2421 if (prev && next && !oldChild->isInline() && !oldChild->virtualContinuation( ) && prev->isLayoutBlockFlow() && next->isLayoutBlockFlow()) { 2426 if (prev && next && !oldChild->isInline() && !oldChild->virtualContinuation( ) && prev->isLayoutBlockFlow() && next->isLayoutBlockFlow()) {
2422 if (toLayoutBlockFlow(prev)->mergeSiblingContiguousAnonymousBlock(toLayo utBlockFlow(next))) { 2427 if (toLayoutBlockFlow(prev)->mergeSiblingContiguousAnonymousBlock(toLayo utBlockFlow(next))) {
2423 mergedAnonymousBlocks = true; 2428 mergedAnonymousBlocks = true;
2424 next = nullptr; 2429 next = nullptr;
2425 } 2430 }
2426 } 2431 }
2427 2432
2428 LayoutBlock::removeChild(oldChild); 2433 LayoutBlock::removeChild(oldChild);
2429 2434
2430 LayoutObject* child = prev ? prev : next; 2435 LayoutObject* child = prev ? prev : next;
2431 if (mergedAnonymousBlocks && child && !child->previousSibling() && !child->n extSibling()) { 2436 if (child && child->isLayoutBlockFlow() && !child->previousSibling() && !chi ld->nextSibling()) {
2432 // The removal has knocked us down to containing only a single anonymous 2437 // If the removal has knocked us down to containing only a single anonym ous
2433 // box. We can go ahead and pull the content right back up into our 2438 // box we can go ahead and pull the content right back up into our
2434 // box. 2439 // box.
2435 collapseAnonymousBlockChild(toLayoutBlockFlow(child)); 2440 if (mergedAnonymousBlocks || isMergeableAnonymousBlock(toLayoutBlockFlow (child)))
2441 collapseAnonymousBlockChild(toLayoutBlockFlow(child));
2436 } 2442 }
2437 2443
2438 if (!firstChild()) { 2444 if (!firstChild()) {
2439 // If this was our last child be sure to clear out our line boxes. 2445 // If this was our last child be sure to clear out our line boxes.
2440 if (childrenInline()) 2446 if (childrenInline())
2441 deleteLineBoxTree(); 2447 deleteLineBoxTree();
2442 2448
2443 // If we are an empty anonymous block in the continuation chain, 2449 // If we are an empty anonymous block in the continuation chain,
2444 // we need to remove ourself and fix the continuation chain. 2450 // we need to remove ourself and fix the continuation chain.
2445 if (!beingDestroyed() && isAnonymousBlockContinuation() && !oldChild->is ListMarker()) { 2451 if (!beingDestroyed() && isAnonymousBlockContinuation() && !oldChild->is ListMarker()) {
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
2547 return; 2553 return;
2548 setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalidation Reason::ChildAnonymousBlockChanged); 2554 setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalidation Reason::ChildAnonymousBlockChanged);
2549 2555
2550 child->moveAllChildrenTo(this, child->nextSibling(), child->hasLayer()); 2556 child->moveAllChildrenTo(this, child->nextSibling(), child->hasLayer());
2551 setChildrenInline(child->childrenInline()); 2557 setChildrenInline(child->childrenInline());
2552 2558
2553 children()->removeChildNode(this, child, child->hasLayer()); 2559 children()->removeChildNode(this, child, child->hasLayer());
2554 child->destroy(); 2560 child->destroy();
2555 } 2561 }
2556 2562
2557 static bool isMergeableAnonymousBlock(const LayoutBlockFlow* block)
2558 {
2559 return block->isAnonymousBlock() && !block->continuation() && !block->beingD estroyed() && !block->isRubyRun() && !block->isRubyBase();
2560 }
2561
2562 bool LayoutBlockFlow::mergeSiblingContiguousAnonymousBlock(LayoutBlockFlow* sibl ingThatMayBeDeleted) 2563 bool LayoutBlockFlow::mergeSiblingContiguousAnonymousBlock(LayoutBlockFlow* sibl ingThatMayBeDeleted)
2563 { 2564 {
2564 // Note: |this| and |siblingThatMayBeDeleted| may not be adjacent siblings a t this point. There 2565 // Note: |this| and |siblingThatMayBeDeleted| may not be adjacent siblings a t this point. There
2565 // may be an object between them which is about to be removed. 2566 // may be an object between them which is about to be removed.
2566 2567
2567 if (!isMergeableAnonymousBlock(this) || !isMergeableAnonymousBlock(siblingTh atMayBeDeleted)) 2568 if (!isMergeableAnonymousBlock(this) || !isMergeableAnonymousBlock(siblingTh atMayBeDeleted))
2568 return false; 2569 return false;
2569 2570
2570 setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalidation Reason::AnonymousBlockChange); 2571 setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalidation Reason::AnonymousBlockChange);
2571 2572
(...skipping 1203 matching lines...) Expand 10 before | Expand all | Expand 10 after
3775 if (!rect.isEmpty()) 3776 if (!rect.isEmpty())
3776 rects.append(rect); 3777 rects.append(rect);
3777 } 3778 }
3778 } 3779 }
3779 3780
3780 if (inlineElementContinuation) 3781 if (inlineElementContinuation)
3781 inlineElementContinuation->addOutlineRects(rects, additionalOffset + (in lineElementContinuation->containingBlock()->location() - location()), includeBlo ckOverflows); 3782 inlineElementContinuation->addOutlineRects(rects, additionalOffset + (in lineElementContinuation->containingBlock()->location() - location()), includeBlo ckOverflows);
3782 } 3783 }
3783 3784
3784 } // namespace blink 3785 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/LayoutTests/fast/block/collapse-nested-anonymous-block-expected.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698