Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 /* | |
| 2 * Copyright (C) 2012 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 | |
| 6 * are met: | |
| 7 * 1. Redistributions of source code must retain the above copyright | |
| 8 * notice, this list of conditions and the following disclaimer. | |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | |
| 10 * notice, this list of conditions and the following disclaimer in the | |
| 11 * documentation and/or other materials provided with the distribution. | |
| 12 * | |
| 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND | |
| 14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| 16 * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE | |
| 17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| 18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
| 19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
| 20 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| 21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| 22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| 23 * SUCH DAMAGE. | |
| 24 */ | |
| 25 | |
| 26 #include "config.h" | |
| 27 #include "web/PopupContainer.h" | |
| 28 | |
| 29 #include <gtest/gtest.h> | |
| 30 | |
| 31 using namespace blink; | |
| 32 | |
| 33 class MockPopupContent : public PopupContent { | |
| 34 public: | |
| 35 virtual void setMaxHeight(int max) override { maxHeight = max; } | |
| 36 virtual int popupContentHeight() const override { return height; } | |
| 37 virtual ~MockPopupContent() { } | |
| 38 | |
| 39 virtual void layout() override | |
| 40 { | |
| 41 layoutCount++; | |
| 42 width = std::min(maxWidth, width); | |
| 43 height = std::min(maxHeight, height); | |
| 44 height -= height % 16; | |
| 45 } | |
| 46 | |
| 47 virtual void setMaxWidthAndLayout(int max) override | |
| 48 { | |
| 49 maxWidth = max; | |
| 50 layout(); | |
| 51 } | |
| 52 | |
| 53 MockPopupContent(const IntSize& widgetSize) | |
| 54 : width(widgetSize.width() - borderSize * 2) | |
| 55 , height(widgetSize.height() - borderSize * 2) | |
| 56 , maxWidth(width) | |
| 57 , maxHeight(height) | |
| 58 , layoutCount(0) | |
| 59 { | |
| 60 } | |
| 61 | |
| 62 int width; | |
| 63 int height; | |
| 64 int maxWidth; | |
| 65 int maxHeight; | |
| 66 unsigned layoutCount; | |
| 67 | |
| 68 static const int borderSize = 1; // Should match to kBorderSize in PopupCont ainer.cpp. | |
| 69 }; | |
| 70 | |
| 71 const int screenMaxX = 1024; | |
| 72 const int screenMaxY = 768; | |
| 73 const int targetControlWidth = 130; | |
| 74 | |
| 75 static IntRect calculatePositionWithTransformAndRTL(const IntRect& initialRect, const IntSize& transformOffset, int verticalOffset, PopupContent* content) | |
| 76 { | |
| 77 const bool isRTL = true; | |
| 78 const int targetControlHeight = 20; | |
| 79 const FloatRect screenRect(0, 0, screenMaxX, screenMaxY); | |
| 80 const FloatRect windowRect(0, 0, 512, 512); | |
| 81 int rtlOffset = targetControlWidth - initialRect.width(); | |
| 82 bool needToResizeView = false; | |
| 83 return PopupContainer::layoutAndCalculateWidgetRectInternal(initialRect, tar getControlHeight, windowRect, screenRect, !isRTL, rtlOffset, verticalOffset, tra nsformOffset, content, needToResizeView); | |
| 84 } | |
| 85 | |
| 86 static IntRect calculatePosition(const IntRect& initialRect, PopupContent* conte nt, FloatRect windowRect = FloatRect(0, 0, 512, 512), bool isRTL = true) | |
| 87 { | |
| 88 const int targetControlHeight = 20; | |
| 89 const FloatRect screenRect(0, 0, screenMaxX, screenMaxY); | |
| 90 int rtlOffset = (targetControlWidth - initialRect.width()) * (isRTL ? 1 : -1 ); | |
| 91 bool needToResizeView = false; | |
| 92 return PopupContainer::layoutAndCalculateWidgetRectInternal(initialRect, tar getControlHeight, windowRect, screenRect, !isRTL, rtlOffset, 0, IntSize(), conte nt, needToResizeView); | |
| 93 } | |
| 94 | |
| 95 TEST(PopupContainerTest, PopupPosition) | |
|
tkent
2014/12/15 02:07:00
I wonder if we have enough tests for PagePopup pos
keishi
2014/12/15 08:29:42
I added popup-menu-position.html to test some of t
| |
| 96 { | |
| 97 // Suppose that initialRect.location is the bottom-left corner of the target | |
| 98 // control such as <select>. | |
| 99 | |
| 100 { | |
| 101 // If initialRect is in the screen, nothing should happen. | |
| 102 IntRect initialRect(100, 100, 256, 258); | |
| 103 MockPopupContent content(initialRect.size()); | |
| 104 IntRect resultRect = calculatePosition(initialRect, &content); | |
| 105 EXPECT_EQ(initialRect, resultRect); | |
| 106 EXPECT_EQ(0u, content.layoutCount); | |
| 107 } | |
| 108 | |
| 109 { | |
| 110 // If the left edge of the control is projecting from the screen, making | |
| 111 // the widget aligned to the right edge of the control. | |
| 112 IntRect initialRect(-10, 100, 100, 258); | |
| 113 MockPopupContent content(initialRect.size()); | |
| 114 IntRect resultRect = calculatePosition(initialRect, &content); | |
| 115 EXPECT_EQ(IntRect(20, 100, 100, 258), resultRect); | |
| 116 } | |
| 117 | |
| 118 { | |
| 119 // Made the widget aligned to the right edge. But it's still projecting | |
| 120 // from the screen. | |
| 121 IntRect initialRect(-10, 100, targetControlWidth, 258); | |
| 122 MockPopupContent content(initialRect.size()); | |
| 123 IntRect resultRect = calculatePosition(initialRect, &content); | |
| 124 EXPECT_EQ(IntRect(0, 100, 120, 258), resultRect); | |
| 125 EXPECT_EQ(118, content.width); | |
| 126 EXPECT_TRUE(content.layoutCount); | |
| 127 } | |
| 128 | |
| 129 { | |
| 130 // If the right edge of the control is projecting from the screen, | |
| 131 // shrink the width of the widget. | |
| 132 IntRect initialRect(screenMaxX - 100, 100, targetControlWidth, 258); | |
| 133 MockPopupContent content(initialRect.size()); | |
| 134 IntRect resultRect = calculatePosition(initialRect, &content); | |
| 135 EXPECT_EQ(IntRect(screenMaxX - 100, 100, 100, 258), resultRect); | |
| 136 EXPECT_EQ(98, content.width); | |
| 137 EXPECT_TRUE(content.layoutCount); | |
| 138 } | |
| 139 | |
| 140 { | |
| 141 // If there is no enough room below, move the widget upwards. | |
| 142 IntRect initialRect(100, 700, targetControlWidth, 258); | |
| 143 MockPopupContent content(initialRect.size()); | |
| 144 IntRect resultRect = calculatePosition(initialRect, &content); | |
| 145 EXPECT_EQ(IntRect(100, 422, targetControlWidth, 258), resultRect); | |
| 146 EXPECT_EQ(0u, content.layoutCount); | |
| 147 } | |
| 148 | |
| 149 { | |
| 150 // There is no enough room below and above, and the below space is large r. | |
| 151 IntRect initialRect(100, 300, targetControlWidth, 514); | |
| 152 MockPopupContent content(initialRect.size()); | |
| 153 IntRect resultRect = calculatePosition(initialRect, &content); | |
| 154 EXPECT_EQ(IntRect(100, 300, targetControlWidth, 466), resultRect); | |
| 155 EXPECT_TRUE(content.layoutCount); | |
| 156 EXPECT_EQ(464, content.height); | |
| 157 } | |
| 158 | |
| 159 { | |
| 160 // There is no enough room below and above, and the above space is large r. | |
| 161 IntRect initialRect(100, 400, targetControlWidth, 514); | |
| 162 MockPopupContent content(initialRect.size()); | |
| 163 IntRect resultRect = calculatePosition(initialRect, &content); | |
| 164 EXPECT_EQ(IntRect(100, 10, targetControlWidth, 370), resultRect); | |
| 165 EXPECT_TRUE(content.layoutCount); | |
| 166 EXPECT_EQ(368, content.height); | |
| 167 } | |
| 168 | |
| 169 { | |
| 170 // There is not enough room to the right, so open the popup menu to the left. | |
| 171 IntRect initialRect(screenMaxX - targetControlWidth - 6, 100, targetCont rolWidth * 2, 100); | |
| 172 MockPopupContent content(initialRect.size()); | |
| 173 IntRect resultRect = calculatePosition(initialRect, &content, FloatRect( 0, 0, screenMaxX, screenMaxY), false); | |
| 174 EXPECT_EQ(IntRect(758, 100, 260, 100), resultRect); | |
| 175 } | |
| 176 | |
| 177 { | |
| 178 // Test for transform:rotate(53deg). | |
| 179 IntRect initialRect(100, 700, targetControlWidth, 258); | |
| 180 MockPopupContent content(initialRect.size()); | |
| 181 IntSize transformOffset(-4, -8); | |
| 182 IntRect resultRect = calculatePositionWithTransformAndRTL(initialRect, t ransformOffset, -104, &content); | |
| 183 EXPECT_EQ(IntRect(104, 430, targetControlWidth, 258), resultRect); | |
| 184 EXPECT_EQ(0u, content.layoutCount); | |
| 185 } | |
| 186 | |
| 187 { | |
| 188 // Test for transform:rotate(-53deg). | |
| 189 IntRect initialRect(100, 700, targetControlWidth, 258); | |
| 190 MockPopupContent content(initialRect.size()); | |
| 191 IntSize transformOffset(4, -8); | |
| 192 IntRect resultRect = calculatePositionWithTransformAndRTL(initialRect, t ransformOffset, 104, &content); | |
| 193 EXPECT_EQ(IntRect(96, 430, targetControlWidth, 258), resultRect); | |
| 194 EXPECT_EQ(0u, content.layoutCount); | |
| 195 } | |
| 196 } | |
| OLD | NEW |