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 1844 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1855 childlist->insertChildNode(parent(), block, this); | 1855 childlist->insertChildNode(parent(), block, this); |
1856 block->children()->appendChildNode(block, childlist->removeChildNode
(parent(), this)); | 1856 block->children()->appendChildNode(block, childlist->removeChildNode
(parent(), this)); |
1857 } | 1857 } |
1858 } | 1858 } |
1859 } | 1859 } |
1860 | 1860 |
1861 StyleDifference RenderObject::adjustStyleDifference(StyleDifference diff, unsign
ed contextSensitiveProperties) const | 1861 StyleDifference RenderObject::adjustStyleDifference(StyleDifference diff, unsign
ed contextSensitiveProperties) const |
1862 { | 1862 { |
1863 // FIXME: The calls to hasDirectReasonsForCompositing are using state that m
ay not be up to date. | 1863 // FIXME: The calls to hasDirectReasonsForCompositing are using state that m
ay not be up to date. |
1864 DisableCompositingQueryAsserts disabler; | 1864 DisableCompositingQueryAsserts disabler; |
1865 // If transform changed, and the layer does not paint into its own separate
backing, then we need to do a layout. | 1865 |
1866 // FIXME: The comment above is what the code does, but it is technically not
following spec. This means we will | 1866 if (contextSensitiveProperties & ContextSensitivePropertyTransform && isSVG(
)) |
1867 // not to layout for 3d transforms, but we should be invoking a simplified r
elayout. Is it possible we are avoiding | 1867 diff.setNeedsFullLayout(); |
1868 // doing this for some performance reason at this time? | 1868 |
1869 if (contextSensitiveProperties & ContextSensitivePropertyTransform) { | 1869 // If transform changed, and the layer does not paint into its own separate
backing, then we need to repaint. |
| 1870 if (contextSensitiveProperties & ContextSensitivePropertyTransform && !diff
.needsLayout()) { |
1870 // Text nodes share style with their parents but transforms don't apply
to them, | 1871 // Text nodes share style with their parents but transforms don't apply
to them, |
1871 // hence the !isText() check. | 1872 // hence the !isText() check. |
1872 // FIXME: when transforms are taken into account for overflow, we will n
eed to do a layout. | 1873 if (!isText() && (!hasLayer() || !toRenderLayerModelObject(this)->layer(
)->hasDirectReasonsForCompositing())) |
1873 if (!isText() && (!hasLayer() || !toRenderLayerModelObject(this)->layer(
)->hasDirectReasonsForCompositing())) { | 1874 diff.setNeedsRepaintLayer(); |
1874 // We need to set at least SimplifiedLayout, but if PositionedMoveme
ntOnly is already set | 1875 else |
1875 // then we actually need SimplifiedLayoutAndPositionedMovement. | |
1876 if (!hasLayer()) | |
1877 diff.setNeedsFullLayout(); // FIXME: Do this for now since Simpl
ifiedLayout cannot handle updating floating objects lists. | |
1878 else | |
1879 diff.setNeedsSimplifiedLayout(); | |
1880 } else { | |
1881 diff.setNeedsRecompositeLayer(); | 1876 diff.setNeedsRecompositeLayer(); |
1882 } | |
1883 } | 1877 } |
1884 | 1878 |
1885 // If opacity or zIndex changed, and the layer does not paint into its own s
eparate backing, then we need to repaint (also | 1879 // If opacity or zIndex changed, and the layer does not paint into its own s
eparate backing, then we need to repaint (also |
1886 // ignoring text nodes) | 1880 // ignoring text nodes) |
1887 if ((contextSensitiveProperties & (ContextSensitivePropertyOpacity | Context
SensitivePropertyZIndex)) && !diff.needsLayout()) { | 1881 if ((contextSensitiveProperties & (ContextSensitivePropertyOpacity | Context
SensitivePropertyZIndex)) && !diff.needsLayout()) { |
1888 if (!isText() && (!hasLayer() || !toRenderLayerModelObject(this)->layer(
)->hasDirectReasonsForCompositing())) | 1882 if (!isText() && (!hasLayer() || !toRenderLayerModelObject(this)->layer(
)->hasDirectReasonsForCompositing())) |
1889 diff.setNeedsRepaintLayer(); | 1883 diff.setNeedsRepaintLayer(); |
1890 else | 1884 else |
1891 diff.setNeedsRecompositeLayer(); | 1885 diff.setNeedsRecompositeLayer(); |
1892 } | 1886 } |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1951 return true; | 1945 return true; |
1952 for (const RenderObject* r = firstChild(); r; r = r->nextSibling()) { | 1946 for (const RenderObject* r = firstChild(); r; r = r->nextSibling()) { |
1953 if (r->isText() && !toRenderText(r)->isAllCollapsibleWhitespace()) | 1947 if (r->isText() && !toRenderText(r)->isAllCollapsibleWhitespace()) |
1954 return true; | 1948 return true; |
1955 if (r->style()->hasOutline() || r->style()->hasBorder()) | 1949 if (r->style()->hasOutline() || r->style()->hasBorder()) |
1956 return true; | 1950 return true; |
1957 } | 1951 } |
1958 return false; | 1952 return false; |
1959 } | 1953 } |
1960 | 1954 |
| 1955 void RenderObject::markContainingBlocksForOverflowRecalc() |
| 1956 { |
| 1957 for (RenderBlock* container = containingBlock(); container && !container->ch
ildNeedsOverflowRecalcAfterStyleChange(); container = container->containingBlock
()) |
| 1958 container->setChildNeedsOverflowRecalcAfterStyleChange(true); |
| 1959 } |
| 1960 |
| 1961 void RenderObject::setNeedsOverflowRecalcAfterStyleChange() |
| 1962 { |
| 1963 bool neededRecalc = needsOverflowRecalcAfterStyleChange(); |
| 1964 setSelfNeedsOverflowRecalcAfterStyleChange(true); |
| 1965 if (!neededRecalc) |
| 1966 markContainingBlocksForOverflowRecalc(); |
| 1967 } |
| 1968 |
1961 void RenderObject::setStyle(PassRefPtr<RenderStyle> style) | 1969 void RenderObject::setStyle(PassRefPtr<RenderStyle> style) |
1962 { | 1970 { |
1963 ASSERT(style); | 1971 ASSERT(style); |
1964 | 1972 |
1965 if (m_style == style) { | 1973 if (m_style == style) { |
1966 // We need to run through adjustStyleDifference() for iframes, plugins,
and canvas so | 1974 // We need to run through adjustStyleDifference() for iframes, plugins,
and canvas so |
1967 // style sharing is disabled for them. That should ensure that we never
hit this code path. | 1975 // style sharing is disabled for them. That should ensure that we never
hit this code path. |
1968 ASSERT(!isRenderIFrame() && !isEmbeddedObject() && !isCanvas()); | 1976 ASSERT(!isRenderIFrame() && !isEmbeddedObject() && !isCanvas()); |
1969 return; | 1977 return; |
1970 } | 1978 } |
(...skipping 27 matching lines...) Expand all Loading... |
1998 // we will safely bail out with the doesNotNeedLayout flag. We might want to
broaden this condition | 2006 // we will safely bail out with the doesNotNeedLayout flag. We might want to
broaden this condition |
1999 // in the future as we move renderer changes out of layout and into style ch
anges. | 2007 // in the future as we move renderer changes out of layout and into style ch
anges. |
2000 if (doesNotNeedLayout) | 2008 if (doesNotNeedLayout) |
2001 return; | 2009 return; |
2002 | 2010 |
2003 // Now that the layer (if any) has been updated, we need to adjust the diff
again, | 2011 // Now that the layer (if any) has been updated, we need to adjust the diff
again, |
2004 // check whether we should layout now, and decide if we need to repaint. | 2012 // check whether we should layout now, and decide if we need to repaint. |
2005 StyleDifference updatedDiff = adjustStyleDifference(diff, contextSensitivePr
operties); | 2013 StyleDifference updatedDiff = adjustStyleDifference(diff, contextSensitivePr
operties); |
2006 | 2014 |
2007 if (!diff.needsFullLayout()) { | 2015 if (!diff.needsFullLayout()) { |
2008 if (updatedDiff.needsFullLayout()) { | 2016 if (updatedDiff.needsFullLayout()) |
2009 setNeedsLayoutAndPrefWidthsRecalc(); | 2017 setNeedsLayoutAndPrefWidthsRecalc(); |
2010 } else { | 2018 else if (updatedDiff.needsPositionedMovementLayout()) |
2011 if (updatedDiff.needsPositionedMovementLayout()) | 2019 setNeedsPositionedMovementLayout(); |
2012 setNeedsPositionedMovementLayout(); | 2020 } |
2013 if (updatedDiff.needsSimplifiedLayout()) | 2021 |
2014 setNeedsSimplifiedNormalFlowLayout(); | 2022 if (contextSensitiveProperties & ContextSensitivePropertyTransform && !needs
Layout()) { |
2015 } | 2023 if (RenderBlock* container = containingBlock()) |
| 2024 container->setNeedsOverflowRecalcAfterStyleChange(); |
| 2025 if (isBox()) |
| 2026 toRenderBox(this)->updateLayerTransform(); |
2016 } | 2027 } |
2017 | 2028 |
2018 if (updatedDiff.needsRepaint()) { | 2029 if (updatedDiff.needsRepaint()) { |
2019 // Do a repaint with the new style now, e.g., for example if we go from | 2030 // Do a repaint with the new style now, e.g., for example if we go from |
2020 // not having an outline to having an outline. | 2031 // not having an outline to having an outline. |
2021 repaint(); | 2032 repaint(); |
2022 } | 2033 } |
2023 } | 2034 } |
2024 | 2035 |
2025 static inline bool rendererHasBackground(const RenderObject* renderer) | 2036 static inline bool rendererHasBackground(const RenderObject* renderer) |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2139 } | 2150 } |
2140 | 2151 |
2141 void RenderObject::styleDidChange(StyleDifference diff, const RenderStyle* oldSt
yle) | 2152 void RenderObject::styleDidChange(StyleDifference diff, const RenderStyle* oldSt
yle) |
2142 { | 2153 { |
2143 if (s_affectsParentBlock) | 2154 if (s_affectsParentBlock) |
2144 handleDynamicFloatPositionChange(); | 2155 handleDynamicFloatPositionChange(); |
2145 | 2156 |
2146 if (!m_parent) | 2157 if (!m_parent) |
2147 return; | 2158 return; |
2148 | 2159 |
2149 if (diff.needsFullLayout() || diff.needsSimplifiedLayout()) { | 2160 if (diff.needsFullLayout()) { |
2150 RenderCounter::rendererStyleChanged(*this, oldStyle, m_style.get()); | 2161 RenderCounter::rendererStyleChanged(*this, oldStyle, m_style.get()); |
2151 | 2162 |
2152 // If the object already needs layout, then setNeedsLayout won't do | 2163 // If the object already needs layout, then setNeedsLayout won't do |
2153 // any work. But if the containing block has changed, then we may need | 2164 // any work. But if the containing block has changed, then we may need |
2154 // to mark the new containing blocks for layout. The change that can | 2165 // to mark the new containing blocks for layout. The change that can |
2155 // directly affect the containing block of this object is a change to | 2166 // directly affect the containing block of this object is a change to |
2156 // the position style. | 2167 // the position style. |
2157 if (needsLayout() && oldStyle->position() != m_style->position()) | 2168 if (needsLayout() && oldStyle->position() != m_style->position()) |
2158 markContainingBlocksForLayout(); | 2169 markContainingBlocksForLayout(); |
2159 | 2170 |
| 2171 // Ditto. |
| 2172 if (needsOverflowRecalcAfterStyleChange() && oldStyle->position() != m_s
tyle->position()) |
| 2173 markContainingBlocksForOverflowRecalc(); |
| 2174 |
2160 if (diff.needsFullLayout()) | 2175 if (diff.needsFullLayout()) |
2161 setNeedsLayoutAndPrefWidthsRecalc(); | 2176 setNeedsLayoutAndPrefWidthsRecalc(); |
2162 else | 2177 } else if (diff.needsPositionedMovementLayout()) |
2163 setNeedsSimplifiedNormalFlowLayout(); | |
2164 } | |
2165 if (diff.needsPositionedMovementLayout()) | |
2166 setNeedsPositionedMovementLayout(); | 2178 setNeedsPositionedMovementLayout(); |
2167 | 2179 |
2168 // Don't check for repaint here; we need to wait until the layer has been | 2180 // Don't check for repaint here; we need to wait until the layer has been |
2169 // updated by subclasses before we know if we have to repaint (in setStyle()
). | 2181 // updated by subclasses before we know if we have to repaint (in setStyle()
). |
2170 | 2182 |
2171 if (oldStyle && !areCursorsEqual(oldStyle, style())) { | 2183 if (oldStyle && !areCursorsEqual(oldStyle, style())) { |
2172 if (LocalFrame* frame = this->frame()) | 2184 if (LocalFrame* frame = this->frame()) |
2173 frame->eventHandler().scheduleCursorUpdate(); | 2185 frame->eventHandler().scheduleCursorUpdate(); |
2174 } | 2186 } |
2175 } | 2187 } |
(...skipping 1222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3398 { | 3410 { |
3399 if (object1) { | 3411 if (object1) { |
3400 const WebCore::RenderObject* root = object1; | 3412 const WebCore::RenderObject* root = object1; |
3401 while (root->parent()) | 3413 while (root->parent()) |
3402 root = root->parent(); | 3414 root = root->parent(); |
3403 root->showRenderTreeAndMark(object1, "*", object2, "-", 0); | 3415 root->showRenderTreeAndMark(object1, "*", object2, "-", 0); |
3404 } | 3416 } |
3405 } | 3417 } |
3406 | 3418 |
3407 #endif | 3419 #endif |
OLD | NEW |