2 * Copyright (C) 2014 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #include "core/rendering/RenderGeometryMap.h"
34 #include "core/dom/Document.h"
35 #include "core/rendering/RenderBox.h"
36 #include "core/rendering/RenderLayer.h"
37 #include "public/platform/Platform.h"
38 #include "public/platform/WebUnitTestSupport.h"
39 #include "public/web/WebFrameClient.h"
40 #include "web/WebLocalFrameImpl.h"
41 #include "web/tests/FloatPointTestHelpers.h"
42 #include "web/tests/FloatQuadTestHelpers.h"
43 #include "web/tests/FrameTestHelpers.h"
44 #include "web/tests/URLTestHelpers.h"
45 #include <gtest/gtest.h>
47 using namespace blink;
48 using namespace blink;
50 class MockWebFrameClient : public WebFrameClient {
55 class RenderGeometryMapTest : public testing::Test {
57 RenderGeometryMapTest()
58 : m_baseURL("http://www.test.com/")
62 virtual void TearDown()
64 Platform::current()->unitTestSupport()->unregisterAllMockedURLs();
68 static RenderBox* getFrameElement(const char* iframeName, WebView* webView, const WTF::AtomicString& elementId)
70 WebLocalFrameImpl* iframe = toWebLocalFrameImpl(webView->findFrameByName(WebString::fromUTF8(iframeName)));
73 LocalFrame* frame = iframe->frame();
74 Document* doc = frame->document();
75 Element* element = doc->getElementById(elementId);
78 return element->renderBox();
81 static RenderBox* getRenderBox(WebView* webView, const WTF::AtomicString& elementId)
83 WebViewImpl* webViewImpl = toWebViewImpl(webView);
86 LocalFrame* frame = webViewImpl->mainFrameImpl()->frame();
87 Document* doc = frame->document();
88 Element* element = doc->getElementById(elementId);
91 return element->renderBox();
94 static const RenderLayerModelObject* getRenderContainer(WebView* webView, const WTF::AtomicString &elementId)
96 RenderBox* rb = getRenderBox(webView, elementId);
99 RenderLayer* compositingLayer = rb->enclosingLayer()->enclosingLayerForPaintInvalidation();
100 if (!compositingLayer)
102 return compositingLayer->renderer();
105 static const RenderLayerModelObject* getFrameRenderContainer(const char* frameId, WebView* webView, const WTF::AtomicString &elementId)
107 RenderBox* rb = getFrameElement(frameId, webView, elementId);
110 RenderLayer* compositingLayer = rb->enclosingLayer()->enclosingLayerForPaintInvalidation();
111 if (!compositingLayer)
113 return compositingLayer->renderer();
116 static const FloatRect rectFromQuad(const FloatQuad& quad)
119 rect.setX(std::min(quad.p1().x(), std::min(quad.p2().x(), std::min(quad.p3().x(), quad.p4().x()))));
120 rect.setY(std::min(quad.p1().y(), std::min(quad.p2().y(), std::min(quad.p3().y(), quad.p4().y()))));
122 rect.setWidth(std::max(quad.p1().x(), std::max(quad.p2().x(), std::max(quad.p3().x(), quad.p4().x()))) - rect.x());
123 rect.setHeight(std::max(quad.p1().y(), std::max(quad.p2().y(), std::max(quad.p3().y(), quad.p4().y()))) - rect.y());
127 void registerMockedHttpURLLoad(const std::string& fileName)
129 URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8(fileName.c_str()));
132 const std::string m_baseURL;
133 MockWebFrameClient m_mockWebViewClient;
136 TEST_F(RenderGeometryMapTest, SimpleGeometryMapTest)
138 registerMockedHttpURLLoad("rgm_test.html");
139 FrameTestHelpers::WebViewHelper webViewHelper;
140 WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "rgm_test.html", true, 0, 0);
141 webView->resize(WebSize(1000, 1000));
144 // We are going test everything twice. Once with FloatPoints and once with
145 // FloatRects. This is because RenderGeometryMap treats both slightly
147 RenderGeometryMap rgm;
148 rgm.pushMappingsToAncestor(getRenderBox(webView, "InitialDiv"), 0);
150 FloatRect rect(0.0f, 0.0f, 1.0f, 2.0f);
151 EXPECT_EQ(FloatPoint(8.0f, 8.0f), rgm.mapToContainer(point, nullptr));
152 EXPECT_EQ(FloatQuad(FloatRect(8.0f, 8.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, nullptr));
154 rgm.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
155 EXPECT_EQ(FloatPoint(0.0f, 0.0f), rgm.mapToContainer(point, nullptr));
156 EXPECT_EQ(FloatQuad(FloatRect(0.0f, 0.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, nullptr));
158 rgm.pushMappingsToAncestor(getRenderBox(webView, "InnerDiv"), 0);
159 EXPECT_EQ(FloatPoint(21.0f, 6.0f), rgm.mapToContainer(point, getRenderBox(webView, "CenterDiv")));
160 EXPECT_EQ(FloatQuad(FloatRect(21.0f, 6.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "CenterDiv")));
162 rgm.pushMappingsToAncestor(getRenderBox(webView, "OtherDiv"), getRenderBox(webView, "InnerDiv"));
163 EXPECT_EQ(FloatPoint(22.0f, 12.0f), rgm.mapToContainer(point, getRenderBox(webView, "CenterDiv")));
164 EXPECT_EQ(FloatQuad(FloatRect(22.0f, 12.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "CenterDiv")));
166 EXPECT_EQ(FloatPoint(1.0f, 6.0f), rgm.mapToContainer(point, getRenderBox(webView, "InnerDiv")));
167 EXPECT_EQ(FloatQuad(FloatRect(1.0f, 6.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "InnerDiv")));
169 EXPECT_EQ(FloatPoint(50.0f, 44.0f), rgm.mapToContainer(point, nullptr));
170 EXPECT_EQ(FloatQuad(FloatRect(50.0f, 44.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, nullptr));
173 // Fails on Windows due to crbug.com/391457. When run through the transform the
174 // position on windows differs by a pixel
176 TEST_F(RenderGeometryMapTest, DISABLED_TransformedGeometryTest)
178 TEST_F(RenderGeometryMapTest, TransformedGeometryTest)
181 registerMockedHttpURLLoad("rgm_transformed_test.html");
182 FrameTestHelpers::WebViewHelper webViewHelper;
183 WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "rgm_transformed_test.html", true, 0, 0);
184 webView->resize(WebSize(1000, 1000));
187 RenderGeometryMap rgm;
188 rgm.pushMappingsToAncestor(getRenderBox(webView, "InitialDiv"), 0);
190 const float rectWidth = 15.0f;
191 const float scaleWidth = 2.0f;
192 const float scaleHeight = 3.0f;
193 FloatRect rect(0.0f, 0.0f, 15.0f, 25.0f);
194 EXPECT_EQ(FloatPoint(8.0f, 8.0f), rgm.mapToContainer(point, nullptr));
195 EXPECT_EQ(FloatQuad(FloatRect(8.0f, 8.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, nullptr));
197 rgm.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
198 EXPECT_EQ(FloatPoint(0.0f, 0.0f), rgm.mapToContainer(point, nullptr));
199 EXPECT_EQ(FloatQuad(FloatRect(0.0f, 0.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, nullptr));
201 rgm.pushMappingsToAncestor(getRenderBox(webView, "InnerDiv"), 0);
202 EXPECT_EQ(FloatPoint(523.0f, 6.0f), rgm.mapToContainer(point, getRenderBox(webView, "CenterDiv")));
203 EXPECT_EQ(FloatQuad(FloatRect(523.0f - rectWidth, 6.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "CenterDiv")));
205 rgm.pushMappingsToAncestor(getRenderBox(webView, "OtherDiv"), getRenderBox(webView, "InnerDiv"));
206 EXPECT_EQ(FloatPoint(522.0f, 12.0f), rgm.mapToContainer(point, getRenderBox(webView, "CenterDiv")));
207 EXPECT_EQ(FloatQuad(FloatRect(522.0f - rectWidth, 12.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "CenterDiv")));
209 EXPECT_EQ(FloatPoint(1.0f, 6.0f), rgm.mapToContainer(point, getRenderBox(webView, "InnerDiv")));
210 EXPECT_EQ(FloatQuad(FloatRect(1.0f, 6.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "InnerDiv")));
212 EXPECT_EQ(FloatPoint(821.0f, 31.0f), rgm.mapToContainer(point, nullptr));
213 EXPECT_EQ(FloatQuad(FloatRect(821.0f - rectWidth * scaleWidth, 31.0f, 15.0f * scaleWidth, 25.0f * scaleHeight)), rgm.mapToContainer(rect, nullptr));
215 point = FloatPoint(10.0f, 25.0f);
216 rect = FloatRect(10.0f, 25.0f, 15.0f, 25.0f);
217 EXPECT_EQ(FloatPoint(512.0f, 37.0f), rgm.mapToContainer(point, getRenderBox(webView, "CenterDiv")));
218 EXPECT_EQ(FloatQuad(FloatRect(512.0f - rectWidth, 37.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "CenterDiv")));
220 EXPECT_EQ(FloatPoint(11.0f, 31.0f), rgm.mapToContainer(point, getRenderBox(webView, "InnerDiv")));
221 EXPECT_EQ(FloatQuad(FloatRect(11.0f, 31.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "InnerDiv")));
223 EXPECT_EQ(FloatPoint(801.0f, 106.0f), rgm.mapToContainer(point, nullptr));
224 EXPECT_EQ(FloatQuad(FloatRect(801.0f - rectWidth * scaleWidth, 106.0f, 15.0f * scaleWidth, 25.0f * scaleHeight)), rgm.mapToContainer(rect, nullptr));
227 TEST_F(RenderGeometryMapTest, FixedGeometryTest)
229 registerMockedHttpURLLoad("rgm_fixed_position_test.html");
230 FrameTestHelpers::WebViewHelper webViewHelper;
231 WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "rgm_fixed_position_test.html", true, 0, 0);
232 webView->resize(WebSize(1000, 1000));
235 RenderGeometryMap rgm;
236 rgm.pushMappingsToAncestor(getRenderBox(webView, "InitialDiv"), 0);
238 FloatRect rect(0.0f, 0.0f, 15.0f, 25.0f);
239 EXPECT_EQ(FloatPoint(8.0f, 8.0f), rgm.mapToContainer(point, nullptr));
240 EXPECT_EQ(FloatQuad(FloatRect(8.0f, 8.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, nullptr));
242 rgm.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
243 EXPECT_EQ(FloatPoint(0.0f, 0.0f), rgm.mapToContainer(point, nullptr));
244 EXPECT_EQ(FloatQuad(FloatRect(0.0f, 0.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, nullptr));
246 rgm.pushMappingsToAncestor(getRenderBox(webView, "InnerDiv"), 0);
247 EXPECT_EQ(FloatPoint(20.0f, 14.0f), rgm.mapToContainer(point, getRenderContainer(webView, "CenterDiv")));
248 EXPECT_EQ(FloatQuad(FloatRect(20.0f, 14.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, nullptr));
250 rgm.pushMappingsToAncestor(getRenderBox(webView, "OtherDiv"), getRenderBox(webView, "InnerDiv"));
251 EXPECT_EQ(FloatPoint(21.0f, 20.0f), rgm.mapToContainer(point, getRenderContainer(webView, "CenterDiv")));
252 EXPECT_EQ(FloatQuad(FloatRect(21.0f, 20.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, getRenderContainer(webView, "CenterDiv")));
254 EXPECT_EQ(FloatPoint(21.0f, 20.0f), rgm.mapToContainer(point, getRenderContainer(webView, "InnerDiv")));
255 EXPECT_EQ(FloatPoint(21.0f, 20.0f), rgm.mapToContainer(point, nullptr));
257 point = FloatPoint(10.0f, 25.0f);
258 rect = FloatRect(22.0f, 15.2f, 15.3f, 0.0f);
259 EXPECT_EQ(FloatQuad(FloatRect(43.0f, 35.2f, 15.3f, 0.0f)), rgm.mapToContainer(rect, getRenderContainer(webView, "CenterDiv")));
261 EXPECT_EQ(FloatPoint(31.0f, 45.0f), rgm.mapToContainer(point, getRenderContainer(webView, "InnerDiv")));
262 EXPECT_EQ(FloatQuad(FloatRect(43.0f, 35.2f, 15.3f, 0.0f)), rgm.mapToContainer(rect, getRenderContainer(webView, "InnerDiv")));
264 EXPECT_EQ(FloatPoint(31.0f, 45.0f), rgm.mapToContainer(point, nullptr));
265 EXPECT_EQ(FloatQuad(FloatRect(43.0f, 35.2f, 15.3f, 0.0f)), rgm.mapToContainer(rect, nullptr));
268 TEST_F(RenderGeometryMapTest, IframeTest)
270 registerMockedHttpURLLoad("rgm_iframe_test.html");
271 registerMockedHttpURLLoad("rgm_test.html");
272 FrameTestHelpers::WebViewHelper webViewHelper;
273 WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "rgm_iframe_test.html", true, 0, 0);
274 webView->resize(WebSize(1000, 1000));
277 RenderGeometryMap rgm(TraverseDocumentBoundaries);
278 RenderGeometryMap rgmNoFrame;
280 rgmNoFrame.pushMappingsToAncestor(getFrameElement("test_frame", webView, "InitialDiv"), 0);
281 rgm.pushMappingsToAncestor(getFrameElement("test_frame", webView, "InitialDiv"), 0);
283 FloatRect rect(0.0f, 0.0f, 1.0f, 2.0f);
285 EXPECT_EQ(FloatPoint(8.0f, 8.0f), rgmNoFrame.mapToContainer(point, nullptr));
286 EXPECT_EQ(FloatQuad(FloatRect(8.0f, 8.0f, 1.0f, 2.0f)), rgmNoFrame.mapToContainer(rect, nullptr));
288 // Our initial rect looks like: (0, 0, 1, 2)
294 // When we rotate we get a rect of the form:
300 // So it is sensible that the minimum y is the same as for a point at 0, 0.
301 // The minimum x should be p0.x - 2 * sin(30deg) = p0.x - 1.
302 // That maximum x should likewise be p0.x + cos(30deg) = p0.x + 0.866.
303 // And the maximum y should be p0.x + sin(30deg) + 2*cos(30deg)
305 EXPECT_NEAR(70.5244f, rgm.mapToContainer(point, nullptr).x(), 0.0001f);
306 EXPECT_NEAR(-44.0237f, rgm.mapToContainer(point, nullptr).y(), 0.0001f);
307 EXPECT_NEAR(69.5244f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).x(), 0.0001f);
308 EXPECT_NEAR(-44.0237, rectFromQuad(rgm.mapToContainer(rect, nullptr)).y(), 0.0001f);
309 EXPECT_NEAR(1.866, rectFromQuad(rgm.mapToContainer(rect, nullptr)).width(), 0.0001f);
310 EXPECT_NEAR(2.232, rectFromQuad(rgm.mapToContainer(rect, nullptr)).height(), 0.0001f);
312 rgm.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
313 rgmNoFrame.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
314 EXPECT_EQ(FloatPoint(0.0f, 0.0f), rgm.mapToContainer(point, nullptr));
315 EXPECT_EQ(FloatPoint(0.0f, 0.0f), rgmNoFrame.mapToContainer(point, nullptr));
317 rgm.pushMappingsToAncestor(getFrameElement("test_frame", webView, "InnerDiv"), 0);
318 rgmNoFrame.pushMappingsToAncestor(getFrameElement("test_frame", webView, "InnerDiv"), 0);
319 EXPECT_EQ(FloatPoint(21.0f, 6.0f), rgm.mapToContainer(point, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
320 EXPECT_EQ(FloatQuad(FloatRect(21.0f, 6.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
321 EXPECT_EQ(FloatPoint(21.0f, 6.0f), rgmNoFrame.mapToContainer(point, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
322 EXPECT_EQ(FloatQuad(FloatRect(21.0f, 6.0f, 1.0f, 2.0f)), rgmNoFrame.mapToContainer(rect, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
324 rgm.pushMappingsToAncestor(getFrameElement("test_frame", webView, "OtherDiv"), getFrameRenderContainer("test_frame", webView, "InnerDiv"));
325 rgmNoFrame.pushMappingsToAncestor(getFrameElement("test_frame", webView, "OtherDiv"), getFrameRenderContainer("test_frame", webView, "InnerDiv"));
326 EXPECT_EQ(FloatPoint(22.0f, 12.0f), rgm.mapToContainer(point, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
327 EXPECT_EQ(FloatQuad(FloatRect(22.0f, 12.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
328 EXPECT_EQ(FloatPoint(22.0f, 12.0f), rgmNoFrame.mapToContainer(point, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
329 EXPECT_EQ(FloatQuad(FloatRect(22.0f, 12.0f, 1.0f, 2.0f)), rgmNoFrame.mapToContainer(rect, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
331 EXPECT_EQ(FloatPoint(1.0f, 6.0f), rgm.mapToContainer(point, getFrameRenderContainer("test_frame", webView, "InnerDiv")));
332 EXPECT_EQ(FloatQuad(FloatRect(1.0f, 6.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, getFrameRenderContainer("test_frame", webView, "InnerDiv")));
333 EXPECT_EQ(FloatPoint(1.0f, 6.0f), rgmNoFrame.mapToContainer(point, getFrameRenderContainer("test_frame", webView, "InnerDiv")));
334 EXPECT_EQ(FloatQuad(FloatRect(1.0f, 6.0f, 1.0f, 2.0f)), rgmNoFrame.mapToContainer(rect, getFrameRenderContainer("test_frame", webView, "InnerDiv")));
336 EXPECT_NEAR(88.8975f, rgm.mapToContainer(point, nullptr).x(), 0.0001f);
337 EXPECT_NEAR(8.1532f, rgm.mapToContainer(point, nullptr).y(), 0.0001f);
338 EXPECT_NEAR(87.8975f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).x(), 0.0001f);
339 EXPECT_NEAR(8.1532f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).y(), 0.0001f);
340 EXPECT_NEAR(1.866, rectFromQuad(rgm.mapToContainer(rect, nullptr)).width(), 0.0001f);
341 EXPECT_NEAR(2.232, rectFromQuad(rgm.mapToContainer(rect, nullptr)).height(), 0.0001f);
343 EXPECT_EQ(FloatPoint(50.0f, 44.0f), rgmNoFrame.mapToContainer(point, nullptr));
344 EXPECT_EQ(FloatQuad(FloatRect(50.0f, 44.0f, 1.0f, 2.0f)), rgmNoFrame.mapToContainer(rect, nullptr));
347 TEST_F(RenderGeometryMapTest, ColumnTest)
349 registerMockedHttpURLLoad("rgm_column_test.html");
350 FrameTestHelpers::WebViewHelper webViewHelper;
351 WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "rgm_column_test.html", true, 0, 0);
352 webView->resize(WebSize(1000, 1000));
355 // The document is 1000f wide (we resized to that size).
356 // We have a 8px margin on either side of the document.
357 // Between each column we have a 10px gap, and we have 3 columns.
358 // The width of a given column is (1000 - 16 - 20)/3.
359 // The total offset between any column and it's neighbour is width + 10px
361 float offset = (1000.0f - 16.0f - 20.0f) / 3.0f + 10.0f;
363 RenderGeometryMap rgm;
364 rgm.pushMappingsToAncestor(getRenderBox(webView, "A"), 0);
366 FloatRect rect(0.0f, 0.0f, 5.0f, 3.0f);
368 EXPECT_EQ(FloatPoint(8.0f, 8.0f), rgm.mapToContainer(point, nullptr));
369 EXPECT_EQ(FloatQuad(FloatRect(8.0f, 8.0f, 5.0f, 3.0f)), rgm.mapToContainer(rect, nullptr));
371 rgm.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
372 EXPECT_EQ(FloatPoint(0.0f, 0.0f), rgm.mapToContainer(point, nullptr));
373 EXPECT_EQ(FloatQuad(FloatRect(0.0f, 0.0f, 5.0f, 3.0f)), rgm.mapToContainer(rect, nullptr));
375 rgm.pushMappingsToAncestor(getRenderBox(webView, "Col1"), 0);
376 EXPECT_EQ(FloatPoint(8.0f, 8.0f), rgm.mapToContainer(point, nullptr));
377 EXPECT_EQ(FloatQuad(FloatRect(8.0f, 8.0f, 5.0f, 3.0f)), rgm.mapToContainer(rect, nullptr));
379 rgm.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
380 rgm.pushMappingsToAncestor(getRenderBox(webView, "Col2"), nullptr);
381 EXPECT_NEAR(8.0f + offset, rgm.mapToContainer(point, nullptr).x(), 0.1f);
382 EXPECT_NEAR(8.0f, rgm.mapToContainer(point, nullptr).y(), 0.1f);
383 EXPECT_NEAR(8.0f + offset, rectFromQuad(rgm.mapToContainer(rect, nullptr)).x(), 0.1f);
384 EXPECT_NEAR(8.0f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).y(), 0.1f);
385 EXPECT_EQ(5.0f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).width());
386 EXPECT_EQ(3.0f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).height());
388 rgm.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
389 rgm.pushMappingsToAncestor(getRenderBox(webView, "Col3"), nullptr);
390 EXPECT_NEAR(8.0f + offset * 2.0f, rgm.mapToContainer(point, nullptr).x(), 0.1f);
391 EXPECT_NEAR(8.0f, rgm.mapToContainer(point, nullptr).y(), 0.1f);
392 EXPECT_NEAR(8.0f + offset * 2.0f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).x(), 0.1f);
393 EXPECT_NEAR(8.0f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).y(), 0.1f);
394 EXPECT_EQ(5.0f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).width());
395 EXPECT_EQ(3.0f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).height());