OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ash/wm/frame_painter.h" | 5 #include "ash/wm/frame_painter.h" |
6 | 6 |
7 #include "ash/shell.h" | 7 #include "ash/shell.h" |
8 #include "ash/shell_window_ids.h" | 8 #include "ash/shell_window_ids.h" |
9 #include "ash/test/ash_test_base.h" | 9 #include "ash/test/ash_test_base.h" |
10 #include "ash/wm/property_util.h" | 10 #include "ash/wm/property_util.h" |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 window_ = NULL; | 95 window_ = NULL; |
96 window->RemoveObserver(this); | 96 window->RemoveObserver(this); |
97 } | 97 } |
98 | 98 |
99 aura::Window* window_; | 99 aura::Window* window_; |
100 bool is_paint_scheduled_; | 100 bool is_paint_scheduled_; |
101 | 101 |
102 DISALLOW_COPY_AND_ASSIGN(WindowRepaintChecker); | 102 DISALLOW_COPY_AND_ASSIGN(WindowRepaintChecker); |
103 }; | 103 }; |
104 | 104 |
| 105 // Modifies the values of kInactiveWindowOpacity, kActiveWindowOpacity, and |
| 106 // kSoloWindowOpacity for the lifetime of the class. This is useful so that |
| 107 // the constants each have different values. |
| 108 class ScopedOpacityConstantModifier { |
| 109 public: |
| 110 ScopedOpacityConstantModifier() |
| 111 : initial_active_window_opacity_( |
| 112 ash::FramePainter::kActiveWindowOpacity), |
| 113 initial_inactive_window_opacity_( |
| 114 ash::FramePainter::kInactiveWindowOpacity), |
| 115 initial_solo_window_opacity_(ash::FramePainter::kSoloWindowOpacity) { |
| 116 ash::FramePainter::kActiveWindowOpacity = 100; |
| 117 ash::FramePainter::kInactiveWindowOpacity = 120; |
| 118 ash::FramePainter::kSoloWindowOpacity = 140; |
| 119 } |
| 120 ~ScopedOpacityConstantModifier() { |
| 121 ash::FramePainter::kActiveWindowOpacity = initial_active_window_opacity_; |
| 122 ash::FramePainter::kInactiveWindowOpacity = |
| 123 initial_inactive_window_opacity_; |
| 124 ash::FramePainter::kSoloWindowOpacity = initial_solo_window_opacity_; |
| 125 } |
| 126 |
| 127 private: |
| 128 int initial_active_window_opacity_; |
| 129 int initial_inactive_window_opacity_; |
| 130 int initial_solo_window_opacity_; |
| 131 |
| 132 DISALLOW_COPY_AND_ASSIGN(ScopedOpacityConstantModifier); |
| 133 }; |
| 134 |
105 } // namespace | 135 } // namespace |
106 | 136 |
107 namespace ash { | 137 namespace ash { |
108 | 138 |
109 class FramePainterTest : public ash::test::AshTestBase { | 139 class FramePainterTest : public ash::test::AshTestBase { |
110 public: | 140 public: |
111 // Creates a test widget that owns its native widget. | 141 // Creates a test widget that owns its native widget. |
112 Widget* CreateTestWidget() { | 142 Widget* CreateTestWidget() { |
113 Widget* widget = new Widget; | 143 Widget* widget = new Widget; |
114 Widget::InitParams params; | 144 Widget::InitParams params; |
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
436 | 466 |
437 TEST_F(FramePainterTest, GetHeaderOpacity) { | 467 TEST_F(FramePainterTest, GetHeaderOpacity) { |
438 // Create a widget and a painter for it. | 468 // Create a widget and a painter for it. |
439 scoped_ptr<Widget> w1(CreateTestWidget()); | 469 scoped_ptr<Widget> w1(CreateTestWidget()); |
440 FramePainter p1; | 470 FramePainter p1; |
441 ImageButton size1(NULL); | 471 ImageButton size1(NULL); |
442 ImageButton close1(NULL); | 472 ImageButton close1(NULL); |
443 p1.Init(w1.get(), NULL, &size1, &close1, FramePainter::SIZE_BUTTON_MAXIMIZES); | 473 p1.Init(w1.get(), NULL, &size1, &close1, FramePainter::SIZE_BUTTON_MAXIMIZES); |
444 w1->Show(); | 474 w1->Show(); |
445 | 475 |
| 476 // Modify the values of the opacity constants so that they each have a |
| 477 // different value. |
| 478 ScopedOpacityConstantModifier opacity_constant_modifier; |
| 479 |
446 // Solo active window has solo window opacity. | 480 // Solo active window has solo window opacity. |
447 EXPECT_EQ(FramePainter::kSoloWindowOpacity, | 481 EXPECT_EQ(FramePainter::kSoloWindowOpacity, |
448 p1.GetHeaderOpacity(FramePainter::ACTIVE, | 482 p1.GetHeaderOpacity(FramePainter::ACTIVE, |
449 IDR_AURA_WINDOW_HEADER_BASE_ACTIVE, | 483 IDR_AURA_WINDOW_HEADER_BASE_ACTIVE, |
450 NULL)); | 484 NULL)); |
451 | 485 |
452 // Create a second widget and painter. | 486 // Create a second widget and painter. |
453 scoped_ptr<Widget> w2(CreateTestWidget()); | 487 scoped_ptr<Widget> w2(CreateTestWidget()); |
454 FramePainter p2; | 488 FramePainter p2; |
455 ImageButton size2(NULL); | 489 ImageButton size2(NULL); |
(...skipping 12 matching lines...) Expand all Loading... |
468 p2.GetHeaderOpacity(FramePainter::INACTIVE, | 502 p2.GetHeaderOpacity(FramePainter::INACTIVE, |
469 IDR_AURA_WINDOW_HEADER_BASE_INACTIVE, | 503 IDR_AURA_WINDOW_HEADER_BASE_INACTIVE, |
470 NULL)); | 504 NULL)); |
471 | 505 |
472 // Custom overlay image is drawn completely opaque. | 506 // Custom overlay image is drawn completely opaque. |
473 gfx::ImageSkia custom_overlay; | 507 gfx::ImageSkia custom_overlay; |
474 EXPECT_EQ(255, | 508 EXPECT_EQ(255, |
475 p1.GetHeaderOpacity(FramePainter::ACTIVE, | 509 p1.GetHeaderOpacity(FramePainter::ACTIVE, |
476 IDR_AURA_WINDOW_HEADER_BASE_ACTIVE, | 510 IDR_AURA_WINDOW_HEADER_BASE_ACTIVE, |
477 &custom_overlay)); | 511 &custom_overlay)); |
| 512 |
| 513 // Regular maximized window is fully transparent. |
| 514 ash::wm::MaximizeWindow(w1->GetNativeWindow()); |
| 515 EXPECT_EQ(0, |
| 516 p1.GetHeaderOpacity(FramePainter::ACTIVE, |
| 517 IDR_AURA_WINDOW_HEADER_BASE_ACTIVE, |
| 518 NULL)); |
| 519 |
| 520 // Windows with custom overlays are fully opaque when maximized. |
| 521 EXPECT_EQ(255, |
| 522 p1.GetHeaderOpacity(FramePainter::ACTIVE, |
| 523 IDR_AURA_WINDOW_HEADER_BASE_ACTIVE, |
| 524 &custom_overlay)); |
| 525 |
| 526 // The maximized window frame should take on the active/inactive opacity |
| 527 // while the user is cycling through workspaces. |
| 528 w1->GetNativeWindow()->GetRootWindow()->SetProperty( |
| 529 ash::internal::kCyclingThroughWorkspacesKey, true); |
| 530 EXPECT_EQ(FramePainter::kInactiveWindowOpacity, |
| 531 p1.GetHeaderOpacity(FramePainter::INACTIVE, |
| 532 IDR_AURA_WINDOW_HEADER_BASE_ACTIVE, |
| 533 NULL)); |
478 } | 534 } |
479 | 535 |
480 // Test the hit test function with windows which are "partially maximized". | 536 // Test the hit test function with windows which are "partially maximized". |
481 TEST_F(FramePainterTest, HitTestSpecialMaximizedModes) { | 537 TEST_F(FramePainterTest, HitTestSpecialMaximizedModes) { |
482 // Create a widget and a painter for it. | 538 // Create a widget and a painter for it. |
483 scoped_ptr<Widget> w1(CreateResizableWidget()); | 539 scoped_ptr<Widget> w1(CreateResizableWidget()); |
484 FramePainter p1; | 540 FramePainter p1; |
485 ImageButton size1(NULL); | 541 ImageButton size1(NULL); |
486 ImageButton close1(NULL); | 542 ImageButton close1(NULL); |
487 p1.Init(w1.get(), NULL, &size1, &close1, FramePainter::SIZE_BUTTON_MAXIMIZES); | 543 p1.Init(w1.get(), NULL, &size1, &close1, FramePainter::SIZE_BUTTON_MAXIMIZES); |
(...skipping 18 matching lines...) Expand all Loading... |
506 EXPECT_EQ(HTRIGHT, | 562 EXPECT_EQ(HTRIGHT, |
507 p1.NonClientHitTest(frame, gfx::Point(screen.width() / 2, | 563 p1.NonClientHitTest(frame, gfx::Point(screen.width() / 2, |
508 screen.height() / 2))); | 564 screen.height() / 2))); |
509 // A hit into the middle lower area should generate right - not bottom&right. | 565 // A hit into the middle lower area should generate right - not bottom&right. |
510 EXPECT_EQ(HTRIGHT, | 566 EXPECT_EQ(HTRIGHT, |
511 p1.NonClientHitTest(frame, gfx::Point(screen.width() / 2, | 567 p1.NonClientHitTest(frame, gfx::Point(screen.width() / 2, |
512 screen.height() - 1))); | 568 screen.height() - 1))); |
513 } | 569 } |
514 | 570 |
515 } // namespace ash | 571 } // namespace ash |
OLD | NEW |