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