Index: third_party/WebKit/Source/core/dom/IntersectionGeometry.cpp |
diff --git a/third_party/WebKit/Source/core/dom/IntersectionGeometry.cpp b/third_party/WebKit/Source/core/dom/IntersectionGeometry.cpp |
deleted file mode 100644 |
index 1956b7b62aeda753729dc3e157b826fb8666bd11..0000000000000000000000000000000000000000 |
--- a/third_party/WebKit/Source/core/dom/IntersectionGeometry.cpp |
+++ /dev/null |
@@ -1,241 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "core/dom/IntersectionGeometry.h" |
- |
-#include "core/dom/Element.h" |
-#include "core/dom/ElementRareData.h" |
-#include "core/frame/FrameView.h" |
-#include "core/frame/LocalFrame.h" |
-#include "core/layout/LayoutBox.h" |
-#include "core/layout/LayoutView.h" |
-#include "core/layout/api/LayoutAPIShim.h" |
-#include "core/layout/api/LayoutViewItem.h" |
-#include "core/paint/PaintLayer.h" |
- |
-namespace blink { |
- |
-namespace { |
- |
-bool isContainingBlockChainDescendant(LayoutObject* descendant, |
- LayoutObject* ancestor) { |
- LocalFrame* ancestorFrame = ancestor->document().frame(); |
- LocalFrame* descendantFrame = descendant->document().frame(); |
- |
- if (ancestor->isLayoutView()) |
- return descendantFrame && descendantFrame->tree().top() == ancestorFrame; |
- |
- if (ancestorFrame != descendantFrame) |
- return false; |
- |
- while (descendant && descendant != ancestor) |
- descendant = descendant->containingBlock(); |
- return descendant; |
-} |
- |
-void mapRectUpToDocument(LayoutRect& rect, |
- const LayoutObject& layoutObject, |
- const Document& document) { |
- FloatQuad mappedQuad = layoutObject.localToAbsoluteQuad( |
- FloatQuad(FloatRect(rect)), UseTransforms | ApplyContainerFlip); |
- rect = LayoutRect(mappedQuad.boundingBox()); |
-} |
- |
-void mapRectDownToDocument(LayoutRect& rect, |
- LayoutBoxModelObject& layoutObject, |
- const Document& document) { |
- FloatQuad mappedQuad = document.layoutView()->ancestorToLocalQuad( |
- &layoutObject, FloatQuad(FloatRect(rect)), |
- UseTransforms | ApplyContainerFlip | TraverseDocumentBoundaries); |
- rect = LayoutRect(mappedQuad.boundingBox()); |
-} |
- |
-LayoutUnit computeMargin(const Length& length, LayoutUnit referenceLength) { |
- if (length.type() == Percent) { |
- return LayoutUnit( |
- static_cast<int>(referenceLength.toFloat() * length.percent() / 100.0)); |
- } |
- DCHECK_EQ(length.type(), Fixed); |
- return LayoutUnit(length.intValue()); |
-} |
- |
-} // namespace |
- |
-IntersectionGeometry::IntersectionGeometry( |
- Node* root, |
- Element* target, |
- const Vector<Length>& rootMargin, |
- ReportRootBounds shouldReportRootBounds) |
- : m_root(root), |
- m_target(target), |
- m_rootMargin(rootMargin), |
- m_shouldReportRootBounds(shouldReportRootBounds) { |
- DCHECK(m_target); |
- DCHECK(rootMargin.isEmpty() || rootMargin.size() == 4); |
-} |
- |
-IntersectionGeometry::~IntersectionGeometry() {} |
- |
-Element* IntersectionGeometry::root() const { |
- if (m_root && !m_root->isDocumentNode()) |
- return toElement(m_root); |
- return nullptr; |
-} |
- |
-LayoutObject* IntersectionGeometry::getRootLayoutObject() const { |
- DCHECK(m_root); |
- if (m_root->isDocumentNode()) { |
- return LayoutAPIShim::layoutObjectFrom( |
- toDocument(m_root)->layoutViewItem()); |
- } |
- return toElement(m_root)->layoutObject(); |
-} |
- |
-void IntersectionGeometry::initializeGeometry() { |
- initializeTargetRect(); |
- m_intersectionRect = m_targetRect; |
- initializeRootRect(); |
- m_doesIntersect = true; |
-} |
- |
-void IntersectionGeometry::initializeTargetRect() { |
- LayoutObject* targetLayoutObject = m_target->layoutObject(); |
- DCHECK(targetLayoutObject && targetLayoutObject->isBoxModelObject()); |
- m_targetRect = LayoutRect( |
- toLayoutBoxModelObject(targetLayoutObject)->borderBoundingBox()); |
-} |
- |
-void IntersectionGeometry::initializeRootRect() { |
- LayoutObject* rootLayoutObject = getRootLayoutObject(); |
- if (rootLayoutObject->isLayoutView()) { |
- m_rootRect = LayoutRect( |
- toLayoutView(rootLayoutObject)->frameView()->visibleContentRect()); |
- } else if (rootLayoutObject->isBox() && rootLayoutObject->hasOverflowClip()) { |
- m_rootRect = LayoutRect(toLayoutBox(rootLayoutObject)->contentBoxRect()); |
- } else { |
- m_rootRect = LayoutRect( |
- toLayoutBoxModelObject(rootLayoutObject)->borderBoundingBox()); |
- } |
- applyRootMargin(); |
-} |
- |
-void IntersectionGeometry::applyRootMargin() { |
- if (m_rootMargin.isEmpty()) |
- return; |
- |
- // TODO(szager): Make sure the spec is clear that left/right margins are |
- // resolved against width and not height. |
- LayoutUnit topMargin = computeMargin(m_rootMargin[0], m_rootRect.height()); |
- LayoutUnit rightMargin = computeMargin(m_rootMargin[1], m_rootRect.width()); |
- LayoutUnit bottomMargin = computeMargin(m_rootMargin[2], m_rootRect.height()); |
- LayoutUnit leftMargin = computeMargin(m_rootMargin[3], m_rootRect.width()); |
- |
- m_rootRect.setX(m_rootRect.x() - leftMargin); |
- m_rootRect.setWidth(m_rootRect.width() + leftMargin + rightMargin); |
- m_rootRect.setY(m_rootRect.y() - topMargin); |
- m_rootRect.setHeight(m_rootRect.height() + topMargin + bottomMargin); |
-} |
- |
-void IntersectionGeometry::clipToRoot() { |
- // Map and clip rect into root element coordinates. |
- // TODO(szager): the writing mode flipping needs a test. |
- LayoutBox* rootLayoutObject = toLayoutBox(getRootLayoutObject()); |
- LayoutObject* targetLayoutObject = m_target->layoutObject(); |
- |
- m_doesIntersect = targetLayoutObject->mapToVisualRectInAncestorSpace( |
- rootLayoutObject, m_intersectionRect, EdgeInclusive); |
- if (rootLayoutObject->hasOverflowClip()) |
- m_intersectionRect.move(-rootLayoutObject->scrolledContentOffset()); |
- |
- if (!m_doesIntersect) |
- return; |
- LayoutRect rootClipRect(m_rootRect); |
- rootLayoutObject->flipForWritingMode(rootClipRect); |
- m_doesIntersect &= m_intersectionRect.inclusiveIntersect(rootClipRect); |
-} |
- |
-void IntersectionGeometry::mapTargetRectToTargetFrameCoordinates() { |
- LayoutObject& targetLayoutObject = *m_target->layoutObject(); |
- Document& targetDocument = m_target->document(); |
- LayoutSize scrollPosition = |
- LayoutSize(targetDocument.view()->getScrollOffset()); |
- mapRectUpToDocument(m_targetRect, targetLayoutObject, targetDocument); |
- m_targetRect.move(-scrollPosition); |
-} |
- |
-void IntersectionGeometry::mapRootRectToRootFrameCoordinates() { |
- LayoutObject& rootLayoutObject = *getRootLayoutObject(); |
- Document& rootDocument = rootLayoutObject.document(); |
- LayoutSize scrollPosition = |
- LayoutSize(rootDocument.view()->getScrollOffset()); |
- mapRectUpToDocument(m_rootRect, rootLayoutObject, |
- rootLayoutObject.document()); |
- m_rootRect.move(-scrollPosition); |
-} |
- |
-void IntersectionGeometry::mapRootRectToTargetFrameCoordinates() { |
- LayoutObject& rootLayoutObject = *getRootLayoutObject(); |
- Document& targetDocument = m_target->document(); |
- LayoutSize scrollPosition = |
- LayoutSize(targetDocument.view()->getScrollOffset()); |
- |
- if (&targetDocument == &rootLayoutObject.document()) { |
- mapRectUpToDocument(m_intersectionRect, rootLayoutObject, targetDocument); |
- } else { |
- mapRectDownToDocument(m_intersectionRect, |
- toLayoutBoxModelObject(rootLayoutObject), |
- targetDocument); |
- } |
- |
- m_intersectionRect.move(-scrollPosition); |
-} |
- |
-void IntersectionGeometry::computeGeometry() { |
- // In the first few lines here, before initializeGeometry is called, "return |
- // true" effectively means "if the previous observed state was that root and |
- // target were intersecting, then generate a notification indicating that they |
- // are no longer intersecting." This happens, for example, when root or |
- // target is removed from the DOM tree and not reinserted before the next |
- // frame is generated, or display:none is set on the root or target. |
- if (!m_target->isConnected()) |
- return; |
- Element* rootElement = root(); |
- if (rootElement && !rootElement->isConnected()) |
- return; |
- |
- LayoutObject* rootLayoutObject = getRootLayoutObject(); |
- if (!rootLayoutObject || !rootLayoutObject->isBoxModelObject()) |
- return; |
- // TODO(szager): Support SVG |
- LayoutObject* targetLayoutObject = m_target->layoutObject(); |
- if (!targetLayoutObject) |
- return; |
- if (!targetLayoutObject->isBoxModelObject() && !targetLayoutObject->isText()) |
- return; |
- if (!isContainingBlockChainDescendant(targetLayoutObject, rootLayoutObject)) |
- return; |
- |
- initializeGeometry(); |
- |
- clipToRoot(); |
- |
- mapTargetRectToTargetFrameCoordinates(); |
- |
- if (m_doesIntersect) |
- mapRootRectToTargetFrameCoordinates(); |
- else |
- m_intersectionRect = LayoutRect(); |
- |
- // Small optimization: if we're not going to report root bounds, don't bother |
- // transforming them to the frame. |
- if (m_shouldReportRootBounds == ReportRootBounds::kShouldReportRootBounds) |
- mapRootRectToRootFrameCoordinates(); |
-} |
- |
-DEFINE_TRACE(IntersectionGeometry) { |
- visitor->trace(m_root); |
- visitor->trace(m_target); |
-} |
- |
-} // namespace blink |