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