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

Side by Side Diff: Source/core/paint/DeprecatedPaintLayer.cpp

Issue 1032823003: Refactor HitTestResult to store the HitTestRequest (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 9 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) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
3 * 3 *
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation.
5 * 5 *
6 * Other contributors: 6 * Other contributors:
7 * Robert O'Callahan <roc+@cs.cmu.edu> 7 * Robert O'Callahan <roc+@cs.cmu.edu>
8 * David Baron <dbaron@fas.harvard.edu> 8 * David Baron <dbaron@fas.harvard.edu>
9 * Christian Biesinger <cbiesinger@web.de> 9 * Christian Biesinger <cbiesinger@web.de>
10 * Randall Jesup <rjesup@wgate.com> 10 * Randall Jesup <rjesup@wgate.com>
(...skipping 1647 matching lines...) Expand 10 before | Expand all | Expand 10 after
1658 1658
1659 static inline LayoutRect frameVisibleRect(LayoutObject* renderer) 1659 static inline LayoutRect frameVisibleRect(LayoutObject* renderer)
1660 { 1660 {
1661 FrameView* frameView = renderer->document().view(); 1661 FrameView* frameView = renderer->document().view();
1662 if (!frameView) 1662 if (!frameView)
1663 return LayoutRect(); 1663 return LayoutRect();
1664 1664
1665 return LayoutRect(frameView->visibleContentRect()); 1665 return LayoutRect(frameView->visibleContentRect());
1666 } 1666 }
1667 1667
1668 bool DeprecatedPaintLayer::hitTest(const HitTestRequest& request, HitTestResult& result) 1668 bool DeprecatedPaintLayer::hitTest(HitTestResult& result)
1669 { 1669 {
1670 return hitTest(request, result.hitTestLocation(), result); 1670 return hitTest(result.hitTestRequest(), result.hitTestLocation(), result);
1671 } 1671 }
1672 1672
1673 bool DeprecatedPaintLayer::hitTest(const HitTestRequest& request, const HitTestL ocation& hitTestLocation, HitTestResult& result) 1673 bool DeprecatedPaintLayer::hitTest(const HitTestRequest& request, const HitTestL ocation& hitTestLocation, HitTestResult& result)
1674 { 1674 {
1675 ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant()); 1675 ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant());
1676 1676
1677 // LayoutView should make sure to update layout before entering hit testing 1677 // LayoutView should make sure to update layout before entering hit testing
1678 ASSERT(!layoutObject()->frame()->view()->layoutPending()); 1678 ASSERT(!layoutObject()->frame()->view()->layoutPending());
1679 ASSERT(!layoutObject()->document().layoutView()->needsLayout()); 1679 ASSERT(!layoutObject()->document().layoutView()->needsLayout());
1680 1680
1681 // Start with frameVisibleRect to ensure we include the scrollbars. 1681 // Start with frameVisibleRect to ensure we include the scrollbars.
1682 LayoutRect hitTestArea = frameVisibleRect(layoutObject()); 1682 LayoutRect hitTestArea = frameVisibleRect(layoutObject());
1683 if (request.ignoreClipping()) 1683 if (request.ignoreClipping())
1684 hitTestArea.unite(LayoutRect(layoutObject()->view()->documentRect())); 1684 hitTestArea.unite(LayoutRect(layoutObject()->view()->documentRect()));
1685 1685
1686 DeprecatedPaintLayer* insideLayer = hitTestLayer(this, 0, request, result, h itTestArea, hitTestLocation, false); 1686 DeprecatedPaintLayer* insideLayer = hitTestLayer(this, 0, result, hitTestAre a, hitTestLocation, false);
1687 if (!insideLayer) { 1687 if (!insideLayer) {
1688 // We didn't hit any layer. If we are the root layer and the mouse is -- or just was -- down, 1688 // We didn't hit any layer. If we are the root layer and the mouse is -- or just was -- down,
1689 // return ourselves. We do this so mouse events continue getting deliver ed after a drag has 1689 // return ourselves. We do this so mouse events continue getting deliver ed after a drag has
1690 // exited the WebView, and so hit testing over a scrollbar hits the cont ent document. 1690 // exited the WebView, and so hit testing over a scrollbar hits the cont ent document.
1691 // In addtion, it is possible for the mouse to stay in the document but there is no element. 1691 // In addtion, it is possible for the mouse to stay in the document but there is no element.
1692 // At that time, the events of the mouse should be fired. 1692 // At that time, the events of the mouse should be fired.
1693 LayoutPoint hitPoint = hitTestLocation.point(); 1693 LayoutPoint hitPoint = hitTestLocation.point();
1694 if (!request.isChildFrameHitTest() && ((request.active() || request.rele ase()) || (request.move() && hitTestArea.contains(hitPoint.x(), hitPoint.y()))) && isRootLayer()) { 1694 if (!request.isChildFrameHitTest() && ((request.active() || request.rele ase()) || (request.move() && hitTestArea.contains(hitPoint.x(), hitPoint.y()))) && isRootLayer()) {
1695 layoutObject()->updateHitTestResult(result, toLayoutView(layoutObjec t())->flipForWritingMode(hitTestLocation.point())); 1695 layoutObject()->updateHitTestResult(result, toLayoutView(layoutObjec t())->flipForWritingMode(hitTestLocation.point()));
1696 insideLayer = this; 1696 insideLayer = this;
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1797 } 1797 }
1798 1798
1799 // hitTestLocation and hitTestRect are relative to rootLayer. 1799 // hitTestLocation and hitTestRect are relative to rootLayer.
1800 // A 'flattening' layer is one preserves3D() == false. 1800 // A 'flattening' layer is one preserves3D() == false.
1801 // transformState.m_accumulatedTransform holds the transform from the containing flattening layer. 1801 // transformState.m_accumulatedTransform holds the transform from the containing flattening layer.
1802 // transformState.m_lastPlanarPoint is the hitTestLocation in the plane of the c ontaining flattening layer. 1802 // transformState.m_lastPlanarPoint is the hitTestLocation in the plane of the c ontaining flattening layer.
1803 // transformState.m_lastPlanarQuad is the hitTestRect as a quad in the plane of the containing flattening layer. 1803 // transformState.m_lastPlanarQuad is the hitTestRect as a quad in the plane of the containing flattening layer.
1804 // 1804 //
1805 // If zOffset is non-null (which indicates that the caller wants z offset inform ation), 1805 // If zOffset is non-null (which indicates that the caller wants z offset inform ation),
1806 // *zOffset on return is the z offset of the hit point relative to the containi ng flattening layer. 1806 // *zOffset on return is the z offset of the hit point relative to the containi ng flattening layer.
1807 DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestLayer(DeprecatedPaintLayer* r ootLayer, DeprecatedPaintLayer* containerLayer, const HitTestRequest& request, H itTestResult& result, 1807 DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestLayer(DeprecatedPaintLayer* r ootLayer, DeprecatedPaintLayer* containerLayer, HitTestResult& result,
1808 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, bool appliedTransform, 1808 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, bool appliedTransform,
1809 const HitTestingTransformState* transformState, double* zOffset) 1809 const HitTestingTransformState* transformState, double* zOffset)
1810 { 1810 {
1811 if (!isSelfPaintingLayer() && !hasSelfPaintingLayerDescendant()) 1811 if (!isSelfPaintingLayer() && !hasSelfPaintingLayerDescendant())
1812 return 0; 1812 return 0;
1813 1813
1814 // The natural thing would be to keep HitTestingTransformState on the stack, but it's big, so we heap-allocate. 1814 // The natural thing would be to keep HitTestingTransformState on the stack, but it's big, so we heap-allocate.
1815 1815
1816 // Apply a transform if we have one. 1816 // Apply a transform if we have one.
1817 if (transform() && !appliedTransform) { 1817 if (transform() && !appliedTransform) {
1818 if (enclosingPaginationLayer()) 1818 if (enclosingPaginationLayer())
1819 return hitTestTransformedLayerInFragments(rootLayer, containerLayer, request, result, hitTestRect, hitTestLocation, transformState, zOffset); 1819 return hitTestTransformedLayerInFragments(rootLayer, containerLayer, result, hitTestRect, hitTestLocation, transformState, zOffset);
1820 1820
1821 // Make sure the parent's clip rects have been calculated. 1821 // Make sure the parent's clip rects have been calculated.
1822 if (parent()) { 1822 if (parent()) {
1823 ClipRect clipRect = clipper().backgroundClipRect(ClipRectsContext(ro otLayer, RootRelativeClipRects, IncludeOverlayScrollbarSize)); 1823 ClipRect clipRect = clipper().backgroundClipRect(ClipRectsContext(ro otLayer, RootRelativeClipRects, IncludeOverlayScrollbarSize));
1824 // Go ahead and test the enclosing clip now. 1824 // Go ahead and test the enclosing clip now.
1825 if (!clipRect.intersects(hitTestLocation)) 1825 if (!clipRect.intersects(hitTestLocation))
1826 return 0; 1826 return 0;
1827 } 1827 }
1828 1828
1829 return hitTestLayerByApplyingTransform(rootLayer, containerLayer, reques t, result, hitTestRect, hitTestLocation, transformState, zOffset); 1829 return hitTestLayerByApplyingTransform(rootLayer, containerLayer, result , hitTestRect, hitTestLocation, transformState, zOffset);
1830 } 1830 }
1831 1831
1832 // Ensure our lists and 3d status are up-to-date. 1832 // Ensure our lists and 3d status are up-to-date.
1833 m_stackingNode->updateLayerListsIfNeeded(); 1833 m_stackingNode->updateLayerListsIfNeeded();
1834 update3DTransformedDescendantStatus(); 1834 update3DTransformedDescendantStatus();
1835 1835
1836 RefPtr<HitTestingTransformState> localTransformState; 1836 RefPtr<HitTestingTransformState> localTransformState;
1837 if (appliedTransform) { 1837 if (appliedTransform) {
1838 // We computed the correct state in the caller (above code), so just ref erence it. 1838 // We computed the correct state in the caller (above code), so just ref erence it.
1839 ASSERT(transformState); 1839 ASSERT(transformState);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1874 } else if (zOffset) { 1874 } else if (zOffset) {
1875 zOffsetForDescendantsPtr = 0; 1875 zOffsetForDescendantsPtr = 0;
1876 // Container needs us to give back a z offset for the hit layer. 1876 // Container needs us to give back a z offset for the hit layer.
1877 zOffsetForContentsPtr = zOffset; 1877 zOffsetForContentsPtr = zOffset;
1878 } 1878 }
1879 1879
1880 // This variable tracks which layer the mouse ends up being inside. 1880 // This variable tracks which layer the mouse ends up being inside.
1881 DeprecatedPaintLayer* candidateLayer = 0; 1881 DeprecatedPaintLayer* candidateLayer = 0;
1882 1882
1883 // Begin by walking our list of positive layers from highest z-index down to the lowest z-index. 1883 // Begin by walking our list of positive layers from highest z-index down to the lowest z-index.
1884 DeprecatedPaintLayer* hitLayer = hitTestChildren(PositiveZOrderChildren, roo tLayer, request, result, hitTestRect, hitTestLocation, 1884 DeprecatedPaintLayer* hitLayer = hitTestChildren(PositiveZOrderChildren, roo tLayer, result, hitTestRect, hitTestLocation,
1885 localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattene dTransformState.get(), depthSortDescendants); 1885 localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattene dTransformState.get(), depthSortDescendants);
1886 if (hitLayer) { 1886 if (hitLayer) {
1887 if (!depthSortDescendants) 1887 if (!depthSortDescendants)
1888 return hitLayer; 1888 return hitLayer;
1889 candidateLayer = hitLayer; 1889 candidateLayer = hitLayer;
1890 } 1890 }
1891 1891
1892 // Now check our overflow objects. 1892 // Now check our overflow objects.
1893 hitLayer = hitTestChildren(NormalFlowChildren, rootLayer, request, result, h itTestRect, hitTestLocation, 1893 hitLayer = hitTestChildren(NormalFlowChildren, rootLayer, result, hitTestRec t, hitTestLocation,
1894 localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattene dTransformState.get(), depthSortDescendants); 1894 localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattene dTransformState.get(), depthSortDescendants);
1895 if (hitLayer) { 1895 if (hitLayer) {
1896 if (!depthSortDescendants) 1896 if (!depthSortDescendants)
1897 return hitLayer; 1897 return hitLayer;
1898 candidateLayer = hitLayer; 1898 candidateLayer = hitLayer;
1899 } 1899 }
1900 1900
1901 // Collect the fragments. This will compute the clip rectangles for each lay er fragment. 1901 // Collect the fragments. This will compute the clip rectangles for each lay er fragment.
1902 DeprecatedPaintLayerFragments layerFragments; 1902 DeprecatedPaintLayerFragments layerFragments;
1903 if (appliedTransform) 1903 if (appliedTransform)
1904 appendSingleFragmentIgnoringPagination(layerFragments, rootLayer, hitTes tRect, RootRelativeClipRects, IncludeOverlayScrollbarSize); 1904 appendSingleFragmentIgnoringPagination(layerFragments, rootLayer, hitTes tRect, RootRelativeClipRects, IncludeOverlayScrollbarSize);
1905 else 1905 else
1906 collectFragments(layerFragments, rootLayer, hitTestRect, RootRelativeCli pRects, IncludeOverlayScrollbarSize); 1906 collectFragments(layerFragments, rootLayer, hitTestRect, RootRelativeCli pRects, IncludeOverlayScrollbarSize);
1907 1907
1908 if (m_scrollableArea && m_scrollableArea->hitTestResizerInFragments(layerFra gments, hitTestLocation)) { 1908 if (m_scrollableArea && m_scrollableArea->hitTestResizerInFragments(layerFra gments, hitTestLocation)) {
1909 layoutObject()->updateHitTestResult(result, hitTestLocation.point()); 1909 layoutObject()->updateHitTestResult(result, hitTestLocation.point());
1910 return this; 1910 return this;
1911 } 1911 }
1912 1912
1913 // Next we want to see if the mouse pos is inside the child LayoutObjects of the layer. Check 1913 // Next we want to see if the mouse pos is inside the child LayoutObjects of the layer. Check
1914 // every fragment in reverse order. 1914 // every fragment in reverse order.
1915 if (isSelfPaintingLayer()) { 1915 if (isSelfPaintingLayer()) {
1916 // Hit test with a temporary HitTestResult, because we only want to comm it to 'result' if we know we're frontmost. 1916 // Hit test with a temporary HitTestResult, because we only want to comm it to 'result' if we know we're frontmost.
1917 HitTestResult tempResult(result.hitTestLocation()); 1917 HitTestResult tempResult(result.hitTestRequest(), result.hitTestLocation ());
1918 bool insideFragmentForegroundRect = false; 1918 bool insideFragmentForegroundRect = false;
1919 if (hitTestContentsForFragments(layerFragments, request, tempResult, hit TestLocation, HitTestDescendants, insideFragmentForegroundRect) 1919 if (hitTestContentsForFragments(layerFragments, tempResult, hitTestLocat ion, HitTestDescendants, insideFragmentForegroundRect)
1920 && isHitCandidate(this, false, zOffsetForContentsPtr, unflattenedTra nsformState.get())) { 1920 && isHitCandidate(this, false, zOffsetForContentsPtr, unflattenedTra nsformState.get())) {
1921 if (request.listBased()) 1921 if (result.hitTestRequest().listBased())
1922 result.append(tempResult, request); 1922 result.append(tempResult);
1923 else 1923 else
1924 result = tempResult; 1924 result = tempResult;
1925 if (!depthSortDescendants) 1925 if (!depthSortDescendants)
1926 return this; 1926 return this;
1927 // Foreground can depth-sort with descendant layers, so keep this as a candidate. 1927 // Foreground can depth-sort with descendant layers, so keep this as a candidate.
1928 candidateLayer = this; 1928 candidateLayer = this;
1929 } else if (insideFragmentForegroundRect && request.listBased()) { 1929 } else if (insideFragmentForegroundRect && result.hitTestRequest().listB ased()) {
1930 result.append(tempResult, request); 1930 result.append(tempResult);
1931 } 1931 }
1932 } 1932 }
1933 1933
1934 // Now check our negative z-index children. 1934 // Now check our negative z-index children.
1935 hitLayer = hitTestChildren(NegativeZOrderChildren, rootLayer, request, resul t, hitTestRect, hitTestLocation, 1935 hitLayer = hitTestChildren(NegativeZOrderChildren, rootLayer, result, hitTes tRect, hitTestLocation,
1936 localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattene dTransformState.get(), depthSortDescendants); 1936 localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattene dTransformState.get(), depthSortDescendants);
1937 if (hitLayer) { 1937 if (hitLayer) {
1938 if (!depthSortDescendants) 1938 if (!depthSortDescendants)
1939 return hitLayer; 1939 return hitLayer;
1940 candidateLayer = hitLayer; 1940 candidateLayer = hitLayer;
1941 } 1941 }
1942 1942
1943 // If we found a layer, return. Child layers, and foreground always render i n front of background. 1943 // If we found a layer, return. Child layers, and foreground always render i n front of background.
1944 if (candidateLayer) 1944 if (candidateLayer)
1945 return candidateLayer; 1945 return candidateLayer;
1946 1946
1947 if (isSelfPaintingLayer()) { 1947 if (isSelfPaintingLayer()) {
1948 HitTestResult tempResult(result.hitTestLocation()); 1948 HitTestResult tempResult(result.hitTestRequest(), result.hitTestLocation ());
1949 bool insideFragmentBackgroundRect = false; 1949 bool insideFragmentBackgroundRect = false;
1950 if (hitTestContentsForFragments(layerFragments, request, tempResult, hit TestLocation, HitTestSelf, insideFragmentBackgroundRect) 1950 if (hitTestContentsForFragments(layerFragments, tempResult, hitTestLocat ion, HitTestSelf, insideFragmentBackgroundRect)
1951 && isHitCandidate(this, false, zOffsetForContentsPtr, unflattenedTra nsformState.get())) { 1951 && isHitCandidate(this, false, zOffsetForContentsPtr, unflattenedTra nsformState.get())) {
1952 if (result.isRectBasedTest()) 1952 if (result.isRectBasedTest())
1953 result.append(tempResult, request); 1953 result.append(tempResult);
1954 else 1954 else
1955 result = tempResult; 1955 result = tempResult;
1956 return this; 1956 return this;
1957 } 1957 }
1958 if (insideFragmentBackgroundRect && request.listBased()) 1958 if (insideFragmentBackgroundRect && result.hitTestRequest().listBased())
1959 result.append(tempResult, request); 1959 result.append(tempResult);
1960 } 1960 }
1961 1961
1962 return 0; 1962 return 0;
1963 } 1963 }
1964 1964
1965 bool DeprecatedPaintLayer::hitTestContentsForFragments(const DeprecatedPaintLaye rFragments& layerFragments, const HitTestRequest& request, HitTestResult& result , 1965 bool DeprecatedPaintLayer::hitTestContentsForFragments(const DeprecatedPaintLaye rFragments& layerFragments, HitTestResult& result,
1966 const HitTestLocation& hitTestLocation, HitTestFilter hitTestFilter, bool& i nsideClipRect) const 1966 const HitTestLocation& hitTestLocation, HitTestFilter hitTestFilter, bool& i nsideClipRect) const
1967 { 1967 {
1968 if (layerFragments.isEmpty()) 1968 if (layerFragments.isEmpty())
1969 return false; 1969 return false;
1970 1970
1971 for (int i = layerFragments.size() - 1; i >= 0; --i) { 1971 for (int i = layerFragments.size() - 1; i >= 0; --i) {
1972 const DeprecatedPaintLayerFragment& fragment = layerFragments.at(i); 1972 const DeprecatedPaintLayerFragment& fragment = layerFragments.at(i);
1973 if ((hitTestFilter == HitTestSelf && !fragment.backgroundRect.intersects (hitTestLocation)) 1973 if ((hitTestFilter == HitTestSelf && !fragment.backgroundRect.intersects (hitTestLocation))
1974 || (hitTestFilter == HitTestDescendants && !fragment.foregroundRect. intersects(hitTestLocation))) 1974 || (hitTestFilter == HitTestDescendants && !fragment.foregroundRect. intersects(hitTestLocation)))
1975 continue; 1975 continue;
1976 insideClipRect = true; 1976 insideClipRect = true;
1977 if (hitTestContents(request, result, fragment.layerBounds, hitTestLocati on, hitTestFilter)) 1977 if (hitTestContents(result, fragment.layerBounds, hitTestLocation, hitTe stFilter))
1978 return true; 1978 return true;
1979 } 1979 }
1980 1980
1981 return false; 1981 return false;
1982 } 1982 }
1983 1983
1984 DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestTransformedLayerInFragments(D eprecatedPaintLayer* rootLayer, DeprecatedPaintLayer* containerLayer, const HitT estRequest& request, HitTestResult& result, 1984 DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestTransformedLayerInFragments(D eprecatedPaintLayer* rootLayer, DeprecatedPaintLayer* containerLayer, HitTestRes ult& result,
1985 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset) 1985 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset)
1986 { 1986 {
1987 DeprecatedPaintLayerFragments enclosingPaginationFragments; 1987 DeprecatedPaintLayerFragments enclosingPaginationFragments;
1988 LayoutPoint offsetOfPaginationLayerFromRoot; 1988 LayoutPoint offsetOfPaginationLayerFromRoot;
1989 // FIXME: We're missing a sub-pixel offset here crbug.com/348728 1989 // FIXME: We're missing a sub-pixel offset here crbug.com/348728
1990 LayoutRect transformedExtent = transparencyClipBox(this, enclosingPagination Layer(), HitTestingTransparencyClipBox, DeprecatedPaintLayer::RootOfTransparency ClipBox, LayoutSize()); 1990 LayoutRect transformedExtent = transparencyClipBox(this, enclosingPagination Layer(), HitTestingTransparencyClipBox, DeprecatedPaintLayer::RootOfTransparency ClipBox, LayoutSize());
1991 enclosingPaginationLayer()->collectFragments(enclosingPaginationFragments, r ootLayer, hitTestRect, 1991 enclosingPaginationLayer()->collectFragments(enclosingPaginationFragments, r ootLayer, hitTestRect,
1992 RootRelativeClipRects, IncludeOverlayScrollbarSize, RespectOverflowClip, &offsetOfPaginationLayerFromRoot, LayoutSize(), &transformedExtent); 1992 RootRelativeClipRects, IncludeOverlayScrollbarSize, RespectOverflowClip, &offsetOfPaginationLayerFromRoot, LayoutSize(), &transformedExtent);
1993 1993
1994 for (int i = enclosingPaginationFragments.size() - 1; i >= 0; --i) { 1994 for (int i = enclosingPaginationFragments.size() - 1; i >= 0; --i) {
1995 const DeprecatedPaintLayerFragment& fragment = enclosingPaginationFragme nts.at(i); 1995 const DeprecatedPaintLayerFragment& fragment = enclosingPaginationFragme nts.at(i);
1996 1996
1997 // Apply the page/column clip for this fragment, as well as any clips es tablished by layers in between us and 1997 // Apply the page/column clip for this fragment, as well as any clips es tablished by layers in between us and
1998 // the enclosing pagination layer. 1998 // the enclosing pagination layer.
1999 LayoutRect clipRect = fragment.backgroundRect.rect(); 1999 LayoutRect clipRect = fragment.backgroundRect.rect();
2000 2000
2001 // Now compute the clips within a given fragment 2001 // Now compute the clips within a given fragment
2002 if (parent() != enclosingPaginationLayer()) { 2002 if (parent() != enclosingPaginationLayer()) {
2003 enclosingPaginationLayer()->convertToLayerCoords(rootLayer, offsetOf PaginationLayerFromRoot); 2003 enclosingPaginationLayer()->convertToLayerCoords(rootLayer, offsetOf PaginationLayerFromRoot);
2004 LayoutRect parentClipRect = clipper().backgroundClipRect(ClipRectsCo ntext(enclosingPaginationLayer(), RootRelativeClipRects, IncludeOverlayScrollbar Size)).rect(); 2004 LayoutRect parentClipRect = clipper().backgroundClipRect(ClipRectsCo ntext(enclosingPaginationLayer(), RootRelativeClipRects, IncludeOverlayScrollbar Size)).rect();
2005 parentClipRect.moveBy(fragment.paginationOffset + offsetOfPagination LayerFromRoot); 2005 parentClipRect.moveBy(fragment.paginationOffset + offsetOfPagination LayerFromRoot);
2006 clipRect.intersect(parentClipRect); 2006 clipRect.intersect(parentClipRect);
2007 } 2007 }
2008 2008
2009 if (!hitTestLocation.intersects(clipRect)) 2009 if (!hitTestLocation.intersects(clipRect))
2010 continue; 2010 continue;
2011 2011
2012 DeprecatedPaintLayer* hitLayer = hitTestLayerByApplyingTransform(rootLay er, containerLayer, request, result, hitTestRect, hitTestLocation, 2012 DeprecatedPaintLayer* hitLayer = hitTestLayerByApplyingTransform(rootLay er, containerLayer, result, hitTestRect, hitTestLocation,
2013 transformState, zOffset, fragment.paginationOffset); 2013 transformState, zOffset, fragment.paginationOffset);
2014 if (hitLayer) 2014 if (hitLayer)
2015 return hitLayer; 2015 return hitLayer;
2016 } 2016 }
2017 2017
2018 return 0; 2018 return 0;
2019 } 2019 }
2020 2020
2021 DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestLayerByApplyingTransform(Depr ecatedPaintLayer* rootLayer, DeprecatedPaintLayer* containerLayer, const HitTest Request& request, HitTestResult& result, 2021 DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestLayerByApplyingTransform(Depr ecatedPaintLayer* rootLayer, DeprecatedPaintLayer* containerLayer, HitTestResult & result,
2022 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset, 2022 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset,
2023 const LayoutPoint& translationOffset) 2023 const LayoutPoint& translationOffset)
2024 { 2024 {
2025 // Create a transform state to accumulate this transform. 2025 // Create a transform state to accumulate this transform.
2026 RefPtr<HitTestingTransformState> newTransformState = createLocalTransformSta te(rootLayer, containerLayer, hitTestRect, hitTestLocation, transformState, tran slationOffset); 2026 RefPtr<HitTestingTransformState> newTransformState = createLocalTransformSta te(rootLayer, containerLayer, hitTestRect, hitTestLocation, transformState, tran slationOffset);
2027 2027
2028 // If the transform can't be inverted, then don't hit test this layer at all . 2028 // If the transform can't be inverted, then don't hit test this layer at all .
2029 if (!newTransformState->m_accumulatedTransform.isInvertible()) 2029 if (!newTransformState->m_accumulatedTransform.isInvertible())
2030 return 0; 2030 return 0;
2031 2031
2032 // Compute the point and the hit test rect in the coords of this layer by us ing the values 2032 // Compute the point and the hit test rect in the coords of this layer by us ing the values
2033 // from the transformState, which store the point and quad in the coords of the last flattened 2033 // from the transformState, which store the point and quad in the coords of the last flattened
2034 // layer, and the accumulated transform which lets up map through preserve-3 d layers. 2034 // layer, and the accumulated transform which lets up map through preserve-3 d layers.
2035 // 2035 //
2036 // We can't just map hitTestLocation and hitTestRect because they may have b een flattened (losing z) 2036 // We can't just map hitTestLocation and hitTestRect because they may have b een flattened (losing z)
2037 // by our container. 2037 // by our container.
2038 FloatPoint localPoint = newTransformState->mappedPoint(); 2038 FloatPoint localPoint = newTransformState->mappedPoint();
2039 FloatQuad localPointQuad = newTransformState->mappedQuad(); 2039 FloatQuad localPointQuad = newTransformState->mappedQuad();
2040 LayoutRect localHitTestRect = newTransformState->boundsOfMappedArea(); 2040 LayoutRect localHitTestRect = newTransformState->boundsOfMappedArea();
2041 HitTestLocation newHitTestLocation; 2041 HitTestLocation newHitTestLocation;
2042 if (hitTestLocation.isRectBasedTest()) 2042 if (hitTestLocation.isRectBasedTest())
2043 newHitTestLocation = HitTestLocation(localPoint, localPointQuad); 2043 newHitTestLocation = HitTestLocation(localPoint, localPointQuad);
2044 else 2044 else
2045 newHitTestLocation = HitTestLocation(localPoint); 2045 newHitTestLocation = HitTestLocation(localPoint);
2046 2046
2047 // Now do a hit test with the root layer shifted to be us. 2047 // Now do a hit test with the root layer shifted to be us.
2048 return hitTestLayer(this, containerLayer, request, result, localHitTestRect, newHitTestLocation, true, newTransformState.get(), zOffset); 2048 return hitTestLayer(this, containerLayer, result, localHitTestRect, newHitTe stLocation, true, newTransformState.get(), zOffset);
2049 } 2049 }
2050 2050
2051 bool DeprecatedPaintLayer::hitTestContents(const HitTestRequest& request, HitTes tResult& result, const LayoutRect& layerBounds, const HitTestLocation& hitTestLo cation, HitTestFilter hitTestFilter) const 2051 bool DeprecatedPaintLayer::hitTestContents(HitTestResult& result, const LayoutRe ct& layerBounds, const HitTestLocation& hitTestLocation, HitTestFilter hitTestFi lter) const
2052 { 2052 {
2053 ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant()); 2053 ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant());
2054 2054
2055 if (!layoutObject()->hitTest(request, result, hitTestLocation, toLayoutPoint (layerBounds.location() - layoutBoxLocation()), hitTestFilter)) { 2055 if (!layoutObject()->hitTest(result, hitTestLocation, toLayoutPoint(layerBou nds.location() - layoutBoxLocation()), hitTestFilter)) {
2056 // It's wrong to set innerNode, but then claim that you didn't hit anyth ing, unless it is 2056 // It's wrong to set innerNode, but then claim that you didn't hit anyth ing, unless it is
2057 // a rect-based test. 2057 // a rect-based test.
2058 ASSERT(!result.innerNode() || (request.listBased() && result.listBasedTe stResult().size())); 2058 ASSERT(!result.innerNode() || (result.hitTestRequest().listBased() && re sult.listBasedTestResult().size()));
2059 return false; 2059 return false;
2060 } 2060 }
2061 2061
2062 if (!result.innerNode() || !result.innerNonSharedNode()) { 2062 if (!result.innerNode() || !result.innerNonSharedNode()) {
2063 // We hit something anonymous, and we didn't find a DOM node ancestor in this layer. 2063 // We hit something anonymous, and we didn't find a DOM node ancestor in this layer.
2064 2064
2065 if (layoutObject()->isLayoutFlowThread()) { 2065 if (layoutObject()->isLayoutFlowThread()) {
2066 // For a flow thread it's safe to just say that we didn't hit anythi ng. That means that 2066 // For a flow thread it's safe to just say that we didn't hit anythi ng. That means that
2067 // we'll continue as normally, and eventually hit a column set sibli ng instead. Column 2067 // we'll continue as normally, and eventually hit a column set sibli ng instead. Column
2068 // sets are also anonymous, but, unlike flow threads, they don't est ablish layers, so 2068 // sets are also anonymous, but, unlike flow threads, they don't est ablish layers, so
2069 // we'll fall back and hit the multicol container parent (which shou ld have a DOM node). 2069 // we'll fall back and hit the multicol container parent (which shou ld have a DOM node).
2070 return false; 2070 return false;
2071 } 2071 }
2072 2072
2073 Node* e = enclosingElement(); 2073 Node* e = enclosingElement();
2074 if (!result.innerNode()) 2074 if (!result.innerNode())
2075 result.setInnerNode(e); 2075 result.setInnerNode(e);
2076 if (!result.innerNonSharedNode()) 2076 if (!result.innerNonSharedNode())
2077 result.setInnerNonSharedNode(e); 2077 result.setInnerNonSharedNode(e);
2078 // FIXME: missing call to result.setLocalPoint(). What we would really w ant to do here is to 2078 // FIXME: missing call to result.setLocalPoint(). What we would really w ant to do here is to
2079 // return and look for the nearest non-anonymous ancestor, and ignore au nts and uncles on 2079 // return and look for the nearest non-anonymous ancestor, and ignore au nts and uncles on
2080 // our way. It's bad to look for it manually like we do here, and give u p on setting a local 2080 // our way. It's bad to look for it manually like we do here, and give u p on setting a local
2081 // point in the result, because that has bad implications for text selec tion and 2081 // point in the result, because that has bad implications for text selec tion and
2082 // caretRangeFromPoint(). See crbug.com/461791 2082 // caretRangeFromPoint(). See crbug.com/461791
2083 } 2083 }
2084 return true; 2084 return true;
2085 } 2085 }
2086 2086
2087 DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestChildren(ChildrenIteration ch ildrentoVisit, DeprecatedPaintLayer* rootLayer, 2087 DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestChildren(ChildrenIteration ch ildrentoVisit, DeprecatedPaintLayer* rootLayer,
2088 const HitTestRequest& request, HitTestResult& result, 2088 HitTestResult& result,
2089 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, 2089 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation,
2090 const HitTestingTransformState* transformState, 2090 const HitTestingTransformState* transformState,
2091 double* zOffsetForDescendants, double* zOffset, 2091 double* zOffsetForDescendants, double* zOffset,
2092 const HitTestingTransformState* unflattenedTransformState, 2092 const HitTestingTransformState* unflattenedTransformState,
2093 bool depthSortDescendants) 2093 bool depthSortDescendants)
2094 { 2094 {
2095 if (!hasSelfPaintingLayerDescendant()) 2095 if (!hasSelfPaintingLayerDescendant())
2096 return 0; 2096 return 0;
2097 2097
2098 DeprecatedPaintLayer* resultLayer = 0; 2098 DeprecatedPaintLayer* resultLayer = 0;
2099 DeprecatedPaintLayerStackingNodeReverseIterator iterator(*m_stackingNode, ch ildrentoVisit); 2099 DeprecatedPaintLayerStackingNodeReverseIterator iterator(*m_stackingNode, ch ildrentoVisit);
2100 while (DeprecatedPaintLayerStackingNode* child = iterator.next()) { 2100 while (DeprecatedPaintLayerStackingNode* child = iterator.next()) {
2101 DeprecatedPaintLayer* childLayer = child->layer(); 2101 DeprecatedPaintLayer* childLayer = child->layer();
2102 DeprecatedPaintLayer* hitLayer = 0; 2102 DeprecatedPaintLayer* hitLayer = 0;
2103 HitTestResult tempResult(result.hitTestLocation()); 2103 HitTestResult tempResult(result.hitTestRequest(), result.hitTestLocation ());
2104 if (childLayer->isPaginated()) 2104 if (childLayer->isPaginated())
2105 hitLayer = hitTestPaginatedChildLayer(childLayer, rootLayer, request , tempResult, hitTestRect, hitTestLocation, transformState, zOffsetForDescendant s); 2105 hitLayer = hitTestPaginatedChildLayer(childLayer, rootLayer, tempRes ult, hitTestRect, hitTestLocation, transformState, zOffsetForDescendants);
2106 else 2106 else
2107 hitLayer = childLayer->hitTestLayer(rootLayer, this, request, tempRe sult, hitTestRect, hitTestLocation, false, transformState, zOffsetForDescendants ); 2107 hitLayer = childLayer->hitTestLayer(rootLayer, this, tempResult, hit TestRect, hitTestLocation, false, transformState, zOffsetForDescendants);
2108 2108
2109 // If it is a list-based test, we can safely append the temporary result since it might had hit 2109 // If it is a list-based test, we can safely append the temporary result since it might had hit
2110 // nodes but not necesserily had hitLayer set. 2110 // nodes but not necesserily had hitLayer set.
2111 ASSERT(!result.isRectBasedTest() || request.listBased()); 2111 ASSERT(!result.isRectBasedTest() || result.hitTestRequest().listBased()) ;
2112 if (request.listBased()) 2112 if (result.hitTestRequest().listBased())
2113 result.append(tempResult, request); 2113 result.append(tempResult);
2114 2114
2115 if (isHitCandidate(hitLayer, depthSortDescendants, zOffset, unflattenedT ransformState)) { 2115 if (isHitCandidate(hitLayer, depthSortDescendants, zOffset, unflattenedT ransformState)) {
2116 resultLayer = hitLayer; 2116 resultLayer = hitLayer;
2117 if (!request.listBased()) 2117 if (!result.hitTestRequest().listBased())
2118 result = tempResult; 2118 result = tempResult;
2119 if (!depthSortDescendants) 2119 if (!depthSortDescendants)
2120 break; 2120 break;
2121 } 2121 }
2122 } 2122 }
2123 2123
2124 return resultLayer; 2124 return resultLayer;
2125 } 2125 }
2126 2126
2127 DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestPaginatedChildLayer(Deprecate dPaintLayer* childLayer, DeprecatedPaintLayer* rootLayer, const HitTestRequest& request, HitTestResult& result, 2127 DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestPaginatedChildLayer(Deprecate dPaintLayer* childLayer, DeprecatedPaintLayer* rootLayer, HitTestResult& result,
2128 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset) 2128 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset)
2129 { 2129 {
2130 Vector<DeprecatedPaintLayer*> columnLayers; 2130 Vector<DeprecatedPaintLayer*> columnLayers;
2131 DeprecatedPaintLayerStackingNode* ancestorNode = m_stackingNode->isNormalFlo wOnly() ? parent()->stackingNode() : m_stackingNode->ancestorStackingContextNode (); 2131 DeprecatedPaintLayerStackingNode* ancestorNode = m_stackingNode->isNormalFlo wOnly() ? parent()->stackingNode() : m_stackingNode->ancestorStackingContextNode ();
2132 for (DeprecatedPaintLayer* curr = childLayer->parent(); curr; curr = curr->p arent()) { 2132 for (DeprecatedPaintLayer* curr = childLayer->parent(); curr; curr = curr->p arent()) {
2133 if (curr->layoutObject()->hasColumns() && checkContainingBlockChainForPa gination(childLayer->layoutObject(), curr->layoutBox())) 2133 if (curr->layoutObject()->hasColumns() && checkContainingBlockChainForPa gination(childLayer->layoutObject(), curr->layoutBox()))
2134 columnLayers.append(curr); 2134 columnLayers.append(curr);
2135 if (curr->stackingNode() == ancestorNode) 2135 if (curr->stackingNode() == ancestorNode)
2136 break; 2136 break;
2137 } 2137 }
2138 2138
2139 ASSERT(columnLayers.size()); 2139 ASSERT(columnLayers.size());
2140 return hitTestChildLayerColumns(childLayer, rootLayer, request, result, hitT estRect, hitTestLocation, transformState, zOffset, 2140 return hitTestChildLayerColumns(childLayer, rootLayer, result, hitTestRect, hitTestLocation, transformState, zOffset,
2141 columnLayers, columnLayers.size() - 1); 2141 columnLayers, columnLayers.size() - 1);
2142 } 2142 }
2143 2143
2144 DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestChildLayerColumns(DeprecatedP aintLayer* childLayer, DeprecatedPaintLayer* rootLayer, const HitTestRequest& re quest, HitTestResult& result, 2144 DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestChildLayerColumns(DeprecatedP aintLayer* childLayer, DeprecatedPaintLayer* rootLayer, HitTestResult& result,
2145 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset, 2145 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset,
2146 const Vector<DeprecatedPaintLayer*>& columnLayers, size_t columnIndex) 2146 const Vector<DeprecatedPaintLayer*>& columnLayers, size_t columnIndex)
2147 { 2147 {
2148 LayoutBlock* columnBlock = toLayoutBlock(columnLayers[columnIndex]->layoutOb ject()); 2148 LayoutBlock* columnBlock = toLayoutBlock(columnLayers[columnIndex]->layoutOb ject());
2149 2149
2150 ASSERT(columnBlock && columnBlock->hasColumns()); 2150 ASSERT(columnBlock && columnBlock->hasColumns());
2151 if (!columnBlock || !columnBlock->hasColumns()) 2151 if (!columnBlock || !columnBlock->hasColumns())
2152 return 0; 2152 return 0;
2153 2153
2154 LayoutPoint layerOffset; 2154 LayoutPoint layerOffset;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2204 if (!columnIndex) { 2204 if (!columnIndex) {
2205 // Apply a translation transform to change where the layer paint s. 2205 // Apply a translation transform to change where the layer paint s.
2206 TransformationMatrix oldTransform; 2206 TransformationMatrix oldTransform;
2207 bool oldHasTransform = childLayer->transform(); 2207 bool oldHasTransform = childLayer->transform();
2208 if (oldHasTransform) 2208 if (oldHasTransform)
2209 oldTransform = *childLayer->transform(); 2209 oldTransform = *childLayer->transform();
2210 TransformationMatrix newTransform(oldTransform); 2210 TransformationMatrix newTransform(oldTransform);
2211 newTransform.translateRight(offset.width(), offset.height()); 2211 newTransform.translateRight(offset.width(), offset.height());
2212 2212
2213 childLayer->m_transform = adoptPtr(new TransformationMatrix(newT ransform)); 2213 childLayer->m_transform = adoptPtr(new TransformationMatrix(newT ransform));
2214 hitLayer = childLayer->hitTestLayer(rootLayer, columnLayers[0], request, result, localClipRect, hitTestLocation, false, transformState, zOffset) ; 2214 hitLayer = childLayer->hitTestLayer(rootLayer, columnLayers[0], result, localClipRect, hitTestLocation, false, transformState, zOffset);
2215 if (oldHasTransform) 2215 if (oldHasTransform)
2216 childLayer->m_transform = adoptPtr(new TransformationMatrix( oldTransform)); 2216 childLayer->m_transform = adoptPtr(new TransformationMatrix( oldTransform));
2217 else 2217 else
2218 childLayer->m_transform.clear(); 2218 childLayer->m_transform.clear();
2219 } else { 2219 } else {
2220 // Adjust the transform such that the renderer's upper left corn er will be at (0,0) in user space. 2220 // Adjust the transform such that the renderer's upper left corn er will be at (0,0) in user space.
2221 // This involves subtracting out the position of the layer in ou r current coordinate space. 2221 // This involves subtracting out the position of the layer in ou r current coordinate space.
2222 DeprecatedPaintLayer* nextLayer = columnLayers[columnIndex - 1]; 2222 DeprecatedPaintLayer* nextLayer = columnLayers[columnIndex - 1];
2223 RefPtr<HitTestingTransformState> newTransformState = nextLayer-> createLocalTransformState(rootLayer, nextLayer, localClipRect, hitTestLocation, transformState); 2223 RefPtr<HitTestingTransformState> newTransformState = nextLayer-> createLocalTransformState(rootLayer, nextLayer, localClipRect, hitTestLocation, transformState);
2224 newTransformState->translate(offset.width(), offset.height(), Hi tTestingTransformState::AccumulateTransform); 2224 newTransformState->translate(offset.width(), offset.height(), Hi tTestingTransformState::AccumulateTransform);
2225 FloatPoint localPoint = newTransformState->mappedPoint(); 2225 FloatPoint localPoint = newTransformState->mappedPoint();
2226 FloatQuad localPointQuad = newTransformState->mappedQuad(); 2226 FloatQuad localPointQuad = newTransformState->mappedQuad();
2227 LayoutRect localHitTestRect(newTransformState->mappedArea().encl osingBoundingBox()); 2227 LayoutRect localHitTestRect(newTransformState->mappedArea().encl osingBoundingBox());
2228 HitTestLocation newHitTestLocation; 2228 HitTestLocation newHitTestLocation;
2229 if (hitTestLocation.isRectBasedTest()) 2229 if (hitTestLocation.isRectBasedTest())
2230 newHitTestLocation = HitTestLocation(localPoint, localPointQ uad); 2230 newHitTestLocation = HitTestLocation(localPoint, localPointQ uad);
2231 else 2231 else
2232 newHitTestLocation = HitTestLocation(localPoint); 2232 newHitTestLocation = HitTestLocation(localPoint);
2233 newTransformState->flatten(); 2233 newTransformState->flatten();
2234 2234
2235 hitLayer = hitTestChildLayerColumns(childLayer, columnLayers[col umnIndex - 1], request, result, localHitTestRect, newHitTestLocation, 2235 hitLayer = hitTestChildLayerColumns(childLayer, columnLayers[col umnIndex - 1], result, localHitTestRect, newHitTestLocation,
2236 newTransformState.get(), zOffset, columnLayers, columnIndex - 1); 2236 newTransformState.get(), zOffset, columnLayers, columnIndex - 1);
2237 } 2237 }
2238 2238
2239 if (hitLayer) 2239 if (hitLayer)
2240 return hitLayer; 2240 return hitLayer;
2241 } 2241 }
2242 } 2242 }
2243 2243
2244 return 0; 2244 return 0;
2245 } 2245 }
(...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after
2973 } 2973 }
2974 } 2974 }
2975 2975
2976 void showLayerTree(const blink::LayoutObject* renderer) 2976 void showLayerTree(const blink::LayoutObject* renderer)
2977 { 2977 {
2978 if (!renderer) 2978 if (!renderer)
2979 return; 2979 return;
2980 showLayerTree(renderer->enclosingLayer()); 2980 showLayerTree(renderer->enclosingLayer());
2981 } 2981 }
2982 #endif 2982 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698