15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 27f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/PopupContainer.h" 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <gtest/gtest.h> 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WebCore; 3209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)using namespace blink; 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MockPopupContent : public PopupContent { 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void setMaxHeight(int max) OVERRIDE { maxHeight = max; } 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual int popupContentHeight() const OVERRIDE { return height; } 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~MockPopupContent() { } 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void layout() OVERRIDE 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) layoutCount++; 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) width = std::min(maxWidth, width); 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) height = std::min(maxHeight, height); 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) height -= height % 16; 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void setMaxWidthAndLayout(int max) OVERRIDE 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) maxWidth = max; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) layout(); 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MockPopupContent(const IntSize& widgetSize) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : width(widgetSize.width() - borderSize * 2) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , height(widgetSize.height() - borderSize * 2) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , maxWidth(width) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , maxHeight(height) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , layoutCount(0) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int width; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int height; 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int maxWidth; 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int maxHeight; 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned layoutCount; 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static const int borderSize = 1; // Should match to kBorderSize in PopupContainer.cpp. 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const int screenMaxX = 1024; 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const int screenMaxY = 768; 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const int targetControlWidth = 130; 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)static IntRect calculatePositionWithTransformAndRTL(const IntRect& initialRect, const IntSize& transformOffset, int verticalOffset, PopupContent* content) 7781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){ 7881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) const bool isRTL = true; 7981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) const int targetControlHeight = 20; 8081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) const FloatRect screenRect(0, 0, screenMaxX, screenMaxY); 8181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) const FloatRect windowRect(0, 0, 512, 512); 8281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) int rtlOffset = targetControlWidth - initialRect.width(); 8381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) bool needToResizeView = false; 8493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return PopupContainer::layoutAndCalculateWidgetRectInternal(initialRect, targetControlHeight, windowRect, screenRect, !isRTL, rtlOffset, verticalOffset, transformOffset, content, needToResizeView); 8581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)} 8681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 8793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)static IntRect calculatePosition(const IntRect& initialRect, PopupContent* content, FloatRect windowRect = FloatRect(0, 0, 512, 512), bool isRTL = true) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const int targetControlHeight = 20; 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const FloatRect screenRect(0, 0, screenMaxX, screenMaxY); 9193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) int rtlOffset = (targetControlWidth - initialRect.width()) * (isRTL ? 1 : -1); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool needToResizeView = false; 9393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return PopupContainer::layoutAndCalculateWidgetRectInternal(initialRect, targetControlHeight, windowRect, screenRect, !isRTL, rtlOffset, 0, IntSize(), content, needToResizeView); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST(PopupContainerTest, PopupPosition) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Suppose that initialRect.location is the bottom-left corner of the target 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // control such as <select>. 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If initialRect is in the screen, nothing should happen. 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect initialRect(100, 100, 256, 258); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MockPopupContent content(initialRect.size()); 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect resultRect = calculatePosition(initialRect, &content); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(initialRect, resultRect); 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(0u, content.layoutCount); 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the left edge of the control is projecting from the screen, making 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the widget aligned to the right edge of the control. 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect initialRect(-10, 100, 100, 258); 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MockPopupContent content(initialRect.size()); 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect resultRect = calculatePosition(initialRect, &content); 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(IntRect(20, 100, 100, 258), resultRect); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Made the widget aligned to the right edge. But it's still projecting 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // from the screen. 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect initialRect(-10, 100, targetControlWidth, 258); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MockPopupContent content(initialRect.size()); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect resultRect = calculatePosition(initialRect, &content); 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(IntRect(0, 100, 120, 258), resultRect); 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(118, content.width); 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_TRUE(content.layoutCount); 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the right edge of the control is projecting from the screen, 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // shrink the width of the widget. 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect initialRect(screenMaxX - 100, 100, targetControlWidth, 258); 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MockPopupContent content(initialRect.size()); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect resultRect = calculatePosition(initialRect, &content); 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(IntRect(screenMaxX - 100, 100, 100, 258), resultRect); 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(98, content.width); 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_TRUE(content.layoutCount); 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If there is no enough room below, move the widget upwards. 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect initialRect(100, 700, targetControlWidth, 258); 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MockPopupContent content(initialRect.size()); 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect resultRect = calculatePosition(initialRect, &content); 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(IntRect(100, 422, targetControlWidth, 258), resultRect); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(0u, content.layoutCount); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // There is no enough room below and above, and the below space is larger. 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect initialRect(100, 300, targetControlWidth, 514); 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MockPopupContent content(initialRect.size()); 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect resultRect = calculatePosition(initialRect, &content); 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(IntRect(100, 300, targetControlWidth, 466), resultRect); 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_TRUE(content.layoutCount); 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(464, content.height); 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // There is no enough room below and above, and the above space is larger. 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect initialRect(100, 400, targetControlWidth, 514); 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MockPopupContent content(initialRect.size()); 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect resultRect = calculatePosition(initialRect, &content); 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(IntRect(100, 10, targetControlWidth, 370), resultRect); 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_TRUE(content.layoutCount); 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(368, content.height); 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 17081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) { 17193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // There is not enough room to the right, so open the popup menu to the left. 17293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) IntRect initialRect(screenMaxX - targetControlWidth - 6, 100, targetControlWidth * 2, 100); 17393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) MockPopupContent content(initialRect.size()); 17493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) IntRect resultRect = calculatePosition(initialRect, &content, FloatRect(0, 0, screenMaxX, screenMaxY), false); 17593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) EXPECT_EQ(IntRect(758, 100, 260, 100), resultRect); 17693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 17793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 17893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) { 17981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) // Test for --webkit-transform:rotate(53deg). 18081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) IntRect initialRect(100, 700, targetControlWidth, 258); 18181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) MockPopupContent content(initialRect.size()); 18281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) IntSize transformOffset(-4, -8); 18393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) IntRect resultRect = calculatePositionWithTransformAndRTL(initialRect, transformOffset, -104, &content); 18481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) EXPECT_EQ(IntRect(104, 430, targetControlWidth, 258), resultRect); 18581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) EXPECT_EQ(0u, content.layoutCount); 18681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 18781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 18881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) { 18981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) // Test for --webkit-transform:rotate(-53deg). 19081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) IntRect initialRect(100, 700, targetControlWidth, 258); 19181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) MockPopupContent content(initialRect.size()); 19281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) IntSize transformOffset(4, -8); 19393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) IntRect resultRect = calculatePositionWithTransformAndRTL(initialRect, transformOffset, 104, &content); 19481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) EXPECT_EQ(IntRect(96, 430, targetControlWidth, 258), resultRect); 19581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) EXPECT_EQ(0u, content.layoutCount); 19681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 198