OLD | NEW |
---|---|
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) 2000 Dirk Mueller (mueller@kde.org) | 4 * (C) 2000 Dirk Mueller (mueller@kde.org) |
5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) | 5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed. |
7 * Copyright (C) 2009 Google Inc. All rights reserved. | 7 * Copyright (C) 2009 Google Inc. All rights reserved. |
8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) | 8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) |
9 * | 9 * |
10 * This library is free software; you can redistribute it and/or | 10 * This library is free software; you can redistribute it and/or |
(...skipping 1905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1916 // The following is for rect invalidation. For slimming paint v2, we can invalidate the rects | 1916 // The following is for rect invalidation. For slimming paint v2, we can invalidate the rects |
1917 // of the first line display item clients instead of the whole rect of the container. | 1917 // of the first line display item clients instead of the whole rect of the container. |
1918 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) | 1918 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) |
1919 firstLineContainer->setShouldDoFullPaintInvalidation(); | 1919 firstLineContainer->setShouldDoFullPaintInvalidation(); |
1920 } | 1920 } |
1921 } | 1921 } |
1922 if (diff.needsLayout()) | 1922 if (diff.needsLayout()) |
1923 setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleChange) ; | 1923 setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleChange) ; |
1924 } | 1924 } |
1925 | 1925 |
1926 void LayoutObject::markContainingBlocksForOverflowRecalc() | 1926 void LayoutObject::markAncestorsForOverflowRecalcIfNeeded() |
1927 { | 1927 { |
1928 for (LayoutBlock* container = containingBlock(); container && !container->ch ildNeedsOverflowRecalcAfterStyleChange(); container = container->containingBlock ()) | 1928 LayoutObject* object = this; |
1929 container->setChildNeedsOverflowRecalcAfterStyleChange(); | 1929 do { |
1930 // Cell and row need to propagate the flag to their containing section a nd row as their containing block is the table wrapper. | |
1931 // This enables us to only recompute overflow the modified sections / ro ws. | |
1932 object = object->isTableCell() || object->isTableRow() ? object->parent( ) : object->containingBlock(); | |
1933 if (object) | |
1934 object->setChildNeedsOverflowRecalcAfterStyleChange(); | |
1935 } while (object); | |
1930 } | 1936 } |
1931 | 1937 |
1932 void LayoutObject::setNeedsOverflowRecalcAfterStyleChange() | 1938 void LayoutObject::setNeedsOverflowRecalcAfterStyleChange() |
1933 { | 1939 { |
1934 bool neededRecalc = needsOverflowRecalcAfterStyleChange(); | 1940 bool neededRecalc = needsOverflowRecalcAfterStyleChange(); |
1935 setSelfNeedsOverflowRecalcAfterStyleChange(); | 1941 setSelfNeedsOverflowRecalcAfterStyleChange(); |
1936 if (!neededRecalc) | 1942 if (!neededRecalc) |
1937 markContainingBlocksForOverflowRecalc(); | 1943 markAncestorsForOverflowRecalcIfNeeded(); |
1938 } | 1944 } |
1939 | 1945 |
1940 void LayoutObject::setStyle(PassRefPtr<ComputedStyle> style) | 1946 void LayoutObject::setStyle(PassRefPtr<ComputedStyle> style) |
1941 { | 1947 { |
1942 ASSERT(style); | 1948 ASSERT(style); |
1943 | 1949 |
1944 if (m_style == style) { | 1950 if (m_style == style) { |
1945 // We need to run through adjustStyleDifference() for iframes, plugins, and canvas so | 1951 // We need to run through adjustStyleDifference() for iframes, plugins, and canvas so |
1946 // style sharing is disabled for them. That should ensure that we never hit this code path. | 1952 // style sharing is disabled for them. That should ensure that we never hit this code path. |
1947 ASSERT(!isLayoutIFrame() && !isEmbeddedObject() && !isCanvas()); | 1953 ASSERT(!isLayoutIFrame() && !isEmbeddedObject() && !isCanvas()); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1997 setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleCha nge); | 2003 setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleCha nge); |
1998 else if (updatedDiff.needsPositionedMovementLayout()) | 2004 else if (updatedDiff.needsPositionedMovementLayout()) |
1999 setNeedsPositionedMovementLayout(); | 2005 setNeedsPositionedMovementLayout(); |
2000 } | 2006 } |
2001 | 2007 |
2002 if (diff.transformChanged() && !needsLayout()) { | 2008 if (diff.transformChanged() && !needsLayout()) { |
2003 if (LayoutBlock* container = containingBlock()) | 2009 if (LayoutBlock* container = containingBlock()) |
2004 container->setNeedsOverflowRecalcAfterStyleChange(); | 2010 container->setNeedsOverflowRecalcAfterStyleChange(); |
2005 } | 2011 } |
2006 | 2012 |
2013 if (diff.visualOverflowChanged() && !needsLayout()) { | |
2014 if (isLayoutBlock()) | |
2015 setNeedsOverflowRecalcAfterStyleChange(); | |
2016 else | |
2017 setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleCha nge); | |
Xianzhu
2016/03/22 17:02:05
Nit: please add a TODO here and reference bug 4370
| |
2018 } | |
2019 | |
2007 if (diff.needsPaintInvalidationLayer() || updatedDiff.needsPaintInvalidation Layer()) | 2020 if (diff.needsPaintInvalidationLayer() || updatedDiff.needsPaintInvalidation Layer()) |
2008 setShouldDoFullPaintInvalidationIncludingNonCompositingDescendants(); | 2021 setShouldDoFullPaintInvalidationIncludingNonCompositingDescendants(); |
2009 else if (diff.needsPaintInvalidationObject() || updatedDiff.needsPaintInvali dationObject()) | 2022 else if (diff.needsPaintInvalidationObject() || updatedDiff.needsPaintInvali dationObject()) |
2010 setShouldDoFullPaintInvalidation(); | 2023 setShouldDoFullPaintInvalidation(); |
2011 } | 2024 } |
2012 | 2025 |
2013 void LayoutObject::styleWillChange(StyleDifference diff, const ComputedStyle& ne wStyle) | 2026 void LayoutObject::styleWillChange(StyleDifference diff, const ComputedStyle& ne wStyle) |
2014 { | 2027 { |
2015 if (m_style) { | 2028 if (m_style) { |
2016 // If our z-index changes value or our visibility changes, | 2029 // If our z-index changes value or our visibility changes, |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2097 // If the object already needs layout, then setNeedsLayout won't do | 2110 // If the object already needs layout, then setNeedsLayout won't do |
2098 // any work. But if the containing block has changed, then we may need | 2111 // any work. But if the containing block has changed, then we may need |
2099 // to mark the new containing blocks for layout. The change that can | 2112 // to mark the new containing blocks for layout. The change that can |
2100 // directly affect the containing block of this object is a change to | 2113 // directly affect the containing block of this object is a change to |
2101 // the position style. | 2114 // the position style. |
2102 if (needsLayout() && oldStyle->position() != m_style->position()) | 2115 if (needsLayout() && oldStyle->position() != m_style->position()) |
2103 markContainerChainForLayout(); | 2116 markContainerChainForLayout(); |
2104 | 2117 |
2105 // Ditto. | 2118 // Ditto. |
2106 if (needsOverflowRecalcAfterStyleChange() && oldStyle->position() != m_s tyle->position()) | 2119 if (needsOverflowRecalcAfterStyleChange() && oldStyle->position() != m_s tyle->position()) |
2107 markContainingBlocksForOverflowRecalc(); | 2120 markAncestorsForOverflowRecalcIfNeeded(); |
2108 | 2121 |
2109 setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleChange) ; | 2122 setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleChange) ; |
2110 } else if (diff.needsPositionedMovementLayout()) { | 2123 } else if (diff.needsPositionedMovementLayout()) { |
2111 setNeedsPositionedMovementLayout(); | 2124 setNeedsPositionedMovementLayout(); |
2112 } | 2125 } |
2113 | 2126 |
2114 // Don't check for paint invalidation here; we need to wait until the layer has been | 2127 // Don't check for paint invalidation here; we need to wait until the layer has been |
2115 // updated by subclasses before we know if we have to invalidate paints (in setStyle()). | 2128 // updated by subclasses before we know if we have to invalidate paints (in setStyle()). |
2116 | 2129 |
2117 if (oldStyle && !areCursorsEqual(oldStyle, style())) { | 2130 if (oldStyle && !areCursorsEqual(oldStyle, style())) { |
(...skipping 1609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3727 const blink::LayoutObject* root = object1; | 3740 const blink::LayoutObject* root = object1; |
3728 while (root->parent()) | 3741 while (root->parent()) |
3729 root = root->parent(); | 3742 root = root->parent(); |
3730 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0); | 3743 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0); |
3731 } else { | 3744 } else { |
3732 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n"); | 3745 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n"); |
3733 } | 3746 } |
3734 } | 3747 } |
3735 | 3748 |
3736 #endif | 3749 #endif |
OLD | NEW |