| Index: third_party/WebKit/Source/core/layout/TextAutosizer.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/TextAutosizer.cpp b/third_party/WebKit/Source/core/layout/TextAutosizer.cpp
|
| index 52f838534546151afd49ff3a41f589996f509d5a..252227f96d1e043dbc5ae190f083d6a47bf88fc2 100644
|
| --- a/third_party/WebKit/Source/core/layout/TextAutosizer.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/TextAutosizer.cpp
|
| @@ -154,8 +154,9 @@ static bool isPotentialClusterRoot(const LayoutObject* layoutObject) {
|
| // maintain consistency with documents that have no child nodes but may
|
| // still have LayoutObject children.
|
| // - Must not be inline, as different multipliers on one line looks terrible.
|
| - // Exceptions are inline-block and alike elements (inline-table, -webkit-inline-*),
|
| - // as they often contain entire multi-line columns of text.
|
| + // Exceptions are inline-block and alike elements (inline-table,
|
| + // -webkit-inline-*), as they often contain entire multi-line columns of
|
| + // text.
|
| // - Must not be normal list items, as items in the same list should look
|
| // consistent, unless they are floating or position:absolute/fixed.
|
| Node* node = layoutObject->generatingNode();
|
| @@ -227,17 +228,20 @@ static bool blockIsRowOfLinks(const LayoutBlock* block) {
|
| }
|
|
|
| static bool blockHeightConstrained(const LayoutBlock* block) {
|
| - // FIXME: Propagate constrainedness down the tree, to avoid inefficiently walking back up from each box.
|
| + // FIXME: Propagate constrainedness down the tree, to avoid inefficiently
|
| + // walking back up from each box.
|
| // FIXME: This code needs to take into account vertical writing modes.
|
| - // FIXME: Consider additional heuristics, such as ignoring fixed heights if the content is already overflowing before autosizing kicks in.
|
| + // FIXME: Consider additional heuristics, such as ignoring fixed heights if
|
| + // the content is already overflowing before autosizing kicks in.
|
| for (; block; block = block->containingBlock()) {
|
| const ComputedStyle& style = block->styleRef();
|
| if (style.overflowY() >= OverflowScroll)
|
| return false;
|
| if (style.height().isSpecified() || style.maxHeight().isSpecified() ||
|
| block->isOutOfFlowPositioned()) {
|
| - // Some sites (e.g. wikipedia) set their html and/or body elements to height:100%,
|
| - // without intending to constrain the height of the content within them.
|
| + // Some sites (e.g. wikipedia) set their html and/or body elements to
|
| + // height:100%, without intending to constrain the height of the content
|
| + // within them.
|
| return !block->isDocumentElement() && !block->isBody() &&
|
| !block->isLayoutView();
|
| }
|
| @@ -280,8 +284,8 @@ static bool blockSuppressesAutosizing(const LayoutBlock* block) {
|
| }
|
|
|
| static bool hasExplicitWidth(const LayoutBlock* block) {
|
| - // FIXME: This heuristic may need to be expanded to other ways a block can be wider or narrower
|
| - // than its parent containing block.
|
| + // FIXME: This heuristic may need to be expanded to other ways a block can be
|
| + // wider or narrower than its parent containing block.
|
| return block->style() && block->style()->width().isSpecified();
|
| }
|
|
|
| @@ -393,8 +397,8 @@ void TextAutosizer::inflateAutoTable(LayoutTable* table) {
|
| if (cluster->m_root != table)
|
| return;
|
|
|
| - // Pre-inflate cells that have enough text so that their inflated preferred widths will be used
|
| - // for column sizing.
|
| + // Pre-inflate cells that have enough text so that their inflated preferred
|
| + // widths will be used for column sizing.
|
| for (LayoutObject* section = table->firstChild(); section;
|
| section = section->nextSibling()) {
|
| if (!section->isTableSection())
|
| @@ -449,8 +453,8 @@ float TextAutosizer::inflate(LayoutObject* parent,
|
| while (child) {
|
| if (child->isText()) {
|
| hasTextChild = true;
|
| - // We only calculate this multiplier on-demand to ensure the parent block of this text
|
| - // has entered layout.
|
| + // We only calculate this multiplier on-demand to ensure the parent block
|
| + // of this text has entered layout.
|
| if (!multiplier)
|
| multiplier =
|
| cluster->m_flags & SUPPRESSING ? 1.0f : clusterMultiplier(cluster);
|
| @@ -473,8 +477,8 @@ float TextAutosizer::inflate(LayoutObject* parent,
|
| applyMultiplier(parent, multiplier,
|
| layouter); // Parent handles line spacing.
|
| } else if (!parent->isListItem()) {
|
| - // For consistency, a block with no immediate text child should always have a
|
| - // multiplier of 1.
|
| + // For consistency, a block with no immediate text child should always have
|
| + // a multiplier of 1.
|
| applyMultiplier(parent, 1, layouter);
|
| }
|
|
|
| @@ -482,10 +486,10 @@ float TextAutosizer::inflate(LayoutObject* parent,
|
| float multiplier = clusterMultiplier(cluster);
|
| applyMultiplier(parent, multiplier, layouter);
|
|
|
| - // The list item has to be treated special because we can have a tree such that you have
|
| - // a list item for a form inside it. The list marker then ends up inside the form and when
|
| - // we try to get the clusterMultiplier we have the wrong cluster root to work from and get
|
| - // the wrong value.
|
| + // The list item has to be treated special because we can have a tree such
|
| + // that you have a list item for a form inside it. The list marker then ends
|
| + // up inside the form and when we try to get the clusterMultiplier we have
|
| + // the wrong cluster root to work from and get the wrong value.
|
| LayoutListItem* item = toLayoutListItem(parent);
|
| if (LayoutListMarker* marker = item->marker()) {
|
| applyMultiplier(marker, multiplier, layouter);
|
| @@ -559,19 +563,22 @@ void TextAutosizer::updatePageInfo() {
|
| m_pageInfo.m_layoutWidth =
|
| horizontalWritingMode ? layoutSize.width() : layoutSize.height();
|
|
|
| - // TODO(pdr): Accessibility should be moved out of the text autosizer. See: crbug.com/645717.
|
| + // TODO(pdr): Accessibility should be moved out of the text autosizer. See:
|
| + // crbug.com/645717.
|
| m_pageInfo.m_accessibilityFontScaleFactor =
|
| m_document->settings()->accessibilityFontScaleFactor();
|
|
|
| - // If the page has a meta viewport or @viewport, don't apply the device scale adjustment.
|
| + // If the page has a meta viewport or @viewport, don't apply the device
|
| + // scale adjustment.
|
| if (!mainFrame->document()->viewportDescription().isSpecifiedByAuthor())
|
| m_pageInfo.m_deviceScaleAdjustment =
|
| m_document->settings()->deviceScaleAdjustment();
|
| else
|
| m_pageInfo.m_deviceScaleAdjustment = 1.0f;
|
|
|
| - // TODO(pdr): pageNeedsAutosizing should take into account whether text-size-adjust is used
|
| - // anywhere on the page because that also needs to trigger autosizing. See: crbug.com/646237.
|
| + // TODO(pdr): pageNeedsAutosizing should take into account whether
|
| + // text-size-adjust is used anywhere on the page because that also needs to
|
| + // trigger autosizing. See: crbug.com/646237.
|
| m_pageInfo.m_pageNeedsAutosizing =
|
| !!m_pageInfo.m_frameWidth &&
|
| (m_pageInfo.m_accessibilityFontScaleFactor *
|
| @@ -582,7 +589,8 @@ void TextAutosizer::updatePageInfo() {
|
| }
|
|
|
| if (m_pageInfo.m_pageNeedsAutosizing) {
|
| - // If page info has changed, multipliers may have changed. Force a layout to recompute them.
|
| + // If page info has changed, multipliers may have changed. Force a layout to
|
| + // recompute them.
|
| if (m_pageInfo.m_frameWidth != previousPageInfo.m_frameWidth ||
|
| m_pageInfo.m_layoutWidth != previousPageInfo.m_layoutWidth ||
|
| m_pageInfo.m_accessibilityFontScaleFactor !=
|
| @@ -592,8 +600,8 @@ void TextAutosizer::updatePageInfo() {
|
| m_pageInfo.m_settingEnabled != previousPageInfo.m_settingEnabled)
|
| setAllTextNeedsLayout();
|
| } else if (previousPageInfo.m_hasAutosized) {
|
| - // If we are no longer autosizing the page, we won't do anything during the next layout.
|
| - // Set all the multipliers back to 1 now.
|
| + // If we are no longer autosizing the page, we won't do anything during the
|
| + // next layout. Set all the multipliers back to 1 now.
|
| resetMultipliers();
|
| m_pageInfo.m_hasAutosized = false;
|
| }
|
| @@ -670,7 +678,8 @@ bool TextAutosizer::clusterHasEnoughTextToAutosize(
|
| if (!widthProvider)
|
| widthProvider = clusterWidthProvider(root);
|
|
|
| - // TextAreas and user-modifiable areas get a free pass to autosize regardless of text content.
|
| + // TextAreas and user-modifiable areas get a free pass to autosize regardless
|
| + // of text content.
|
| if (root->isTextArea() ||
|
| (root->style() && root->style()->userModify() != READ_ONLY)) {
|
| cluster->m_hasEnoughTextToAutosize = HasEnoughText;
|
| @@ -694,8 +703,9 @@ bool TextAutosizer::clusterHasEnoughTextToAutosize(
|
| continue;
|
| }
|
| } else if (descendant->isText()) {
|
| - // Note: Using text().stripWhiteSpace().length() instead of resolvedTextLength() because
|
| - // the lineboxes will not be built until layout. These values can be different.
|
| + // Note: Using text().stripWhiteSpace().length() instead of
|
| + // resolvedTextLength() because the lineboxes will not be built until
|
| + // layout. These values can be different.
|
| // Note: This is an approximation assuming each character is 1em wide.
|
| length += toLayoutText(descendant)->text().stripWhiteSpace().length() *
|
| descendant->style()->specifiedFontSize();
|
| @@ -771,7 +781,8 @@ TextAutosizer::Cluster* TextAutosizer::maybeCreateCluster(
|
| m_clusterStack.isEmpty() ? nullptr : currentCluster();
|
| ASSERT(parentCluster || block->isLayoutView());
|
|
|
| - // If a non-independent block would not alter the SUPPRESSING flag, it doesn't need to be a cluster.
|
| + // If a non-independent block would not alter the SUPPRESSING flag, it doesn't
|
| + // need to be a cluster.
|
| bool parentSuppresses =
|
| parentCluster && (parentCluster->m_flags & SUPPRESSING);
|
| if (!(flags & INDEPENDENT) && !(flags & EXPLICIT_WIDTH) &&
|
| @@ -906,8 +917,8 @@ float TextAutosizer::widthFromBlock(const LayoutBlock* block) const {
|
| if (!block->containingBlock())
|
| return 0;
|
|
|
| - // Tables may be inflated before computing their preferred widths. Try several methods to
|
| - // obtain a width, and fall back on a containing block's width.
|
| + // Tables may be inflated before computing their preferred widths. Try several
|
| + // methods to obtain a width, and fall back on a containing block's width.
|
| for (; block; block = block->containingBlock()) {
|
| float width;
|
| Length specifiedWidth =
|
| @@ -932,9 +943,10 @@ float TextAutosizer::widthFromBlock(const LayoutBlock* block) const {
|
| }
|
|
|
| float TextAutosizer::multiplierFromBlock(const LayoutBlock* block) {
|
| - // If block->needsLayout() is false, it does not need to be in m_blocksThatHaveBegunLayout.
|
| - // This can happen during layout of a positioned object if the cluster's DBCAT is deeper
|
| - // than the positioned object's containing block, and wasn't marked as needing layout.
|
| + // If block->needsLayout() is false, it does not need to be in
|
| + // m_blocksThatHaveBegunLayout. This can happen during layout of a positioned
|
| + // object if the cluster's DBCAT is deeper than the positioned object's
|
| + // containing block, and wasn't marked as needing layout.
|
| ASSERT(m_blocksThatHaveBegunLayout.contains(block) || !block->needsLayout());
|
|
|
| // Block width, in CSS pixels.
|
| @@ -969,7 +981,8 @@ const LayoutBlock* TextAutosizer::deepestBlockContainingAllText(
|
| const LayoutObject* lastTextLeaf = findTextLeaf(root, lastDepth, Last);
|
| ASSERT(lastTextLeaf);
|
|
|
| - // Equalize the depths if necessary. Only one of the while loops below will get executed.
|
| + // Equalize the depths if necessary. Only one of the while loops below will
|
| + // get executed.
|
| const LayoutObject* firstNode = firstTextLeaf;
|
| const LayoutObject* lastNode = lastTextLeaf;
|
| while (firstDepth > lastDepth) {
|
| @@ -981,7 +994,8 @@ const LayoutBlock* TextAutosizer::deepestBlockContainingAllText(
|
| --lastDepth;
|
| }
|
|
|
| - // Go up from both nodes until the parent is the same. Both pointers will point to the LCA then.
|
| + // Go up from both nodes until the parent is the same. Both pointers will
|
| + // point to the LCA then.
|
| while (firstNode != lastNode) {
|
| firstNode = firstNode->parent();
|
| lastNode = lastNode->parent();
|
| @@ -990,10 +1004,11 @@ const LayoutBlock* TextAutosizer::deepestBlockContainingAllText(
|
| if (firstNode->isLayoutBlock())
|
| return toLayoutBlock(firstNode);
|
|
|
| - // containingBlock() should never leave the cluster, since it only skips ancestors when finding
|
| - // the container of position:absolute/fixed blocks, and those cannot exist between a cluster and
|
| - // its text node's lowest common ancestor as isAutosizingCluster would have made them into their
|
| - // own independent cluster.
|
| + // containingBlock() should never leave the cluster, since it only skips
|
| + // ancestors when finding the container of position:absolute/fixed blocks, and
|
| + // those cannot exist between a cluster and its text node's lowest common
|
| + // ancestor as isAutosizingCluster would have made them into their own
|
| + // independent cluster.
|
| const LayoutBlock* containingBlock = firstNode->containingBlock();
|
| if (!containingBlock)
|
| return root;
|
| @@ -1017,8 +1032,9 @@ const LayoutObject* TextAutosizer::findTextLeaf(
|
| const LayoutObject* child = (firstOrLast == First) ? parent->slowFirstChild()
|
| : parent->slowLastChild();
|
| while (child) {
|
| - // Note: At this point clusters may not have been created for these blocks so we cannot rely
|
| - // on m_clusters. Instead, we use a best-guess about whether the block will become a cluster.
|
| + // Note: At this point clusters may not have been created for these blocks
|
| + // so we cannot rely on m_clusters. Instead, we use a best-guess about
|
| + // whether the block will become a cluster.
|
| if (!classifyBlock(child, INDEPENDENT)) {
|
| if (const LayoutObject* leaf = findTextLeaf(child, depth, firstOrLast))
|
| return leaf;
|
| @@ -1038,8 +1054,9 @@ void TextAutosizer::applyMultiplier(LayoutObject* layoutObject,
|
| ASSERT(layoutObject);
|
| ComputedStyle& currentStyle = layoutObject->mutableStyleRef();
|
| if (!currentStyle.getTextSizeAdjust().isAuto()) {
|
| - // The accessibility font scale factor is applied by the autosizer so we need to apply that
|
| - // scale factor on top of the text-size-adjust multiplier.
|
| + // The accessibility font scale factor is applied by the autosizer so we
|
| + // need to apply that scale factor on top of the text-size-adjust
|
| + // multiplier.
|
| multiplier = currentStyle.getTextSizeAdjust().multiplier() *
|
| m_pageInfo.m_accessibilityFontScaleFactor;
|
| } else if (multiplier < 1) {
|
| @@ -1057,8 +1074,9 @@ void TextAutosizer::applyMultiplier(LayoutObject* layoutObject,
|
|
|
| switch (relayoutBehavior) {
|
| case AlreadyInLayout:
|
| - // Don't free currentStyle until the end of the layout pass. This allows other parts of the system
|
| - // to safely hold raw ComputedStyle* pointers during layout, e.g. BreakingContext::m_currentStyle.
|
| + // Don't free currentStyle until the end of the layout pass. This allows
|
| + // other parts of the system to safely hold raw ComputedStyle* pointers
|
| + // during layout, e.g. BreakingContext::m_currentStyle.
|
| m_stylesRetainedDuringLayout.append(¤tStyle);
|
|
|
| layoutObject->setStyleInternal(style.release());
|
| @@ -1095,13 +1113,14 @@ bool TextAutosizer::isWiderOrNarrowerDescendant(Cluster* cluster) {
|
| float clusterTextWidth =
|
| parentDeepestBlockContainingAllText->contentLogicalWidth().toFloat();
|
|
|
| - // Clusters with a root that is wider than the deepestBlockContainingAllText of their parent
|
| - // autosize independently of their parent.
|
| + // Clusters with a root that is wider than the deepestBlockContainingAllText
|
| + // of their parent autosize independently of their parent.
|
| if (contentWidth > clusterTextWidth)
|
| return true;
|
|
|
| - // Clusters with a root that is significantly narrower than the deepestBlockContainingAllText of
|
| - // their parent autosize independently of their parent.
|
| + // Clusters with a root that is significantly narrower than the
|
| + // deepestBlockContainingAllText of their parent autosize independently of
|
| + // their parent.
|
| static float narrowWidthDifference = 200;
|
| if (clusterTextWidth - contentWidth > narrowWidthDifference)
|
| return true;
|
| @@ -1130,8 +1149,8 @@ TextAutosizer::Cluster::Cluster(const LayoutBlock* root,
|
|
|
| #if ENABLE(ASSERT)
|
| void TextAutosizer::FingerprintMapper::assertMapsAreConsistent() {
|
| - // For each fingerprint -> block mapping in m_blocksForFingerprint we should have an associated
|
| - // map from block -> fingerprint in m_fingerprints.
|
| + // For each fingerprint -> block mapping in m_blocksForFingerprint we should
|
| + // have an associated map from block -> fingerprint in m_fingerprints.
|
| ReverseFingerprintMap::iterator end = m_blocksForFingerprint.end();
|
| for (ReverseFingerprintMap::iterator fingerprintIt =
|
| m_blocksForFingerprint.begin();
|
| @@ -1265,7 +1284,8 @@ float TextAutosizer::computeAutosizedFontSize(float specifiedSize,
|
| const float gradientAfterPleasantSize = 0.5;
|
|
|
| float computedSize;
|
| - // Skip linear backoff for multipliers that shrink the size or when the font sizes are small.
|
| + // Skip linear backoff for multipliers that shrink the size or when the font
|
| + // sizes are small.
|
| if (multiplier <= 1 || specifiedSize <= pleasantSize) {
|
| computedSize = multiplier * specifiedSize;
|
| } else {
|
|
|