| OLD | NEW |
| 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, 2010 Apple Inc. All rights reserv
ed. | 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. |
| 7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. | 7 * Copyright (C) 2013 Adobe Systems Incorporated. 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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 // Size of border belt for autoscroll. When mouse pointer in border belt, | 84 // Size of border belt for autoscroll. When mouse pointer in border belt, |
| 85 // autoscroll is started. | 85 // autoscroll is started. |
| 86 static const int autoscrollBeltSize = 20; | 86 static const int autoscrollBeltSize = 20; |
| 87 static const unsigned backgroundObscurationTestMaxDepth = 4; | 87 static const unsigned backgroundObscurationTestMaxDepth = 4; |
| 88 | 88 |
| 89 static bool skipBodyBackground(const LayoutBox* bodyElementRenderer) | 89 static bool skipBodyBackground(const LayoutBox* bodyElementRenderer) |
| 90 { | 90 { |
| 91 ASSERT(bodyElementRenderer->isBody()); | 91 ASSERT(bodyElementRenderer->isBody()); |
| 92 // The <body> only paints its background if the root element has defined a b
ackground independent of the body, | 92 // The <body> only paints its background if the root element has defined a b
ackground independent of the body, |
| 93 // or if the <body>'s parent is not the document element's renderer (e.g. in
side SVG foreignObject). | 93 // or if the <body>'s parent is not the document element's renderer (e.g. in
side SVG foreignObject). |
| 94 LayoutObject* documentElementRenderer = bodyElementRenderer->document().docu
mentElement()->renderer(); | 94 LayoutObject* documentElementRenderer = bodyElementRenderer->document().docu
mentElement()->layoutObject(); |
| 95 return documentElementRenderer | 95 return documentElementRenderer |
| 96 && !documentElementRenderer->hasBackground() | 96 && !documentElementRenderer->hasBackground() |
| 97 && (documentElementRenderer == bodyElementRenderer->parent()); | 97 && (documentElementRenderer == bodyElementRenderer->parent()); |
| 98 } | 98 } |
| 99 | 99 |
| 100 LayoutBox::LayoutBox(ContainerNode* node) | 100 LayoutBox::LayoutBox(ContainerNode* node) |
| 101 : LayoutBoxModelObject(node) | 101 : LayoutBoxModelObject(node) |
| 102 , m_intrinsicContentLogicalHeight(-1) | 102 , m_intrinsicContentLogicalHeight(-1) |
| 103 , m_minPreferredLogicalWidth(-1) | 103 , m_minPreferredLogicalWidth(-1) |
| 104 , m_maxPreferredLogicalWidth(-1) | 104 , m_maxPreferredLogicalWidth(-1) |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 } | 489 } |
| 490 | 490 |
| 491 if (hasOverflowClip() && !restrictedByLineClamp) { | 491 if (hasOverflowClip() && !restrictedByLineClamp) { |
| 492 // Don't scroll to reveal an overflow layer that is restricted by the -w
ebkit-line-clamp property. | 492 // Don't scroll to reveal an overflow layer that is restricted by the -w
ebkit-line-clamp property. |
| 493 // This will prevent us from revealing text hidden by the slider in Safa
ri RSS. | 493 // This will prevent us from revealing text hidden by the slider in Safa
ri RSS. |
| 494 newRect = layer()->scrollableArea()->exposeRect(rect, alignX, alignY); | 494 newRect = layer()->scrollableArea()->exposeRect(rect, alignX, alignY); |
| 495 } else if (!parentBox && canBeProgramaticallyScrolled()) { | 495 } else if (!parentBox && canBeProgramaticallyScrolled()) { |
| 496 if (FrameView* frameView = this->frameView()) { | 496 if (FrameView* frameView = this->frameView()) { |
| 497 HTMLFrameOwnerElement* ownerElement = document().ownerElement(); | 497 HTMLFrameOwnerElement* ownerElement = document().ownerElement(); |
| 498 | 498 |
| 499 if (ownerElement && ownerElement->renderer()) { | 499 if (ownerElement && ownerElement->layoutObject()) { |
| 500 HTMLFrameElementBase* frameElementBase = isHTMLFrameElementBase(
*ownerElement) ? toHTMLFrameElementBase(ownerElement) : 0; | 500 HTMLFrameElementBase* frameElementBase = isHTMLFrameElementBase(
*ownerElement) ? toHTMLFrameElementBase(ownerElement) : 0; |
| 501 if (frameElementAndViewPermitScroll(frameElementBase, frameView)
) { | 501 if (frameElementAndViewPermitScroll(frameElementBase, frameView)
) { |
| 502 LayoutRect viewRect(frameView->visibleContentRect()); | 502 LayoutRect viewRect(frameView->visibleContentRect()); |
| 503 LayoutRect exposeRect = ScrollAlignment::getRectToExpose(vie
wRect, rect, alignX, alignY); | 503 LayoutRect exposeRect = ScrollAlignment::getRectToExpose(vie
wRect, rect, alignX, alignY); |
| 504 | 504 |
| 505 double xOffset = exposeRect.x(); | 505 double xOffset = exposeRect.x(); |
| 506 double yOffset = exposeRect.y(); | 506 double yOffset = exposeRect.y(); |
| 507 // Adjust offsets if they're outside of the allowable range. | 507 // Adjust offsets if they're outside of the allowable range. |
| 508 xOffset = std::max(0.0, std::min<double>(frameView->contents
Width(), xOffset)); | 508 xOffset = std::max(0.0, std::min<double>(frameView->contents
Width(), xOffset)); |
| 509 yOffset = std::max(0.0, std::min<double>(frameView->contents
Height(), yOffset)); | 509 yOffset = std::max(0.0, std::min<double>(frameView->contents
Height(), yOffset)); |
| 510 | 510 |
| 511 frameView->setScrollPosition(DoublePoint(xOffset, yOffset)); | 511 frameView->setScrollPosition(DoublePoint(xOffset, yOffset)); |
| 512 if (frameView->safeToPropagateScrollToParent()) { | 512 if (frameView->safeToPropagateScrollToParent()) { |
| 513 parentBox = ownerElement->renderer()->enclosingBox(); | 513 parentBox = ownerElement->layoutObject()->enclosingBox()
; |
| 514 // FIXME: This doesn't correctly convert the rect to | 514 // FIXME: This doesn't correctly convert the rect to |
| 515 // absolute coordinates in the parent. | 515 // absolute coordinates in the parent. |
| 516 newRect.setX(rect.x() - frameView->scrollX() + frameView
->x()); | 516 newRect.setX(rect.x() - frameView->scrollX() + frameView
->x()); |
| 517 newRect.setY(rect.y() - frameView->scrollY() + frameView
->y()); | 517 newRect.setY(rect.y() - frameView->scrollY() + frameView
->y()); |
| 518 } else { | 518 } else { |
| 519 parentBox = 0; | 519 parentBox = 0; |
| 520 } | 520 } |
| 521 } | 521 } |
| 522 } else { | 522 } else { |
| 523 if (frame()->settings()->pinchVirtualViewportEnabled()) { | 523 if (frame()->settings()->pinchVirtualViewportEnabled()) { |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 820 else if (windowAutoscrollPoint.y() > windowBox.maxY() - autoscrollBeltSize) | 820 else if (windowAutoscrollPoint.y() > windowBox.maxY() - autoscrollBeltSize) |
| 821 windowAutoscrollPoint.move(0, autoscrollBeltSize); | 821 windowAutoscrollPoint.move(0, autoscrollBeltSize); |
| 822 | 822 |
| 823 return windowAutoscrollPoint - windowPoint; | 823 return windowAutoscrollPoint - windowPoint; |
| 824 } | 824 } |
| 825 | 825 |
| 826 LayoutBox* LayoutBox::findAutoscrollable(LayoutObject* renderer) | 826 LayoutBox* LayoutBox::findAutoscrollable(LayoutObject* renderer) |
| 827 { | 827 { |
| 828 while (renderer && !(renderer->isBox() && toLayoutBox(renderer)->canAutoscro
ll())) { | 828 while (renderer && !(renderer->isBox() && toLayoutBox(renderer)->canAutoscro
ll())) { |
| 829 if (!renderer->parent() && renderer->node() == renderer->document() && r
enderer->document().ownerElement()) | 829 if (!renderer->parent() && renderer->node() == renderer->document() && r
enderer->document().ownerElement()) |
| 830 renderer = renderer->document().ownerElement()->renderer(); | 830 renderer = renderer->document().ownerElement()->layoutObject(); |
| 831 else | 831 else |
| 832 renderer = renderer->parent(); | 832 renderer = renderer->parent(); |
| 833 } | 833 } |
| 834 | 834 |
| 835 return renderer && renderer->isBox() ? toLayoutBox(renderer) : 0; | 835 return renderer && renderer->isBox() ? toLayoutBox(renderer) : 0; |
| 836 } | 836 } |
| 837 | 837 |
| 838 static inline int adjustedScrollDelta(int beginningDelta) | 838 static inline int adjustedScrollDelta(int beginningDelta) |
| 839 { | 839 { |
| 840 // This implemention matches Firefox's. | 840 // This implemention matches Firefox's. |
| (...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1374 paintInvalidationLayerRectsForImage(image, style()->maskLayers(), false)
; | 1374 paintInvalidationLayerRectsForImage(image, style()->maskLayers(), false)
; |
| 1375 } | 1375 } |
| 1376 | 1376 |
| 1377 bool LayoutBox::paintInvalidationLayerRectsForImage(WrappedImagePtr image, const
FillLayer& layers, bool drawingBackground) | 1377 bool LayoutBox::paintInvalidationLayerRectsForImage(WrappedImagePtr image, const
FillLayer& layers, bool drawingBackground) |
| 1378 { | 1378 { |
| 1379 Vector<LayoutObject*> layerRenderers; | 1379 Vector<LayoutObject*> layerRenderers; |
| 1380 | 1380 |
| 1381 // A background of the body or document must extend to the total visible siz
e of the document. This means the union of the | 1381 // A background of the body or document must extend to the total visible siz
e of the document. This means the union of the |
| 1382 // view and document bounds, since it can be the case that the view is large
r than the document and vice-versa. | 1382 // view and document bounds, since it can be the case that the view is large
r than the document and vice-versa. |
| 1383 // http://dev.w3.org/csswg/css-backgrounds/#the-background | 1383 // http://dev.w3.org/csswg/css-backgrounds/#the-background |
| 1384 if (drawingBackground && (isDocumentElement() || (isBody() && !document().do
cumentElement()->renderer()->hasBackground()))) { | 1384 if (drawingBackground && (isDocumentElement() || (isBody() && !document().do
cumentElement()->layoutObject()->hasBackground()))) { |
| 1385 layerRenderers.append(document().documentElement()->renderer()); | 1385 layerRenderers.append(document().documentElement()->layoutObject()); |
| 1386 layerRenderers.append(view()); | 1386 layerRenderers.append(view()); |
| 1387 if (view()->frameView()) | 1387 if (view()->frameView()) |
| 1388 view()->frameView()->setNeedsFullPaintInvalidation(); | 1388 view()->frameView()->setNeedsFullPaintInvalidation(); |
| 1389 } else { | 1389 } else { |
| 1390 layerRenderers.append(this); | 1390 layerRenderers.append(this); |
| 1391 } | 1391 } |
| 1392 for (const FillLayer* curLayer = &layers; curLayer; curLayer = curLayer->nex
t()) { | 1392 for (const FillLayer* curLayer = &layers; curLayer; curLayer = curLayer->nex
t()) { |
| 1393 if (curLayer->image() && image == curLayer->image()->data() && curLayer-
>image()->canRender(*this, style()->effectiveZoom())) { | 1393 if (curLayer->image() && image == curLayer->image()->data() && curLayer-
>image()->canRender(*this, style()->effectiveZoom())) { |
| 1394 for (LayoutObject* layerRenderer : layerRenderers) | 1394 for (LayoutObject* layerRenderer : layerRenderers) |
| 1395 layerRenderer->setShouldDoFullPaintInvalidation(); | 1395 layerRenderer->setShouldDoFullPaintInvalidation(); |
| (...skipping 947 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2343 computeMarginsForDirection(flowDirection, cb, containingBlockLogicalWidt
hForContent(), computedValues.m_extent, computedValues.m_margins.m_before, | 2343 computeMarginsForDirection(flowDirection, cb, containingBlockLogicalWidt
hForContent(), computedValues.m_extent, computedValues.m_margins.m_before, |
| 2344 computedValues.m_margins.m_after, style()->marginBefore(), style()->
marginAfter()); | 2344 computedValues.m_margins.m_after, style()->marginBefore(), style()->
marginAfter()); |
| 2345 } | 2345 } |
| 2346 | 2346 |
| 2347 // WinIE quirk: The <html> block always fills the entire canvas in quirks mo
de. The <body> always fills the | 2347 // WinIE quirk: The <html> block always fills the entire canvas in quirks mo
de. The <body> always fills the |
| 2348 // <html> block in quirks mode. Only apply this quirk if the block is norma
l flow and no height | 2348 // <html> block in quirks mode. Only apply this quirk if the block is norma
l flow and no height |
| 2349 // is specified. When we're printing, we also need this quirk if the body or
root has a percentage | 2349 // is specified. When we're printing, we also need this quirk if the body or
root has a percentage |
| 2350 // height since we don't set a height in LayoutView when we're printing. So
without this quirk, the | 2350 // height since we don't set a height in LayoutView when we're printing. So
without this quirk, the |
| 2351 // height has nothing to be a percentage of, and it ends up being 0. That is
bad. | 2351 // height has nothing to be a percentage of, and it ends up being 0. That is
bad. |
| 2352 bool paginatedContentNeedsBaseHeight = document().printing() && h.isPercent(
) | 2352 bool paginatedContentNeedsBaseHeight = document().printing() && h.isPercent(
) |
| 2353 && (isDocumentElement() || (isBody() && document().documentElement()->re
nderer()->style()->logicalHeight().isPercent())) && !isInline(); | 2353 && (isDocumentElement() || (isBody() && document().documentElement()->la
youtObject()->style()->logicalHeight().isPercent())) && !isInline(); |
| 2354 if (stretchesToViewport() || paginatedContentNeedsBaseHeight) { | 2354 if (stretchesToViewport() || paginatedContentNeedsBaseHeight) { |
| 2355 LayoutUnit margins = collapsedMarginBefore() + collapsedMarginAfter(); | 2355 LayoutUnit margins = collapsedMarginBefore() + collapsedMarginAfter(); |
| 2356 LayoutUnit visibleHeight = view()->viewLogicalHeightForPercentages(); | 2356 LayoutUnit visibleHeight = view()->viewLogicalHeightForPercentages(); |
| 2357 if (isDocumentElement()) { | 2357 if (isDocumentElement()) { |
| 2358 computedValues.m_extent = std::max(computedValues.m_extent, visibleH
eight - margins); | 2358 computedValues.m_extent = std::max(computedValues.m_extent, visibleH
eight - margins); |
| 2359 } else { | 2359 } else { |
| 2360 LayoutUnit marginsBordersPadding = margins + parentBox()->marginBefo
re() + parentBox()->marginAfter() + parentBox()->borderAndPaddingLogicalHeight()
; | 2360 LayoutUnit marginsBordersPadding = margins + parentBox()->marginBefo
re() + parentBox()->marginAfter() + parentBox()->borderAndPaddingLogicalHeight()
; |
| 2361 computedValues.m_extent = std::max(computedValues.m_extent, visibleH
eight - marginsBordersPadding); | 2361 computedValues.m_extent = std::max(computedValues.m_extent, visibleH
eight - marginsBordersPadding); |
| 2362 } | 2362 } |
| 2363 } | 2363 } |
| (...skipping 2277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4641 } | 4641 } |
| 4642 | 4642 |
| 4643 void LayoutBox::invalidateDisplayItemClients(DisplayItemList* displayItemList) c
onst | 4643 void LayoutBox::invalidateDisplayItemClients(DisplayItemList* displayItemList) c
onst |
| 4644 { | 4644 { |
| 4645 LayoutBoxModelObject::invalidateDisplayItemClients(displayItemList); | 4645 LayoutBoxModelObject::invalidateDisplayItemClients(displayItemList); |
| 4646 if (LayerScrollableArea* area = scrollableArea()) | 4646 if (LayerScrollableArea* area = scrollableArea()) |
| 4647 displayItemList->invalidate(area->displayItemClient()); | 4647 displayItemList->invalidate(area->displayItemClient()); |
| 4648 } | 4648 } |
| 4649 | 4649 |
| 4650 } // namespace blink | 4650 } // namespace blink |
| OLD | NEW |