Chromium Code Reviews

Side by Side Diff: Source/core/rendering/RenderObject.cpp

Issue 236203020: Separate repaint and layout requirements of StyleDifference (Step 1) (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase; Renaming of some methods and small changes in StyleDifference Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | | Annotate | Revision Log
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) 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 1832 matching lines...)
1843 else { 1843 else {
1844 // An anonymous block must be made to wrap this inline. 1844 // An anonymous block must be made to wrap this inline.
1845 RenderBlock* block = toRenderBlock(parent())->createAnonymousBlock() ; 1845 RenderBlock* block = toRenderBlock(parent())->createAnonymousBlock() ;
1846 RenderObjectChildList* childlist = parent()->virtualChildren(); 1846 RenderObjectChildList* childlist = parent()->virtualChildren();
1847 childlist->insertChildNode(parent(), block, this); 1847 childlist->insertChildNode(parent(), block, this);
1848 block->children()->appendChildNode(block, childlist->removeChildNode (parent(), this)); 1848 block->children()->appendChildNode(block, childlist->removeChildNode (parent(), this));
1849 } 1849 }
1850 } 1850 }
1851 } 1851 }
1852 1852
1853 StyleDifference RenderObject::adjustStyleDifference(StyleDifference diff, unsign ed contextSensitiveProperties) const 1853 StyleDifference RenderObject::adjustStyleDifference(StyleDifference diff) const
1854 { 1854 {
1855 // FIXME: The calls to hasDirectReasonsForCompositing are using state that m ay not be up to date. 1855 // FIXME: The calls to hasDirectReasonsForCompositing are using state that m ay not be up to date.
1856 DisableCompositingQueryAsserts disabler; 1856 DisableCompositingQueryAsserts disabler;
1857 1857
1858 if (contextSensitiveProperties & ContextSensitivePropertyTransform && isSVG( )) 1858 if (diff.transformChanged() && isSVG())
1859 diff = StyleDifferenceLayout; 1859 diff.setNeedsFullLayout();
1860 1860
1861 // If transform changed, and the layer does not paint into its own separate backing, then we need to repaint. 1861 // If transform changed, and the layer does not paint into its own separate backing, then we need to repaint.
1862 if (contextSensitiveProperties & ContextSensitivePropertyTransform && diff <= StyleDifferenceRepaintLayer) { 1862 if (diff.transformChanged() && !diff.needsLayout()) {
1863 // Text nodes share style with their parents but transforms don't apply to them, 1863 // Text nodes share style with their parents but transforms don't apply to them,
1864 // hence the !isText() check. 1864 // hence the !isText() check.
1865 if (!isText() && (!hasLayer() || !toRenderLayerModelObject(this)->layer( )->hasDirectReasonsForCompositing())) 1865 if (!isText() && (!hasLayer() || !toRenderLayerModelObject(this)->layer( )->hasDirectReasonsForCompositing()))
1866 diff = StyleDifferenceRepaintLayer; 1866 diff.setNeedsRepaintLayer();
1867 else if (diff < StyleDifferenceRecompositeLayer) 1867 else
1868 diff = StyleDifferenceRecompositeLayer; 1868 diff.setNeedsRecompositeLayer();
1869 } 1869 }
1870 1870
1871 // If opacity or filters changed, and the layer does not paint into its own separate backing, then we need to repaint (also 1871 // If opacity or filters changed, and the layer does not paint into its own separate backing, then we need to repaint (also
1872 // ignoring text nodes) 1872 // ignoring text nodes)
1873 if (contextSensitiveProperties & ContextSensitivePropertyOpacity && diff <= StyleDifferenceRepaintLayer) { 1873 if (diff.opacityChanged() && !diff.needsLayout()) {
1874 if (!isText() && (!hasLayer() || !toRenderLayerModelObject(this)->layer( )->hasDirectReasonsForCompositing())) 1874 if (!isText() && (!hasLayer() || !toRenderLayerModelObject(this)->layer( )->hasDirectReasonsForCompositing()))
1875 diff = StyleDifferenceRepaintLayer; 1875 diff.setNeedsRepaintLayer();
1876 else if (diff < StyleDifferenceRecompositeLayer) 1876 else
1877 diff = StyleDifferenceRecompositeLayer; 1877 diff.setNeedsRecompositeLayer();
1878 } 1878 }
1879 1879
1880 if ((contextSensitiveProperties & ContextSensitivePropertyFilter) && hasLaye r() && diff <= StyleDifferenceRepaintLayer) { 1880 if (diff.filterChanged() && hasLayer() && !diff.needsLayout()) {
1881 RenderLayer* layer = toRenderLayerModelObject(this)->layer(); 1881 RenderLayer* layer = toRenderLayerModelObject(this)->layer();
1882 if (!layer->hasDirectReasonsForCompositing() || layer->paintsWithFilters ()) 1882 if (!layer->hasDirectReasonsForCompositing() || layer->paintsWithFilters ())
1883 diff = StyleDifferenceRepaintLayer; 1883 diff.setNeedsRepaintLayer();
1884 else if (diff < StyleDifferenceRecompositeLayer) 1884 else
1885 diff = StyleDifferenceRecompositeLayer; 1885 diff.setNeedsRecompositeLayer();
1886 } 1886 }
1887 1887
1888 if ((contextSensitiveProperties & ContextSensitivePropertyTextOrColor) && di ff < StyleDifferenceRepaint 1888 if (diff.textOrColorChanged() && !diff.needsRepaint() && !diff.needsLayout()
1889 && hasImmediateNonWhitespaceTextChildOrPropertiesDependentOnColor()) 1889 && hasImmediateNonWhitespaceTextChildOrPropertiesDependentOnColor())
1890 diff = StyleDifferenceRepaint; 1890 diff.setNeedsRepaintObject();
1891 1891
1892 // The answer to layerTypeRequired() for plugins, iframes, and canvas can ch ange without the actual 1892 // The answer to layerTypeRequired() for plugins, iframes, and canvas can ch ange without the actual
1893 // style changing, since it depends on whether we decide to composite these elements. When the 1893 // style changing, since it depends on whether we decide to composite these elements. When the
1894 // layer status of one of these elements changes, we need to force a layout. 1894 // layer status of one of these elements changes, we need to force a layout.
1895 if (diff == StyleDifferenceEqual && style() && isLayerModelObject()) { 1895 if (diff.hasNoChange() && style() && isLayerModelObject()) {
1896 bool requiresLayer = toRenderLayerModelObject(this)->layerTypeRequired() != NoLayer; 1896 bool requiresLayer = toRenderLayerModelObject(this)->layerTypeRequired() != NoLayer;
1897 if (hasLayer() != requiresLayer) 1897 if (hasLayer() != requiresLayer)
1898 diff = StyleDifferenceLayout; 1898 diff.setNeedsFullLayout();
1899 } 1899 }
1900 1900
1901 // If we have no layer(), just treat a RepaintLayer hint as a normal Repaint . 1901 // If we have no layer(), just treat a RepaintLayer hint as a normal Repaint .
1902 if (diff == StyleDifferenceRepaintLayer && !hasLayer()) 1902 if (diff.needsRepaintLayer() && !hasLayer()) {
1903 diff = StyleDifferenceRepaint; 1903 diff.resetNeedsRepaint();
1904 diff.setNeedsRepaintObject();
1905 }
1904 1906
1905 return diff; 1907 return diff;
1906 } 1908 }
1907 1909
1908 void RenderObject::setPseudoStyle(PassRefPtr<RenderStyle> pseudoStyle) 1910 void RenderObject::setPseudoStyle(PassRefPtr<RenderStyle> pseudoStyle)
1909 { 1911 {
1910 ASSERT(pseudoStyle->styleType() == BEFORE || pseudoStyle->styleType() == AFT ER); 1912 ASSERT(pseudoStyle->styleType() == BEFORE || pseudoStyle->styleType() == AFT ER);
1911 1913
1912 // FIXME: We should consider just making all pseudo items use an inherited s tyle. 1914 // FIXME: We should consider just making all pseudo items use an inherited s tyle.
1913 1915
(...skipping 43 matching lines...)
1957 { 1959 {
1958 ASSERT(style); 1960 ASSERT(style);
1959 1961
1960 if (m_style == style) { 1962 if (m_style == style) {
1961 // We need to run through adjustStyleDifference() for iframes, plugins, and canvas so 1963 // We need to run through adjustStyleDifference() for iframes, plugins, and canvas so
1962 // style sharing is disabled for them. That should ensure that we never hit this code path. 1964 // style sharing is disabled for them. That should ensure that we never hit this code path.
1963 ASSERT(!isRenderIFrame() && !isEmbeddedObject() && !isCanvas()); 1965 ASSERT(!isRenderIFrame() && !isEmbeddedObject() && !isCanvas());
1964 return; 1966 return;
1965 } 1967 }
1966 1968
1967 StyleDifference diff = StyleDifferenceEqual; 1969 StyleDifference diff;
1968 unsigned contextSensitiveProperties = ContextSensitivePropertyNone;
1969 if (m_style) 1970 if (m_style)
1970 diff = m_style->visualInvalidationDiff(*style, contextSensitivePropertie s); 1971 diff = m_style->visualInvalidationDiff(*style);
1971 1972
1972 diff = adjustStyleDifference(diff, contextSensitiveProperties); 1973 diff = adjustStyleDifference(diff);
1973 1974
1974 styleWillChange(diff, *style); 1975 styleWillChange(diff, *style);
1975 1976
1976 RefPtr<RenderStyle> oldStyle = m_style.release(); 1977 RefPtr<RenderStyle> oldStyle = m_style.release();
1977 setStyleInternal(style); 1978 setStyleInternal(style);
1978 1979
1979 updateFillImages(oldStyle ? oldStyle->backgroundLayers() : 0, m_style ? m_st yle->backgroundLayers() : 0); 1980 updateFillImages(oldStyle ? oldStyle->backgroundLayers() : 0, m_style ? m_st yle->backgroundLayers() : 0);
1980 updateFillImages(oldStyle ? oldStyle->maskLayers() : 0, m_style ? m_style->m askLayers() : 0); 1981 updateFillImages(oldStyle ? oldStyle->maskLayers() : 0, m_style ? m_style->m askLayers() : 0);
1981 1982
1982 updateImage(oldStyle ? oldStyle->borderImage().image() : 0, m_style ? m_styl e->borderImage().image() : 0); 1983 updateImage(oldStyle ? oldStyle->borderImage().image() : 0, m_style ? m_styl e->borderImage().image() : 0);
1983 updateImage(oldStyle ? oldStyle->maskBoxImage().image() : 0, m_style ? m_sty le->maskBoxImage().image() : 0); 1984 updateImage(oldStyle ? oldStyle->maskBoxImage().image() : 0, m_style ? m_sty le->maskBoxImage().image() : 0);
1984 1985
1985 updateShapeImage(oldStyle ? oldStyle->shapeOutside() : 0, m_style ? m_style- >shapeOutside() : 0); 1986 updateShapeImage(oldStyle ? oldStyle->shapeOutside() : 0, m_style ? m_style- >shapeOutside() : 0);
1986 1987
1987 bool doesNotNeedLayout = !m_parent || isText(); 1988 bool doesNotNeedLayout = !m_parent || isText();
1988 1989
1989 styleDidChange(diff, oldStyle.get()); 1990 styleDidChange(diff, oldStyle.get());
1990 1991
1991 // FIXME: |this| might be destroyed here. This can currently happen for a Re nderTextFragment when 1992 // FIXME: |this| might be destroyed here. This can currently happen for a Re nderTextFragment when
1992 // its first-letter block gets an update in RenderTextFragment::styleDidChan ge. For RenderTextFragment(s), 1993 // its first-letter block gets an update in RenderTextFragment::styleDidChan ge. For RenderTextFragment(s),
1993 // we will safely bail out with the doesNotNeedLayout flag. We might want to broaden this condition 1994 // we will safely bail out with the doesNotNeedLayout flag. We might want to broaden this condition
1994 // in the future as we move renderer changes out of layout and into style ch anges. 1995 // in the future as we move renderer changes out of layout and into style ch anges.
1995 if (doesNotNeedLayout) 1996 if (doesNotNeedLayout)
1996 return; 1997 return;
1997 1998
1998 // Now that the layer (if any) has been updated, we need to adjust the diff again, 1999 // Now that the layer (if any) has been updated, we need to adjust the diff again,
1999 // check whether we should layout now, and decide if we need to repaint. 2000 // check whether we should layout now, and decide if we need to repaint.
2000 StyleDifference updatedDiff = adjustStyleDifference(diff, contextSensitivePr operties); 2001 StyleDifference updatedDiff = adjustStyleDifference(diff);
2001 2002
2002 if (diff <= StyleDifferenceLayoutPositionedMovementOnly) { 2003 if (!diff.needsFullLayout()) {
2003 if (updatedDiff == StyleDifferenceLayout) 2004 if (updatedDiff.needsFullLayout())
2004 setNeedsLayoutAndPrefWidthsRecalc(); 2005 setNeedsLayoutAndPrefWidthsRecalc();
2005 else if (updatedDiff == StyleDifferenceLayoutPositionedMovementOnly) 2006 else if (updatedDiff.needsPositionedMovementLayoutOnly())
2006 setNeedsPositionedMovementLayout(); 2007 setNeedsPositionedMovementLayout();
2007 } 2008 }
2008 2009
2009 if (contextSensitiveProperties & ContextSensitivePropertyTransform && !needs Layout()) { 2010 if (diff.transformChanged() && !needsLayout()) {
2010 if (RenderBlock* container = containingBlock()) 2011 if (RenderBlock* container = containingBlock())
2011 container->setNeedsOverflowRecalcAfterStyleChange(); 2012 container->setNeedsOverflowRecalcAfterStyleChange();
2012 if (isBox()) 2013 if (isBox())
2013 toRenderBox(this)->updateLayerTransform(); 2014 toRenderBox(this)->updateLayerTransform();
2014 } 2015 }
2015 2016
2016 if (updatedDiff == StyleDifferenceRepaint || updatedDiff == StyleDifferenceR epaintLayer) { 2017 if (updatedDiff.needsRepaint()) {
2017 // Do a repaint with the new style now, e.g., for example if we go from 2018 // Do a repaint with the new style now, e.g., for example if we go from
2018 // not having an outline to having an outline. 2019 // not having an outline to having an outline.
2019 repaint(); 2020 repaint();
2020 } 2021 }
2021 } 2022 }
2022 2023
2023 static inline bool rendererHasBackground(const RenderObject* renderer) 2024 static inline bool rendererHasBackground(const RenderObject* renderer)
2024 { 2025 {
2025 return renderer && renderer->hasBackground(); 2026 return renderer && renderer->hasBackground();
2026 } 2027 }
(...skipping 13 matching lines...)
2040 } 2041 }
2041 2042
2042 // Keep layer hierarchy visibility bits up to date if visibility changes . 2043 // Keep layer hierarchy visibility bits up to date if visibility changes .
2043 if (m_style->visibility() != newStyle.visibility()) { 2044 if (m_style->visibility() != newStyle.visibility()) {
2044 // We might not have an enclosing layer yet because we might not be in the tree. 2045 // We might not have an enclosing layer yet because we might not be in the tree.
2045 if (RenderLayer* layer = enclosingLayer()) { 2046 if (RenderLayer* layer = enclosingLayer()) {
2046 if (newStyle.visibility() == VISIBLE) { 2047 if (newStyle.visibility() == VISIBLE) {
2047 layer->setHasVisibleContent(); 2048 layer->setHasVisibleContent();
2048 } else if (layer->hasVisibleContent() && (this == layer->rendere r() || layer->renderer()->style()->visibility() != VISIBLE)) { 2049 } else if (layer->hasVisibleContent() && (this == layer->rendere r() || layer->renderer()->style()->visibility() != VISIBLE)) {
2049 layer->dirtyVisibleContentStatus(); 2050 layer->dirtyVisibleContentStatus();
2050 if (diff > StyleDifferenceRepaintLayer) 2051 if (diff.needsLayout())
2051 repaint(); 2052 repaint();
2052 } 2053 }
2053 } 2054 }
2054 } 2055 }
2055 2056
2056 if (m_parent && diff == StyleDifferenceRepaint) 2057 if (m_parent && diff.needsRepaintObjectOnly())
2057 repaint(); 2058 repaint();
2058 if (isFloating() && (m_style->floating() != newStyle.floating())) 2059 if (isFloating() && (m_style->floating() != newStyle.floating()))
2059 // For changes in float styles, we need to conceivably remove oursel ves 2060 // For changes in float styles, we need to conceivably remove oursel ves
2060 // from the floating objects list. 2061 // from the floating objects list.
2061 toRenderBox(this)->removeFloatingOrPositionedChildFromBlockLists(); 2062 toRenderBox(this)->removeFloatingOrPositionedChildFromBlockLists();
2062 else if (isOutOfFlowPositioned() && (m_style->position() != newStyle.pos ition())) 2063 else if (isOutOfFlowPositioned() && (m_style->position() != newStyle.pos ition()))
2063 // For changes in positioning styles, we need to conceivably remove ourselves 2064 // For changes in positioning styles, we need to conceivably remove ourselves
2064 // from the positioned objects list. 2065 // from the positioned objects list.
2065 toRenderBox(this)->removeFloatingOrPositionedChildFromBlockLists(); 2066 toRenderBox(this)->removeFloatingOrPositionedChildFromBlockLists();
2066 2067
2067 s_affectsParentBlock = isFloatingOrOutOfFlowPositioned() 2068 s_affectsParentBlock = isFloatingOrOutOfFlowPositioned()
2068 && (!newStyle.isFloating() && !newStyle.hasOutOfFlowPosition()) 2069 && (!newStyle.isFloating() && !newStyle.hasOutOfFlowPosition())
2069 && parent() && (parent()->isRenderBlockFlow() || parent()->isRenderI nline()); 2070 && parent() && (parent()->isRenderBlockFlow() || parent()->isRenderI nline());
2070 2071
2071 // Clearing these bits is required to avoid leaving stale renderers. 2072 // Clearing these bits is required to avoid leaving stale renderers.
2072 // FIXME: We shouldn't need that hack if our logic was totally correct. 2073 // FIXME: We shouldn't need that hack if our logic was totally correct.
2073 if (diff == StyleDifferenceLayout || diff == StyleDifferenceLayoutPositi onedMovementOnly) { 2074 if (diff.needsFullLayout() || diff.needsPositionedMovementLayoutOnly()) {
2074 setFloating(false); 2075 setFloating(false);
2075 clearPositionedState(); 2076 clearPositionedState();
2076 } 2077 }
2077 } else 2078 } else {
2078 s_affectsParentBlock = false; 2079 s_affectsParentBlock = false;
2080 }
2079 2081
2080 if (view()->frameView()) { 2082 if (view()->frameView()) {
2081 bool shouldBlitOnFixedBackgroundImage = false; 2083 bool shouldBlitOnFixedBackgroundImage = false;
2082 #if ENABLE(FAST_MOBILE_SCROLLING) 2084 #if ENABLE(FAST_MOBILE_SCROLLING)
2083 // On low-powered/mobile devices, preventing blitting on a scroll can ca use noticeable delays 2085 // On low-powered/mobile devices, preventing blitting on a scroll can ca use noticeable delays
2084 // when scrolling a page with a fixed background image. As an optimizati on, assuming there are 2086 // when scrolling a page with a fixed background image. As an optimizati on, assuming there are
2085 // no fixed positoned elements on the page, we can acclerate scrolling ( via blitting) if we 2087 // no fixed positoned elements on the page, we can acclerate scrolling ( via blitting) if we
2086 // ignore the CSS property "background-attachment: fixed". 2088 // ignore the CSS property "background-attachment: fixed".
2087 shouldBlitOnFixedBackgroundImage = true; 2089 shouldBlitOnFixedBackgroundImage = true;
2088 #endif 2090 #endif
(...skipping 47 matching lines...)
2136 } 2138 }
2137 2139
2138 void RenderObject::styleDidChange(StyleDifference diff, const RenderStyle* oldSt yle) 2140 void RenderObject::styleDidChange(StyleDifference diff, const RenderStyle* oldSt yle)
2139 { 2141 {
2140 if (s_affectsParentBlock) 2142 if (s_affectsParentBlock)
2141 handleDynamicFloatPositionChange(); 2143 handleDynamicFloatPositionChange();
2142 2144
2143 if (!m_parent) 2145 if (!m_parent)
2144 return; 2146 return;
2145 2147
2146 if (diff == StyleDifferenceLayout) { 2148 if (diff.needsFullLayout()) {
2147 RenderCounter::rendererStyleChanged(*this, oldStyle, m_style.get()); 2149 RenderCounter::rendererStyleChanged(*this, oldStyle, m_style.get());
2148 2150
2149 // If the object already needs layout, then setNeedsLayout won't do 2151 // If the object already needs layout, then setNeedsLayout won't do
2150 // any work. But if the containing block has changed, then we may need 2152 // any work. But if the containing block has changed, then we may need
2151 // to mark the new containing blocks for layout. The change that can 2153 // to mark the new containing blocks for layout. The change that can
2152 // directly affect the containing block of this object is a change to 2154 // directly affect the containing block of this object is a change to
2153 // the position style. 2155 // the position style.
2154 if (needsLayout() && oldStyle->position() != m_style->position()) 2156 if (needsLayout() && oldStyle->position() != m_style->position())
2155 markContainingBlocksForLayout(); 2157 markContainingBlocksForLayout();
2156 2158
2157 // Ditto. 2159 // Ditto.
2158 if (needsOverflowRecalcAfterStyleChange() && oldStyle->position() != m_s tyle->position()) 2160 if (needsOverflowRecalcAfterStyleChange() && oldStyle->position() != m_s tyle->position())
2159 markContainingBlocksForOverflowRecalc(); 2161 markContainingBlocksForOverflowRecalc();
2160 2162
2161 if (diff == StyleDifferenceLayout) 2163 setNeedsLayoutAndPrefWidthsRecalc();
2162 setNeedsLayoutAndPrefWidthsRecalc(); 2164 } else if (diff.needsPositionedMovementLayoutOnly()) {
2163 } else if (diff == StyleDifferenceLayoutPositionedMovementOnly)
2164 setNeedsPositionedMovementLayout(); 2165 setNeedsPositionedMovementLayout();
2166 }
2165 2167
2166 // Don't check for repaint here; we need to wait until the layer has been 2168 // Don't check for repaint here; we need to wait until the layer has been
2167 // updated by subclasses before we know if we have to repaint (in setStyle() ). 2169 // updated by subclasses before we know if we have to repaint (in setStyle() ).
2168 2170
2169 if (oldStyle && !areCursorsEqual(oldStyle, style())) { 2171 if (oldStyle && !areCursorsEqual(oldStyle, style())) {
2170 if (LocalFrame* frame = this->frame()) 2172 if (LocalFrame* frame = this->frame())
2171 frame->eventHandler().scheduleCursorUpdate(); 2173 frame->eventHandler().scheduleCursorUpdate();
2172 } 2174 }
2173 } 2175 }
2174 2176
(...skipping 1221 matching lines...)
3396 { 3398 {
3397 if (object1) { 3399 if (object1) {
3398 const WebCore::RenderObject* root = object1; 3400 const WebCore::RenderObject* root = object1;
3399 while (root->parent()) 3401 while (root->parent())
3400 root = root->parent(); 3402 root = root->parent();
3401 root->showRenderTreeAndMark(object1, "*", object2, "-", 0); 3403 root->showRenderTreeAndMark(object1, "*", object2, "-", 0);
3402 } 3404 }
3403 } 3405 }
3404 3406
3405 #endif 3407 #endif
OLDNEW

Powered by Google App Engine