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

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

Issue 26390004: Rework SVG sizing (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix mishap during rebase in svg.css Created 6 years, 8 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2000 Dirk Mueller (mueller@kde.org) 3 * Copyright (C) 2000 Dirk Mueller (mueller@kde.org)
4 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. 4 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
5 * Copyright (C) Research In Motion Limited 2011-2012. All rights reserved. 5 * Copyright (C) Research In Motion Limited 2011-2012. All rights reserved.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public 8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 // this node to change it's preferred width because it maintains aspect rati o. 264 // this node to change it's preferred width because it maintains aspect rati o.
265 return hasRelativeLogicalHeight() && style()->logicalWidth().isAuto() && !ha sAutoHeightOrContainingBlockWithAutoHeight(); 265 return hasRelativeLogicalHeight() && style()->logicalWidth().isAuto() && !ha sAutoHeightOrContainingBlockWithAutoHeight();
266 } 266 }
267 267
268 static inline bool rendererHasAspectRatio(const RenderObject* renderer) 268 static inline bool rendererHasAspectRatio(const RenderObject* renderer)
269 { 269 {
270 ASSERT(renderer); 270 ASSERT(renderer);
271 return renderer->isImage() || renderer->isCanvas() || renderer->isVideo(); 271 return renderer->isImage() || renderer->isCanvas() || renderer->isVideo();
272 } 272 }
273 273
274 void RenderReplaced::computeAspectRatioInformationForRenderBox(RenderBox* conten tRenderer, FloatSize& constrainedSize, double& intrinsicRatio, bool& isPercentag eIntrinsicSize) const 274 void RenderReplaced::computeAspectRatioInformationForRenderBox(RenderBox* conten tRenderer, FloatSize& constrainedSize, double& intrinsicRatio) const
275 { 275 {
276 FloatSize intrinsicSize; 276 FloatSize intrinsicSize;
277 if (contentRenderer) { 277 if (contentRenderer) {
278 contentRenderer->computeIntrinsicRatioInformation(intrinsicSize, intrins icRatio, isPercentageIntrinsicSize); 278 contentRenderer->computeIntrinsicRatioInformation(intrinsicSize, intrins icRatio);
279 if (intrinsicRatio)
280 ASSERT(!isPercentageIntrinsicSize);
281 279
282 // Handle zoom & vertical writing modes here, as the embedded document d oesn't know about them. 280 // Handle zoom & vertical writing modes here, as the embedded document d oesn't know about them.
283 if (!isPercentageIntrinsicSize) { 281 intrinsicSize.scale(style()->effectiveZoom());
284 intrinsicSize.scale(style()->effectiveZoom()); 282 if (isRenderImage())
285 if (isRenderImage()) 283 intrinsicSize.scale(toRenderImage(this)->imageDevicePixelRatio());
286 intrinsicSize.scale(toRenderImage(this)->imageDevicePixelRatio() );
287 }
288
289 if (rendererHasAspectRatio(this) && isPercentageIntrinsicSize)
290 intrinsicRatio = 1;
291 284
292 // Update our intrinsic size to match what the content renderer has comp uted, so that when we 285 // Update our intrinsic size to match what the content renderer has comp uted, so that when we
293 // constrain the size below, the correct intrinsic size will be obtained for comparison against 286 // constrain the size below, the correct intrinsic size will be obtained for comparison against
294 // min and max widths. 287 // min and max widths.
295 if (intrinsicRatio && !isPercentageIntrinsicSize && !intrinsicSize.isEmp ty()) 288 if (intrinsicRatio && !intrinsicSize.isEmpty())
296 m_intrinsicSize = LayoutSize(intrinsicSize); 289 m_intrinsicSize = LayoutSize(intrinsicSize);
297 290
298 if (!isHorizontalWritingMode()) { 291 if (!isHorizontalWritingMode()) {
299 if (intrinsicRatio) 292 if (intrinsicRatio)
300 intrinsicRatio = 1 / intrinsicRatio; 293 intrinsicRatio = 1 / intrinsicRatio;
301 intrinsicSize = intrinsicSize.transposedSize(); 294 intrinsicSize = intrinsicSize.transposedSize();
302 } 295 }
303 } else { 296 } else {
304 computeIntrinsicRatioInformation(intrinsicSize, intrinsicRatio, isPercen tageIntrinsicSize); 297 computeIntrinsicRatioInformation(intrinsicSize, intrinsicRatio);
305 if (intrinsicRatio) { 298 if (intrinsicRatio && !intrinsicSize.isEmpty())
306 ASSERT(!isPercentageIntrinsicSize); 299 m_intrinsicSize = LayoutSize(isHorizontalWritingMode() ? intrinsicSi ze : intrinsicSize.transposedSize());
307 if (!intrinsicSize.isEmpty())
308 m_intrinsicSize = LayoutSize(isHorizontalWritingMode() ? intrins icSize : intrinsicSize.transposedSize());
309 }
310 } 300 }
311 301
312 // Now constrain the intrinsic size along each axis according to minimum and maximum width/heights along the 302 // Now constrain the intrinsic size along each axis according to minimum and maximum width/heights along the
313 // opposite axis. So for example a maximum width that shrinks our width will result in the height we compute here 303 // opposite axis. So for example a maximum width that shrinks our width will result in the height we compute here
314 // having to shrink in order to preserve the aspect ratio. Because we comput e these values independently along 304 // having to shrink in order to preserve the aspect ratio. Because we comput e these values independently along
315 // each axis, the final returned size may in fact not preserve the aspect ra tio. 305 // each axis, the final returned size may in fact not preserve the aspect ra tio.
316 // FIXME: In the long term, it might be better to just return this code more to the way it used to be before this 306 // FIXME: In the long term, it might be better to just return this code more to the way it used to be before this
317 // function was added, since all it has done is make the code more unclear. 307 // function was added, since all it has done is make the code more unclear.
318 constrainedSize = intrinsicSize; 308 constrainedSize = intrinsicSize;
319 if (intrinsicRatio && !isPercentageIntrinsicSize && !intrinsicSize.isEmpty() && style()->logicalWidth().isAuto() && style()->logicalHeight().isAuto()) { 309 if (intrinsicRatio && !intrinsicSize.isEmpty() && style()->logicalWidth().is Auto() && style()->logicalHeight().isAuto()) {
320 // We can't multiply or divide by 'intrinsicRatio' here, it breaks tests , like fast/images/zoomed-img-size.html, which 310 // We can't multiply or divide by 'intrinsicRatio' here, it breaks tests , like fast/images/zoomed-img-size.html, which
321 // can only be fixed once subpixel precision is available for things lik e intrinsicWidth/Height - which include zoom! 311 // can only be fixed once subpixel precision is available for things lik e intrinsicWidth/Height - which include zoom!
322 constrainedSize.setWidth(RenderBox::computeReplacedLogicalHeight() * int rinsicSize.width() / intrinsicSize.height()); 312 constrainedSize.setWidth(RenderBox::computeReplacedLogicalHeight() * int rinsicSize.width() / intrinsicSize.height());
323 constrainedSize.setHeight(RenderBox::computeReplacedLogicalWidth() * int rinsicSize.height() / intrinsicSize.width()); 313 constrainedSize.setHeight(RenderBox::computeReplacedLogicalWidth() * int rinsicSize.height() / intrinsicSize.width());
324 } 314 }
325 } 315 }
326 316
327 LayoutRect RenderReplaced::replacedContentRect(const LayoutSize* overriddenIntri nsicSize) const 317 LayoutRect RenderReplaced::replacedContentRect(const LayoutSize* overriddenIntri nsicSize) const
328 { 318 {
329 LayoutRect contentRect = contentBoxRect(); 319 LayoutRect contentRect = contentBoxRect();
(...skipping 27 matching lines...) Expand all
357 ASSERT_NOT_REACHED(); 347 ASSERT_NOT_REACHED();
358 } 348 }
359 349
360 LayoutUnit xOffset = minimumValueForLength(style()->objectPosition().x(), co ntentRect.width() - finalRect.width()); 350 LayoutUnit xOffset = minimumValueForLength(style()->objectPosition().x(), co ntentRect.width() - finalRect.width());
361 LayoutUnit yOffset = minimumValueForLength(style()->objectPosition().y(), co ntentRect.height() - finalRect.height()); 351 LayoutUnit yOffset = minimumValueForLength(style()->objectPosition().y(), co ntentRect.height() - finalRect.height());
362 finalRect.move(xOffset, yOffset); 352 finalRect.move(xOffset, yOffset);
363 353
364 return finalRect; 354 return finalRect;
365 } 355 }
366 356
367 void RenderReplaced::computeIntrinsicRatioInformation(FloatSize& intrinsicSize, double& intrinsicRatio, bool& isPercentageIntrinsicSize) const 357 void RenderReplaced::computeIntrinsicRatioInformation(FloatSize& intrinsicSize, double& intrinsicRatio) const
368 { 358 {
369 // If there's an embeddedContentBox() of a remote, referenced document avail able, this code-path should never be used. 359 // If there's an embeddedContentBox() of a remote, referenced document avail able, this code-path should never be used.
370 ASSERT(!embeddedContentBox()); 360 ASSERT(!embeddedContentBox());
371 isPercentageIntrinsicSize = false;
372 intrinsicSize = FloatSize(intrinsicLogicalWidth().toFloat(), intrinsicLogica lHeight().toFloat()); 361 intrinsicSize = FloatSize(intrinsicLogicalWidth().toFloat(), intrinsicLogica lHeight().toFloat());
373 362
374 // Figure out if we need to compute an intrinsic ratio. 363 // Figure out if we need to compute an intrinsic ratio.
375 if (intrinsicSize.isEmpty() || !rendererHasAspectRatio(this)) 364 if (intrinsicSize.isEmpty() || !rendererHasAspectRatio(this))
376 return; 365 return;
377 366
378 intrinsicRatio = intrinsicSize.width() / intrinsicSize.height(); 367 intrinsicRatio = intrinsicSize.width() / intrinsicSize.height();
379 } 368 }
380 369
381 LayoutUnit RenderReplaced::computeReplacedLogicalWidth(ShouldComputePreferred sh ouldComputePreferred) const 370 LayoutUnit RenderReplaced::computeReplacedLogicalWidth(ShouldComputePreferred sh ouldComputePreferred) const
382 { 371 {
383 if (style()->logicalWidth().isSpecified() || style()->logicalWidth().isIntri nsic()) 372 if (style()->logicalWidth().isSpecified() || style()->logicalWidth().isIntri nsic())
384 return computeReplacedLogicalWidthRespectingMinMaxWidth(computeReplacedL ogicalWidthUsing(style()->logicalWidth()), shouldComputePreferred); 373 return computeReplacedLogicalWidthRespectingMinMaxWidth(computeReplacedL ogicalWidthUsing(style()->logicalWidth()), shouldComputePreferred);
385 374
386 RenderBox* contentRenderer = embeddedContentBox(); 375 RenderBox* contentRenderer = embeddedContentBox();
387 376
388 // 10.3.2 Inline, replaced elements: http://www.w3.org/TR/CSS21/visudet.html #inline-replaced-width 377 // 10.3.2 Inline, replaced elements: http://www.w3.org/TR/CSS21/visudet.html #inline-replaced-width
389 bool isPercentageIntrinsicSize = false;
390 double intrinsicRatio = 0; 378 double intrinsicRatio = 0;
391 FloatSize constrainedSize; 379 FloatSize constrainedSize;
392 computeAspectRatioInformationForRenderBox(contentRenderer, constrainedSize, intrinsicRatio, isPercentageIntrinsicSize); 380 computeAspectRatioInformationForRenderBox(contentRenderer, constrainedSize, intrinsicRatio);
393 381
394 if (style()->logicalWidth().isAuto()) { 382 if (style()->logicalWidth().isAuto()) {
395 bool heightIsAuto = style()->logicalHeight().isAuto(); 383 bool computedHeightIsAuto = hasAutoHeightOrContainingBlockWithAutoHeight ();
396 bool hasIntrinsicWidth = !isPercentageIntrinsicSize && constrainedSize.w idth() > 0; 384 bool hasIntrinsicWidth = constrainedSize.width() > 0;
397 385
398 // If 'height' and 'width' both have computed values of 'auto' and the e lement also has an intrinsic width, then that intrinsic width is the used value of 'width'. 386 // If 'height' and 'width' both have computed values of 'auto' and the e lement also has an intrinsic width, then that intrinsic width is the used value of 'width'.
399 if (heightIsAuto && hasIntrinsicWidth) 387 if (computedHeightIsAuto && hasIntrinsicWidth)
400 return computeReplacedLogicalWidthRespectingMinMaxWidth(constrainedS ize.width(), shouldComputePreferred); 388 return computeReplacedLogicalWidthRespectingMinMaxWidth(constrainedS ize.width(), shouldComputePreferred);
401 389
402 bool hasIntrinsicHeight = !isPercentageIntrinsicSize && constrainedSize. height() > 0; 390 bool hasIntrinsicHeight = constrainedSize.height() > 0;
403 if (intrinsicRatio || isPercentageIntrinsicSize) { 391 if (intrinsicRatio) {
404 // If 'height' and 'width' both have computed values of 'auto' and t he element has no intrinsic width, but does have an intrinsic height and intrins ic ratio; 392 // If 'height' and 'width' both have computed values of 'auto' and t he element has no intrinsic width, but does have an intrinsic height and intrins ic ratio;
405 // or if 'width' has a computed value of 'auto', 'height' has some o ther computed value, and the element does have an intrinsic ratio; then the used value 393 // or if 'width' has a computed value of 'auto', 'height' has some o ther computed value, and the element does have an intrinsic ratio; then the used value
406 // of 'width' is: (used height) * (intrinsic ratio) 394 // of 'width' is: (used height) * (intrinsic ratio)
407 if (intrinsicRatio && ((heightIsAuto && !hasIntrinsicWidth && hasInt rinsicHeight) || !heightIsAuto)) { 395 if (intrinsicRatio && ((computedHeightIsAuto && !hasIntrinsicWidth & & hasIntrinsicHeight) || !computedHeightIsAuto)) {
408 LayoutUnit logicalHeight = computeReplacedLogicalHeight(); 396 LayoutUnit logicalHeight = computeReplacedLogicalHeight();
409 return computeReplacedLogicalWidthRespectingMinMaxWidth(roundToI nt(round(logicalHeight * intrinsicRatio)), shouldComputePreferred); 397 return computeReplacedLogicalWidthRespectingMinMaxWidth(roundToI nt(round(logicalHeight * intrinsicRatio)), shouldComputePreferred);
410 } 398 }
411 399
412 // If 'height' and 'width' both have computed values of 'auto' and t he element has an intrinsic ratio but no intrinsic height or width, then the use d value of 400 // If 'height' and 'width' both have computed values of 'auto' and t he element has an intrinsic ratio but no intrinsic height or width, then the use d value of
413 // 'width' is undefined in CSS 2.1. However, it is suggested that, i f the containing block's width does not itself depend on the replaced element's width, then 401 // 'width' is undefined in CSS 2.1. However, it is suggested that, i f the containing block's width does not itself depend on the replaced element's width, then
414 // the used value of 'width' is calculated from the constraint equat ion used for block-level, non-replaced elements in normal flow. 402 // the used value of 'width' is calculated from the constraint equat ion used for block-level, non-replaced elements in normal flow.
415 if (heightIsAuto && !hasIntrinsicWidth && !hasIntrinsicHeight) { 403 if (computedHeightIsAuto && !hasIntrinsicWidth && !hasIntrinsicHeigh t) {
416 // The aforementioned 'constraint equation' used for block-level , non-replaced elements in normal flow: 404 // The aforementioned 'constraint equation' used for block-level , non-replaced elements in normal flow:
417 // 'margin-left' + 'border-left-width' + 'padding-left' + 'width ' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containin g block 405 // 'margin-left' + 'border-left-width' + 'padding-left' + 'width ' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containin g block
418 LayoutUnit logicalWidth; 406 LayoutUnit logicalWidth;
419 // FIXME: This walking up the containgBlock chain to find the fi rst one with a specified width is bonkers. 407 // FIXME: This walking up the containgBlock chain to find the fi rst one with a specified width is bonkers.
420 // If nothing else, it requires making sure that computeReplaced LogicalWidthRespectingMinMaxWidth cannot 408 // If nothing else, it requires making sure that computeReplaced LogicalWidthRespectingMinMaxWidth cannot
421 // depend on the width of the replaced element or we infinite lo op. Right now we do that in 409 // depend on the width of the replaced element or we infinite lo op. Right now we do that in
422 // firstContainingBlockWithLogicalWidth by checking that width/m in-width/max-width are all specified. 410 // firstContainingBlockWithLogicalWidth by checking that width/m in-width/max-width are all specified.
423 // 411 //
424 // Firefox 27 seems to only do this if the <svg> has a viewbox. 412 // Firefox 27 seems to only do this if the <svg> has a viewbox.
425 if (RenderBlock* blockWithWidth = firstContainingBlockWithLogica lWidth(this)) { 413 if (RenderBlock* blockWithWidth = firstContainingBlockWithLogica lWidth(this)) {
426 logicalWidth = blockWithWidth->computeReplacedLogicalWidthRe spectingMinMaxWidth(blockWithWidth->computeReplacedLogicalWidthUsing(blockWithWi dth->style()->logicalWidth()), shouldComputePreferred); 414 logicalWidth = blockWithWidth->computeReplacedLogicalWidthRe spectingMinMaxWidth(blockWithWidth->computeReplacedLogicalWidthUsing(blockWithWi dth->style()->logicalWidth()), shouldComputePreferred);
427 } else { 415 } else {
428 // FIXME: If shouldComputePreferred == ComputePreferred, the n we're reading this during preferred width 416 // FIXME: If shouldComputePreferred == ComputePreferred, the n we're reading this during preferred width
429 // computation, at which point this is reading stale data fr om a previous layout. 417 // computation, at which point this is reading stale data fr om a previous layout.
430 logicalWidth = containingBlock()->availableLogicalWidth(); 418 logicalWidth = containingBlock()->availableLogicalWidth();
431 } 419 }
432 420
433 // This solves above equation for 'width' (== logicalWidth). 421 // This solves above equation for 'width' (== logicalWidth).
434 LayoutUnit marginStart = minimumValueForLength(style()->marginSt art(), logicalWidth); 422 LayoutUnit marginStart = minimumValueForLength(style()->marginSt art(), logicalWidth);
435 LayoutUnit marginEnd = minimumValueForLength(style()->marginEnd( ), logicalWidth); 423 LayoutUnit marginEnd = minimumValueForLength(style()->marginEnd( ), logicalWidth);
436 logicalWidth = max<LayoutUnit>(0, logicalWidth - (marginStart + marginEnd + (width() - clientWidth()))); 424 logicalWidth = max<LayoutUnit>(0, logicalWidth - (marginStart + marginEnd + (width() - clientWidth())));
437 if (isPercentageIntrinsicSize)
438 logicalWidth = logicalWidth * constrainedSize.width() / 100;
439 return computeReplacedLogicalWidthRespectingMinMaxWidth(logicalW idth, shouldComputePreferred); 425 return computeReplacedLogicalWidthRespectingMinMaxWidth(logicalW idth, shouldComputePreferred);
440 } 426 }
441 } 427 }
442 428
443 // Otherwise, if 'width' has a computed value of 'auto', and the element has an intrinsic width, then that intrinsic width is the used value of 'width'. 429 // Otherwise, if 'width' has a computed value of 'auto', and the element has an intrinsic width, then that intrinsic width is the used value of 'width'.
444 if (hasIntrinsicWidth) 430 if (hasIntrinsicWidth)
445 return computeReplacedLogicalWidthRespectingMinMaxWidth(constrainedS ize.width(), shouldComputePreferred); 431 return computeReplacedLogicalWidthRespectingMinMaxWidth(constrainedS ize.width(), shouldComputePreferred);
446 432
447 // Otherwise, if 'width' has a computed value of 'auto', but none of the conditions above are met, then the used value of 'width' becomes 300px. If 300p x is too 433 // Otherwise, if 'width' has a computed value of 'auto', but none of the conditions above are met, then the used value of 'width' becomes 300px. If 300p x is too
448 // wide to fit the device, UAs should use the width of the largest recta ngle that has a 2:1 ratio and fits the device instead. 434 // wide to fit the device, UAs should use the width of the largest recta ngle that has a 2:1 ratio and fits the device instead.
449 // Note: We fall through and instead return intrinsicLogicalWidth() here - to preserve existing WebKit behavior, which might or might not be correct, or desired. 435 // Note: We fall through and instead return intrinsicLogicalWidth() here - to preserve existing WebKit behavior, which might or might not be correct, or desired.
450 // Changing this to return cDefaultWidth, will affect lots of test resul ts. Eg. some tests assume that a blank <img> tag (which implies width/height=aut o) 436 // Changing this to return cDefaultWidth, will affect lots of test resul ts. Eg. some tests assume that a blank <img> tag (which implies width/height=aut o)
451 // has no intrinsic size, which is wrong per CSS 2.1, but matches our be havior since a long time. 437 // has no intrinsic size, which is wrong per CSS 2.1, but matches our be havior since a long time.
452 } 438 }
453 439
454 return computeReplacedLogicalWidthRespectingMinMaxWidth(intrinsicLogicalWidt h(), shouldComputePreferred); 440 return computeReplacedLogicalWidthRespectingMinMaxWidth(intrinsicLogicalWidt h(), shouldComputePreferred);
455 } 441 }
456 442
457 LayoutUnit RenderReplaced::computeReplacedLogicalHeight() const 443 LayoutUnit RenderReplaced::computeReplacedLogicalHeight() const
458 { 444 {
459 // 10.5 Content height: the 'height' property: http://www.w3.org/TR/CSS21/vi sudet.html#propdef-height 445 // 10.5 Content height: the 'height' property: http://www.w3.org/TR/CSS21/vi sudet.html#propdef-height
460 if (hasReplacedLogicalHeight()) 446 if (hasReplacedLogicalHeight())
461 return computeReplacedLogicalHeightRespectingMinMaxHeight(computeReplace dLogicalHeightUsing(style()->logicalHeight())); 447 return computeReplacedLogicalHeightRespectingMinMaxHeight(computeReplace dLogicalHeightUsing(style()->logicalHeight()));
462 448
463 RenderBox* contentRenderer = embeddedContentBox(); 449 RenderBox* contentRenderer = embeddedContentBox();
464 450
465 // 10.6.2 Inline, replaced elements: http://www.w3.org/TR/CSS21/visudet.html #inline-replaced-height 451 // 10.6.2 Inline, replaced elements: http://www.w3.org/TR/CSS21/visudet.html #inline-replaced-height
466 bool isPercentageIntrinsicSize = false;
467 double intrinsicRatio = 0; 452 double intrinsicRatio = 0;
468 FloatSize constrainedSize; 453 FloatSize constrainedSize;
469 computeAspectRatioInformationForRenderBox(contentRenderer, constrainedSize, intrinsicRatio, isPercentageIntrinsicSize); 454 computeAspectRatioInformationForRenderBox(contentRenderer, constrainedSize, intrinsicRatio);
470 455
471 bool widthIsAuto = style()->logicalWidth().isAuto(); 456 bool widthIsAuto = style()->logicalWidth().isAuto();
472 bool hasIntrinsicHeight = !isPercentageIntrinsicSize && constrainedSize.heig ht() > 0; 457 bool hasIntrinsicHeight = constrainedSize.height() > 0;
473 458
474 // If 'height' and 'width' both have computed values of 'auto' and the eleme nt also has an intrinsic height, then that intrinsic height is the used value of 'height'. 459 // If 'height' and 'width' both have computed values of 'auto' and the eleme nt also has an intrinsic height, then that intrinsic height is the used value of 'height'.
475 if (widthIsAuto && hasIntrinsicHeight) 460 if (widthIsAuto && hasIntrinsicHeight)
476 return computeReplacedLogicalHeightRespectingMinMaxHeight(constrainedSiz e.height()); 461 return computeReplacedLogicalHeightRespectingMinMaxHeight(constrainedSiz e.height());
477 462
478 // Otherwise, if 'height' has a computed value of 'auto', and the element ha s an intrinsic ratio then the used value of 'height' is: 463 // Otherwise, if 'height' has a computed value of 'auto', and the element ha s an intrinsic ratio then the used value of 'height' is:
479 // (used width) / (intrinsic ratio) 464 // (used width) / (intrinsic ratio)
480 if (intrinsicRatio) 465 if (intrinsicRatio)
481 return computeReplacedLogicalHeightRespectingMinMaxHeight(roundToInt(rou nd(availableLogicalWidth() / intrinsicRatio))); 466 return computeReplacedLogicalHeightRespectingMinMaxHeight(roundToInt(rou nd(availableLogicalWidth() / intrinsicRatio)));
482 467
(...skipping 16 matching lines...) Expand all
499 ASSERT(preferredLogicalWidthsDirty()); 484 ASSERT(preferredLogicalWidthsDirty());
500 485
501 // We cannot resolve any percent logical width here as the available logical 486 // We cannot resolve any percent logical width here as the available logical
502 // width may not be set on our containing block. 487 // width may not be set on our containing block.
503 if (style()->logicalWidth().isPercent()) 488 if (style()->logicalWidth().isPercent())
504 computeIntrinsicLogicalWidths(m_minPreferredLogicalWidth, m_maxPreferred LogicalWidth); 489 computeIntrinsicLogicalWidths(m_minPreferredLogicalWidth, m_maxPreferred LogicalWidth);
505 else 490 else
506 m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = computeReplace dLogicalWidth(ComputePreferred); 491 m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = computeReplace dLogicalWidth(ComputePreferred);
507 492
508 RenderStyle* styleToUse = style(); 493 RenderStyle* styleToUse = style();
509 if (styleToUse->logicalWidth().isPercent() || styleToUse->logicalMaxWidth(). isPercent() || hasRelativeIntrinsicLogicalWidth()) 494 if (styleToUse->logicalWidth().isPercent() || styleToUse->logicalMaxWidth(). isPercent())
510 m_minPreferredLogicalWidth = 0; 495 m_minPreferredLogicalWidth = 0;
511 496
512 if (styleToUse->logicalMinWidth().isFixed() && styleToUse->logicalMinWidth() .value() > 0) { 497 if (styleToUse->logicalMinWidth().isFixed() && styleToUse->logicalMinWidth() .value() > 0) {
513 m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, adjustConte ntBoxLogicalWidthForBoxSizing(styleToUse->logicalMinWidth().value())); 498 m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, adjustConte ntBoxLogicalWidthForBoxSizing(styleToUse->logicalMinWidth().value()));
514 m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, adjustConte ntBoxLogicalWidthForBoxSizing(styleToUse->logicalMinWidth().value())); 499 m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, adjustConte ntBoxLogicalWidthForBoxSizing(styleToUse->logicalMinWidth().value()));
515 } 500 }
516 501
517 if (styleToUse->logicalMaxWidth().isFixed()) { 502 if (styleToUse->logicalMaxWidth().isFixed()) {
518 m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, adjustConte ntBoxLogicalWidthForBoxSizing(styleToUse->logicalMaxWidth().value())); 503 m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, adjustConte ntBoxLogicalWidthForBoxSizing(styleToUse->logicalMaxWidth().value()));
519 m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, adjustConte ntBoxLogicalWidthForBoxSizing(styleToUse->logicalMaxWidth().value())); 504 m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, adjustConte ntBoxLogicalWidthForBoxSizing(styleToUse->logicalMaxWidth().value()));
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
631 // FIXME: layoutDelta needs to be applied in parts before/after transfor ms and 616 // FIXME: layoutDelta needs to be applied in parts before/after transfor ms and
632 // repaint containers. https://bugs.webkit.org/show_bug.cgi?id=23308 617 // repaint containers. https://bugs.webkit.org/show_bug.cgi?id=23308
633 r.move(v->layoutDelta()); 618 r.move(v->layoutDelta());
634 } 619 }
635 620
636 computeRectForRepaint(repaintContainer, r); 621 computeRectForRepaint(repaintContainer, r);
637 return r; 622 return r;
638 } 623 }
639 624
640 } 625 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698