// 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/layout/LayoutInline.h" #include "core/layout/LayoutTestHelper.h" #include "core/layout/LayoutView.h" #include "platform/geometry/TransformState.h" #include "testing/gtest/include/gtest/gtest.h" namespace blink { class MapCoordinatesTest : public RenderingTest { public: MapCoordinatesTest() : RenderingTest(SingleChildFrameLoaderClient::create()) {} FloatPoint mapLocalToAncestor(const LayoutObject*, const LayoutBoxModelObject* ancestor, FloatPoint, MapCoordinatesFlags = 0) const; FloatQuad mapLocalToAncestor(const LayoutObject*, const LayoutBoxModelObject* ancestor, FloatQuad, MapCoordinatesFlags = 0) const; FloatPoint mapAncestorToLocal(const LayoutObject*, const LayoutBoxModelObject* ancestor, FloatPoint, MapCoordinatesFlags = 0) const; FloatQuad mapAncestorToLocal(const LayoutObject*, const LayoutBoxModelObject* ancestor, FloatQuad, MapCoordinatesFlags = 0) const; }; // One note about tests here that operate on LayoutInline and LayoutText objects: // mapLocalToAncestor() expects such objects to pass their static location and size (relatively to // the border edge of their container) to mapLocalToAncestor() via the TransformState // argument. mapLocalToAncestor() is then only expected to make adjustments for // relative-positioning, container-specific characteristics (such as writing mode roots, multicol), // and so on. This in contrast to LayoutBox objects, where the TransformState passed is relative to // the box itself, not the container. FloatPoint MapCoordinatesTest::mapLocalToAncestor(const LayoutObject* object, const LayoutBoxModelObject* ancestor, FloatPoint point, MapCoordinatesFlags mode) const { TransformState transformState(TransformState::ApplyTransformDirection, point); object->mapLocalToAncestor(ancestor, transformState, mode); transformState.flatten(); return transformState.lastPlanarPoint(); } FloatQuad MapCoordinatesTest::mapLocalToAncestor(const LayoutObject* object, const LayoutBoxModelObject* ancestor, FloatQuad quad, MapCoordinatesFlags mode) const { TransformState transformState(TransformState::ApplyTransformDirection, quad.boundingBox().center(), quad); object->mapLocalToAncestor(ancestor, transformState, mode); transformState.flatten(); return transformState.lastPlanarQuad(); } FloatPoint MapCoordinatesTest::mapAncestorToLocal(const LayoutObject* object, const LayoutBoxModelObject* ancestor, FloatPoint point, MapCoordinatesFlags mode) const { TransformState transformState(TransformState::UnapplyInverseTransformDirection, point); object->mapAncestorToLocal(ancestor, transformState, mode); transformState.flatten(); return transformState.lastPlanarPoint(); } FloatQuad MapCoordinatesTest::mapAncestorToLocal(const LayoutObject* object, const LayoutBoxModelObject* ancestor, FloatQuad quad, MapCoordinatesFlags mode) const { TransformState transformState(TransformState::UnapplyInverseTransformDirection, quad.boundingBox().center(), quad); object->mapAncestorToLocal(ancestor, transformState, mode); transformState.flatten(); return transformState.lastPlanarQuad(); } TEST_F(MapCoordinatesTest, SimpleText) { setBodyInnerHTML("
" " " " | " "|
" " " " | " "|
" " " " | " "" " " " | " "