| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights |
| 3 * reserved. | 3 * reserved. |
| 4 * | 4 * |
| 5 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 5 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
| 6 * | 6 * |
| 7 * Other contributors: | 7 * Other contributors: |
| 8 * Robert O'Callahan <roc+@cs.cmu.edu> | 8 * Robert O'Callahan <roc+@cs.cmu.edu> |
| 9 * David Baron <dbaron@fas.harvard.edu> | 9 * David Baron <dbaron@fas.harvard.edu> |
| 10 * Christian Biesinger <cbiesinger@web.de> | 10 * Christian Biesinger <cbiesinger@web.de> |
| (...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 750 | 750 |
| 751 // Transformed or preserve-3d descendants can only be in the z-order lists, | 751 // Transformed or preserve-3d descendants can only be in the z-order lists, |
| 752 // not in the normal flow list, so we only need to check those. | 752 // not in the normal flow list, so we only need to check those. |
| 753 PaintLayerStackingNodeIterator iterator( | 753 PaintLayerStackingNodeIterator iterator( |
| 754 *m_stackingNode.get(), PositiveZOrderChildren | NegativeZOrderChildren); | 754 *m_stackingNode.get(), PositiveZOrderChildren | NegativeZOrderChildren); |
| 755 while (PaintLayerStackingNode* node = iterator.next()) { | 755 while (PaintLayerStackingNode* node = iterator.next()) { |
| 756 const PaintLayer& childLayer = *node->layer(); | 756 const PaintLayer& childLayer = *node->layer(); |
| 757 bool childHas3D = false; | 757 bool childHas3D = false; |
| 758 // If the child lives in a 3d hierarchy, then the layer at the root of | 758 // If the child lives in a 3d hierarchy, then the layer at the root of |
| 759 // that hierarchy needs the m_has3DTransformedDescendant set. | 759 // that hierarchy needs the m_has3DTransformedDescendant set. |
| 760 if (childLayer.preserves3D() && (childLayer.has3DTransform() || | 760 if (childLayer.preserves3D() && |
| 761 childLayer.has3DTransformedDescendant())) | 761 (childLayer.has3DTransform() || |
| 762 childLayer.has3DTransformedDescendant())) |
| 762 childHas3D = true; | 763 childHas3D = true; |
| 763 else if (childLayer.has3DTransform()) | 764 else if (childLayer.has3DTransform()) |
| 764 childHas3D = true; | 765 childHas3D = true; |
| 765 | 766 |
| 766 if (childHas3D) { | 767 if (childHas3D) { |
| 767 m_has3DTransformedDescendant = true; | 768 m_has3DTransformedDescendant = true; |
| 768 break; | 769 break; |
| 769 } | 770 } |
| 770 } | 771 } |
| 771 } | 772 } |
| (...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1505 m_stackingNode = nullptr; | 1506 m_stackingNode = nullptr; |
| 1506 } | 1507 } |
| 1507 | 1508 |
| 1508 void PaintLayer::updateScrollableArea() { | 1509 void PaintLayer::updateScrollableArea() { |
| 1509 DCHECK(!m_scrollableArea); | 1510 DCHECK(!m_scrollableArea); |
| 1510 if (requiresScrollableArea()) | 1511 if (requiresScrollableArea()) |
| 1511 m_scrollableArea = PaintLayerScrollableArea::create(*this); | 1512 m_scrollableArea = PaintLayerScrollableArea::create(*this); |
| 1512 } | 1513 } |
| 1513 | 1514 |
| 1514 bool PaintLayer::hasOverflowControls() const { | 1515 bool PaintLayer::hasOverflowControls() const { |
| 1515 return m_scrollableArea && (m_scrollableArea->hasScrollbar() || | 1516 return m_scrollableArea && |
| 1516 m_scrollableArea->scrollCorner() || | 1517 (m_scrollableArea->hasScrollbar() || |
| 1517 layoutObject()->style()->resize() != RESIZE_NONE); | 1518 m_scrollableArea->scrollCorner() || |
| 1519 layoutObject()->style()->resize() != RESIZE_NONE); |
| 1518 } | 1520 } |
| 1519 | 1521 |
| 1520 void PaintLayer::appendSingleFragmentIgnoringPagination( | 1522 void PaintLayer::appendSingleFragmentIgnoringPagination( |
| 1521 PaintLayerFragments& fragments, | 1523 PaintLayerFragments& fragments, |
| 1522 const PaintLayer* rootLayer, | 1524 const PaintLayer* rootLayer, |
| 1523 const LayoutRect& dirtyRect, | 1525 const LayoutRect& dirtyRect, |
| 1524 ClipRectsCacheSlot clipRectsCacheSlot, | 1526 ClipRectsCacheSlot clipRectsCacheSlot, |
| 1525 PaintLayer::GeometryMapperOption geometryMapperOption, | 1527 PaintLayer::GeometryMapperOption geometryMapperOption, |
| 1526 OverlayScrollbarClipBehavior overlayScrollbarClipBehavior, | 1528 OverlayScrollbarClipBehavior overlayScrollbarClipBehavior, |
| 1527 ShouldRespectOverflowClipType respectOverflowClip, | 1529 ShouldRespectOverflowClipType respectOverflowClip, |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1725 // crbug.com/522109. | 1727 // crbug.com/522109. |
| 1726 // TODO(majidvp): This should apply more consistently across different | 1728 // TODO(majidvp): This should apply more consistently across different |
| 1727 // event types and we should not use RequestType for it. Perhaps best for | 1729 // event types and we should not use RequestType for it. Perhaps best for |
| 1728 // it to be done at a higher level. See http://crbug.com/505825 | 1730 // it to be done at a higher level. See http://crbug.com/505825 |
| 1729 } else if ((request.active() || request.release()) && | 1731 } else if ((request.active() || request.release()) && |
| 1730 !request.isChildFrameHitTest()) { | 1732 !request.isChildFrameHitTest()) { |
| 1731 fallback = true; | 1733 fallback = true; |
| 1732 } | 1734 } |
| 1733 if (fallback) { | 1735 if (fallback) { |
| 1734 layoutObject()->updateHitTestResult( | 1736 layoutObject()->updateHitTestResult( |
| 1735 result, toLayoutView(layoutObject()) | 1737 result, |
| 1736 ->flipForWritingMode(hitTestLocation.point())); | 1738 toLayoutView(layoutObject()) |
| 1739 ->flipForWritingMode(hitTestLocation.point())); |
| 1737 insideLayer = this; | 1740 insideLayer = this; |
| 1738 | 1741 |
| 1739 // Don't cache this result since it really wasn't a true hit. | 1742 // Don't cache this result since it really wasn't a true hit. |
| 1740 result.setCacheable(false); | 1743 result.setCacheable(false); |
| 1741 } | 1744 } |
| 1742 } | 1745 } |
| 1743 | 1746 |
| 1744 // Now determine if the result is inside an anchor - if the urlElement isn't | 1747 // Now determine if the result is inside an anchor - if the urlElement isn't |
| 1745 // already set. | 1748 // already set. |
| 1746 Node* node = result.innerNode(); | 1749 Node* node = result.innerNode(); |
| (...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2205 const HitTestLocation& hitTestLocation, | 2208 const HitTestLocation& hitTestLocation, |
| 2206 HitTestFilter hitTestFilter) const { | 2209 HitTestFilter hitTestFilter) const { |
| 2207 DCHECK(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant()); | 2210 DCHECK(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant()); |
| 2208 | 2211 |
| 2209 if (!layoutObject()->hitTest( | 2212 if (!layoutObject()->hitTest( |
| 2210 result, hitTestLocation, | 2213 result, hitTestLocation, |
| 2211 toLayoutPoint(layerBounds.location() - layoutBoxLocation()), | 2214 toLayoutPoint(layerBounds.location() - layoutBoxLocation()), |
| 2212 hitTestFilter)) { | 2215 hitTestFilter)) { |
| 2213 // It's wrong to set innerNode, but then claim that you didn't hit anything, | 2216 // It's wrong to set innerNode, but then claim that you didn't hit anything, |
| 2214 // unless it is a rect-based test. | 2217 // unless it is a rect-based test. |
| 2215 DCHECK(!result.innerNode() || (result.hitTestRequest().listBased() && | 2218 DCHECK(!result.innerNode() || |
| 2216 result.listBasedTestResult().size())); | 2219 (result.hitTestRequest().listBased() && |
| 2220 result.listBasedTestResult().size())); |
| 2217 return false; | 2221 return false; |
| 2218 } | 2222 } |
| 2219 | 2223 |
| 2220 if (!result.innerNode()) { | 2224 if (!result.innerNode()) { |
| 2221 // We hit something anonymous, and we didn't find a DOM node ancestor in | 2225 // We hit something anonymous, and we didn't find a DOM node ancestor in |
| 2222 // this layer. | 2226 // this layer. |
| 2223 | 2227 |
| 2224 if (layoutObject()->isLayoutFlowThread()) { | 2228 if (layoutObject()->isLayoutFlowThread()) { |
| 2225 // For a flow thread it's safe to just say that we didn't hit anything. | 2229 // For a flow thread it's safe to just say that we didn't hit anything. |
| 2226 // That means that we'll continue as normally, and eventually hit a column | 2230 // That means that we'll continue as normally, and eventually hit a column |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2282 if (!depthSortDescendants) | 2286 if (!depthSortDescendants) |
| 2283 break; | 2287 break; |
| 2284 } | 2288 } |
| 2285 } | 2289 } |
| 2286 | 2290 |
| 2287 return resultLayer; | 2291 return resultLayer; |
| 2288 } | 2292 } |
| 2289 | 2293 |
| 2290 FloatRect PaintLayer::boxForFilterOrMask() const { | 2294 FloatRect PaintLayer::boxForFilterOrMask() const { |
| 2291 return FloatRect(physicalBoundingBoxIncludingStackingChildren( | 2295 return FloatRect(physicalBoundingBoxIncludingStackingChildren( |
| 2292 LayoutPoint(), PaintLayer::CalculateBoundsOptions:: | 2296 LayoutPoint(), |
| 2293 IncludeTransformsAndCompositedChildLayers)); | 2297 PaintLayer::CalculateBoundsOptions:: |
| 2298 IncludeTransformsAndCompositedChildLayers)); |
| 2294 } | 2299 } |
| 2295 | 2300 |
| 2296 LayoutRect PaintLayer::boxForClipPath() const { | 2301 LayoutRect PaintLayer::boxForClipPath() const { |
| 2297 if (!layoutObject()->isBox()) { | 2302 if (!layoutObject()->isBox()) { |
| 2298 SECURITY_DCHECK(layoutObject()->isLayoutInline()); | 2303 SECURITY_DCHECK(layoutObject()->isLayoutInline()); |
| 2299 const LayoutInline& layoutInline = toLayoutInline(*layoutObject()); | 2304 const LayoutInline& layoutInline = toLayoutInline(*layoutObject()); |
| 2300 // This somewhat convoluted computation matches what Gecko does. | 2305 // This somewhat convoluted computation matches what Gecko does. |
| 2301 // See crbug.com/641907. | 2306 // See crbug.com/641907. |
| 2302 LayoutRect inlineBBox = layoutInline.linesBoundingBox(); | 2307 LayoutRect inlineBBox = layoutInline.linesBoundingBox(); |
| 2303 const InlineFlowBox* flowBox = layoutInline.firstLineBox(); | 2308 const InlineFlowBox* flowBox = layoutInline.firstLineBox(); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2450 const_cast<PaintLayer*>(this)->stackingNode()); | 2455 const_cast<PaintLayer*>(this)->stackingNode()); |
| 2451 #endif | 2456 #endif |
| 2452 | 2457 |
| 2453 PaintLayerStackingNodeIterator iterator(*this->stackingNode(), AllChildren); | 2458 PaintLayerStackingNodeIterator iterator(*this->stackingNode(), AllChildren); |
| 2454 while (PaintLayerStackingNode* node = iterator.next()) { | 2459 while (PaintLayerStackingNode* node = iterator.next()) { |
| 2455 // Here we exclude both directly composited layers and squashing layers | 2460 // Here we exclude both directly composited layers and squashing layers |
| 2456 // because those Layers don't paint into the graphics layer | 2461 // because those Layers don't paint into the graphics layer |
| 2457 // for this Layer. For example, the bounds of squashed Layers | 2462 // for this Layer. For example, the bounds of squashed Layers |
| 2458 // will be included in the computation of the appropriate squashing | 2463 // will be included in the computation of the appropriate squashing |
| 2459 // GraphicsLayer. | 2464 // GraphicsLayer. |
| 2460 if (options != PaintLayer::CalculateBoundsOptions:: | 2465 if (options != |
| 2461 IncludeTransformsAndCompositedChildLayers && | 2466 PaintLayer::CalculateBoundsOptions:: |
| 2467 IncludeTransformsAndCompositedChildLayers && |
| 2462 node->layer()->compositingState() != NotComposited) | 2468 node->layer()->compositingState() != NotComposited) |
| 2463 continue; | 2469 continue; |
| 2464 result.unite(node->layer()->boundingBoxForCompositingInternal( | 2470 result.unite(node->layer()->boundingBoxForCompositingInternal( |
| 2465 compositedLayer, this, options)); | 2471 compositedLayer, this, options)); |
| 2466 } | 2472 } |
| 2467 } | 2473 } |
| 2468 | 2474 |
| 2469 LayoutRect PaintLayer::physicalBoundingBoxIncludingStackingChildren( | 2475 LayoutRect PaintLayer::physicalBoundingBoxIncludingStackingChildren( |
| 2470 const LayoutPoint& offsetFromRoot, | 2476 const LayoutPoint& offsetFromRoot, |
| 2471 CalculateBoundsOptions options) const { | 2477 CalculateBoundsOptions options) const { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2525 | 2531 |
| 2526 result.intersect(physicalBoundingBox(LayoutPoint())); | 2532 result.intersect(physicalBoundingBox(LayoutPoint())); |
| 2527 | 2533 |
| 2528 expandRectForStackingChildren(compositedLayer, result, options); | 2534 expandRectForStackingChildren(compositedLayer, result, options); |
| 2529 | 2535 |
| 2530 // Only enlarge by the filter outsets if we know the filter is going to be | 2536 // Only enlarge by the filter outsets if we know the filter is going to be |
| 2531 // rendered in software. Accelerated filters will handle their own outsets. | 2537 // rendered in software. Accelerated filters will handle their own outsets. |
| 2532 if (paintsWithFilters()) | 2538 if (paintsWithFilters()) |
| 2533 result = mapLayoutRectForFilter(result); | 2539 result = mapLayoutRectForFilter(result); |
| 2534 | 2540 |
| 2535 if (transform() && (options == IncludeTransformsAndCompositedChildLayers || | 2541 if (transform() && |
| 2536 ((paintsWithTransform(GlobalPaintNormalPhase) && | 2542 (options == IncludeTransformsAndCompositedChildLayers || |
| 2537 (this != &compositedLayer || | 2543 ((paintsWithTransform(GlobalPaintNormalPhase) && |
| 2538 options == MaybeIncludeTransformForAncestorLayer))))) | 2544 (this != &compositedLayer || |
| 2545 options == MaybeIncludeTransformForAncestorLayer))))) |
| 2539 result = transform()->mapRect(result); | 2546 result = transform()->mapRect(result); |
| 2540 | 2547 |
| 2541 if (shouldFragmentCompositedBounds(&compositedLayer)) { | 2548 if (shouldFragmentCompositedBounds(&compositedLayer)) { |
| 2542 convertFromFlowThreadToVisualBoundingBoxInAncestor(&compositedLayer, | 2549 convertFromFlowThreadToVisualBoundingBoxInAncestor(&compositedLayer, |
| 2543 result); | 2550 result); |
| 2544 return result; | 2551 return result; |
| 2545 } | 2552 } |
| 2546 | 2553 |
| 2547 if (stackingParent) { | 2554 if (stackingParent) { |
| 2548 LayoutPoint delta; | 2555 LayoutPoint delta; |
| (...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3221 } | 3228 } |
| 3222 | 3229 |
| 3223 void showLayerTree(const blink::LayoutObject* layoutObject) { | 3230 void showLayerTree(const blink::LayoutObject* layoutObject) { |
| 3224 if (!layoutObject) { | 3231 if (!layoutObject) { |
| 3225 LOG(INFO) << "Cannot showLayerTree. Root is (nil)"; | 3232 LOG(INFO) << "Cannot showLayerTree. Root is (nil)"; |
| 3226 return; | 3233 return; |
| 3227 } | 3234 } |
| 3228 showLayerTree(layoutObject->enclosingLayer()); | 3235 showLayerTree(layoutObject->enclosingLayer()); |
| 3229 } | 3236 } |
| 3230 #endif | 3237 #endif |
| OLD | NEW |