Home | History | Annotate | Download | only in tests
      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 "core/testing/URLTestHelpers.h"
     38 #include "public/platform/Platform.h"
     39 #include "public/platform/WebUnitTestSupport.h"
     40 #include "public/web/WebFrameClient.h"
     41 #include "web/WebLocalFrameImpl.h"
     42 #include "web/tests/FloatPointTestHelpers.h"
     43 #include "web/tests/FloatQuadTestHelpers.h"
     44 #include "web/tests/FrameTestHelpers.h"
     45 #include <gtest/gtest.h>
     46 
     47 using namespace blink;
     48 
     49 class MockWebFrameClient : public WebFrameClient {
     50 };
     51 namespace {
     52 
     53 
     54 class RenderGeometryMapTest : public testing::Test {
     55 public:
     56     RenderGeometryMapTest()
     57         : m_baseURL("http://www.test.com/")
     58     {
     59     }
     60 
     61     virtual void TearDown()
     62     {
     63         Platform::current()->unitTestSupport()->unregisterAllMockedURLs();
     64     }
     65 
     66 protected:
     67     static RenderBox* getFrameElement(const char* iframeName, WebView* webView, const WTF::AtomicString& elementId)
     68     {
     69         WebLocalFrameImpl* iframe = toWebLocalFrameImpl(webView->findFrameByName(WebString::fromUTF8(iframeName)));
     70         if (!iframe)
     71             return nullptr;
     72         LocalFrame* frame = iframe->frame();
     73         Document* doc = frame->document();
     74         Element* element = doc->getElementById(elementId);
     75         if (!element)
     76             return nullptr;
     77         return element->renderBox();
     78     }
     79 
     80     static RenderBox* getRenderBox(WebView* webView, const WTF::AtomicString& elementId)
     81     {
     82         WebViewImpl* webViewImpl = toWebViewImpl(webView);
     83         if (!webViewImpl)
     84             return nullptr;
     85         LocalFrame* frame = webViewImpl->mainFrameImpl()->frame();
     86         Document* doc = frame->document();
     87         Element* element = doc->getElementById(elementId);
     88         if (!element)
     89             return nullptr;
     90         return element->renderBox();
     91     }
     92 
     93     static const RenderLayerModelObject* getRenderContainer(WebView* webView, const WTF::AtomicString &elementId)
     94     {
     95         RenderBox* rb = getRenderBox(webView, elementId);
     96         if (!rb)
     97             return nullptr;
     98         RenderLayer* compositingLayer = rb->enclosingLayer()->enclosingLayerForPaintInvalidation();
     99         if (!compositingLayer)
    100             return nullptr;
    101         return compositingLayer->renderer();
    102     }
    103 
    104     static const RenderLayerModelObject* getFrameRenderContainer(const char* frameId, WebView* webView, const WTF::AtomicString &elementId)
    105     {
    106         RenderBox* rb = getFrameElement(frameId, webView, elementId);
    107         if (!rb)
    108             return nullptr;
    109         RenderLayer* compositingLayer = rb->enclosingLayer()->enclosingLayerForPaintInvalidation();
    110         if (!compositingLayer)
    111             return nullptr;
    112         return compositingLayer->renderer();
    113     }
    114 
    115     static const FloatRect rectFromQuad(const FloatQuad& quad)
    116     {
    117         FloatRect rect;
    118         rect.setX(std::min(quad.p1().x(), std::min(quad.p2().x(), std::min(quad.p3().x(), quad.p4().x()))));
    119         rect.setY(std::min(quad.p1().y(), std::min(quad.p2().y(), std::min(quad.p3().y(), quad.p4().y()))));
    120 
    121         rect.setWidth(std::max(quad.p1().x(), std::max(quad.p2().x(), std::max(quad.p3().x(), quad.p4().x()))) - rect.x());
    122         rect.setHeight(std::max(quad.p1().y(), std::max(quad.p2().y(), std::max(quad.p3().y(), quad.p4().y()))) - rect.y());
    123         return rect;
    124     }
    125 
    126     void registerMockedHttpURLLoad(const std::string& fileName)
    127     {
    128         URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8(fileName.c_str()));
    129     }
    130 
    131     const std::string m_baseURL;
    132     MockWebFrameClient m_mockWebViewClient;
    133 };
    134 
    135 TEST_F(RenderGeometryMapTest, SimpleGeometryMapTest)
    136 {
    137     registerMockedHttpURLLoad("rgm_test.html");
    138     FrameTestHelpers::WebViewHelper webViewHelper;
    139     WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "rgm_test.html", true, 0, 0);
    140     webView->resize(WebSize(1000, 1000));
    141     webView->layout();
    142 
    143     // We are going test everything twice. Once with FloatPoints and once with
    144     // FloatRects. This is because RenderGeometryMap treats both slightly
    145     // differently
    146     RenderGeometryMap rgm;
    147     rgm.pushMappingsToAncestor(getRenderBox(webView, "InitialDiv"), 0);
    148     FloatPoint point;
    149     FloatRect rect(0.0f, 0.0f, 1.0f, 2.0f);
    150     EXPECT_EQ(FloatPoint(8.0f, 8.0f), rgm.mapToContainer(point, nullptr));
    151     EXPECT_EQ(FloatQuad(FloatRect(8.0f, 8.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, nullptr));
    152 
    153     rgm.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
    154     EXPECT_EQ(FloatPoint(0.0f, 0.0f), rgm.mapToContainer(point, nullptr));
    155     EXPECT_EQ(FloatQuad(FloatRect(0.0f, 0.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, nullptr));
    156 
    157     rgm.pushMappingsToAncestor(getRenderBox(webView, "InnerDiv"), 0);
    158     EXPECT_EQ(FloatPoint(21.0f, 6.0f), rgm.mapToContainer(point, getRenderBox(webView, "CenterDiv")));
    159     EXPECT_EQ(FloatQuad(FloatRect(21.0f, 6.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "CenterDiv")));
    160 
    161     rgm.pushMappingsToAncestor(getRenderBox(webView, "OtherDiv"), getRenderBox(webView, "InnerDiv"));
    162     EXPECT_EQ(FloatPoint(22.0f, 12.0f), rgm.mapToContainer(point, getRenderBox(webView, "CenterDiv")));
    163     EXPECT_EQ(FloatQuad(FloatRect(22.0f, 12.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "CenterDiv")));
    164 
    165     EXPECT_EQ(FloatPoint(1.0f, 6.0f), rgm.mapToContainer(point, getRenderBox(webView, "InnerDiv")));
    166     EXPECT_EQ(FloatQuad(FloatRect(1.0f, 6.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "InnerDiv")));
    167 
    168     EXPECT_EQ(FloatPoint(50.0f, 44.0f), rgm.mapToContainer(point, nullptr));
    169     EXPECT_EQ(FloatQuad(FloatRect(50.0f, 44.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, nullptr));
    170 }
    171 
    172 // Fails on Windows due to crbug.com/391457. When run through the transform the
    173 // position on windows differs by a pixel
    174 #if OS(WIN)
    175 TEST_F(RenderGeometryMapTest, DISABLED_TransformedGeometryTest)
    176 #else
    177 TEST_F(RenderGeometryMapTest, TransformedGeometryTest)
    178 #endif
    179 {
    180     registerMockedHttpURLLoad("rgm_transformed_test.html");
    181     FrameTestHelpers::WebViewHelper webViewHelper;
    182     WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "rgm_transformed_test.html", true, 0, 0);
    183     webView->resize(WebSize(1000, 1000));
    184     webView->layout();
    185 
    186     RenderGeometryMap rgm;
    187     rgm.pushMappingsToAncestor(getRenderBox(webView, "InitialDiv"), 0);
    188     FloatPoint point;
    189     const float rectWidth = 15.0f;
    190     const float scaleWidth = 2.0f;
    191     const float scaleHeight = 3.0f;
    192     FloatRect rect(0.0f, 0.0f, 15.0f, 25.0f);
    193     EXPECT_EQ(FloatPoint(8.0f, 8.0f), rgm.mapToContainer(point, nullptr));
    194     EXPECT_EQ(FloatQuad(FloatRect(8.0f, 8.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, nullptr));
    195 
    196     rgm.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
    197     EXPECT_EQ(FloatPoint(0.0f, 0.0f), rgm.mapToContainer(point, nullptr));
    198     EXPECT_EQ(FloatQuad(FloatRect(0.0f, 0.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, nullptr));
    199 
    200     rgm.pushMappingsToAncestor(getRenderBox(webView, "InnerDiv"), 0);
    201     EXPECT_EQ(FloatPoint(523.0f, 6.0f), rgm.mapToContainer(point, getRenderBox(webView, "CenterDiv")));
    202     EXPECT_EQ(FloatQuad(FloatRect(523.0f - rectWidth, 6.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "CenterDiv")));
    203 
    204     rgm.pushMappingsToAncestor(getRenderBox(webView, "OtherDiv"), getRenderBox(webView, "InnerDiv"));
    205     EXPECT_EQ(FloatPoint(522.0f, 12.0f), rgm.mapToContainer(point, getRenderBox(webView, "CenterDiv")));
    206     EXPECT_EQ(FloatQuad(FloatRect(522.0f - rectWidth, 12.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "CenterDiv")));
    207 
    208     EXPECT_EQ(FloatPoint(1.0f, 6.0f), rgm.mapToContainer(point, getRenderBox(webView, "InnerDiv")));
    209     EXPECT_EQ(FloatQuad(FloatRect(1.0f, 6.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "InnerDiv")));
    210 
    211     EXPECT_EQ(FloatPoint(821.0f, 31.0f), rgm.mapToContainer(point, nullptr));
    212     EXPECT_EQ(FloatQuad(FloatRect(821.0f - rectWidth * scaleWidth, 31.0f, 15.0f * scaleWidth, 25.0f * scaleHeight)), rgm.mapToContainer(rect, nullptr));
    213 
    214     point = FloatPoint(10.0f, 25.0f);
    215     rect = FloatRect(10.0f, 25.0f, 15.0f, 25.0f);
    216     EXPECT_EQ(FloatPoint(512.0f, 37.0f), rgm.mapToContainer(point, getRenderBox(webView, "CenterDiv")));
    217     EXPECT_EQ(FloatQuad(FloatRect(512.0f - rectWidth, 37.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "CenterDiv")));
    218 
    219     EXPECT_EQ(FloatPoint(11.0f, 31.0f), rgm.mapToContainer(point, getRenderBox(webView, "InnerDiv")));
    220     EXPECT_EQ(FloatQuad(FloatRect(11.0f, 31.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, getRenderBox(webView, "InnerDiv")));
    221 
    222     EXPECT_EQ(FloatPoint(801.0f, 106.0f), rgm.mapToContainer(point, nullptr));
    223     EXPECT_EQ(FloatQuad(FloatRect(801.0f - rectWidth * scaleWidth, 106.0f, 15.0f * scaleWidth, 25.0f * scaleHeight)), rgm.mapToContainer(rect, nullptr));
    224 }
    225 
    226 TEST_F(RenderGeometryMapTest, FixedGeometryTest)
    227 {
    228     registerMockedHttpURLLoad("rgm_fixed_position_test.html");
    229     FrameTestHelpers::WebViewHelper webViewHelper;
    230     WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "rgm_fixed_position_test.html", true, 0, 0);
    231     webView->resize(WebSize(1000, 1000));
    232     webView->layout();
    233 
    234     RenderGeometryMap rgm;
    235     rgm.pushMappingsToAncestor(getRenderBox(webView, "InitialDiv"), 0);
    236     FloatPoint point;
    237     FloatRect rect(0.0f, 0.0f, 15.0f, 25.0f);
    238     EXPECT_EQ(FloatPoint(8.0f, 8.0f), rgm.mapToContainer(point, nullptr));
    239     EXPECT_EQ(FloatQuad(FloatRect(8.0f, 8.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, nullptr));
    240 
    241     rgm.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
    242     EXPECT_EQ(FloatPoint(0.0f, 0.0f), rgm.mapToContainer(point, nullptr));
    243     EXPECT_EQ(FloatQuad(FloatRect(0.0f, 0.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, nullptr));
    244 
    245     rgm.pushMappingsToAncestor(getRenderBox(webView, "InnerDiv"), 0);
    246     EXPECT_EQ(FloatPoint(20.0f, 14.0f), rgm.mapToContainer(point, getRenderContainer(webView, "CenterDiv")));
    247     EXPECT_EQ(FloatQuad(FloatRect(20.0f, 14.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, nullptr));
    248 
    249     rgm.pushMappingsToAncestor(getRenderBox(webView, "OtherDiv"), getRenderBox(webView, "InnerDiv"));
    250     EXPECT_EQ(FloatPoint(21.0f, 20.0f), rgm.mapToContainer(point, getRenderContainer(webView, "CenterDiv")));
    251     EXPECT_EQ(FloatQuad(FloatRect(21.0f, 20.0f, 15.0f, 25.0f)), rgm.mapToContainer(rect, getRenderContainer(webView, "CenterDiv")));
    252 
    253     EXPECT_EQ(FloatPoint(21.0f, 20.0f), rgm.mapToContainer(point, getRenderContainer(webView, "InnerDiv")));
    254     EXPECT_EQ(FloatPoint(21.0f, 20.0f), rgm.mapToContainer(point, nullptr));
    255 
    256     point = FloatPoint(10.0f, 25.0f);
    257     rect = FloatRect(22.0f, 15.2f, 15.3f, 0.0f);
    258     EXPECT_EQ(FloatQuad(FloatRect(43.0f, 35.2f, 15.3f, 0.0f)), rgm.mapToContainer(rect, getRenderContainer(webView, "CenterDiv")));
    259 
    260     EXPECT_EQ(FloatPoint(31.0f, 45.0f), rgm.mapToContainer(point, getRenderContainer(webView, "InnerDiv")));
    261     EXPECT_EQ(FloatQuad(FloatRect(43.0f, 35.2f, 15.3f, 0.0f)), rgm.mapToContainer(rect, getRenderContainer(webView, "InnerDiv")));
    262 
    263     EXPECT_EQ(FloatPoint(31.0f, 45.0f), rgm.mapToContainer(point, nullptr));
    264     EXPECT_EQ(FloatQuad(FloatRect(43.0f, 35.2f, 15.3f, 0.0f)), rgm.mapToContainer(rect, nullptr));
    265 }
    266 
    267 TEST_F(RenderGeometryMapTest, IframeTest)
    268 {
    269     registerMockedHttpURLLoad("rgm_iframe_test.html");
    270     registerMockedHttpURLLoad("rgm_test.html");
    271     FrameTestHelpers::WebViewHelper webViewHelper;
    272     WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "rgm_iframe_test.html", true, 0, 0);
    273     webView->resize(WebSize(1000, 1000));
    274     webView->layout();
    275 
    276     RenderGeometryMap rgm(TraverseDocumentBoundaries);
    277     RenderGeometryMap rgmNoFrame;
    278 
    279     rgmNoFrame.pushMappingsToAncestor(getFrameElement("test_frame", webView, "InitialDiv"), 0);
    280     rgm.pushMappingsToAncestor(getFrameElement("test_frame", webView, "InitialDiv"), 0);
    281     FloatPoint point;
    282     FloatRect rect(0.0f, 0.0f, 1.0f, 2.0f);
    283 
    284     EXPECT_EQ(FloatPoint(8.0f, 8.0f), rgmNoFrame.mapToContainer(point, nullptr));
    285     EXPECT_EQ(FloatQuad(FloatRect(8.0f, 8.0f, 1.0f, 2.0f)), rgmNoFrame.mapToContainer(rect, nullptr));
    286 
    287     // Our initial rect looks like: (0, 0, 1, 2)
    288     //        p0_____
    289     //          |   |
    290     //          |   |
    291     //          |   |
    292     //          |___|
    293     // When we rotate we get a rect of the form:
    294     //         p0_
    295     //          / -_
    296     //         /   /
    297     //        /   /
    298     //         -_/
    299     // So it is sensible that the minimum y is the same as for a point at 0, 0.
    300     // The minimum x should be p0.x - 2 * sin(30deg) = p0.x - 1.
    301     // That maximum x should likewise be p0.x + cos(30deg) = p0.x + 0.866.
    302     // And the maximum y should be p0.x + sin(30deg) + 2*cos(30deg)
    303     //      = p0.y + 2.232.
    304     EXPECT_NEAR(70.5244f, rgm.mapToContainer(point, nullptr).x(), 0.0001f);
    305     EXPECT_NEAR(-44.0237f, rgm.mapToContainer(point, nullptr).y(), 0.0001f);
    306     EXPECT_NEAR(69.5244f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).x(), 0.0001f);
    307     EXPECT_NEAR(-44.0237, rectFromQuad(rgm.mapToContainer(rect, nullptr)).y(), 0.0001f);
    308     EXPECT_NEAR(1.866, rectFromQuad(rgm.mapToContainer(rect, nullptr)).width(), 0.0001f);
    309     EXPECT_NEAR(2.232, rectFromQuad(rgm.mapToContainer(rect, nullptr)).height(), 0.0001f);
    310 
    311     rgm.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
    312     rgmNoFrame.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
    313     EXPECT_EQ(FloatPoint(0.0f, 0.0f), rgm.mapToContainer(point, nullptr));
    314     EXPECT_EQ(FloatPoint(0.0f, 0.0f), rgmNoFrame.mapToContainer(point, nullptr));
    315 
    316     rgm.pushMappingsToAncestor(getFrameElement("test_frame", webView, "InnerDiv"), 0);
    317     rgmNoFrame.pushMappingsToAncestor(getFrameElement("test_frame", webView, "InnerDiv"), 0);
    318     EXPECT_EQ(FloatPoint(21.0f, 6.0f), rgm.mapToContainer(point, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
    319     EXPECT_EQ(FloatQuad(FloatRect(21.0f, 6.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
    320     EXPECT_EQ(FloatPoint(21.0f, 6.0f), rgmNoFrame.mapToContainer(point, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
    321     EXPECT_EQ(FloatQuad(FloatRect(21.0f, 6.0f, 1.0f, 2.0f)), rgmNoFrame.mapToContainer(rect, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
    322 
    323     rgm.pushMappingsToAncestor(getFrameElement("test_frame", webView, "OtherDiv"), getFrameRenderContainer("test_frame", webView, "InnerDiv"));
    324     rgmNoFrame.pushMappingsToAncestor(getFrameElement("test_frame", webView, "OtherDiv"), getFrameRenderContainer("test_frame", webView, "InnerDiv"));
    325     EXPECT_EQ(FloatPoint(22.0f, 12.0f), rgm.mapToContainer(point, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
    326     EXPECT_EQ(FloatQuad(FloatRect(22.0f, 12.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
    327     EXPECT_EQ(FloatPoint(22.0f, 12.0f), rgmNoFrame.mapToContainer(point, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
    328     EXPECT_EQ(FloatQuad(FloatRect(22.0f, 12.0f, 1.0f, 2.0f)), rgmNoFrame.mapToContainer(rect, getFrameRenderContainer("test_frame", webView, "CenterDiv")));
    329 
    330     EXPECT_EQ(FloatPoint(1.0f, 6.0f), rgm.mapToContainer(point, getFrameRenderContainer("test_frame", webView, "InnerDiv")));
    331     EXPECT_EQ(FloatQuad(FloatRect(1.0f, 6.0f, 1.0f, 2.0f)), rgm.mapToContainer(rect, getFrameRenderContainer("test_frame", webView, "InnerDiv")));
    332     EXPECT_EQ(FloatPoint(1.0f, 6.0f), rgmNoFrame.mapToContainer(point, getFrameRenderContainer("test_frame", webView, "InnerDiv")));
    333     EXPECT_EQ(FloatQuad(FloatRect(1.0f, 6.0f, 1.0f, 2.0f)), rgmNoFrame.mapToContainer(rect, getFrameRenderContainer("test_frame", webView, "InnerDiv")));
    334 
    335     EXPECT_NEAR(88.8975f, rgm.mapToContainer(point, nullptr).x(), 0.0001f);
    336     EXPECT_NEAR(8.1532f, rgm.mapToContainer(point, nullptr).y(), 0.0001f);
    337     EXPECT_NEAR(87.8975f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).x(), 0.0001f);
    338     EXPECT_NEAR(8.1532f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).y(), 0.0001f);
    339     EXPECT_NEAR(1.866, rectFromQuad(rgm.mapToContainer(rect, nullptr)).width(), 0.0001f);
    340     EXPECT_NEAR(2.232, rectFromQuad(rgm.mapToContainer(rect, nullptr)).height(), 0.0001f);
    341 
    342     EXPECT_EQ(FloatPoint(50.0f, 44.0f), rgmNoFrame.mapToContainer(point, nullptr));
    343     EXPECT_EQ(FloatQuad(FloatRect(50.0f, 44.0f, 1.0f, 2.0f)), rgmNoFrame.mapToContainer(rect, nullptr));
    344 }
    345 
    346 TEST_F(RenderGeometryMapTest, ColumnTest)
    347 {
    348     registerMockedHttpURLLoad("rgm_column_test.html");
    349     FrameTestHelpers::WebViewHelper webViewHelper;
    350     WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "rgm_column_test.html", true, 0, 0);
    351     webView->resize(WebSize(1000, 1000));
    352     webView->layout();
    353 
    354     // The document is 1000f wide (we resized to that size).
    355     // We have a 8px margin on either side of the document.
    356     // Between each column we have a 10px gap, and we have 3 columns.
    357     // The width of a given column is (1000 - 16 - 20)/3.
    358     // The total offset between any column and it's neighbour is width + 10px
    359     // (for the gap).
    360     float offset = (1000.0f - 16.0f - 20.0f) / 3.0f + 10.0f;
    361 
    362     RenderGeometryMap rgm;
    363     rgm.pushMappingsToAncestor(getRenderBox(webView, "A"), 0);
    364     FloatPoint point;
    365     FloatRect rect(0.0f, 0.0f, 5.0f, 3.0f);
    366 
    367     EXPECT_EQ(FloatPoint(8.0f, 8.0f), rgm.mapToContainer(point, nullptr));
    368     EXPECT_EQ(FloatQuad(FloatRect(8.0f, 8.0f, 5.0f, 3.0f)), rgm.mapToContainer(rect, nullptr));
    369 
    370     rgm.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
    371     EXPECT_EQ(FloatPoint(0.0f, 0.0f), rgm.mapToContainer(point, nullptr));
    372     EXPECT_EQ(FloatQuad(FloatRect(0.0f, 0.0f, 5.0f, 3.0f)), rgm.mapToContainer(rect, nullptr));
    373 
    374     rgm.pushMappingsToAncestor(getRenderBox(webView, "Col1"), 0);
    375     EXPECT_EQ(FloatPoint(8.0f, 8.0f), rgm.mapToContainer(point, nullptr));
    376     EXPECT_EQ(FloatQuad(FloatRect(8.0f, 8.0f, 5.0f, 3.0f)), rgm.mapToContainer(rect, nullptr));
    377 
    378     rgm.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
    379     rgm.pushMappingsToAncestor(getRenderBox(webView, "Col2"), nullptr);
    380     EXPECT_NEAR(8.0f + offset, rgm.mapToContainer(point, nullptr).x(), 0.1f);
    381     EXPECT_NEAR(8.0f, rgm.mapToContainer(point, nullptr).y(), 0.1f);
    382     EXPECT_NEAR(8.0f + offset, rectFromQuad(rgm.mapToContainer(rect, nullptr)).x(), 0.1f);
    383     EXPECT_NEAR(8.0f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).y(), 0.1f);
    384     EXPECT_EQ(5.0f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).width());
    385     EXPECT_EQ(3.0f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).height());
    386 
    387     rgm.popMappingsToAncestor(static_cast<RenderLayer*>(nullptr));
    388     rgm.pushMappingsToAncestor(getRenderBox(webView, "Col3"), nullptr);
    389     EXPECT_NEAR(8.0f + offset * 2.0f, rgm.mapToContainer(point, nullptr).x(), 0.1f);
    390     EXPECT_NEAR(8.0f, rgm.mapToContainer(point, nullptr).y(), 0.1f);
    391     EXPECT_NEAR(8.0f + offset * 2.0f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).x(), 0.1f);
    392     EXPECT_NEAR(8.0f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).y(), 0.1f);
    393     EXPECT_EQ(5.0f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).width());
    394     EXPECT_EQ(3.0f, rectFromQuad(rgm.mapToContainer(rect, nullptr)).height());
    395 
    396 }
    397 } // namespace ::
    398