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

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

Issue 16943008: Column balancing support in the region based multicol implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 6 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 | « Source/core/rendering/RenderBlock.h ('k') | Source/core/rendering/RenderBox.cpp » ('j') | 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) 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) 2007 David Smith (catfish.man@gmail.com) 4 * (C) 2007 David Smith (catfish.man@gmail.com)
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 7368 matching lines...) Expand 10 before | Expand all | Expand 10 after
7379 bool checkColumnBreaks = view()->layoutState()->isPaginatingColumns(); 7379 bool checkColumnBreaks = view()->layoutState()->isPaginatingColumns();
7380 bool checkPageBreaks = !checkColumnBreaks && view()->layoutState()->m_pageLo gicalHeight; 7380 bool checkPageBreaks = !checkColumnBreaks && view()->layoutState()->m_pageLo gicalHeight;
7381 RenderFlowThread* flowThread = flowThreadContainingBlock(); 7381 RenderFlowThread* flowThread = flowThreadContainingBlock();
7382 bool checkRegionBreaks = flowThread && flowThread->isRenderNamedFlowThread() ; 7382 bool checkRegionBreaks = flowThread && flowThread->isRenderNamedFlowThread() ;
7383 bool isUnsplittable = child->isUnsplittableForPagination() || (checkColumnBr eaks && child->style()->columnBreakInside() == PBAVOID) 7383 bool isUnsplittable = child->isUnsplittableForPagination() || (checkColumnBr eaks && child->style()->columnBreakInside() == PBAVOID)
7384 || (checkPageBreaks && child->style()->pageBreakInside() == PBAVOID) 7384 || (checkPageBreaks && child->style()->pageBreakInside() == PBAVOID)
7385 || (checkRegionBreaks && child->style()->regionBreakInside() == PBAVOID) ; 7385 || (checkRegionBreaks && child->style()->regionBreakInside() == PBAVOID) ;
7386 if (!isUnsplittable) 7386 if (!isUnsplittable)
7387 return logicalOffset; 7387 return logicalOffset;
7388 LayoutUnit childLogicalHeight = logicalHeightForChild(child) + (includeMargi ns ? marginBeforeForChild(child) + marginAfterForChild(child) : LayoutUnit()); 7388 LayoutUnit childLogicalHeight = logicalHeightForChild(child) + (includeMargi ns ? marginBeforeForChild(child) + marginAfterForChild(child) : LayoutUnit());
7389 LayoutState* layoutState = view()->layoutState();
7390 if (layoutState->m_columnInfo)
7391 layoutState->m_columnInfo->updateMinimumColumnHeight(childLogicalHeight) ;
7392 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); 7389 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset);
7393 bool hasUniformPageLogicalHeight = !flowThread || flowThread->regionsHaveUni formLogicalHeight(); 7390 bool hasUniformPageLogicalHeight = !flowThread || flowThread->regionsHaveUni formLogicalHeight();
7391 updateMinimumPageHeight(logicalOffset, childLogicalHeight);
7394 if (!pageLogicalHeight || (hasUniformPageLogicalHeight && childLogicalHeight > pageLogicalHeight) 7392 if (!pageLogicalHeight || (hasUniformPageLogicalHeight && childLogicalHeight > pageLogicalHeight)
7395 || !hasNextPage(logicalOffset)) 7393 || !hasNextPage(logicalOffset))
7396 return logicalOffset; 7394 return logicalOffset;
7397 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi calOffset, ExcludePageBoundary); 7395 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi calOffset, ExcludePageBoundary);
7398 if (remainingLogicalHeight < childLogicalHeight) { 7396 if (remainingLogicalHeight < childLogicalHeight) {
7399 if (!hasUniformPageLogicalHeight && !pushToNextPageWithMinimumLogicalHei ght(remainingLogicalHeight, logicalOffset, childLogicalHeight)) 7397 if (!hasUniformPageLogicalHeight && !pushToNextPageWithMinimumLogicalHei ght(remainingLogicalHeight, logicalOffset, childLogicalHeight))
7400 return logicalOffset; 7398 return logicalOffset;
7401 return logicalOffset + remainingLogicalHeight; 7399 return logicalOffset + remainingLogicalHeight;
7402 } 7400 }
7403 return logicalOffset; 7401 return logicalOffset;
7404 } 7402 }
7405 7403
7406 bool RenderBlock::pushToNextPageWithMinimumLogicalHeight(LayoutUnit& adjustment, LayoutUnit logicalOffset, LayoutUnit minimumLogicalHeight) const 7404 bool RenderBlock::pushToNextPageWithMinimumLogicalHeight(LayoutUnit& adjustment, LayoutUnit logicalOffset, LayoutUnit minimumLogicalHeight) const
7407 { 7405 {
7408 bool checkRegion = false; 7406 bool checkRegion = false;
7409 for (LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset + adjustment); pageLogicalHeight; 7407 for (LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset + adjustment); pageLogicalHeight;
7410 pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset + adjustmen t)) { 7408 pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset + adjustmen t)) {
7411 if (minimumLogicalHeight <= pageLogicalHeight) 7409 if (minimumLogicalHeight <= pageLogicalHeight)
7412 return true; 7410 return true;
7413 if (!hasNextPage(logicalOffset + adjustment)) 7411 if (!hasNextPage(logicalOffset + adjustment))
7414 return false; 7412 return false;
7415 adjustment += pageLogicalHeight; 7413 adjustment += pageLogicalHeight;
7416 checkRegion = true; 7414 checkRegion = true;
7417 } 7415 }
7418 return !checkRegion; 7416 return !checkRegion;
7419 } 7417 }
7420 7418
7419 void RenderBlock::setPageBreak(LayoutUnit offset, LayoutUnit spaceShortage)
7420 {
7421 if (RenderFlowThread* flowThread = flowThreadContainingBlock())
7422 flowThread->setPageBreak(offsetFromLogicalTopOfFirstPage() + offset, spa ceShortage);
7423 }
7424
7425 void RenderBlock::updateMinimumPageHeight(LayoutUnit offset, LayoutUnit minHeigh t)
7426 {
7427 if (RenderFlowThread* flowThread = flowThreadContainingBlock())
7428 flowThread->updateMinimumPageHeight(offsetFromLogicalTopOfFirstPage() + offset, minHeight);
7429 else if (ColumnInfo* colInfo = view()->layoutState()->m_columnInfo)
7430 colInfo->updateMinimumColumnHeight(minHeight);
7431 }
7432
7433 static inline LayoutUnit calculateMinimumPageHeight(RenderStyle* renderStyle, Ro otInlineBox* lastLine, LayoutUnit lineTop, LayoutUnit lineBottom)
7434 {
7435 // We may require a certain minimum number of lines per page in order to sat isfy
7436 // orphans and widows, and that may affect the minimum page height.
7437 unsigned lineCount = max<unsigned>(renderStyle->hasAutoOrphans() ? 1 : rende rStyle->orphans(), renderStyle->hasAutoWidows() ? 1 : renderStyle->widows());
7438 if (lineCount > 1) {
7439 RootInlineBox* line = lastLine;
7440 for (unsigned i = 1; i < lineCount && line->prevRootBox(); i++)
7441 line = line->prevRootBox();
7442
7443 // FIXME: Paginating using line overflow isn't all fine. See FIXME in
7444 // adjustLinePositionForPagination() for more details.
7445 LayoutRect overflow = line->logicalVisualOverflowRect(line->lineTop(), l ine->lineBottom());
7446 lineTop = min(line->lineTopWithLeading(), overflow.y());
7447 }
7448 return lineBottom - lineTop;
7449 }
7450
7421 void RenderBlock::adjustLinePositionForPagination(RootInlineBox* lineBox, Layout Unit& delta, RenderFlowThread* flowThread) 7451 void RenderBlock::adjustLinePositionForPagination(RootInlineBox* lineBox, Layout Unit& delta, RenderFlowThread* flowThread)
7422 { 7452 {
7423 // FIXME: For now we paginate using line overflow. This ensures that lines don't overlap at all when we 7453 // FIXME: For now we paginate using line overflow. This ensures that lines don't overlap at all when we
7424 // put a strut between them for pagination purposes. However, this really i sn't the desired rendering, since 7454 // put a strut between them for pagination purposes. However, this really i sn't the desired rendering, since
7425 // the line on the top of the next page will appear too far down relative to the same kind of line at the top 7455 // the line on the top of the next page will appear too far down relative to the same kind of line at the top
7426 // of the first column. 7456 // of the first column.
7427 // 7457 //
7428 // The rendering we would like to see is one where the lineTopWithLeading is at the top of the column, and any line overflow 7458 // The rendering we would like to see is one where the lineTopWithLeading is at the top of the column, and any line overflow
7429 // simply spills out above the top of the column. This effect would match w hat happens at the top of the first column. 7459 // simply spills out above the top of the column. This effect would match w hat happens at the top of the first column.
7430 // We can't achieve this rendering, however, until we stop columns from clip ping to the column bounds (thus allowing 7460 // We can't achieve this rendering, however, until we stop columns from clip ping to the column bounds (thus allowing
7431 // for overflow to occur), and then cache visible overflow for each column r ect. 7461 // for overflow to occur), and then cache visible overflow for each column r ect.
7432 // 7462 //
7433 // Furthermore, the paint we have to do when a column has overflow has to be special. We need to exclude 7463 // Furthermore, the paint we have to do when a column has overflow has to be special. We need to exclude
7434 // content that paints in a previous column (and content that paints in the following column). 7464 // content that paints in a previous column (and content that paints in the following column).
7435 // 7465 //
7436 // For now we'll at least honor the lineTopWithLeading when paginating if it is above the logical top overflow. This will 7466 // For now we'll at least honor the lineTopWithLeading when paginating if it is above the logical top overflow. This will
7437 // at least make positive leading work in typical cases. 7467 // at least make positive leading work in typical cases.
7438 // 7468 //
7439 // FIXME: Another problem with simply moving lines is that the available lin e width may change (because of floats). 7469 // FIXME: Another problem with simply moving lines is that the available lin e width may change (because of floats).
7440 // Technically if the location we move the line to has a different line widt h than our old position, then we need to dirty the 7470 // Technically if the location we move the line to has a different line widt h than our old position, then we need to dirty the
7441 // line and all following lines. 7471 // line and all following lines.
7442 LayoutRect logicalVisualOverflow = lineBox->logicalVisualOverflowRect(lineBo x->lineTop(), lineBox->lineBottom()); 7472 LayoutRect logicalVisualOverflow = lineBox->logicalVisualOverflowRect(lineBo x->lineTop(), lineBox->lineBottom());
7443 LayoutUnit logicalOffset = min(lineBox->lineTopWithLeading(), logicalVisualO verflow.y()); 7473 LayoutUnit logicalOffset = min(lineBox->lineTopWithLeading(), logicalVisualO verflow.y());
7444 LayoutUnit lineHeight = max(lineBox->lineBottomWithLeading(), logicalVisualO verflow.maxY()) - logicalOffset; 7474 LayoutUnit logicalBottom = max(lineBox->lineBottomWithLeading(), logicalVisu alOverflow.maxY());
7445 RenderView* renderView = view(); 7475 LayoutUnit lineHeight = logicalBottom - logicalOffset;
7446 LayoutState* layoutState = renderView->layoutState(); 7476 updateMinimumPageHeight(logicalOffset, calculateMinimumPageHeight(style(), l ineBox, logicalOffset, logicalBottom));
7447 if (layoutState->m_columnInfo)
7448 layoutState->m_columnInfo->updateMinimumColumnHeight(lineHeight);
7449 logicalOffset += delta; 7477 logicalOffset += delta;
7450 lineBox->setPaginationStrut(0); 7478 lineBox->setPaginationStrut(0);
7451 lineBox->setIsFirstAfterPageBreak(false); 7479 lineBox->setIsFirstAfterPageBreak(false);
7452 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); 7480 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset);
7453 bool hasUniformPageLogicalHeight = !flowThread || flowThread->regionsHaveUni formLogicalHeight(); 7481 bool hasUniformPageLogicalHeight = !flowThread || flowThread->regionsHaveUni formLogicalHeight();
7454 // If lineHeight is greater than pageLogicalHeight, but logicalVisualOverflo w.height() still fits, we are 7482 // If lineHeight is greater than pageLogicalHeight, but logicalVisualOverflo w.height() still fits, we are
7455 // still going to add a strut, so that the visible overflow fits on a single page. 7483 // still going to add a strut, so that the visible overflow fits on a single page.
7456 if (!pageLogicalHeight || (hasUniformPageLogicalHeight && logicalVisualOverf low.height() > pageLogicalHeight) 7484 if (!pageLogicalHeight || (hasUniformPageLogicalHeight && logicalVisualOverf low.height() > pageLogicalHeight)
7457 || !hasNextPage(logicalOffset)) 7485 || !hasNextPage(logicalOffset))
7458 return; 7486 return;
7459 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi calOffset, ExcludePageBoundary); 7487 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi calOffset, ExcludePageBoundary);
7460 7488
7461 if (remainingLogicalHeight < lineHeight || (shouldBreakAtLineToAvoidWidow() && lineBreakToAvoidWidow() == lineBox)) { 7489 if (remainingLogicalHeight < lineHeight || (shouldBreakAtLineToAvoidWidow() && lineBreakToAvoidWidow() == lineBox)) {
7462 if (shouldBreakAtLineToAvoidWidow() && lineBreakToAvoidWidow() == lineBo x) 7490 if (shouldBreakAtLineToAvoidWidow() && lineBreakToAvoidWidow() == lineBo x)
7463 clearShouldBreakAtLineToAvoidWidow(); 7491 clearShouldBreakAtLineToAvoidWidow();
7464 // If we have a non-uniform page height, then we have to shift further p ossibly. 7492 // If we have a non-uniform page height, then we have to shift further p ossibly.
7465 if (!hasUniformPageLogicalHeight && !pushToNextPageWithMinimumLogicalHei ght(remainingLogicalHeight, logicalOffset, lineHeight)) 7493 if (!hasUniformPageLogicalHeight && !pushToNextPageWithMinimumLogicalHei ght(remainingLogicalHeight, logicalOffset, lineHeight))
7466 return; 7494 return;
7467 if (lineHeight > pageLogicalHeight) { 7495 if (lineHeight > pageLogicalHeight) {
7468 // Split the top margin in order to avoid splitting the visible part of the line. 7496 // Split the top margin in order to avoid splitting the visible part of the line.
7469 remainingLogicalHeight -= min(lineHeight - pageLogicalHeight, max<La youtUnit>(0, logicalVisualOverflow.y() - lineBox->lineTopWithLeading())); 7497 remainingLogicalHeight -= min(lineHeight - pageLogicalHeight, max<La youtUnit>(0, logicalVisualOverflow.y() - lineBox->lineTopWithLeading()));
7470 } 7498 }
7471 LayoutUnit totalLogicalHeight = lineHeight + max<LayoutUnit>(0, logicalO ffset); 7499 LayoutUnit totalLogicalHeight = lineHeight + max<LayoutUnit>(0, logicalO ffset);
7472 LayoutUnit pageLogicalHeightAtNewOffset = hasUniformPageLogicalHeight ? pageLogicalHeight : pageLogicalHeightForOffset(logicalOffset + remainingLogicalH eight); 7500 LayoutUnit pageLogicalHeightAtNewOffset = hasUniformPageLogicalHeight ? pageLogicalHeight : pageLogicalHeightForOffset(logicalOffset + remainingLogicalH eight);
7501 setPageBreak(logicalOffset, lineHeight - remainingLogicalHeight);
7473 if (((lineBox == firstRootBox() && totalLogicalHeight < pageLogicalHeigh tAtNewOffset) || (!style()->hasAutoOrphans() && style()->orphans() >= lineCount( lineBox))) 7502 if (((lineBox == firstRootBox() && totalLogicalHeight < pageLogicalHeigh tAtNewOffset) || (!style()->hasAutoOrphans() && style()->orphans() >= lineCount( lineBox)))
7474 && !isOutOfFlowPositioned() && !isTableCell()) 7503 && !isOutOfFlowPositioned() && !isTableCell())
7475 setPaginationStrut(remainingLogicalHeight + max<LayoutUnit>(0, logic alOffset)); 7504 setPaginationStrut(remainingLogicalHeight + max<LayoutUnit>(0, logic alOffset));
7476 else { 7505 else {
7477 delta += remainingLogicalHeight; 7506 delta += remainingLogicalHeight;
7478 lineBox->setPaginationStrut(remainingLogicalHeight); 7507 lineBox->setPaginationStrut(remainingLogicalHeight);
7479 lineBox->setIsFirstAfterPageBreak(true); 7508 lineBox->setIsFirstAfterPageBreak(true);
7480 } 7509 }
7481 } else if (remainingLogicalHeight == pageLogicalHeight && lineBox != firstRo otBox()) 7510 } else if (remainingLogicalHeight == pageLogicalHeight && lineBox != firstRo otBox())
7482 lineBox->setIsFirstAfterPageBreak(true); 7511 lineBox->setIsFirstAfterPageBreak(true);
(...skipping 26 matching lines...) Expand all
7509 7538
7510 // Our guess was wrong. Make the child lay itself out again. 7539 // Our guess was wrong. Make the child lay itself out again.
7511 child->layoutIfNeeded(); 7540 child->layoutIfNeeded();
7512 } 7541 }
7513 7542
7514 LayoutUnit oldTop = logicalTopAfterClear; 7543 LayoutUnit oldTop = logicalTopAfterClear;
7515 7544
7516 // If the object has a page or column break value of "before", then we shoul d shift to the top of the next page. 7545 // If the object has a page or column break value of "before", then we shoul d shift to the top of the next page.
7517 LayoutUnit result = applyBeforeBreak(child, logicalTopAfterClear); 7546 LayoutUnit result = applyBeforeBreak(child, logicalTopAfterClear);
7518 7547
7548 if (pageLogicalHeightForOffset(result)) {
7549 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset( result, ExcludePageBoundary);
7550 LayoutUnit spaceShortage = child->logicalHeight() - remainingLogicalHeig ht;
7551 if (spaceShortage > 0) {
7552 // If the child crosses a column boundary, report a break, in case n othing inside it has already
7553 // done so. The column balancer needs to know how much it has to str etch the columns to make more
7554 // content fit. If no breaks are reported (but do occur), the balanc er will have no clue. FIXME:
7555 // This should be improved, though, because here we just pretend tha t the child is
7556 // unsplittable. A splittable child, on the other hand, has break op portunities at every position
7557 // where there's no child content, border or padding. In other words , we risk stretching more
7558 // than necessary.
7559 setPageBreak(result, spaceShortage);
7560 }
7561 }
7562
7519 // For replaced elements and scrolled elements, we want to shift them to the next page if they don't fit on the current one. 7563 // For replaced elements and scrolled elements, we want to shift them to the next page if they don't fit on the current one.
7520 LayoutUnit logicalTopBeforeUnsplittableAdjustment = result; 7564 LayoutUnit logicalTopBeforeUnsplittableAdjustment = result;
7521 LayoutUnit logicalTopAfterUnsplittableAdjustment = adjustForUnsplittableChil d(child, result); 7565 LayoutUnit logicalTopAfterUnsplittableAdjustment = adjustForUnsplittableChil d(child, result);
7522 7566
7523 LayoutUnit paginationStrut = 0; 7567 LayoutUnit paginationStrut = 0;
7524 LayoutUnit unsplittableAdjustmentDelta = logicalTopAfterUnsplittableAdjustme nt - logicalTopBeforeUnsplittableAdjustment; 7568 LayoutUnit unsplittableAdjustmentDelta = logicalTopAfterUnsplittableAdjustme nt - logicalTopBeforeUnsplittableAdjustment;
7525 if (unsplittableAdjustmentDelta) 7569 if (unsplittableAdjustmentDelta)
7526 paginationStrut = unsplittableAdjustmentDelta; 7570 paginationStrut = unsplittableAdjustmentDelta;
7527 else if (childRenderBlock && childRenderBlock->paginationStrut()) 7571 else if (childRenderBlock && childRenderBlock->paginationStrut())
7528 paginationStrut = childRenderBlock->paginationStrut(); 7572 paginationStrut = childRenderBlock->paginationStrut();
(...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after
8104 { 8148 {
8105 memoryInstrumentation->addRootObject(gColumnInfoMap, WebCoreMemoryTypes::Ren deringStructures); 8149 memoryInstrumentation->addRootObject(gColumnInfoMap, WebCoreMemoryTypes::Ren deringStructures);
8106 memoryInstrumentation->addRootObject(gPositionedDescendantsMap, WebCoreMemor yTypes::RenderingStructures); 8150 memoryInstrumentation->addRootObject(gPositionedDescendantsMap, WebCoreMemor yTypes::RenderingStructures);
8107 memoryInstrumentation->addRootObject(gPercentHeightDescendantsMap, WebCoreMe moryTypes::RenderingStructures); 8151 memoryInstrumentation->addRootObject(gPercentHeightDescendantsMap, WebCoreMe moryTypes::RenderingStructures);
8108 memoryInstrumentation->addRootObject(gPositionedContainerMap, WebCoreMemoryT ypes::RenderingStructures); 8152 memoryInstrumentation->addRootObject(gPositionedContainerMap, WebCoreMemoryT ypes::RenderingStructures);
8109 memoryInstrumentation->addRootObject(gPercentHeightContainerMap, WebCoreMemo ryTypes::RenderingStructures); 8153 memoryInstrumentation->addRootObject(gPercentHeightContainerMap, WebCoreMemo ryTypes::RenderingStructures);
8110 memoryInstrumentation->addRootObject(gDelayedUpdateScrollInfoSet, WebCoreMem oryTypes::RenderingStructures); 8154 memoryInstrumentation->addRootObject(gDelayedUpdateScrollInfoSet, WebCoreMem oryTypes::RenderingStructures);
8111 } 8155 }
8112 8156
8113 } // namespace WebCore 8157 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderBlock.h ('k') | Source/core/rendering/RenderBox.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698