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

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

Issue 550363004: Factor painting code out of RenderBox into a new class called BoxPainter. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix Created 6 years, 3 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 | 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) 2005 Allan Sandfeld Jensen (kde@carewolf.com) 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com)
6 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
7 * Copyright (C) 2010 Google Inc. All rights reserved. 7 * Copyright (C) 2010 Google Inc. All rights reserved.
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 24 matching lines...) Expand all
35 #include "core/rendering/RenderFlowThread.h" 35 #include "core/rendering/RenderFlowThread.h"
36 #include "core/rendering/RenderGeometryMap.h" 36 #include "core/rendering/RenderGeometryMap.h"
37 #include "core/rendering/RenderInline.h" 37 #include "core/rendering/RenderInline.h"
38 #include "core/rendering/RenderLayer.h" 38 #include "core/rendering/RenderLayer.h"
39 #include "core/rendering/RenderObjectInlines.h" 39 #include "core/rendering/RenderObjectInlines.h"
40 #include "core/rendering/RenderRegion.h" 40 #include "core/rendering/RenderRegion.h"
41 #include "core/rendering/RenderTextFragment.h" 41 #include "core/rendering/RenderTextFragment.h"
42 #include "core/rendering/RenderView.h" 42 #include "core/rendering/RenderView.h"
43 #include "core/rendering/compositing/CompositedLayerMapping.h" 43 #include "core/rendering/compositing/CompositedLayerMapping.h"
44 #include "core/rendering/compositing/RenderLayerCompositor.h" 44 #include "core/rendering/compositing/RenderLayerCompositor.h"
45 #include "core/rendering/style/BorderEdge.h"
45 #include "core/rendering/style/ShadowList.h" 46 #include "core/rendering/style/ShadowList.h"
46 #include "platform/LengthFunctions.h" 47 #include "platform/LengthFunctions.h"
47 #include "platform/geometry/TransformState.h" 48 #include "platform/geometry/TransformState.h"
48 #include "platform/graphics/DrawLooperBuilder.h" 49 #include "platform/graphics/DrawLooperBuilder.h"
49 #include "platform/graphics/GraphicsContextStateSaver.h" 50 #include "platform/graphics/GraphicsContextStateSaver.h"
50 #include "platform/graphics/Path.h" 51 #include "platform/graphics/Path.h"
51 #include "wtf/CurrentTime.h" 52 #include "wtf/CurrentTime.h"
52 53
53 namespace blink { 54 namespace blink {
54 55
(...skipping 1169 matching lines...) Expand 10 before | Expand all | Expand 10 after
1224 1225
1225 graphicsContext->drawTiledImage(image.get(), 1226 graphicsContext->drawTiledImage(image.get(),
1226 IntRect(borderImageRect.x() + leftWidth, borderImageRect.y() + topWi dth, destinationWidth, destinationHeight), 1227 IntRect(borderImageRect.x() + leftWidth, borderImageRect.y() + topWi dth, destinationWidth, destinationHeight),
1227 IntRect(leftSlice, topSlice, sourceWidth, sourceHeight), 1228 IntRect(leftSlice, topSlice, sourceWidth, sourceHeight),
1228 middleScaleFactor, (Image::TileRule)hRule, (Image::TileRule)vRule, o p); 1229 middleScaleFactor, (Image::TileRule)hRule, (Image::TileRule)vRule, o p);
1229 } 1230 }
1230 1231
1231 return true; 1232 return true;
1232 } 1233 }
1233 1234
1234 class BorderEdge {
1235 public:
1236 BorderEdge(int edgeWidth, const Color& edgeColor, EBorderStyle edgeStyle, bo ol edgeIsTransparent, bool edgeIsPresent = true)
1237 : width(edgeWidth)
1238 , color(edgeColor)
1239 , style(edgeStyle)
1240 , isTransparent(edgeIsTransparent)
1241 , isPresent(edgeIsPresent)
1242 {
1243 if (style == DOUBLE && edgeWidth < 3)
1244 style = SOLID;
1245 }
1246
1247 BorderEdge()
1248 : width(0)
1249 , style(BHIDDEN)
1250 , isTransparent(false)
1251 , isPresent(false)
1252 {
1253 }
1254
1255 bool hasVisibleColorAndStyle() const { return style > BHIDDEN && !isTranspar ent; }
1256 bool shouldRender() const { return isPresent && width && hasVisibleColorAndS tyle(); }
1257 bool presentButInvisible() const { return usedWidth() && !hasVisibleColorAnd Style(); }
1258 bool obscuresBackgroundEdge(float scale) const
1259 {
1260 if (!isPresent || isTransparent || (width * scale) < 2 || color.hasAlpha () || style == BHIDDEN)
1261 return false;
1262
1263 if (style == DOTTED || style == DASHED)
1264 return false;
1265
1266 if (style == DOUBLE)
1267 return width >= 5 * scale; // The outer band needs to be >= 2px wide at unit scale.
1268
1269 return true;
1270 }
1271 bool obscuresBackground() const
1272 {
1273 if (!isPresent || isTransparent || color.hasAlpha() || style == BHIDDEN)
1274 return false;
1275
1276 if (style == DOTTED || style == DASHED || style == DOUBLE)
1277 return false;
1278
1279 return true;
1280 }
1281
1282 int usedWidth() const { return isPresent ? width : 0; }
1283
1284 void getDoubleBorderStripeWidths(int& outerWidth, int& innerWidth) const
1285 {
1286 int fullWidth = usedWidth();
1287 outerWidth = fullWidth / 3;
1288 innerWidth = fullWidth * 2 / 3;
1289
1290 // We need certain integer rounding results
1291 if (fullWidth % 3 == 2)
1292 outerWidth += 1;
1293
1294 if (fullWidth % 3 == 1)
1295 innerWidth += 1;
1296 }
1297
1298 int width;
1299 Color color;
1300 EBorderStyle style;
1301 bool isTransparent;
1302 bool isPresent;
1303 };
1304
1305 static bool allCornersClippedOut(const RoundedRect& border, const LayoutRect& cl ipRect) 1235 static bool allCornersClippedOut(const RoundedRect& border, const LayoutRect& cl ipRect)
1306 { 1236 {
1307 LayoutRect boundingRect = border.rect(); 1237 LayoutRect boundingRect = border.rect();
1308 if (clipRect.contains(boundingRect)) 1238 if (clipRect.contains(boundingRect))
1309 return false; 1239 return false;
1310 1240
1311 RoundedRect::Radii radii = border.radii(); 1241 RoundedRect::Radii radii = border.radii();
1312 1242
1313 LayoutRect topLeftRect(boundingRect.location(), radii.topLeft()); 1243 LayoutRect topLeftRect(boundingRect.location(), radii.topLeft());
1314 if (clipRect.intersects(topLeftRect)) 1244 if (clipRect.intersects(topLeftRect))
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1357 } 1287 }
1358 1288
1359 static inline bool includesAdjacentEdges(BorderEdgeFlags flags) 1289 static inline bool includesAdjacentEdges(BorderEdgeFlags flags)
1360 { 1290 {
1361 return (flags & (TopBorderEdge | RightBorderEdge)) == (TopBorderEdge | Right BorderEdge) 1291 return (flags & (TopBorderEdge | RightBorderEdge)) == (TopBorderEdge | Right BorderEdge)
1362 || (flags & (RightBorderEdge | BottomBorderEdge)) == (RightBorderEdge | BottomBorderEdge) 1292 || (flags & (RightBorderEdge | BottomBorderEdge)) == (RightBorderEdge | BottomBorderEdge)
1363 || (flags & (BottomBorderEdge | LeftBorderEdge)) == (BottomBorderEdge | LeftBorderEdge) 1293 || (flags & (BottomBorderEdge | LeftBorderEdge)) == (BottomBorderEdge | LeftBorderEdge)
1364 || (flags & (LeftBorderEdge | TopBorderEdge)) == (LeftBorderEdge | TopBo rderEdge); 1294 || (flags & (LeftBorderEdge | TopBorderEdge)) == (LeftBorderEdge | TopBo rderEdge);
1365 } 1295 }
1366 1296
1367 inline bool edgesShareColor(const BorderEdge& firstEdge, const BorderEdge& secon dEdge)
1368 {
1369 return firstEdge.color == secondEdge.color;
1370 }
1371
1372 inline bool styleRequiresClipPolygon(EBorderStyle style) 1297 inline bool styleRequiresClipPolygon(EBorderStyle style)
1373 { 1298 {
1374 return style == DOTTED || style == DASHED; // These are drawn with a stroke, so we have to clip to get corner miters. 1299 return style == DOTTED || style == DASHED; // These are drawn with a stroke, so we have to clip to get corner miters.
1375 } 1300 }
1376 1301
1377 static bool borderStyleFillsBorderArea(EBorderStyle style) 1302 static bool borderStyleFillsBorderArea(EBorderStyle style)
1378 { 1303 {
1379 return !(style == DOTTED || style == DASHED || style == DOUBLE); 1304 return !(style == DOTTED || style == DASHED || style == DOUBLE);
1380 } 1305 }
1381 1306
(...skipping 20 matching lines...) Expand all
1402 return flags == topRightFlags || flags == bottomLeftFlags; 1327 return flags == topRightFlags || flags == bottomLeftFlags;
1403 } 1328 }
1404 return false; 1329 return false;
1405 } 1330 }
1406 1331
1407 static inline bool colorsMatchAtCorner(BoxSide side, BoxSide adjacentSide, const BorderEdge edges[]) 1332 static inline bool colorsMatchAtCorner(BoxSide side, BoxSide adjacentSide, const BorderEdge edges[])
1408 { 1333 {
1409 if (edges[side].shouldRender() != edges[adjacentSide].shouldRender()) 1334 if (edges[side].shouldRender() != edges[adjacentSide].shouldRender())
1410 return false; 1335 return false;
1411 1336
1412 if (!edgesShareColor(edges[side], edges[adjacentSide])) 1337 if (!edges[side].sharesColorWith(edges[adjacentSide]))
1413 return false; 1338 return false;
1414 1339
1415 return !borderStyleHasUnmatchedColorsAtCorner(edges[side].style, side, adjac entSide); 1340 return !borderStyleHasUnmatchedColorsAtCorner(edges[side].style, side, adjac entSide);
1416 } 1341 }
1417 1342
1418 1343
1419 static inline bool colorNeedsAntiAliasAtCorner(BoxSide side, BoxSide adjacentSid e, const BorderEdge edges[]) 1344 static inline bool colorNeedsAntiAliasAtCorner(BoxSide side, BoxSide adjacentSid e, const BorderEdge edges[])
1420 { 1345 {
1421 if (!edges[side].color.hasAlpha()) 1346 if (!edges[side].color.hasAlpha())
1422 return false; 1347 return false;
1423 1348
1424 if (edges[side].shouldRender() != edges[adjacentSide].shouldRender()) 1349 if (edges[side].shouldRender() != edges[adjacentSide].shouldRender())
1425 return false; 1350 return false;
1426 1351
1427 if (!edgesShareColor(edges[side], edges[adjacentSide])) 1352 if (!edges[side].sharesColorWith(edges[adjacentSide]))
1428 return true; 1353 return true;
1429 1354
1430 return borderStyleHasUnmatchedColorsAtCorner(edges[side].style, side, adjace ntSide); 1355 return borderStyleHasUnmatchedColorsAtCorner(edges[side].style, side, adjace ntSide);
1431 } 1356 }
1432 1357
1433 // This assumes that we draw in order: top, bottom, left, right. 1358 // This assumes that we draw in order: top, bottom, left, right.
1434 static inline bool willBeOverdrawn(BoxSide side, BoxSide adjacentSide, const Bor derEdge edges[]) 1359 static inline bool willBeOverdrawn(BoxSide side, BoxSide adjacentSide, const Bor derEdge edges[])
1435 { 1360 {
1436 switch (side) { 1361 switch (side) {
1437 case BSTop: 1362 case BSTop:
1438 case BSBottom: 1363 case BSBottom:
1439 if (edges[adjacentSide].presentButInvisible()) 1364 if (edges[adjacentSide].presentButInvisible())
1440 return false; 1365 return false;
1441 1366
1442 if (!edgesShareColor(edges[side], edges[adjacentSide]) && edges[adjacent Side].color.hasAlpha()) 1367 if (!edges[side].sharesColorWith(edges[adjacentSide]) && edges[adjacentS ide].color.hasAlpha())
1443 return false; 1368 return false;
1444 1369
1445 if (!borderStyleFillsBorderArea(edges[adjacentSide].style)) 1370 if (!borderStyleFillsBorderArea(edges[adjacentSide].style))
1446 return false; 1371 return false;
1447 1372
1448 return true; 1373 return true;
1449 1374
1450 case BSLeft: 1375 case BSLeft:
1451 case BSRight: 1376 case BSRight:
1452 // These draw last, so are never overdrawn. 1377 // These draw last, so are never overdrawn.
(...skipping 17 matching lines...) Expand all
1470 } 1395 }
1471 1396
1472 static bool joinRequiresMitre(BoxSide side, BoxSide adjacentSide, const BorderEd ge edges[], bool allowOverdraw) 1397 static bool joinRequiresMitre(BoxSide side, BoxSide adjacentSide, const BorderEd ge edges[], bool allowOverdraw)
1473 { 1398 {
1474 if ((edges[side].isTransparent && edges[adjacentSide].isTransparent) || !edg es[adjacentSide].isPresent) 1399 if ((edges[side].isTransparent && edges[adjacentSide].isTransparent) || !edg es[adjacentSide].isPresent)
1475 return false; 1400 return false;
1476 1401
1477 if (allowOverdraw && willBeOverdrawn(side, adjacentSide, edges)) 1402 if (allowOverdraw && willBeOverdrawn(side, adjacentSide, edges))
1478 return false; 1403 return false;
1479 1404
1480 if (!edgesShareColor(edges[side], edges[adjacentSide])) 1405 if (!edges[side].sharesColorWith(edges[adjacentSide]))
1481 return true; 1406 return true;
1482 1407
1483 if (borderStylesRequireMitre(side, adjacentSide, edges[side].style, edges[ad jacentSide].style)) 1408 if (borderStylesRequireMitre(side, adjacentSide, edges[side].style, edges[ad jacentSide].style))
1484 return true; 1409 return true;
1485 1410
1486 return false; 1411 return false;
1487 } 1412 }
1488 1413
1489 void RenderBoxModelObject::paintOneBorderSide(GraphicsContext* graphicsContext, const RenderStyle* style, const RoundedRect& outerBorder, const RoundedRect& inn erBorder, 1414 void RenderBoxModelObject::paintOneBorderSide(GraphicsContext* graphicsContext, const RenderStyle* style, const RoundedRect& outerBorder, const RoundedRect& inn erBorder,
1490 const IntRect& sideRect, BoxSide side, BoxSide adjacentSide1, BoxSide adjace ntSide2, const BorderEdge edges[], const Path* path, 1415 const IntRect& sideRect, BoxSide side, BoxSide adjacentSide1, BoxSide adjace ntSide2, const BorderEdge edges[], const Path* path,
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
1643 1568
1644 void RenderBoxModelObject::paintBorder(const PaintInfo& info, const LayoutRect& rect, const RenderStyle* style, 1569 void RenderBoxModelObject::paintBorder(const PaintInfo& info, const LayoutRect& rect, const RenderStyle* style,
1645 BackgroundBleedAvoidance bleedAvoidance, bool includeLogicalLeftEdge, bool includeLogicalRightEdge) 1570 BackgroundBleedAvoidance bleedAvoidance, bool includeLogicalLeftEdge, bool includeLogicalRightEdge)
1646 { 1571 {
1647 GraphicsContext* graphicsContext = info.context; 1572 GraphicsContext* graphicsContext = info.context;
1648 // border-image is not affected by border-radius. 1573 // border-image is not affected by border-radius.
1649 if (paintNinePieceImage(graphicsContext, rect, style, style->borderImage())) 1574 if (paintNinePieceImage(graphicsContext, rect, style, style->borderImage()))
1650 return; 1575 return;
1651 1576
1652 BorderEdge edges[4]; 1577 BorderEdge edges[4];
1653 getBorderEdgeInfo(edges, style, includeLogicalLeftEdge, includeLogicalRightE dge); 1578 style->getBorderEdgeInfo(edges, includeLogicalLeftEdge, includeLogicalRightE dge);
1654 RoundedRect outerBorder = style->getRoundedBorderFor(rect, includeLogicalLef tEdge, includeLogicalRightEdge); 1579 RoundedRect outerBorder = style->getRoundedBorderFor(rect, includeLogicalLef tEdge, includeLogicalRightEdge);
1655 RoundedRect innerBorder = style->getRoundedInnerBorderFor(borderInnerRectAdj ustedForBleedAvoidance(graphicsContext, rect, bleedAvoidance), includeLogicalLef tEdge, includeLogicalRightEdge); 1580 RoundedRect innerBorder = style->getRoundedInnerBorderFor(borderInnerRectAdj ustedForBleedAvoidance(graphicsContext, rect, bleedAvoidance), includeLogicalLef tEdge, includeLogicalRightEdge);
1656 1581
1657 if (outerBorder.rect().isEmpty()) 1582 if (outerBorder.rect().isEmpty())
1658 return; 1583 return;
1659 1584
1660 bool haveAlphaColor = false; 1585 bool haveAlphaColor = false;
1661 bool haveAllSolidEdges = true; 1586 bool haveAllSolidEdges = true;
1662 bool haveAllDoubleEdges = true; 1587 bool haveAllDoubleEdges = true;
1663 int numEdgesVisible = 4; 1588 int numEdgesVisible = 4;
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after
2266 2191
2267 void RenderBoxModelObject::clipBorderSideForComplexInnerPath(GraphicsContext* gr aphicsContext, const RoundedRect& outerBorder, const RoundedRect& innerBorder, 2192 void RenderBoxModelObject::clipBorderSideForComplexInnerPath(GraphicsContext* gr aphicsContext, const RoundedRect& outerBorder, const RoundedRect& innerBorder,
2268 BoxSide side, const class BorderEdge edges[]) 2193 BoxSide side, const class BorderEdge edges[])
2269 { 2194 {
2270 graphicsContext->clip(calculateSideRectIncludingInner(outerBorder, edges, si de)); 2195 graphicsContext->clip(calculateSideRectIncludingInner(outerBorder, edges, si de));
2271 RoundedRect adjustedInnerRect = calculateAdjustedInnerBorder(innerBorder, si de); 2196 RoundedRect adjustedInnerRect = calculateAdjustedInnerBorder(innerBorder, si de);
2272 if (!adjustedInnerRect.isEmpty()) 2197 if (!adjustedInnerRect.isEmpty())
2273 graphicsContext->clipOutRoundedRect(adjustedInnerRect); 2198 graphicsContext->clipOutRoundedRect(adjustedInnerRect);
2274 } 2199 }
2275 2200
2276 void RenderBoxModelObject::getBorderEdgeInfo(BorderEdge edges[], const RenderSty le* style, bool includeLogicalLeftEdge, bool includeLogicalRightEdge) const
2277 {
2278 bool horizontal = style->isHorizontalWritingMode();
2279
2280 edges[BSTop] = BorderEdge(style->borderTopWidth(),
2281 resolveColor(style, CSSPropertyBorderTopColor),
2282 style->borderTopStyle(),
2283 style->borderTopIsTransparent(),
2284 horizontal || includeLogicalLeftEdge);
2285
2286 edges[BSRight] = BorderEdge(style->borderRightWidth(),
2287 resolveColor(style, CSSPropertyBorderRightColor),
2288 style->borderRightStyle(),
2289 style->borderRightIsTransparent(),
2290 !horizontal || includeLogicalRightEdge);
2291
2292 edges[BSBottom] = BorderEdge(style->borderBottomWidth(),
2293 resolveColor(style, CSSPropertyBorderBottomColor),
2294 style->borderBottomStyle(),
2295 style->borderBottomIsTransparent(),
2296 horizontal || includeLogicalRightEdge);
2297
2298 edges[BSLeft] = BorderEdge(style->borderLeftWidth(),
2299 resolveColor(style, CSSPropertyBorderLeftColor),
2300 style->borderLeftStyle(),
2301 style->borderLeftIsTransparent(),
2302 !horizontal || includeLogicalLeftEdge);
2303 }
2304
2305 bool RenderBoxModelObject::borderObscuresBackgroundEdge(const FloatSize& context Scale) const
2306 {
2307 BorderEdge edges[4];
2308 getBorderEdgeInfo(edges, style());
2309
2310 for (int i = BSTop; i <= BSLeft; ++i) {
2311 const BorderEdge& currEdge = edges[i];
2312 // FIXME: for vertical text
2313 float axisScale = (i == BSTop || i == BSBottom) ? contextScale.height() : contextScale.width();
2314 if (!currEdge.obscuresBackgroundEdge(axisScale))
2315 return false;
2316 }
2317
2318 return true;
2319 }
2320
2321 bool RenderBoxModelObject::borderObscuresBackground() const
2322 {
2323 if (!style()->hasBorder())
2324 return false;
2325
2326 // Bail if we have any border-image for now. We could look at the image alph a to improve this.
2327 if (style()->borderImage().image())
2328 return false;
2329
2330 BorderEdge edges[4];
2331 getBorderEdgeInfo(edges, style());
2332
2333 for (int i = BSTop; i <= BSLeft; ++i) {
2334 const BorderEdge& currEdge = edges[i];
2335 if (!currEdge.obscuresBackground())
2336 return false;
2337 }
2338
2339 return true;
2340 }
2341
2342 bool RenderBoxModelObject::boxShadowShouldBeAppliedToBackground(BackgroundBleedA voidance bleedAvoidance, InlineFlowBox* inlineFlowBox) const 2201 bool RenderBoxModelObject::boxShadowShouldBeAppliedToBackground(BackgroundBleedA voidance bleedAvoidance, InlineFlowBox* inlineFlowBox) const
2343 { 2202 {
2344 if (bleedAvoidance != BackgroundBleedNone) 2203 if (bleedAvoidance != BackgroundBleedNone)
2345 return false; 2204 return false;
2346 2205
2347 if (style()->hasAppearance()) 2206 if (style()->hasAppearance())
2348 return false; 2207 return false;
2349 2208
2350 const ShadowList* shadowList = style()->boxShadow(); 2209 const ShadowList* shadowList = style()->boxShadow();
2351 if (!shadowList) 2210 if (!shadowList)
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after
2745 ASSERT(!beforeChild || toBoxModelObject == beforeChild->parent()); 2604 ASSERT(!beforeChild || toBoxModelObject == beforeChild->parent());
2746 for (RenderObject* child = startChild; child && child != endChild; ) { 2605 for (RenderObject* child = startChild; child && child != endChild; ) {
2747 // Save our next sibling as moveChildTo will clear it. 2606 // Save our next sibling as moveChildTo will clear it.
2748 RenderObject* nextSibling = child->nextSibling(); 2607 RenderObject* nextSibling = child->nextSibling();
2749 moveChildTo(toBoxModelObject, child, beforeChild, fullRemoveInsert); 2608 moveChildTo(toBoxModelObject, child, beforeChild, fullRemoveInsert);
2750 child = nextSibling; 2609 child = nextSibling;
2751 } 2610 }
2752 } 2611 }
2753 2612
2754 } // namespace blink 2613 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698