Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / web / tests / RenderGeometryMapTest.cpp
1 /*
2  * Copyright (C) 2014 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
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
13  * distribution.
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.
17  *
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.
29  */
30
31 #include "config.h"
32 #include "core/rendering/RenderGeometryMap.h"
33
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>
46
47 using namespace blink;
48 using namespace blink;
49
50 class MockWebFrameClient : public WebFrameClient {
51 };
52 namespace {
53
54
55 class RenderGeometryMapTest : public testing::Test {
56 public:
57     RenderGeometryMapTest()
58         : m_baseURL("http://www.test.com/")
59     {
60     }
61
62     virtual void TearDown()
63     {
64         Platform::current()->unitTestSupport()->unregisterAllMockedURLs();
65     }
66
67 protected:
68     static RenderBox* getFrameElement(const char* iframeName, WebView* webView, const WTF::AtomicString& elementId)
69     {
70         WebLocalFrameImpl* iframe = toWebLocalFrameImpl(webView->findFrameByName(WebString::fromUTF8(iframeName)));
71         if (!iframe)
72             return nullptr;
73         LocalFrame* frame = iframe->frame();
74         Document* doc = frame->document();
75         Element* element = doc->getElementById(elementId);
76         if (!element)
77             return nullptr;
78         return element->renderBox();
79     }
80
81     static RenderBox* getRenderBox(WebView* webView, const WTF::AtomicString& elementId)
82     {
83         WebViewImpl* webViewImpl = toWebViewImpl(webView);
84         if (!webViewImpl)
85             return nullptr;
86         LocalFrame* frame = webViewImpl->mainFrameImpl()->frame();
87         Document* doc = frame->document();
88         Element* element = doc->getElementById(elementId);
89         if (!element)
90             return nullptr;
91         return element->renderBox();
92     }
93
94     static const RenderLayerModelObject* getRenderContainer(WebView* webView, const WTF::AtomicString &elementId)
95     {
96         RenderBox* rb = getRenderBox(webView, elementId);
97         if (!rb)
98             return nullptr;
99         RenderLayer* compositingLayer = rb->enclosingLayer()->enclosingLayerForPaintInvalidation();
100         if (!compositingLayer)
101             return nullptr;
102         return compositingLayer->renderer();
103     }
104
105     static const RenderLayerModelObject* getFrameRenderContainer(const char* frameId, WebView* webView, const WTF::AtomicString &elementId)
106     {
107         RenderBox* rb = getFrameElement(frameId, webView, elementId);
108         if (!rb)
109             return nullptr;
110         RenderLayer* compositingLayer = rb->enclosingLayer()->enclosingLayerForPaintInvalidation();
111         if (!compositingLayer)
112             return nullptr;
113         return compositingLayer->renderer();
114     }
115
116     static const FloatRect rectFromQuad(const FloatQuad& quad)
117     {
118         FloatRect rect;
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()))));
121
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());
124         return rect;
125     }
126
127     void registerMockedHttpURLLoad(const std::string& fileName)
128     {
129         URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8(fileName.c_str()));
130     }
131
132     const std::string m_baseURL;
133     MockWebFrameClient m_mockWebViewClient;
134 };
135
136 TEST_F(RenderGeometryMapTest, SimpleGeometryMapTest)
137 {
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));
142     webView->layout();
143
144     // We are going test everything twice. Once with FloatPoints and once with
145     // FloatRects. This is because RenderGeometryMap treats both slightly
146     // differently
147     RenderGeometryMap rgm;
148     rgm.pushMappingsToAncestor(getRenderBox(webView, "InitialDiv"), 0);
149     FloatPoint point;
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));
153
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));
157
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")));
161
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")));
165
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")));
168
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));
171 }
172
173 // Fails on Windows due to crbug.com/391457. When run through the transform the
174 // position on windows differs by a pixel
175 #if OS(WIN)
176 TEST_F(RenderGeometryMapTest, DISABLED_TransformedGeometryTest)
177 #else
178 TEST_F(RenderGeometryMapTest, TransformedGeometryTest)
179 #endif
180 {
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));
185     webView->layout();
186
187     RenderGeometryMap rgm;
188     rgm.pushMappingsToAncestor(getRenderBox(webView, "InitialDiv"), 0);
189     FloatPoint point;
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));
196
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));
200
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")));
204
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")));
208
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")));
211
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));
214
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")));
219
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")));
222
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));
225 }
226
227 TEST_F(RenderGeometryMapTest, FixedGeometryTest)
228 {
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));
233     webView->layout();
234
235     RenderGeometryMap rgm;
236     rgm.pushMappingsToAncestor(getRenderBox(webView, "InitialDiv"), 0);
237     FloatPoint point;
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));
241
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));
245
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));
249
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")));
253
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));
256
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")));
260
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")));
263
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));
266 }
267
268 TEST_F(RenderGeometryMapTest, IframeTest)
269 {
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));
275     webView->layout();
276
277     RenderGeometryMap rgm(TraverseDocumentBoundaries);
278     RenderGeometryMap rgmNoFrame;
279
280     rgmNoFrame.pushMappingsToAncestor(getFrameElement("test_frame", webView, "InitialDiv"), 0);
281     rgm.pushMappingsToAncestor(getFrameElement("test_frame", webView, "InitialDiv"), 0);
282     FloatPoint point;
283     FloatRect rect(0.0f, 0.0f, 1.0f, 2.0f);
284
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));
287
288     // Our initial rect looks like: (0, 0, 1, 2)
289     //        p0_____
290     //          |   |
291     //          |   |
292     //          |   |
293     //          |___|
294     // When we rotate we get a rect of the form:
295     //         p0_
296     //          / -_
297     //         /   /
298     //        /   /
299     //         -_/
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)
304     //      = p0.y + 2.232.
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);
311
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));
316
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")));
323
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")));
330
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")));
335
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);
342
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));
345 }
346
347 TEST_F(RenderGeometryMapTest, ColumnTest)
348 {
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));
353     webView->layout();
354
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
360     // (for the gap).
361     float offset = (1000.0f - 16.0f - 20.0f) / 3.0f + 10.0f;
362
363     RenderGeometryMap rgm;
364     rgm.pushMappingsToAncestor(getRenderBox(webView, "A"), 0);
365     FloatPoint point;
366     FloatRect rect(0.0f, 0.0f, 5.0f, 3.0f);
367
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));
370
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));
374
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));
378
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());
387
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());
396
397 }
398 } // namespace ::