1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ash/magnifier/magnification_controller.h" 6 #include "ash/magnifier/magnifier_constants.h" 7 #include "ash/shell.h" 8 #include "ash/test/ash_test_base.h" 9 #include "base/strings/stringprintf.h" 10 #include "ui/aura/client/aura_constants.h" 11 #include "ui/aura/env.h" 12 #include "ui/aura/root_window.h" 13 #include "ui/aura/test/event_generator.h" 14 #include "ui/gfx/rect_conversions.h" 15 #include "ui/gfx/screen.h" 16 17 namespace ash { 18 namespace internal { 19 namespace { 20 21 const int kRootHeight = 600; 22 const int kRootWidth = 800; 23 24 } // namespace 25 26 class MagnificationControllerTest: public test::AshTestBase { 27 public: 28 MagnificationControllerTest() {} 29 virtual ~MagnificationControllerTest() {} 30 31 virtual void SetUp() OVERRIDE { 32 AshTestBase::SetUp(); 33 UpdateDisplay(base::StringPrintf("%dx%d", kRootWidth, kRootHeight)); 34 35 aura::Window* root = GetRootWindow(); 36 gfx::Rect root_bounds(root->bounds()); 37 38 #if defined(OS_WIN) 39 // RootWindow and Display can't resize on Windows Ash. 40 // http://crbug.com/165962 41 EXPECT_EQ(kRootHeight, root_bounds.height()); 42 EXPECT_EQ(kRootWidth, root_bounds.width()); 43 #endif 44 } 45 46 virtual void TearDown() OVERRIDE { 47 AshTestBase::TearDown(); 48 } 49 50 protected: 51 aura::Window* GetRootWindow() const { 52 return Shell::GetPrimaryRootWindow(); 53 } 54 55 std::string GetHostMouseLocation() { 56 gfx::Point point; 57 GetRootWindow()->GetDispatcher()->host()->QueryMouseLocation(&point); 58 return point.ToString(); 59 } 60 61 ash::MagnificationController* GetMagnificationController() const { 62 return ash::Shell::GetInstance()->magnification_controller(); 63 } 64 65 gfx::Rect GetViewport() const { 66 gfx::RectF bounds(0, 0, kRootWidth, kRootHeight); 67 GetRootWindow()->layer()->transform().TransformRectReverse(&bounds); 68 return gfx::ToEnclosingRect(bounds); 69 } 70 71 std::string CurrentPointOfInterest() const { 72 return GetMagnificationController()-> 73 GetPointOfInterestForTesting().ToString(); 74 } 75 76 private: 77 DISALLOW_COPY_AND_ASSIGN(MagnificationControllerTest); 78 }; 79 80 TEST_F(MagnificationControllerTest, EnableAndDisable) { 81 // Confirms the magnifier is disabled. 82 EXPECT_TRUE(GetRootWindow()->layer()->transform().IsIdentity()); 83 EXPECT_EQ(1.0f, GetMagnificationController()->GetScale()); 84 EXPECT_EQ("0,0 800x600", GetViewport().ToString()); 85 86 // Enables magnifier. 87 GetMagnificationController()->SetEnabled(true); 88 EXPECT_FALSE(GetRootWindow()->layer()->transform().IsIdentity()); 89 EXPECT_EQ(2.0f, GetMagnificationController()->GetScale()); 90 EXPECT_EQ("200,150 400x300", GetViewport().ToString()); 91 92 // Disables magnifier. 93 GetMagnificationController()->SetEnabled(false); 94 EXPECT_TRUE(GetRootWindow()->layer()->transform().IsIdentity()); 95 EXPECT_EQ(1.0f, GetMagnificationController()->GetScale()); 96 EXPECT_EQ("0,0 800x600", GetViewport().ToString()); 97 98 // Confirms the the scale can't be changed. 99 GetMagnificationController()->SetScale(4.0f, false); 100 EXPECT_TRUE(GetRootWindow()->layer()->transform().IsIdentity()); 101 EXPECT_EQ(1.0f, GetMagnificationController()->GetScale()); 102 EXPECT_EQ("0,0 800x600", GetViewport().ToString()); 103 } 104 105 TEST_F(MagnificationControllerTest, MagnifyAndUnmagnify) { 106 // Enables magnifier and confirms the default scale is 2.0x. 107 GetMagnificationController()->SetEnabled(true); 108 EXPECT_FALSE(GetRootWindow()->layer()->transform().IsIdentity()); 109 EXPECT_EQ(2.0f, GetMagnificationController()->GetScale()); 110 EXPECT_EQ("200,150 400x300", GetViewport().ToString()); 111 EXPECT_EQ("400,300", CurrentPointOfInterest()); 112 113 // Changes the scale. 114 GetMagnificationController()->SetScale(4.0f, false); 115 EXPECT_EQ(4.0f, GetMagnificationController()->GetScale()); 116 EXPECT_EQ("300,225 200x150", GetViewport().ToString()); 117 EXPECT_EQ("400,300", CurrentPointOfInterest()); 118 119 GetMagnificationController()->SetScale(1.0f, false); 120 EXPECT_EQ(1.0f, GetMagnificationController()->GetScale()); 121 EXPECT_EQ("0,0 800x600", GetViewport().ToString()); 122 EXPECT_EQ("400,300", CurrentPointOfInterest()); 123 124 GetMagnificationController()->SetScale(3.0f, false); 125 EXPECT_EQ(3.0f, GetMagnificationController()->GetScale()); 126 EXPECT_EQ("266,200 267x200", GetViewport().ToString()); 127 EXPECT_EQ("400,300", CurrentPointOfInterest()); 128 } 129 130 TEST_F(MagnificationControllerTest, MoveWindow) { 131 // Enables magnifier and confirm the viewport is at center. 132 GetMagnificationController()->SetEnabled(true); 133 EXPECT_EQ(2.0f, GetMagnificationController()->GetScale()); 134 EXPECT_EQ("200,150 400x300", GetViewport().ToString()); 135 136 // Move the viewport. 137 GetMagnificationController()->MoveWindow(0, 0, false); 138 EXPECT_EQ("0,0 400x300", GetViewport().ToString()); 139 140 GetMagnificationController()->MoveWindow(200, 300, false); 141 EXPECT_EQ("200,300 400x300", GetViewport().ToString()); 142 143 GetMagnificationController()->MoveWindow(400, 0, false); 144 EXPECT_EQ("400,0 400x300", GetViewport().ToString()); 145 146 GetMagnificationController()->MoveWindow(400, 300, false); 147 EXPECT_EQ("400,300 400x300", GetViewport().ToString()); 148 149 // Confirms that the viewport can't across the top-left border. 150 GetMagnificationController()->MoveWindow(-100, 0, false); 151 EXPECT_EQ("0,0 400x300", GetViewport().ToString()); 152 153 GetMagnificationController()->MoveWindow(0, -100, false); 154 EXPECT_EQ("0,0 400x300", GetViewport().ToString()); 155 156 GetMagnificationController()->MoveWindow(-100, -100, false); 157 EXPECT_EQ("0,0 400x300", GetViewport().ToString()); 158 159 // Confirms that the viewport can't across the bittom-right border. 160 GetMagnificationController()->MoveWindow(800, 0, false); 161 EXPECT_EQ("400,0 400x300", GetViewport().ToString()); 162 163 GetMagnificationController()->MoveWindow(0, 400, false); 164 EXPECT_EQ("0,300 400x300", GetViewport().ToString()); 165 166 GetMagnificationController()->MoveWindow(200, 400, false); 167 EXPECT_EQ("200,300 400x300", GetViewport().ToString()); 168 169 GetMagnificationController()->MoveWindow(1000, 1000, false); 170 EXPECT_EQ("400,300 400x300", GetViewport().ToString()); 171 } 172 173 TEST_F(MagnificationControllerTest, PointOfInterest) { 174 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); 175 176 generator.MoveMouseToInHost(gfx::Point(0, 0)); 177 EXPECT_EQ("0,0", CurrentPointOfInterest()); 178 179 generator.MoveMouseToInHost(gfx::Point(799, 599)); 180 EXPECT_EQ("799,599", CurrentPointOfInterest()); 181 182 generator.MoveMouseToInHost(gfx::Point(400, 300)); 183 EXPECT_EQ("400,300", CurrentPointOfInterest()); 184 185 GetMagnificationController()->SetEnabled(true); 186 EXPECT_EQ("400,300", CurrentPointOfInterest()); 187 188 generator.MoveMouseToInHost(gfx::Point(500, 400)); 189 EXPECT_EQ("450,350", CurrentPointOfInterest()); 190 } 191 192 TEST_F(MagnificationControllerTest, PanWindow2xLeftToRight) { 193 const aura::Env* env = aura::Env::GetInstance(); 194 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); 195 196 generator.MoveMouseToInHost(gfx::Point(0, 0)); 197 EXPECT_EQ(1.f, GetMagnificationController()->GetScale()); 198 EXPECT_EQ("0,0 800x600", GetViewport().ToString()); 199 EXPECT_EQ("0,0", env->last_mouse_location().ToString()); 200 201 // Enables magnifier and confirm the viewport is at center. 202 GetMagnificationController()->SetEnabled(true); 203 EXPECT_EQ(2.0f, GetMagnificationController()->GetScale()); 204 205 GetMagnificationController()->MoveWindow(0, 0, false); 206 generator.MoveMouseToInHost(gfx::Point(0, 0)); 207 EXPECT_EQ("0,0", env->last_mouse_location().ToString()); 208 EXPECT_EQ("0,0 400x300", GetViewport().ToString()); 209 210 generator.MoveMouseToInHost(gfx::Point(300, 150)); 211 EXPECT_EQ("150,75", env->last_mouse_location().ToString()); 212 EXPECT_EQ("0,0 400x300", GetViewport().ToString()); 213 214 generator.MoveMouseToInHost(gfx::Point(700, 150)); 215 EXPECT_EQ("350,75", env->last_mouse_location().ToString()); 216 EXPECT_EQ("0,0 400x300", GetViewport().ToString()); 217 218 generator.MoveMouseToInHost(gfx::Point(701, 150)); 219 EXPECT_EQ("350,75", env->last_mouse_location().ToString()); 220 EXPECT_EQ("0,0 400x300", GetViewport().ToString()); 221 222 generator.MoveMouseToInHost(gfx::Point(702, 150)); 223 EXPECT_EQ("351,75", env->last_mouse_location().ToString()); 224 EXPECT_EQ("1,0 400x300", GetViewport().ToString()); 225 226 generator.MoveMouseToInHost(gfx::Point(703, 150)); 227 EXPECT_EQ("352,75", env->last_mouse_location().ToString()); 228 EXPECT_EQ("2,0 400x300", GetViewport().ToString()); 229 230 generator.MoveMouseToInHost(gfx::Point(704, 150)); 231 EXPECT_EQ("354,75", env->last_mouse_location().ToString()); 232 EXPECT_EQ("4,0 400x300", GetViewport().ToString()); 233 234 generator.MoveMouseToInHost(gfx::Point(712, 150)); 235 EXPECT_EQ("360,75", env->last_mouse_location().ToString()); 236 EXPECT_EQ("10,0 400x300", GetViewport().ToString()); 237 238 generator.MoveMouseToInHost(gfx::Point(600, 150)); 239 EXPECT_EQ("310,75", env->last_mouse_location().ToString()); 240 EXPECT_EQ("10,0 400x300", GetViewport().ToString()); 241 242 generator.MoveMouseToInHost(gfx::Point(720, 150)); 243 EXPECT_EQ("370,75", env->last_mouse_location().ToString()); 244 EXPECT_EQ("20,0 400x300", GetViewport().ToString()); 245 246 generator.MoveMouseToInHost(gfx::Point(780, 150)); 247 EXPECT_EQ("410,75", env->last_mouse_location().ToString()); 248 EXPECT_EQ("410,75", CurrentPointOfInterest()); 249 EXPECT_EQ("60,0 400x300", GetViewport().ToString()); 250 251 generator.MoveMouseToInHost(gfx::Point(799, 150)); 252 EXPECT_EQ("459,75", env->last_mouse_location().ToString()); 253 EXPECT_EQ("109,0 400x300", GetViewport().ToString()); 254 255 generator.MoveMouseToInHost(gfx::Point(702, 150)); 256 EXPECT_EQ("460,75", env->last_mouse_location().ToString()); 257 EXPECT_EQ("110,0 400x300", GetViewport().ToString()); 258 259 generator.MoveMouseToInHost(gfx::Point(780, 150)); 260 EXPECT_EQ("500,75", env->last_mouse_location().ToString()); 261 EXPECT_EQ("150,0 400x300", GetViewport().ToString()); 262 263 generator.MoveMouseToInHost(gfx::Point(780, 150)); 264 EXPECT_EQ("540,75", env->last_mouse_location().ToString()); 265 EXPECT_EQ("190,0 400x300", GetViewport().ToString()); 266 267 generator.MoveMouseToInHost(gfx::Point(780, 150)); 268 EXPECT_EQ("580,75", env->last_mouse_location().ToString()); 269 EXPECT_EQ("230,0 400x300", GetViewport().ToString()); 270 271 generator.MoveMouseToInHost(gfx::Point(780, 150)); 272 EXPECT_EQ("620,75", env->last_mouse_location().ToString()); 273 EXPECT_EQ("270,0 400x300", GetViewport().ToString()); 274 275 generator.MoveMouseToInHost(gfx::Point(780, 150)); 276 EXPECT_EQ("660,75", env->last_mouse_location().ToString()); 277 EXPECT_EQ("310,0 400x300", GetViewport().ToString()); 278 279 generator.MoveMouseToInHost(gfx::Point(780, 150)); 280 EXPECT_EQ("700,75", env->last_mouse_location().ToString()); 281 EXPECT_EQ("350,0 400x300", GetViewport().ToString()); 282 283 generator.MoveMouseToInHost(gfx::Point(780, 150)); 284 EXPECT_EQ("740,75", env->last_mouse_location().ToString()); 285 EXPECT_EQ("390,0 400x300", GetViewport().ToString()); 286 287 generator.MoveMouseToInHost(gfx::Point(780, 150)); 288 EXPECT_EQ("780,75", env->last_mouse_location().ToString()); 289 EXPECT_EQ("400,0 400x300", GetViewport().ToString()); 290 291 generator.MoveMouseToInHost(gfx::Point(799, 150)); 292 EXPECT_EQ("799,75", env->last_mouse_location().ToString()); 293 EXPECT_EQ("400,0 400x300", GetViewport().ToString()); 294 } 295 296 TEST_F(MagnificationControllerTest, PanWindow2xRightToLeft) { 297 const aura::Env* env = aura::Env::GetInstance(); 298 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); 299 300 generator.MoveMouseToInHost(gfx::Point(799, 300)); 301 EXPECT_EQ(1.f, GetMagnificationController()->GetScale()); 302 EXPECT_EQ("0,0 800x600", GetViewport().ToString()); 303 EXPECT_EQ("799,300", env->last_mouse_location().ToString()); 304 305 // Enables magnifier and confirm the viewport is at center. 306 GetMagnificationController()->SetEnabled(true); 307 308 generator.MoveMouseToInHost(gfx::Point(799, 300)); 309 EXPECT_EQ("798,300", env->last_mouse_location().ToString()); 310 EXPECT_EQ("400,150 400x300", GetViewport().ToString()); 311 312 generator.MoveMouseToInHost(gfx::Point(0, 300)); 313 EXPECT_EQ("400,300", env->last_mouse_location().ToString()); 314 EXPECT_EQ("350,150 400x300", GetViewport().ToString()); 315 316 generator.MoveMouseToInHost(gfx::Point(0, 300)); 317 EXPECT_EQ("350,300", env->last_mouse_location().ToString()); 318 EXPECT_EQ("300,150 400x300", GetViewport().ToString()); 319 320 generator.MoveMouseToInHost(gfx::Point(0, 300)); 321 EXPECT_EQ("300,300", env->last_mouse_location().ToString()); 322 EXPECT_EQ("250,150 400x300", GetViewport().ToString()); 323 324 generator.MoveMouseToInHost(gfx::Point(0, 300)); 325 EXPECT_EQ("250,300", env->last_mouse_location().ToString()); 326 EXPECT_EQ("200,150 400x300", GetViewport().ToString()); 327 328 generator.MoveMouseToInHost(gfx::Point(0, 300)); 329 EXPECT_EQ("200,300", env->last_mouse_location().ToString()); 330 EXPECT_EQ("150,150 400x300", GetViewport().ToString()); 331 332 generator.MoveMouseToInHost(gfx::Point(0, 300)); 333 EXPECT_EQ("150,300", env->last_mouse_location().ToString()); 334 EXPECT_EQ("100,150 400x300", GetViewport().ToString()); 335 336 generator.MoveMouseToInHost(gfx::Point(0, 300)); 337 EXPECT_EQ("100,300", env->last_mouse_location().ToString()); 338 EXPECT_EQ("50,150 400x300", GetViewport().ToString()); 339 340 generator.MoveMouseToInHost(gfx::Point(0, 300)); 341 EXPECT_EQ("50,300", env->last_mouse_location().ToString()); 342 EXPECT_EQ("0,150 400x300", GetViewport().ToString()); 343 344 generator.MoveMouseToInHost(gfx::Point(0, 300)); 345 EXPECT_EQ("0,300", env->last_mouse_location().ToString()); 346 EXPECT_EQ("0,150 400x300", GetViewport().ToString()); 347 } 348 349 TEST_F(MagnificationControllerTest, PanWindowToRight) { 350 const aura::Env* env = aura::Env::GetInstance(); 351 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); 352 353 generator.MoveMouseToInHost(gfx::Point(400, 300)); 354 EXPECT_EQ(1.f, GetMagnificationController()->GetScale()); 355 EXPECT_EQ("0,0 800x600", GetViewport().ToString()); 356 EXPECT_EQ("400,300", env->last_mouse_location().ToString()); 357 358 float scale = 2.f; 359 360 // Enables magnifier and confirm the viewport is at center. 361 GetMagnificationController()->SetEnabled(true); 362 EXPECT_FLOAT_EQ(2.f, GetMagnificationController()->GetScale()); 363 364 scale *= kMagnificationScaleFactor; 365 GetMagnificationController()->SetScale(scale, false); 366 EXPECT_FLOAT_EQ(2.3784142, GetMagnificationController()->GetScale()); 367 generator.MoveMouseToInHost(gfx::Point(400, 300)); 368 EXPECT_EQ("400,300", env->last_mouse_location().ToString()); 369 generator.MoveMouseToInHost(gfx::Point(799, 300)); 370 EXPECT_EQ("566,299", env->last_mouse_location().ToString()); 371 EXPECT_EQ("705,300", GetHostMouseLocation()); 372 373 scale *= kMagnificationScaleFactor; 374 GetMagnificationController()->SetScale(scale, false); 375 EXPECT_FLOAT_EQ(2.8284268, GetMagnificationController()->GetScale()); 376 generator.MoveMouseToInHost(gfx::Point(799, 300)); 377 EXPECT_EQ("599,299", env->last_mouse_location().ToString()); 378 EXPECT_EQ("702,300", GetHostMouseLocation()); 379 380 scale *= kMagnificationScaleFactor; 381 GetMagnificationController()->SetScale(scale, false); 382 EXPECT_FLOAT_EQ(3.3635852, GetMagnificationController()->GetScale()); 383 generator.MoveMouseToInHost(gfx::Point(799, 300)); 384 EXPECT_EQ("627,298", env->last_mouse_location().ToString()); 385 EXPECT_EQ("707,300", GetHostMouseLocation()); 386 387 scale *= kMagnificationScaleFactor; 388 GetMagnificationController()->SetScale(scale, false); 389 EXPECT_FLOAT_EQ(4.f, GetMagnificationController()->GetScale()); 390 generator.MoveMouseToInHost(gfx::Point(799, 300)); 391 EXPECT_EQ("649,298", env->last_mouse_location().ToString()); 392 EXPECT_EQ("704,300", GetHostMouseLocation()); 393 } 394 395 TEST_F(MagnificationControllerTest, PanWindowToLeft) { 396 const aura::Env* env = aura::Env::GetInstance(); 397 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); 398 399 generator.MoveMouseToInHost(gfx::Point(400, 300)); 400 EXPECT_EQ(1.f, GetMagnificationController()->GetScale()); 401 EXPECT_EQ("0,0 800x600", GetViewport().ToString()); 402 EXPECT_EQ("400,300", env->last_mouse_location().ToString()); 403 404 float scale = 2.f; 405 406 // Enables magnifier and confirm the viewport is at center. 407 GetMagnificationController()->SetEnabled(true); 408 EXPECT_FLOAT_EQ(2.f, GetMagnificationController()->GetScale()); 409 410 scale *= kMagnificationScaleFactor; 411 GetMagnificationController()->SetScale(scale, false); 412 EXPECT_FLOAT_EQ(2.3784142, GetMagnificationController()->GetScale()); 413 generator.MoveMouseToInHost(gfx::Point(400, 300)); 414 EXPECT_EQ("400,300", env->last_mouse_location().ToString()); 415 generator.MoveMouseToInHost(gfx::Point(0, 300)); 416 EXPECT_EQ("231,299", env->last_mouse_location().ToString()); 417 EXPECT_EQ("100,300", GetHostMouseLocation()); 418 419 scale *= kMagnificationScaleFactor; 420 GetMagnificationController()->SetScale(scale, false); 421 EXPECT_FLOAT_EQ(2.8284268, GetMagnificationController()->GetScale()); 422 generator.MoveMouseToInHost(gfx::Point(0, 300)); 423 EXPECT_EQ("194,299", env->last_mouse_location().ToString()); 424 EXPECT_EQ("99,300", GetHostMouseLocation()); 425 426 scale *= kMagnificationScaleFactor; 427 GetMagnificationController()->SetScale(scale, false); 428 EXPECT_FLOAT_EQ(3.3635852, GetMagnificationController()->GetScale()); 429 generator.MoveMouseToInHost(gfx::Point(0, 300)); 430 EXPECT_EQ("164,298", env->last_mouse_location().ToString()); 431 EXPECT_EQ("98,300", GetHostMouseLocation()); 432 433 scale *= kMagnificationScaleFactor; 434 GetMagnificationController()->SetScale(scale, false); 435 EXPECT_FLOAT_EQ(4.f, GetMagnificationController()->GetScale()); 436 generator.MoveMouseToInHost(gfx::Point(0, 300)); 437 EXPECT_EQ("139,298", env->last_mouse_location().ToString()); 438 EXPECT_EQ("100,300", GetHostMouseLocation()); 439 } 440 441 } // namespace internal 442 } // namespace ash 443