Chromium Code Reviews| 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 42 * version of this file under any of the LGPL, the MPL or the GPL. | 42 * version of this file under any of the LGPL, the MPL or the GPL. |
| 43 */ | 43 */ |
| 44 | 44 |
| 45 #include "core/paint/PaintLayer.h" | 45 #include "core/paint/PaintLayer.h" |
| 46 | 46 |
| 47 #include "core/CSSPropertyNames.h" | 47 #include "core/CSSPropertyNames.h" |
| 48 #include "core/HTMLNames.h" | 48 #include "core/HTMLNames.h" |
| 49 #include "core/css/PseudoStyleRequest.h" | 49 #include "core/css/PseudoStyleRequest.h" |
| 50 #include "core/dom/Document.h" | 50 #include "core/dom/Document.h" |
| 51 #include "core/dom/shadow/ShadowRoot.h" | 51 #include "core/dom/shadow/ShadowRoot.h" |
| 52 #include "core/frame/FrameHost.h" | |
| 52 #include "core/frame/FrameView.h" | 53 #include "core/frame/FrameView.h" |
| 53 #include "core/frame/LocalFrame.h" | 54 #include "core/frame/LocalFrame.h" |
| 54 #include "core/frame/Settings.h" | 55 #include "core/frame/Settings.h" |
| 55 #include "core/layout/FragmentainerIterator.h" | 56 #include "core/layout/FragmentainerIterator.h" |
| 56 #include "core/layout/HitTestRequest.h" | 57 #include "core/layout/HitTestRequest.h" |
| 57 #include "core/layout/HitTestResult.h" | 58 #include "core/layout/HitTestResult.h" |
| 58 #include "core/layout/HitTestingTransformState.h" | 59 #include "core/layout/HitTestingTransformState.h" |
| 59 #include "core/layout/LayoutFlowThread.h" | 60 #include "core/layout/LayoutFlowThread.h" |
| 60 #include "core/layout/LayoutInline.h" | 61 #include "core/layout/LayoutInline.h" |
| 61 #include "core/layout/LayoutPart.h" | 62 #include "core/layout/LayoutPart.h" |
| 62 #include "core/layout/LayoutTreeAsText.h" | 63 #include "core/layout/LayoutTreeAsText.h" |
| 63 #include "core/layout/LayoutView.h" | 64 #include "core/layout/LayoutView.h" |
| 64 #include "core/layout/api/LayoutPartItem.h" | 65 #include "core/layout/api/LayoutPartItem.h" |
| 65 #include "core/layout/api/LayoutViewItem.h" | 66 #include "core/layout/api/LayoutViewItem.h" |
| 66 #include "core/layout/compositing/CompositedLayerMapping.h" | 67 #include "core/layout/compositing/CompositedLayerMapping.h" |
| 67 #include "core/layout/compositing/PaintLayerCompositor.h" | 68 #include "core/layout/compositing/PaintLayerCompositor.h" |
| 68 #include "core/layout/svg/LayoutSVGResourceClipper.h" | 69 #include "core/layout/svg/LayoutSVGResourceClipper.h" |
| 69 #include "core/layout/svg/LayoutSVGRoot.h" | 70 #include "core/layout/svg/LayoutSVGRoot.h" |
| 70 #include "core/page/Page.h" | 71 #include "core/page/Page.h" |
| 71 #include "core/page/scrolling/RootScrollerController.h" | 72 #include "core/page/scrolling/RootScrollerController.h" |
| 72 #include "core/page/scrolling/ScrollingCoordinator.h" | 73 #include "core/page/scrolling/ScrollingCoordinator.h" |
| 74 #include "core/page/scrolling/TopDocumentRootScrollerController.h" | |
| 73 #include "core/paint/BoxReflectionUtils.h" | 75 #include "core/paint/BoxReflectionUtils.h" |
| 74 #include "core/paint/FilterEffectBuilder.h" | 76 #include "core/paint/FilterEffectBuilder.h" |
| 75 #include "core/paint/ObjectPaintInvalidator.h" | 77 #include "core/paint/ObjectPaintInvalidator.h" |
| 76 #include "platform/LengthFunctions.h" | 78 #include "platform/LengthFunctions.h" |
| 77 #include "platform/RuntimeEnabledFeatures.h" | 79 #include "platform/RuntimeEnabledFeatures.h" |
| 78 #include "platform/geometry/FloatPoint3D.h" | 80 #include "platform/geometry/FloatPoint3D.h" |
| 79 #include "platform/geometry/FloatRect.h" | 81 #include "platform/geometry/FloatRect.h" |
| 80 #include "platform/geometry/TransformState.h" | 82 #include "platform/geometry/TransformState.h" |
| 81 #include "platform/graphics/CompositorFilterOperations.h" | 83 #include "platform/graphics/CompositorFilterOperations.h" |
| 82 #include "platform/graphics/filters/Filter.h" | 84 #include "platform/graphics/filters/Filter.h" |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 205 } | 207 } |
| 206 | 208 |
| 207 String PaintLayer::debugName() const { | 209 String PaintLayer::debugName() const { |
| 208 return layoutObject()->debugName(); | 210 return layoutObject()->debugName(); |
| 209 } | 211 } |
| 210 | 212 |
| 211 LayoutRect PaintLayer::visualRect() const { | 213 LayoutRect PaintLayer::visualRect() const { |
| 212 return m_layoutObject->visualRect(); | 214 return m_layoutObject->visualRect(); |
| 213 } | 215 } |
| 214 | 216 |
| 217 bool PaintLayer::isRootScrollerLayer() const { | |
| 218 return this == | |
| 219 layoutObject() | |
| 220 ->document() | |
| 221 .rootScrollerController() | |
| 222 .rootScrollerPaintLayer(); | |
| 223 } | |
| 224 | |
| 215 PaintLayerCompositor* PaintLayer::compositor() const { | 225 PaintLayerCompositor* PaintLayer::compositor() const { |
| 216 if (!layoutObject()->view()) | 226 if (!layoutObject()->view()) |
| 217 return 0; | 227 return 0; |
| 218 return layoutObject()->view()->compositor(); | 228 return layoutObject()->view()->compositor(); |
| 219 } | 229 } |
| 220 | 230 |
| 221 void PaintLayer::contentChanged(ContentChangeType changeType) { | 231 void PaintLayer::contentChanged(ContentChangeType changeType) { |
| 222 // updateLayerCompositingState will query compositingReasons for accelerated | 232 // updateLayerCompositingState will query compositingReasons for accelerated |
| 223 // overflow scrolling. This is tripped by | 233 // overflow scrolling. This is tripped by |
| 224 // LayoutTests/compositing/content-changed-chicken-egg.html | 234 // LayoutTests/compositing/content-changed-chicken-egg.html |
| (...skipping 1468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1693 fragment.intersect(fragment.paginationClip); | 1703 fragment.intersect(fragment.paginationClip); |
| 1694 | 1704 |
| 1695 // TODO(mstensho): Don't add empty fragments. We've always done that in some | 1705 // TODO(mstensho): Don't add empty fragments. We've always done that in some |
| 1696 // cases, but there should be no reason to do so. Either filter them out | 1706 // cases, but there should be no reason to do so. Either filter them out |
| 1697 // here, or, even better: pass a better clip rectangle to the fragmentainer | 1707 // here, or, even better: pass a better clip rectangle to the fragmentainer |
| 1698 // iterator, so that we won't end up with empty fragments here. | 1708 // iterator, so that we won't end up with empty fragments here. |
| 1699 fragments.push_back(fragment); | 1709 fragments.push_back(fragment); |
| 1700 } | 1710 } |
| 1701 } | 1711 } |
| 1702 | 1712 |
| 1703 static inline LayoutRect frameVisibleRect(LayoutObject* layoutObject) { | 1713 static inline LayoutRect frameVisibleRect(PaintLayer* layer) { |
| 1704 FrameView* frameView = layoutObject->document().view(); | 1714 LayoutObject* layoutObject = layer->layoutObject(); |
| 1715 DCHECK(layoutObject); | |
| 1716 | |
| 1717 Document& doc = layoutObject->document(); | |
| 1718 | |
| 1719 FrameView* frameView = doc.view(); | |
| 1705 if (!frameView) | 1720 if (!frameView) |
| 1706 return LayoutRect(); | 1721 return LayoutRect(); |
| 1707 | 1722 |
| 1708 return LayoutRect(frameView->visibleContentRect()); | 1723 IntRect frameRect = frameView->visibleContentRect(ExcludeScrollbars); |
| 1724 | |
| 1725 FrameHost* host = doc.frameHost(); | |
| 1726 DCHECK(host); | |
| 1727 if (host->globalRootScrollerController().isRootScrollerAncestor(doc)) { | |
|
chrishtr
2017/01/21 02:06:47
This adjustment in hit-testing code doesn't also a
| |
| 1728 frameRect.setSize(host->globalRootScrollerController() | |
| 1729 .visibleContentRect(ExcludeScrollbars) | |
| 1730 .size()); | |
| 1731 } | |
| 1732 | |
| 1733 return LayoutRect(frameRect); | |
| 1709 } | 1734 } |
| 1710 | 1735 |
| 1711 bool PaintLayer::hitTest(HitTestResult& result) { | 1736 bool PaintLayer::hitTest(HitTestResult& result) { |
| 1712 DCHECK(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant()); | 1737 DCHECK(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant()); |
| 1713 | 1738 |
| 1714 // LayoutView should make sure to update layout before entering hit testing | 1739 // LayoutView should make sure to update layout before entering hit testing |
| 1715 DCHECK(!layoutObject()->frame()->view()->layoutPending()); | 1740 DCHECK(!layoutObject()->frame()->view()->layoutPending()); |
| 1716 DCHECK(!layoutObject()->document().layoutViewItem().needsLayout()); | 1741 DCHECK(!layoutObject()->document().layoutViewItem().needsLayout()); |
| 1717 | 1742 |
| 1718 const HitTestRequest& request = result.hitTestRequest(); | 1743 const HitTestRequest& request = result.hitTestRequest(); |
| 1719 const HitTestLocation& hitTestLocation = result.hitTestLocation(); | 1744 const HitTestLocation& hitTestLocation = result.hitTestLocation(); |
| 1720 | 1745 |
| 1721 // Start with frameVisibleRect to ensure we include the scrollbars. | 1746 // Start with frameVisibleRect to ensure we include the scrollbars. |
| 1722 LayoutRect hitTestArea = frameVisibleRect(layoutObject()); | 1747 LayoutRect hitTestArea = frameVisibleRect(this); |
| 1723 if (request.ignoreClipping()) | 1748 if (request.ignoreClipping()) |
| 1724 hitTestArea.unite(LayoutRect(layoutObject()->view()->documentRect())); | 1749 hitTestArea.unite(LayoutRect(layoutObject()->view()->documentRect())); |
| 1725 | 1750 |
| 1726 PaintLayer* insideLayer = | 1751 PaintLayer* insideLayer = |
| 1727 hitTestLayer(this, 0, result, hitTestArea, hitTestLocation, false); | 1752 hitTestLayer(this, 0, result, hitTestArea, hitTestLocation, false); |
| 1728 if (!insideLayer && isRootLayer()) { | 1753 if (!insideLayer && isRootLayer()) { |
| 1729 IntRect hitRect = hitTestLocation.boundingBox(); | 1754 IntRect hitRect = hitTestLocation.boundingBox(); |
| 1730 bool fallback = false; | 1755 bool fallback = false; |
| 1731 // If we didn't hit any layers but are still inside the document | 1756 // If we didn't hit any layers but are still inside the document |
| 1732 // bounds, then we should fallback to hitting the document. | 1757 // bounds, then we should fallback to hitting the document. |
| (...skipping 1488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3221 } | 3246 } |
| 3222 | 3247 |
| 3223 void showLayerTree(const blink::LayoutObject* layoutObject) { | 3248 void showLayerTree(const blink::LayoutObject* layoutObject) { |
| 3224 if (!layoutObject) { | 3249 if (!layoutObject) { |
| 3225 LOG(INFO) << "Cannot showLayerTree. Root is (nil)"; | 3250 LOG(INFO) << "Cannot showLayerTree. Root is (nil)"; |
| 3226 return; | 3251 return; |
| 3227 } | 3252 } |
| 3228 showLayerTree(layoutObject->enclosingLayer()); | 3253 showLayerTree(layoutObject->enclosingLayer()); |
| 3229 } | 3254 } |
| 3230 #endif | 3255 #endif |
| OLD | NEW |