15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/accelerators/accelerator_controller.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/accelerators/accelerator_table.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_switches.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_manager.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/focus_cycler.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h"
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ash/session/session_state_delegate.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/shelf/shelf.h"
15b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager_observer.h"
168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ash/shelf/shelf_view.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/status_area_widget.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_item.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/test/shelf_test_api.h"
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/wm/window_state.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/event_generator.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animator.h"
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/compositor/scoped_animation_duration_scale_mode.h"
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/events/gestures/gesture_configuration.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/fill_layout.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/win/windows_version.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StepWidgetLayerAnimatorToEnd(views::Widget* widget) {
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  widget->GetNativeView()->layer()->GetAnimator()->Step(
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::TimeTicks::Now() + base::TimeDelta::FromSeconds(1));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShelfWidget* GetShelfWidget() {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Shell::GetPrimaryRootWindowController()->shelf();
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShelfLayoutManager* GetShelfLayoutManager() {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager();
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SystemTray* GetSystemTray() {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Shell::GetPrimaryRootWindowController()->GetSystemTray();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Class which waits till the shelf finishes animating to the target size and
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// counts the number of animation steps.
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ShelfAnimationWaiter : views::WidgetObserver {
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  explicit ShelfAnimationWaiter(const gfx::Rect& target_bounds)
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      : target_bounds_(target_bounds),
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        animation_steps_(0),
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        done_waiting_(false) {
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GetShelfWidget()->AddObserver(this);
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~ShelfAnimationWaiter() {
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GetShelfWidget()->RemoveObserver(this);
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Wait till the shelf finishes animating to its expected bounds.
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void WaitTillDoneAnimating() {
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (IsDoneAnimating())
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      done_waiting_ = true;
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    else
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      base::MessageLoop::current()->Run();
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Returns true if the animation has completed and it was valid.
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool WasValidAnimation() const {
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return done_waiting_ && animation_steps_ > 0;
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Returns true if shelf has finished animating to the target size.
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool IsDoneAnimating() const {
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ShelfLayoutManager* layout_manager = GetShelfLayoutManager();
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    gfx::Rect current_bounds = GetShelfWidget()->GetWindowBoundsInScreen();
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    int size = layout_manager->PrimaryAxisValue(current_bounds.height(),
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        current_bounds.width());
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    int desired_size = layout_manager->PrimaryAxisValue(target_bounds_.height(),
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        target_bounds_.width());
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return (size == desired_size);
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // views::WidgetObserver override.
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void OnWidgetBoundsChanged(views::Widget* widget,
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                     const gfx::Rect& new_bounds) OVERRIDE {
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (done_waiting_)
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return;
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ++animation_steps_;
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (IsDoneAnimating()) {
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      done_waiting_ = true;
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      base::MessageLoop::current()->Quit();
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  gfx::Rect target_bounds_;
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  int animation_steps_;
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool done_waiting_;
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ShelfAnimationWaiter);
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ShelfDragCallback {
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ShelfDragCallback(const gfx::Rect& not_visible, const gfx::Rect& visible)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : not_visible_bounds_(not_visible),
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        visible_bounds_(visible),
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        was_visible_on_drag_start_(false) {
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(not_visible_bounds_.bottom(), visible_bounds_.bottom());
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~ShelfDragCallback() {
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ProcessScroll(ui::EventType type, const gfx::Vector2dF& delta) {
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (GetShelfLayoutManager()->visibility_state() == ash::SHELF_HIDDEN)
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (type == ui::ET_GESTURE_SCROLL_BEGIN) {
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scroll_ = gfx::Vector2dF();
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      was_visible_on_drag_start_ = GetShelfLayoutManager()->IsVisible();
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The state of the shelf at the end of the gesture is tested separately.
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (type == ui::ET_GESTURE_SCROLL_END)
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (type == ui::ET_GESTURE_SCROLL_UPDATE)
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scroll_.Add(delta);
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect shelf_bounds = GetShelfWidget()->GetWindowBoundsInScreen();
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (GetShelfLayoutManager()->IsHorizontalAlignment()) {
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EXPECT_EQ(not_visible_bounds_.bottom(), shelf_bounds.bottom());
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EXPECT_EQ(visible_bounds_.bottom(), shelf_bounds.bottom());
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else if (SHELF_ALIGNMENT_RIGHT ==
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        GetShelfLayoutManager()->GetAlignment()){
16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EXPECT_EQ(not_visible_bounds_.right(), shelf_bounds.right());
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EXPECT_EQ(visible_bounds_.right(), shelf_bounds.right());
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else if (SHELF_ALIGNMENT_LEFT ==
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        GetShelfLayoutManager()->GetAlignment()) {
16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EXPECT_EQ(not_visible_bounds_.x(), shelf_bounds.x());
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EXPECT_EQ(visible_bounds_.x(), shelf_bounds.x());
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // if the shelf is being dimmed test dimmer bounds as well.
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (GetShelfWidget()->GetDimsShelf())
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(GetShelfWidget()->GetWindowBoundsInScreen(),
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                GetShelfWidget()->GetDimmerBoundsForTest());
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The shelf should never be smaller than the hidden state.
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_GE(shelf_bounds.height(), not_visible_bounds_.height());
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    float scroll_delta = GetShelfLayoutManager()->PrimaryAxisValue(
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        scroll_.y(),
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        scroll_.x());
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    bool increasing_drag =
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        GetShelfLayoutManager()->SelectValueForShelfAlignment(
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            scroll_delta < 0,
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            scroll_delta > 0,
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            scroll_delta < 0,
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            scroll_delta > 0);
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int shelf_size = GetShelfLayoutManager()->PrimaryAxisValue(
18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        shelf_bounds.height(),
18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        shelf_bounds.width());
19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int visible_bounds_size = GetShelfLayoutManager()->PrimaryAxisValue(
19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        visible_bounds_.height(),
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        visible_bounds_.width());
19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int not_visible_bounds_size = GetShelfLayoutManager()->PrimaryAxisValue(
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        not_visible_bounds_.height(),
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        not_visible_bounds_.width());
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (was_visible_on_drag_start_) {
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (increasing_drag) {
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        // If dragging inwards from the visible state, then the shelf should
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        // increase in size, but not more than the scroll delta.
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        EXPECT_LE(visible_bounds_size, shelf_size);
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        EXPECT_LE(std::abs(shelf_size - visible_bounds_size),
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                  std::abs(scroll_delta));
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if (shelf_size > not_visible_bounds_size) {
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          // If dragging outwards from the visible state, then the shelf
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          // should decrease in size, until it reaches the minimum size.
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          EXPECT_EQ(shelf_size, visible_bounds_size - std::abs(scroll_delta));
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (std::abs(scroll_delta) <
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          visible_bounds_size - not_visible_bounds_size) {
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Tests that the shelf sticks with the touch point during the drag
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // until the shelf is completely visible.
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        EXPECT_EQ(shelf_size, not_visible_bounds_size + std::abs(scroll_delta));
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Tests that after the shelf is completely visible, the shelf starts
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // resisting the drag.
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        EXPECT_LT(shelf_size, not_visible_bounds_size + std::abs(scroll_delta));
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect not_visible_bounds_;
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect visible_bounds_;
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Vector2dF scroll_;
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool was_visible_on_drag_start_;
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ShelfDragCallback);
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
233b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class ShelfLayoutObserverTest : public ShelfLayoutManagerObserver {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShelfLayoutObserverTest()
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : changed_auto_hide_state_(false) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ShelfLayoutObserverTest() {}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool changed_auto_hide_state() const { return changed_auto_hide_state_; }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnAutoHideStateChanged(
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShelfAutoHideState new_state) OVERRIDE {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    changed_auto_hide_state_ = true;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool changed_auto_hide_state_;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ShelfLayoutObserverTest);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Trivial item implementation that tracks its views for testing.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestItem : public SystemTrayItem {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestItem()
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : SystemTrayItem(GetSystemTray()),
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        tray_view_(NULL),
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default_view_(NULL),
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        detailed_view_(NULL),
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        notification_view_(NULL) {}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tray_view_ = new views::View;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add a label so it has non-zero width.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tray_view_->SetLayoutManager(new views::FillLayout);
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    tray_view_->AddChildView(new views::Label(base::UTF8ToUTF16("Tray")));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return tray_view_;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_view_ = new views::View;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_view_->SetLayoutManager(new views::FillLayout);
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    default_view_->AddChildView(new views::Label(base::UTF8ToUTF16("Default")));
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return default_view_;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual views::View* CreateDetailedView(user::LoginStatus status) OVERRIDE {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    detailed_view_ = new views::View;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    detailed_view_->SetLayoutManager(new views::FillLayout);
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    detailed_view_->AddChildView(
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new views::Label(base::UTF8ToUTF16("Detailed")));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return detailed_view_;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual views::View* CreateNotificationView(
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user::LoginStatus status) OVERRIDE {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_view_ = new views::View;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return notification_view_;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DestroyTrayView() OVERRIDE {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tray_view_ = NULL;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DestroyDefaultView() OVERRIDE {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_view_ = NULL;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DestroyDetailedView() OVERRIDE {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    detailed_view_ = NULL;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DestroyNotificationView() OVERRIDE {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_view_ = NULL;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateAfterLoginStatusChange(
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user::LoginStatus status) OVERRIDE {}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* tray_view() const { return tray_view_; }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* default_view() const { return default_view_; }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* detailed_view() const { return detailed_view_; }
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* notification_view() const { return notification_view_; }
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* tray_view_;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* default_view_;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* detailed_view_;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* notification_view_;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestItem);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShelfLayoutManagerTest : public ash::test::AshTestBase {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShelfLayoutManagerTest() {}
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetState(ShelfLayoutManager* shelf,
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                ShelfVisibilityState state) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shelf->SetState(state);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateAutoHideStateNow() {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetShelfLayoutManager()->UpdateAutoHideStateNow();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* CreateTestWindow() {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* window = new aura::Window(NULL);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window->SetType(ui::wm::WINDOW_TYPE_NORMAL);
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window->Init(aura::WINDOW_LAYER_TEXTURED);
3461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ParentWindowInPrimaryRootWindow(window);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return window;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* CreateTestWidgetWithParams(
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const views::Widget::InitParams& params) {
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Widget* out = new views::Widget;
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    out->Init(params);
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    out->Show();
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return out;
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a simple widget attached to the current context (will
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // delete on TearDown).
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* CreateTestWidget() {
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params.bounds = gfx::Rect(0, 0, 200, 200);
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params.context = CurrentContext();
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return CreateTestWidgetWithParams(params);
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from AshTestBase:
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CommandLine::ForCurrentProcess()->AppendSwitch(
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ash::switches::kAshEnableTrayDragging);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test::AshTestBase::SetUp();
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
37490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void RunGestureDragTests(gfx::Vector2d);
37590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ShelfLayoutManagerTest);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ShelfLayoutManagerTest::RunGestureDragTests(gfx::Vector2d delta) {
38190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
38290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
38390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Widget* widget = new views::Widget;
38490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
38590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
38690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.context = CurrentContext();
38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  widget->Init(params);
38890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  widget->Show();
38990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  widget->Maximize();
39090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
39146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const base::TimeDelta kTimeDelta = base::TimeDelta::FromMilliseconds(40);
39246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
39390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  aura::Window* window = widget->GetNativeWindow();
39490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  shelf->LayoutShelf();
39590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
39690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect shelf_shown = GetShelfWidget()->GetWindowBoundsInScreen();
39790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect bounds_shelf = window->bounds();
39890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
39990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
40090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
40190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  shelf->LayoutShelf();
40290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
40390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
40490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect bounds_noshelf = window->bounds();
40590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect shelf_hidden = GetShelfWidget()->GetWindowBoundsInScreen();
40690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
40790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
40890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  shelf->LayoutShelf();
40990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
41090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
41158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const int kNumScrollSteps = 4;
41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ShelfDragCallback handler(shelf_hidden, shelf_shown);
41390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Swipe up on the shelf. This should not change any state.
41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Point start = GetShelfWidget()->GetWindowBoundsInScreen().CenterPoint();
41690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Point end = start + delta;
41790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Swipe down on the shelf to hide it.
41946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  generator.GestureScrollSequenceWithCallback(
42046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      start,
42146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      end,
42246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kTimeDelta,
42346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kNumScrollSteps,
42490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&ShelfDragCallback::ProcessScroll,
42590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 base::Unretained(&handler)));
42690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
42790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
42890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS, shelf->auto_hide_behavior());
42990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_NE(bounds_shelf.ToString(), window->bounds().ToString());
43090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_NE(shelf_shown.ToString(),
43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().ToString());
43290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
43390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Swipe up to show the shelf.
43446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  generator.GestureScrollSequenceWithCallback(
43546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      end,
43646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      start,
43746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kTimeDelta,
43846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kNumScrollSteps,
43990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&ShelfDragCallback::ProcessScroll,
44090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 base::Unretained(&handler)));
44190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
44290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_NEVER, shelf->auto_hide_behavior());
44390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(bounds_shelf.ToString(), window->bounds().ToString());
44490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(GetShelfWidget()->GetDimmerBoundsForTest(),
44590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen());
44690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(shelf_shown.ToString(),
44790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().ToString());
44890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
44990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Swipe up again. The shelf should hide.
45090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  end = start - delta;
45146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  generator.GestureScrollSequenceWithCallback(
45246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      start,
45346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      end,
45446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kTimeDelta,
45546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kNumScrollSteps,
45690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&ShelfDragCallback::ProcessScroll,
45790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 base::Unretained(&handler)));
45890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
45990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
46090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS, shelf->auto_hide_behavior());
46190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(shelf_hidden.ToString(),
46290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().ToString());
46390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
46490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Swipe up yet again to show it.
46590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  end = start + delta;
46646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  generator.GestureScrollSequenceWithCallback(
46746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      end,
46846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      start,
46946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kTimeDelta,
47046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kNumScrollSteps,
47190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&ShelfDragCallback::ProcessScroll,
47290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 base::Unretained(&handler)));
47390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
47490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Swipe down very little. It shouldn't change any state.
47590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (GetShelfLayoutManager()->IsHorizontalAlignment())
47690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    end.set_y(start.y() + shelf_shown.height() * 3 / 10);
47790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else if (SHELF_ALIGNMENT_LEFT == GetShelfLayoutManager()->GetAlignment())
47890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    end.set_x(start.x() - shelf_shown.width() * 3 / 10);
47990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else if (SHELF_ALIGNMENT_RIGHT == GetShelfLayoutManager()->GetAlignment())
48090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    end.set_x(start.x() + shelf_shown.width() * 3 / 10);
48146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  generator.GestureScrollSequence(start, end, kTimeDelta, 5);
48290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
48390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_NEVER, shelf->auto_hide_behavior());
48490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(bounds_shelf.ToString(), window->bounds().ToString());
48590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(shelf_shown.ToString(),
48690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().ToString());
48790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
48890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Swipe down again to hide.
48990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  end = start + delta;
49046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  generator.GestureScrollSequenceWithCallback(
49146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      start,
49246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      end,
49346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kTimeDelta,
49446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kNumScrollSteps,
49590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&ShelfDragCallback::ProcessScroll,
49690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 base::Unretained(&handler)));
49790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
49890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
49990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS, shelf->auto_hide_behavior());
50090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(GetShelfWidget()->GetDimmerBoundsForTest(), gfx::Rect());
50190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(bounds_noshelf.ToString(), window->bounds().ToString());
50290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(shelf_hidden.ToString(),
50390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().ToString());
50490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
50590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Swipe up in extended hit region to show it.
50690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Point extended_start = start;
50790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (GetShelfLayoutManager()->IsHorizontalAlignment())
50890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    extended_start.set_y(GetShelfWidget()->GetWindowBoundsInScreen().y() -1);
50990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else if (SHELF_ALIGNMENT_LEFT == GetShelfLayoutManager()->GetAlignment())
51090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    extended_start.set_x(
51190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        GetShelfWidget()->GetWindowBoundsInScreen().right() + 1);
51290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else if (SHELF_ALIGNMENT_RIGHT == GetShelfLayoutManager()->GetAlignment())
51390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    extended_start.set_x(GetShelfWidget()->GetWindowBoundsInScreen().x() - 1);
51490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  end = extended_start - delta;
51546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  generator.GestureScrollSequenceWithCallback(
51646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extended_start,
51746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      end,
51846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kTimeDelta,
51946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kNumScrollSteps,
52090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&ShelfDragCallback::ProcessScroll,
52190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 base::Unretained(&handler)));
52290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
52390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_NEVER, shelf->auto_hide_behavior());
52490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(bounds_shelf.ToString(), window->bounds().ToString());
52590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(GetShelfWidget()->GetDimmerBoundsForTest(),
52690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen());
52790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(shelf_shown.ToString(),
52890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().ToString());
52990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
53090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Swipe down again to hide.
53190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  end = start + delta;
53246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  generator.GestureScrollSequenceWithCallback(
53346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      start,
53446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      end,
53546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kTimeDelta,
53646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kNumScrollSteps,
53790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&ShelfDragCallback::ProcessScroll,
53890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 base::Unretained(&handler)));
53990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
54090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
54190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS, shelf->auto_hide_behavior());
54290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(GetShelfWidget()->GetDimmerBoundsForTest(), gfx::Rect());
54390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(bounds_noshelf.ToString(), window->bounds().ToString());
54490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(shelf_hidden.ToString(),
54590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().ToString());
54690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
54790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Swipe up outside the hit area. This should not change anything.
54890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Point outside_start = gfx::Point(
54990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      (GetShelfWidget()->GetWindowBoundsInScreen().x() +
55090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)       GetShelfWidget()->GetWindowBoundsInScreen().right())/2,
55190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetShelfWidget()->GetWindowBoundsInScreen().y() - 50);
552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  end = outside_start + delta;
55346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  generator.GestureScrollSequence(
55446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      outside_start, end, kTimeDelta, kNumScrollSteps);
55590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
55690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
55790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS, shelf->auto_hide_behavior());
55890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(shelf_hidden.ToString(),
55990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().ToString());
56090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Swipe up from below the shelf where a bezel would be, this should show the
562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // shelf.
563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Point below_start = start;
564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (GetShelfLayoutManager()->IsHorizontalAlignment())
565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    below_start.set_y(GetShelfWidget()->GetWindowBoundsInScreen().bottom() + 1);
566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  else if (SHELF_ALIGNMENT_LEFT == GetShelfLayoutManager()->GetAlignment())
567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    below_start.set_x(
568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        GetShelfWidget()->GetWindowBoundsInScreen().x() - 1);
569868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  else if (SHELF_ALIGNMENT_RIGHT == GetShelfLayoutManager()->GetAlignment())
570868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    below_start.set_x(GetShelfWidget()->GetWindowBoundsInScreen().right() + 1);
571868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  end = below_start - delta;
57246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  generator.GestureScrollSequence(
57346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      below_start, end, kTimeDelta, kNumScrollSteps);
574868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
575868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_NEVER, shelf->auto_hide_behavior());
576868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(bounds_shelf.ToString(), window->bounds().ToString());
577868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GetShelfWidget()->GetDimmerBoundsForTest(),
578868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen());
579868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(shelf_shown.ToString(),
580868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().ToString());
581868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
582868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Swipe down again to hide.
583868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  end = start + delta;
58446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  generator.GestureScrollSequenceWithCallback(
58546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      start,
58646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      end,
58746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kTimeDelta,
58846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kNumScrollSteps,
589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::Bind(&ShelfDragCallback::ProcessScroll,
590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(&handler)));
591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
593868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS, shelf->auto_hide_behavior());
594868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GetShelfWidget()->GetDimmerBoundsForTest(), gfx::Rect());
595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(bounds_noshelf.ToString(), window->bounds().ToString());
596868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(shelf_hidden.ToString(),
597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().ToString());
598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Put |widget| into fullscreen. Set the shelf to be auto hidden when |widget|
6001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // is fullscreen. (eg browser immersive fullscreen).
60190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  widget->SetFullscreen(true);
6021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  wm::GetWindowState(window)->set_hide_shelf_when_fullscreen(false);
6037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  shelf->UpdateVisibilityState();
6047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
60590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect bounds_fullscreen = window->bounds();
60690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(widget->IsFullscreen());
60790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_NE(bounds_noshelf.ToString(), bounds_fullscreen.ToString());
6087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Swipe up. This should show the shelf.
6107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  end = below_start - delta;
61146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  generator.GestureScrollSequenceWithCallback(
61246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      below_start,
61346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      end,
61446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kTimeDelta,
61546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kNumScrollSteps,
6167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&ShelfDragCallback::ProcessScroll,
6177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 base::Unretained(&handler)));
6187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
6197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
6207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_NEVER, shelf->auto_hide_behavior());
6217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(shelf_shown.ToString(),
6227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().ToString());
6237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(bounds_fullscreen.ToString(), window->bounds().ToString());
6247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Swipe up again. This should hide the shelf.
62646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  generator.GestureScrollSequenceWithCallback(
62746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      below_start,
62846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      end,
62946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kTimeDelta,
63046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kNumScrollSteps,
6317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&ShelfDragCallback::ProcessScroll,
6327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 base::Unretained(&handler)));
6337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
6347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
6357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS, shelf->auto_hide_behavior());
6367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(shelf_hidden.ToString(),
6377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().ToString());
6387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(bounds_fullscreen.ToString(), window->bounds().ToString());
6397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Set the shelf to be hidden when |widget| is fullscreen. (eg tab fullscreen
6411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // with or without immersive browser fullscreen).
6421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  wm::GetWindowState(window)->set_hide_shelf_when_fullscreen(true);
6437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  shelf->UpdateVisibilityState();
64490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_HIDDEN, shelf->visibility_state());
645868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS, shelf->auto_hide_behavior());
64690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
64790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Swipe-up. This should not change anything.
648868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  end = start - delta;
64946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  generator.GestureScrollSequenceWithCallback(
65046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      below_start,
65146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      end,
65246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kTimeDelta,
65346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kNumScrollSteps,
65490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&ShelfDragCallback::ProcessScroll,
65590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 base::Unretained(&handler)));
65690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_HIDDEN, shelf->visibility_state());
65790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS, shelf->auto_hide_behavior());
65890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(bounds_fullscreen.ToString(), window->bounds().ToString());
65990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
660a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Close actually, otherwise further event may be affected since widget
661a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // is fullscreen status.
66290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  widget->Close();
663a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  RunAllPendingInMessageLoop();
664ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
665ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // The shelf should be shown because there are no more visible windows.
666ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
667ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
668ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS, shelf->auto_hide_behavior());
669ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
670ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Swipe-up to hide. This should have no effect because there are no visible
671ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // windows.
672ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  end = below_start - delta;
67346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  generator.GestureScrollSequenceWithCallback(
67446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      below_start,
67546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      end,
67646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kTimeDelta,
67746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kNumScrollSteps,
678ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&ShelfDragCallback::ProcessScroll,
679ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 base::Unretained(&handler)));
680ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
681ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
682ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS, shelf->auto_hide_behavior());
68390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
68490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
685d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Need to be implemented.  http://crbug.com/111279.
686d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_WIN)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_SetVisible DISABLED_SetVisible
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_SetVisible SetVisible
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure SetVisible updates work area and widget appropriately.
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, MAYBE_SetVisible) {
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShelfWidget* shelf = GetShelfWidget();
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShelfLayoutManager* manager = shelf->shelf_layout_manager();
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force an initial layout.
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->LayoutShelf();
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, manager->visibility_state());
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect status_bounds(
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shelf->status_area_widget()->GetWindowBoundsInScreen());
7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect shelf_bounds(
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shelf->GetWindowBoundsInScreen());
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int shelf_height = manager->GetIdealBounds().height();
7047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Screen* screen = Shell::GetScreen();
7057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Display display = screen->GetDisplayNearestWindow(
7067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      Shell::GetPrimaryRootWindow());
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(-1, display.id());
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bottom inset should be the max of widget heights.
7097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(shelf_height, display.GetWorkAreaInsets().bottom());
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Hide the shelf.
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetState(manager, SHELF_HIDDEN);
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the animation to completion.
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StepWidgetLayerAnimatorToEnd(shelf);
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StepWidgetLayerAnimatorToEnd(shelf->status_area_widget());
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_HIDDEN, manager->visibility_state());
7177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  display = screen->GetDisplayNearestWindow(
7187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      Shell::GetPrimaryRootWindow());
7197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(0, display.GetWorkAreaInsets().bottom());
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the bounds of the two widgets changed.
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GE(shelf->GetNativeView()->bounds().y(),
7247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            screen->GetPrimaryDisplay().bounds().bottom());
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(shelf->status_area_widget()->GetNativeView()->bounds().y(),
7267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            screen->GetPrimaryDisplay().bounds().bottom());
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And show it again.
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetState(manager, SHELF_VISIBLE);
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the animation to completion.
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StepWidgetLayerAnimatorToEnd(shelf);
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StepWidgetLayerAnimatorToEnd(shelf->status_area_widget());
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, manager->visibility_state());
7347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  display = screen->GetDisplayNearestWindow(
7357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      Shell::GetPrimaryRootWindow());
7367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(shelf_height, display.GetWorkAreaInsets().bottom());
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the bounds of the two widgets changed.
7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  shelf_bounds = shelf->GetNativeView()->bounds();
7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_LT(shelf_bounds.y(), screen->GetPrimaryDisplay().bounds().bottom());
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status_bounds = shelf->status_area_widget()->GetNativeView()->bounds();
74258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_LT(status_bounds.y(),
74358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            screen->GetPrimaryDisplay().bounds().bottom());
74458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
74558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
74658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Makes sure shelf alignment is correct for lock screen.
74758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ShelfLayoutManagerTest, SideAlignmentInteractionWithLockScreen) {
74858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShelfLayoutManager* manager = GetShelfWidget()->shelf_layout_manager();
74958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  manager->SetAlignment(SHELF_ALIGNMENT_LEFT);
75058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(SHELF_ALIGNMENT_LEFT, manager->GetAlignment());
75158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Shell::GetInstance()->session_state_delegate()->LockScreen();
75258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(SHELF_ALIGNMENT_BOTTOM, manager->GetAlignment());
75358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Shell::GetInstance()->session_state_delegate()->UnlockScreen();
75458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(SHELF_ALIGNMENT_LEFT, manager->GetAlignment());
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure LayoutShelf invoked while animating cleans things up.
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, LayoutShelfWhileAnimating) {
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShelfWidget* shelf = GetShelfWidget();
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force an initial layout.
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf->shelf_layout_manager()->LayoutShelf();
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->shelf_layout_manager()->visibility_state());
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Hide the shelf.
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetState(shelf->shelf_layout_manager(), SHELF_HIDDEN);
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf->shelf_layout_manager()->LayoutShelf();
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_HIDDEN, shelf->shelf_layout_manager()->visibility_state());
7687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Display display = Shell::GetScreen()->GetDisplayNearestWindow(
7697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      Shell::GetPrimaryRootWindow());
7707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(0, display.GetWorkAreaInsets().bottom());
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the bounds of the two widgets changed.
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GE(shelf->GetNativeView()->bounds().y(),
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetPrimaryDisplay().bounds().bottom());
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(shelf->status_area_widget()->GetNativeView()->bounds().y(),
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetPrimaryDisplay().bounds().bottom());
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
779eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Test that switching to a different visibility state does not restart the
780eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// shelf show / hide animation if it is already running. (crbug.com/250918)
781eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ShelfLayoutManagerTest, SetStateWhileAnimating) {
782eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ShelfWidget* shelf = GetShelfWidget();
783eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SetState(shelf->shelf_layout_manager(), SHELF_VISIBLE);
784eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect initial_shelf_bounds = shelf->GetWindowBoundsInScreen();
785eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect initial_status_bounds =
786eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      shelf->status_area_widget()->GetWindowBoundsInScreen();
787eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
788eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ui::ScopedAnimationDurationScaleMode normal_animation_duration(
789eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ui::ScopedAnimationDurationScaleMode::SLOW_DURATION);
790eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SetState(shelf->shelf_layout_manager(), SHELF_HIDDEN);
791eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SetState(shelf->shelf_layout_manager(), SHELF_VISIBLE);
792eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
793eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect current_shelf_bounds = shelf->GetWindowBoundsInScreen();
794eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect current_status_bounds =
795eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      shelf->status_area_widget()->GetWindowBoundsInScreen();
796eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
797eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const int small_change = initial_shelf_bounds.height() / 2;
798eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_LE(
799eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      std::abs(initial_shelf_bounds.height() - current_shelf_bounds.height()),
800eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      small_change);
801eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_LE(
802eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      std::abs(initial_status_bounds.height() - current_status_bounds.height()),
803eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      small_change);
804eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
805eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Makes sure the shelf is sized when the status area changes size.
8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, ShelfUpdatedWhenStatusAreaChangesSize) {
8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Shelf* shelf = Shelf::ForPrimaryDisplay();
8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(shelf);
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShelfWidget* shelf_widget = GetShelfWidget();
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(shelf_widget);
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(shelf_widget->status_area_widget());
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf_widget->status_area_widget()->SetBounds(
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Rect(0, 0, 200, 200));
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(200, shelf_widget->GetContentsView()->width() -
8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            test::ShelfTestAPI(shelf).shelf_view()->width());
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AutoHide DISABLED_AutoHide
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AutoHide AutoHide
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Various assertions around auto-hide.
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ShelfLayoutManagerTest, MAYBE_AutoHide) {
8291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventGenerator generator(root, root);
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseTo(0, 0);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* widget = new views::Widget;
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.context = CurrentContext();
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Widget is now owned by the parent window.
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Init(params);
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Maximize();
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Show();
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LayoutShelf() forces the animation to completion, at which point the
8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // shelf should go off the screen.
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->LayoutShelf();
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root->bounds().bottom() - ShelfLayoutManager::kAutoHideSize,
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().y());
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root->bounds().bottom() - ShelfLayoutManager::kAutoHideSize,
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestWindow(
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                root).work_area().bottom());
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move the mouse to the bottom of the screen.
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseTo(0, root->bounds().bottom() - 1);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shelf should be shown again (but it shouldn't have changed the work area).
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetState(shelf, SHELF_AUTO_HIDE);
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->LayoutShelf();
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root->bounds().bottom() - shelf->GetIdealBounds().height(),
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().y());
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root->bounds().bottom() - ShelfLayoutManager::kAutoHideSize,
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestWindow(
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                root).work_area().bottom());
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move mouse back up.
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseTo(0, 0);
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetState(shelf, SHELF_AUTO_HIDE);
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->LayoutShelf();
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root->bounds().bottom() - ShelfLayoutManager::kAutoHideSize,
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().y());
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag mouse to bottom of screen.
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.PressLeftButton();
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseTo(0, root->bounds().bottom() - 1);
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateAutoHideStateNow();
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.ReleaseLeftButton();
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseTo(1, root->bounds().bottom() - 1);
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateAutoHideStateNow();
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.PressLeftButton();
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseTo(1, root->bounds().bottom() - 1);
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateAutoHideStateNow();
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
892bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Test the behavior of the shelf when it is auto hidden and it is on the
893bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// boundary between the primary and the secondary display.
894bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochTEST_F(ShelfLayoutManagerTest, AutoHideShelfOnScreenBoundary) {
895bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  if (!SupportsMultipleDisplays())
896bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    return;
897bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
898bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  UpdateDisplay("800x600,800x600");
899bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  DisplayLayout display_layout(DisplayLayout::RIGHT, 0);
9008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays(
901bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      display_layout);
902bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Put the primary monitor's shelf on the display boundary.
903bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  ShelfLayoutManager* shelf = GetShelfLayoutManager();
904bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  shelf->SetAlignment(SHELF_ALIGNMENT_RIGHT);
905bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
906bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Create a window because the shelf is always shown when no windows are
907bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // visible.
908bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  CreateTestWidget();
909bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
910f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
911bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  ASSERT_EQ(root_windows[0],
912bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch            GetShelfWidget()->GetNativeWindow()->GetRootWindow());
913bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
914bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  shelf->SetAutoHideBehavior(ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
915bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
916bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
917bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  int right_edge = root_windows[0]->GetBoundsInScreen().right() - 1;
918bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  int y = root_windows[0]->GetBoundsInScreen().y();
919bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
920bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Start off the mouse nowhere near the shelf; the shelf should be hidden.
921bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  aura::test::EventGenerator& generator(GetEventGenerator());
922bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  generator.MoveMouseTo(right_edge - 50, y);
923bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  UpdateAutoHideStateNow();
924bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
925bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
926bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Moving the mouse over the light bar (but not to the edge of the screen)
927bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // should show the shelf.
928bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  generator.MoveMouseTo(right_edge - 1, y);
929bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  UpdateAutoHideStateNow();
930bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
931bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(right_edge - 1, Shell::GetScreen()->GetCursorScreenPoint().x());
932bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
933bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Moving the mouse off the light bar should hide the shelf.
934bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  generator.MoveMouseTo(right_edge - 50, y);
935bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  UpdateAutoHideStateNow();
936bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
937bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
938bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Moving the mouse to the right edge of the screen crossing the light bar
939bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // should show the shelf despite the mouse cursor getting warped to the
940bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // secondary display.
941bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  generator.MoveMouseTo(right_edge - 1, y);
942bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  generator.MoveMouseTo(right_edge, y);
943bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  UpdateAutoHideStateNow();
944bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_NE(right_edge - 1, Shell::GetScreen()->GetCursorScreenPoint().x());
945bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
946bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
947bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Hide the shelf.
948bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  generator.MoveMouseTo(right_edge - 50, y);
949bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  UpdateAutoHideStateNow();
950bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
951bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
952bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Moving the mouse to the right edge of the screen crossing the light bar and
953bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // overshooting by a lot should keep the shelf hidden.
954bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  generator.MoveMouseTo(right_edge - 1, y);
955bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  generator.MoveMouseTo(right_edge + 50, y);
956bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  UpdateAutoHideStateNow();
957bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
958bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
959bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Moving the mouse to the right edge of the screen crossing the light bar and
960bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // overshooting a bit should show the shelf.
961bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  generator.MoveMouseTo(right_edge - 1, y);
962bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  generator.MoveMouseTo(right_edge + 2, y);
963bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  UpdateAutoHideStateNow();
964bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
965bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
966bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Keeping the mouse close to the left edge of the secondary display after the
967bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // shelf is shown should keep the shelf shown.
968bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  generator.MoveMouseTo(right_edge + 2, y + 1);
969bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  UpdateAutoHideStateNow();
970bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
971bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
972bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Moving the mouse far from the left edge of the secondary display should
973bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // hide the shelf.
974bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  generator.MoveMouseTo(right_edge + 50, y);
975bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  UpdateAutoHideStateNow();
976bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
977bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
978bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Moving to the left edge of the secondary display without first crossing
979bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // the primary display's right aligned shelf first should not show the shelf.
980bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  generator.MoveMouseTo(right_edge + 2, y);
981bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  UpdateAutoHideStateNow();
982bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
983bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
984bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around the lock screen showing.
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, VisibleWhenLockScreenShowing) {
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since ShelfLayoutManager queries for mouse location, move the mouse so
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it isn't over the shelf.
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventGenerator generator(
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Point());
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseTo(0, 0);
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* widget = new views::Widget;
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.context = CurrentContext();
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Widget is now owned by the parent window.
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Init(params);
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Maximize();
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Show();
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = Shell::GetPrimaryRootWindow();
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LayoutShelf() forces the animation to completion, at which point the
10085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // shelf should go off the screen.
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->LayoutShelf();
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(root->bounds().bottom() - ShelfLayoutManager::kAutoHideSize,
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetShelfWidget()->GetWindowBoundsInScreen().y());
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* lock_container = Shell::GetContainer(
1014c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      Shell::GetPrimaryRootWindow(), kShellWindowId_LockScreenContainer);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* lock_widget = new views::Widget;
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget::InitParams lock_params(
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      views::Widget::InitParams::TYPE_WINDOW);
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  lock_params.bounds = gfx::Rect(0, 0, 200, 200);
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.context = CurrentContext();
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  lock_params.parent = lock_container;
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Widget is now owned by the parent window.
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  lock_widget->Init(lock_params);
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  lock_widget->Maximize();
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  lock_widget->Show();
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock the screen.
1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Shell::GetInstance()->session_state_delegate()->LockScreen();
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->UpdateVisibilityState();
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Showing a widget in the lock screen should force the shelf to be visibile.
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Shell::GetInstance()->session_state_delegate()->UnlockScreen();
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->UpdateVisibilityState();
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around SetAutoHideBehavior.
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, SetAutoHideBehavior) {
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since ShelfLayoutManager queries for mouse location, move the mouse so
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it isn't over the shelf.
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventGenerator generator(
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Point());
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseTo(0, 0);
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* widget = new views::Widget;
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.context = CurrentContext();
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Widget is now owned by the parent window.
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Init(params);
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Show();
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* window = widget->GetNativeWindow();
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect display_bounds(
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetScreen()->GetDisplayNearestWindow(window).bounds());
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Maximize();
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Shell::GetScreen()->GetDisplayNearestWindow(
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                window).work_area().bottom(),
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            widget->GetWorkAreaBoundsInScreen().bottom());
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Shell::GetScreen()->GetDisplayNearestWindow(
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                window).work_area().bottom(),
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            widget->GetWorkAreaBoundsInScreen().bottom());
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Shell::GetScreen()->GetDisplayNearestWindow(
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                window).work_area().bottom(),
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            widget->GetWorkAreaBoundsInScreen().bottom());
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Basic assertions around the dimming of the shelf.
1084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ShelfLayoutManagerTest, TestDimmingBehavior) {
1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Since ShelfLayoutManager queries for mouse location, move the mouse so
1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // it isn't over the shelf.
1087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::test::EventGenerator generator(
1088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Point());
1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseTo(0, 0);
1090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
1092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shelf->shelf_widget()->DisableDimmingAnimationsForTest();
1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  views::Widget* widget = new views::Widget;
1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
1097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  params.context = CurrentContext();
1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Widget is now owned by the parent window.
1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  widget->Init(params);
1100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  widget->Show();
1101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Window* window = widget->GetNativeWindow();
1102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect display_bounds(
1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Shell::GetScreen()->GetDisplayNearestWindow(window).bounds());
1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Point off_shelf = display_bounds.CenterPoint();
1106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Point on_shelf =
1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      shelf->shelf_widget()->GetWindowBoundsInScreen().CenterPoint();
1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Test there is no dimming object active at this point.
1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseTo(on_shelf.x(), on_shelf.y());
1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(-1, shelf->shelf_widget()->GetDimmingAlphaForTest());
1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseTo(off_shelf.x(), off_shelf.y());
1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(-1, shelf->shelf_widget()->GetDimmingAlphaForTest());
1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // After maximization, the shelf should be visible and the dimmer created.
1116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  widget->Maximize();
1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  on_shelf = shelf->shelf_widget()->GetWindowBoundsInScreen().CenterPoint();
1119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LT(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Moving the mouse off the shelf should dim the bar.
1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseTo(off_shelf.x(), off_shelf.y());
1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LT(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Adding touch events outside the shelf should still keep the shelf in
1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // dimmed state.
1127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.PressTouch();
1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveTouch(off_shelf);
1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LT(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Move the touch into the shelf area should undim.
1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveTouch(on_shelf);
1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.ReleaseTouch();
1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // And a release dims again.
1135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LT(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Moving the mouse on the shelf should undim the bar.
1138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseTo(on_shelf);
1139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // No matter what the touch events do, the shelf should stay undimmed.
1142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.PressTouch();
1143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveTouch(off_shelf);
1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveTouch(on_shelf);
1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveTouch(off_shelf);
1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveTouch(on_shelf);
1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.ReleaseTouch();
1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // After restore, the dimming object should be deleted again.
1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  widget->Restore();
1154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(-1, shelf->shelf_widget()->GetDimmingAlphaForTest());
1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Assertions around the dimming of the shelf in conjunction with menus.
1158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ShelfLayoutManagerTest, TestDimmingBehaviorWithMenus) {
1159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Since ShelfLayoutManager queries for mouse location, move the mouse so
1160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // it isn't over the shelf.
1161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::test::EventGenerator generator(
1162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Point());
1163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseTo(0, 0);
1164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shelf->shelf_widget()->DisableDimmingAnimationsForTest();
1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  views::Widget* widget = new views::Widget;
1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  params.context = CurrentContext();
1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Widget is now owned by the parent window.
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  widget->Init(params);
1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  widget->Show();
1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Window* window = widget->GetNativeWindow();
1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect display_bounds(
1177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Shell::GetScreen()->GetDisplayNearestWindow(window).bounds());
1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // After maximization, the shelf should be visible and the dimmer created.
1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  widget->Maximize();
1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Point off_shelf = display_bounds.CenterPoint();
1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Point on_shelf =
1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      shelf->shelf_widget()->GetWindowBoundsInScreen().CenterPoint();
1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Moving the mouse on the shelf should undim the bar.
1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseTo(on_shelf.x(), on_shelf.y());
1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Simulate a menu opening.
1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shelf->shelf_widget()->ForceUndimming(true);
1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Moving the mouse off the shelf should not dim the bar.
1194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseTo(off_shelf.x(), off_shelf.y());
1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // No matter what the touch events do, the shelf should stay undimmed.
1198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.PressTouch();
1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveTouch(off_shelf);
1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveTouch(on_shelf);
1202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveTouch(off_shelf);
1204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.ReleaseTouch();
1206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // "Closing the menu" should now turn off the menu since no event is inside
1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the shelf any longer.
1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shelf->shelf_widget()->ForceUndimming(false);
1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LT(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Moving the mouse again on the shelf which should undim the bar again.
1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This time we check that the bar stays undimmed when the mouse remains on
1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the bar and the "menu gets closed".
1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseTo(on_shelf.x(), on_shelf.y());
1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shelf->shelf_widget()->ForceUndimming(true);
1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseTo(off_shelf.x(), off_shelf.y());
1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseTo(on_shelf.x(), on_shelf.y());
1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shelf->shelf_widget()->ForceUndimming(true);
1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, shelf->shelf_widget()->GetDimmingAlphaForTest());
1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies the shelf is visible when status/shelf is focused.
12285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, VisibleWhenStatusOrShelfFocused) {
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since ShelfLayoutManager queries for mouse location, move the mouse so
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it isn't over the shelf.
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventGenerator generator(
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetPrimaryRootWindow(), gfx::Point());
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseTo(0, 0);
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* widget = new views::Widget;
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.context = CurrentContext();
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Widget is now owned by the parent window.
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Init(params);
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Show();
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Focus the shelf. Have to go through the focus cycler as normal focus
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // requests to it do nothing.
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetShelfWidget()->GetFocusCycler()->RotateFocus(FocusCycler::FORWARD);
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Activate();
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Trying to activate the status should fail, since we only allow activating
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it when the user is using the keyboard (i.e. through FocusCycler).
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetShelfWidget()->status_area_widget()->Activate();
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetShelfWidget()->GetFocusCycler()->RotateFocus(FocusCycler::FORWARD);
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Makes sure shelf will be visible when app list opens as shelf is in
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// SHELF_VISIBLE state,and toggling app list won't change shelf
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// visibility state.
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, OpenAppListWithShelfVisibleState) {
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* shell = Shell::GetInstance();
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->LayoutShelf();
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a normal unmaximized windowm shelf should be visible.
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* window = CreateTestWindow();
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetBounds(gfx::Rect(0, 0, 100, 100));
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->Show();
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(shell->GetAppListTargetVisibility());
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Toggle app list to show, and the shelf stays visible.
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shell->ToggleAppList(NULL);
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(shell->GetAppListTargetVisibility());
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Toggle app list to hide, and the shelf stays visible.
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shell->ToggleAppList(NULL);
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(shell->GetAppListTargetVisibility());
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Makes sure shelf will be shown with SHELF_AUTO_HIDE_SHOWN state
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// when app list opens as shelf is in SHELF_AUTO_HIDE state, and
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// toggling app list won't change shelf visibility state.
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, OpenAppListWithShelfAutoHideState) {
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* shell = Shell::GetInstance();
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->LayoutShelf();
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a window and show it in maximized state.
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* window = CreateTestWindow();
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetBounds(gfx::Rect(0, 0, 100, 100));
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED);
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->Show();
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(window);
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(shell->GetAppListTargetVisibility());
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Toggle app list to show.
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shell->ToggleAppList(NULL);
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The shelf's auto hide state won't be changed until the timer fires, so
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // calling shell->UpdateShelfVisibility() is kind of manually helping it to
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // update the state.
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shell->UpdateShelfVisibility();
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(shell->GetAppListTargetVisibility());
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Toggle app list to hide.
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shell->ToggleAppList(NULL);
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(shell->GetAppListTargetVisibility());
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure shelf will be hidden when app list opens as shelf is in HIDDEN
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// state, and toggling app list won't change shelf visibility state.
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, OpenAppListWithShelfHiddenState) {
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* shell = Shell::GetInstance();
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For shelf to be visible, app list is not open in initial state.
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->LayoutShelf();
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a window and make it full screen.
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* window = CreateTestWindow();
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetBounds(gfx::Rect(0, 0, 100, 100));
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN);
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window->Show();
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(window);
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // App list and shelf is not shown.
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(shell->GetAppListTargetVisibility());
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_HIDDEN, shelf->visibility_state());
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Toggle app list to show.
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shell->ToggleAppList(NULL);
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(shell->GetAppListTargetVisibility());
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_HIDDEN, shelf->visibility_state());
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Toggle app list to hide.
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shell->ToggleAppList(NULL);
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(shell->GetAppListTargetVisibility());
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_HIDDEN, shelf->visibility_state());
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Tests that the shelf is only hidden for a fullscreen window at the front and
1357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// toggles visibility when another window is activated.
1358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, FullscreenWindowInFrontHidesShelf) {
1359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
1360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Create a window and make it full screen.
1362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  aura::Window* window1 = CreateTestWindow();
1363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window1->SetBounds(gfx::Rect(0, 0, 100, 100));
1364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN);
1365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window1->Show();
1366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  aura::Window* window2 = CreateTestWindow();
1368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window2->SetBounds(gfx::Rect(0, 0, 100, 100));
1369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window2->Show();
1370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  wm::GetWindowState(window1)->Activate();
1372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(SHELF_HIDDEN, shelf->visibility_state());
1373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  wm::GetWindowState(window2)->Activate();
1375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
1376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  wm::GetWindowState(window1)->Activate();
1378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(SHELF_HIDDEN, shelf->visibility_state());
1379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Test the behavior of the shelf when a window on one display is fullscreen
1382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// but the other display has the active window.
1383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, FullscreenWindowOnSecondDisplay) {
1384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!SupportsMultipleDisplays())
1385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
1386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UpdateDisplay("800x600,800x600");
1388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
1389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
1390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Shell::RootWindowControllerList root_window_controllers =
1391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      Shell::GetAllRootWindowControllers();
1392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Create windows on either display.
1394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  aura::Window* window1 = CreateTestWindow();
1395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window1->SetBoundsInScreen(
1396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      gfx::Rect(0, 0, 100, 100),
1397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      display_manager->GetDisplayAt(0));
1398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN);
1399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window1->Show();
1400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  aura::Window* window2 = CreateTestWindow();
1402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window2->SetBoundsInScreen(
1403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      gfx::Rect(800, 0, 100, 100),
1404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      display_manager->GetDisplayAt(1));
1405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window2->Show();
1406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(root_windows[0], window1->GetRootWindow());
1408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(root_windows[1], window2->GetRootWindow());
1409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  wm::GetWindowState(window2)->Activate();
1411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(SHELF_HIDDEN,
1412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      root_window_controllers[0]->GetShelfLayoutManager()->visibility_state());
1413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE,
1414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      root_window_controllers[1]->GetShelfLayoutManager()->visibility_state());
1415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SetAlignment DISABLED_SetAlignment
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_SetAlignment SetAlignment
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests SHELF_ALIGNMENT_(LEFT, RIGHT, TOP).
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ShelfLayoutManagerTest, MAYBE_SetAlignment) {
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force an initial layout.
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->LayoutShelf();
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAlignment(SHELF_ALIGNMENT_LEFT);
14345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect shelf_bounds(
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetShelfWidget()->GetWindowBoundsInScreen());
14367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const gfx::Screen* screen = Shell::GetScreen();
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display display =
14387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      screen->GetDisplayNearestWindow(Shell::GetPrimaryRootWindow());
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(-1, display.id());
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(shelf->GetIdealBounds().width(),
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            display.GetWorkAreaInsets().left());
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(
14435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      shelf_bounds.width(),
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetShelfWidget()->GetContentsView()->GetPreferredSize().width());
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_ALIGNMENT_LEFT, GetSystemTray()->shelf_alignment());
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StatusAreaWidget* status_area_widget = GetShelfWidget()->status_area_widget();
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect status_bounds(status_area_widget->GetWindowBoundsInScreen());
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(status_bounds.width(),
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            status_area_widget->GetContentsView()->GetPreferredSize().width());
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(shelf->GetIdealBounds().width(),
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            display.GetWorkAreaInsets().left());
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, display.GetWorkAreaInsets().top());
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, display.GetWorkAreaInsets().bottom());
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, display.GetWorkAreaInsets().right());
14555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(display.bounds().x(), shelf_bounds.x());
14565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(display.bounds().y(), shelf_bounds.y());
14575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(display.bounds().height(), shelf_bounds.height());
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
14597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  display = screen->GetDisplayNearestWindow(Shell::GetPrimaryRootWindow());
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ShelfLayoutManager::kAutoHideSize,
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display.GetWorkAreaInsets().left());
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ShelfLayoutManager::kAutoHideSize, display.work_area().x());
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAlignment(SHELF_ALIGNMENT_RIGHT);
14667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  display = screen->GetDisplayNearestWindow(Shell::GetPrimaryRootWindow());
14675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  shelf_bounds = GetShelfWidget()->GetWindowBoundsInScreen();
14687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  display = screen->GetDisplayNearestWindow(Shell::GetPrimaryRootWindow());
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(-1, display.id());
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(shelf->GetIdealBounds().width(),
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            display.GetWorkAreaInsets().right());
14725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_GE(shelf_bounds.width(),
14735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GetShelfWidget()->GetContentsView()->GetPreferredSize().width());
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_ALIGNMENT_RIGHT, GetSystemTray()->shelf_alignment());
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status_bounds = gfx::Rect(status_area_widget->GetWindowBoundsInScreen());
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(status_bounds.width(),
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            status_area_widget->GetContentsView()->GetPreferredSize().width());
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(shelf->GetIdealBounds().width(),
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            display.GetWorkAreaInsets().right());
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, display.GetWorkAreaInsets().top());
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, display.GetWorkAreaInsets().bottom());
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, display.GetWorkAreaInsets().left());
14835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(display.work_area().right(), shelf_bounds.x());
14845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(display.bounds().y(), shelf_bounds.y());
14855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(display.bounds().height(), shelf_bounds.height());
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
14877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  display = screen->GetDisplayNearestWindow(Shell::GetPrimaryRootWindow());
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ShelfLayoutManager::kAutoHideSize,
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display.GetWorkAreaInsets().right());
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ShelfLayoutManager::kAutoHideSize,
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display.bounds().right() - display.work_area().right());
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf->SetAlignment(SHELF_ALIGNMENT_TOP);
14957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  display = screen->GetDisplayNearestWindow(Shell::GetPrimaryRootWindow());
14965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  shelf_bounds = GetShelfWidget()->GetWindowBoundsInScreen();
14977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  display = screen->GetDisplayNearestWindow(Shell::GetPrimaryRootWindow());
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NE(-1, display.id());
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(shelf->GetIdealBounds().height(),
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            display.GetWorkAreaInsets().top());
15015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_GE(shelf_bounds.height(),
15025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GetShelfWidget()->GetContentsView()->GetPreferredSize().height());
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_ALIGNMENT_TOP, GetSystemTray()->shelf_alignment());
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  status_bounds = gfx::Rect(status_area_widget->GetWindowBoundsInScreen());
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GE(status_bounds.height(),
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            status_area_widget->GetContentsView()->GetPreferredSize().height());
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(shelf->GetIdealBounds().height(),
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            display.GetWorkAreaInsets().top());
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, display.GetWorkAreaInsets().right());
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, display.GetWorkAreaInsets().bottom());
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, display.GetWorkAreaInsets().left());
15125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(display.work_area().y(), shelf_bounds.bottom());
15135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(display.bounds().x(), shelf_bounds.x());
15145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(display.bounds().width(), shelf_bounds.width());
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
15167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  display = screen->GetDisplayNearestWindow(Shell::GetPrimaryRootWindow());
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ShelfLayoutManager::kAutoHideSize,
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display.GetWorkAreaInsets().top());
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ShelfLayoutManager::kAutoHideSize,
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            display.work_area().y() - display.bounds().y());
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1523a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(ShelfLayoutManagerTest, GestureEdgeSwipe) {
15245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
15255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
15265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  views::Widget* widget = new views::Widget;
15275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
15285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
15295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  params.context = CurrentContext();
15305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  widget->Init(params);
15315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  widget->Show();
15325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  widget->Maximize();
15335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1534a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
1535a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
15365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::Window* window = widget->GetNativeWindow();
15375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  shelf->LayoutShelf();
15385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect shelf_shown = GetShelfWidget()->GetWindowBoundsInScreen();
15405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect bounds_shelf = window->bounds();
1541a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1542a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Edge swipe when SHELF_VISIBLE should not change visibility state.
1543a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
1544a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  generator.GestureEdgeSwipe();
15455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
15465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1547a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Edge swipe when AUTO_HIDE_HIDDEN should change to AUTO_HIDE_SHOWN.
15485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
15495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  shelf->LayoutShelf();
1550a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
15515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
15525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  generator.GestureEdgeSwipe();
1553a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
1554a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
15555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  widget->SetFullscreen(true);
15575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  wm::GetWindowState(window)->set_hide_shelf_when_fullscreen(false);
15585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  shelf->UpdateVisibilityState();
15595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1560a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Edge swipe in fullscreen + AUTO_HIDE_HIDDEN should show the shelf and
15615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // remain fullscreen.
15625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(widget->IsFullscreen());
15635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
15645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
15655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  generator.GestureEdgeSwipe();
15665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
15675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
15685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(widget->IsFullscreen());
15695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
15705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
15715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Test that starting the maximize mode does still allow the shelf to be made
15725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// visible when an (immersive mode) full screen app is running.
15735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(ShelfLayoutManagerTest, GestureEdgeSwipeInMaximizeMode) {
15745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ShelfLayoutManager* shelf = GetShelfLayoutManager();
15755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
15765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  views::Widget* widget = new views::Widget;
15775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
15785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  params.bounds = gfx::Rect(0, 0, 200, 200);
15795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  params.context = CurrentContext();
15805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  widget->Init(params);
15815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  widget->Show();
15825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  aura::Window* window = widget->GetNativeWindow();
15835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  wm::GetWindowState(window)->set_hide_shelf_when_fullscreen(false);
15845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  widget->SetFullscreen(true);
15855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
15865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
15875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
15885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // The maximize mode gets started.
15895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  shelf->OnMaximizeModeStarted();
15905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  shelf->LayoutShelf();
15915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  shelf->UpdateVisibilityState();
15925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
15935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Edge swipe in fullscreen + AUTO_HIDE_HIDDEN should show the shelf and
1594a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // remain fullscreen.
15955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(widget->IsFullscreen());
1596a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
15975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
15985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  generator.GestureEdgeSwipe();
1599a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
1600a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
1601a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(widget->IsFullscreen());
1602effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1603effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_GestureDrag DISABLED_GestureDrag
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_GestureDrag GestureDrag
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ShelfLayoutManagerTest, MAYBE_GestureDrag) {
16125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Slop is an implementation detail of gesture recognition, and complicates
16135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // these tests. Ignore it.
16145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::GestureConfiguration::set_max_touch_move_in_pixels_for_click(0);
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
1616a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  {
1617a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    SCOPED_TRACE("BOTTOM");
161858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    RunGestureDragTests(gfx::Vector2d(0, 120));
1619a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  }
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1621a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  {
1622a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    SCOPED_TRACE("LEFT");
1623a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    shelf->SetAlignment(SHELF_ALIGNMENT_LEFT);
162458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    RunGestureDragTests(gfx::Vector2d(-120, 0));
1625a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  }
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1627a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  {
1628a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    SCOPED_TRACE("RIGHT");
1629a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    shelf->SetAlignment(SHELF_ALIGNMENT_RIGHT);
163058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    RunGestureDragTests(gfx::Vector2d(120, 0));
1631a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  }
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ShelfLayoutManagerTest, WindowVisibilityDisablesAutoHide) {
16357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
16367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
16377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("800x600,800x600");
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf->LayoutShelf();
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a visible window so auto-hide behavior is enforced
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* dummy = CreateTestWidget();
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Window visible => auto hide behaves normally.
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shelf->UpdateVisibilityState();
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Window minimized => auto hide disabled.
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dummy->Minimize();
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Window closed => auto hide disabled.
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dummy->CloseNow();
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Multiple window test
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* window1 = CreateTestWidget();
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* window2 = CreateTestWidget();
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // both visible => normal autohide
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // either minimzed => normal autohide
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2->Minimize();
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2->Restore();
16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window1->Minimize();
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // both minimized => disable auto hide
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window2->Minimize();
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
1675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Test moving windows to/from other display.
1677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  window2->Restore();
1678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
1679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Move to second display.
1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  window2->SetBounds(gfx::Rect(850, 50, 50, 50));
1681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Move back to primary display.
1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  window2->SetBounds(gfx::Rect(50, 50, 50, 50));
1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Test that the shelf animates back to its normal position upon a user
16883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// completing a gesture drag.
16893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, ShelfAnimatesWhenGestureComplete) {
16903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!SupportsHostWindowResize())
16913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return;
16923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
16933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Test the shelf animates back to its original visible bounds when it is
16943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // dragged when there are no visible windows.
16953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
16963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
16973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
16983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
16993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  gfx::Rect visible_bounds = GetShelfWidget()->GetWindowBoundsInScreen();
17003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  {
17013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Enable animations so that we can make sure that they occur.
17023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ui::ScopedAnimationDurationScaleMode regular_animations(
17033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION);
17043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
17053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
17063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    gfx::Rect shelf_bounds_in_screen =
17073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        GetShelfWidget()->GetWindowBoundsInScreen();
17083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    gfx::Point start(shelf_bounds_in_screen.CenterPoint());
17093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    gfx::Point end(start.x(), shelf_bounds_in_screen.bottom());
17103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    generator.GestureScrollSequence(start, end,
171158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::TimeDelta::FromMilliseconds(10), 5);
17123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
17133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
17143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
17153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ShelfAnimationWaiter waiter(visible_bounds);
17163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Wait till the animation completes and check that it occurred.
17173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    waiter.WaitTillDoneAnimating();
17183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(waiter.WasValidAnimation());
17193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
17203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
17213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Create a visible window so auto-hide behavior is enforced.
17223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CreateTestWidget();
17233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
17243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Get the bounds of the shelf when it is hidden.
17253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
17263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
17273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  gfx::Rect auto_hidden_bounds = GetShelfWidget()->GetWindowBoundsInScreen();
17283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
17293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  {
17303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Enable the animations so that we can make sure they do occur.
17313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ui::ScopedAnimationDurationScaleMode regular_animations(
17323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION);
17333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
17343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    gfx::Point start =
17353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        GetShelfWidget()->GetWindowBoundsInScreen().CenterPoint();
17363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    gfx::Point end(start.x(), start.y() - 100);
17373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
17383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
17393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Test that the shelf animates to the visible bounds after a swipe up on
17403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // the auto hidden shelf.
17413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    generator.GestureScrollSequence(start, end,
17423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(10), 1);
17433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
17443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ShelfAnimationWaiter waiter1(visible_bounds);
17453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    waiter1.WaitTillDoneAnimating();
17463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(waiter1.WasValidAnimation());
17473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
17483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Test that the shelf animates to the auto hidden bounds after a swipe up
17493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // on the visible shelf.
17503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
17513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    generator.GestureScrollSequence(start, end,
17523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(10), 1);
17533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
17543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
17553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ShelfAnimationWaiter waiter2(auto_hidden_bounds);
17563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    waiter2.WaitTillDoneAnimating();
17573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(waiter2.WasValidAnimation());
17583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
17593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
17603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
17613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, GestureRevealsTrayBubble) {
17623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!SupportsHostWindowResize())
17633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return;
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->LayoutShelf();
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a visible window so auto-hide behavior is enforced.
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateTestWidget();
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SystemTray* tray = GetSystemTray();
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First, make sure the shelf is visible.
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tray->HasSystemBubble());
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now, drag up on the tray to show the bubble.
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point start = GetShelfWidget()->status_area_widget()->
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetWindowBoundsInScreen().CenterPoint();
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point end(start.x(), start.y() - 100);
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.GestureScrollSequence(start, end,
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(10), 1);
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tray->HasSystemBubble());
1785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  tray->CloseSystemBubble();
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tray->HasSystemBubble());
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag again, but only a small amount, and slowly. The bubble should not be
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // visible.
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  end.set_y(start.y() - 30);
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.GestureScrollSequence(start, end,
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(500), 100);
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tray->HasSystemBubble());
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now, hide the shelf.
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a drag from the bezel, and drag up to show both the shelf and the
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tray bubble.
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  start.set_y(start.y() + 100);
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  end.set_y(start.y() - 400);
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.GestureScrollSequence(start, end,
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(10), 1);
18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tray->HasSystemBubble());
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, ShelfFlickerOnTrayActivation) {
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a visible window so auto-hide behavior is enforced.
18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateTestWidget();
18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turn on auto-hide for the shelf.
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Show the status menu. That should make the shelf visible again.
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->accelerator_controller()->PerformAction(
18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SHOW_SYSTEM_TRAY_BUBBLE, ui::Accelerator());
18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GetSystemTray()->HasSystemBubble());
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, WorkAreaChangeWorkspace) {
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the shelf is always visible.
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->LayoutShelf();
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.context = CurrentContext();
18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* widget_one = CreateTestWidgetWithParams(params);
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget_one->Maximize();
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* widget_two = CreateTestWidgetWithParams(params);
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget_two->Maximize();
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget_two->Activate();
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both windows are maximized. They should be of the same size.
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(widget_one->GetNativeWindow()->bounds().ToString(),
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            widget_two->GetNativeWindow()->bounds().ToString());
18475e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  int area_when_shelf_shown =
18485e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      widget_one->GetNativeWindow()->bounds().size().GetArea();
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now hide the shelf.
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18535e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  // Both windows should be resized according to the shelf status.
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(widget_one->GetNativeWindow()->bounds().ToString(),
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            widget_two->GetNativeWindow()->bounds().ToString());
18565e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  // Resized to small.
18575e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_LT(area_when_shelf_shown,
18585e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)            widget_one->GetNativeWindow()->bounds().size().GetArea());
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now show the shelf.
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18635e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  // Again both windows should be of the same size.
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(widget_one->GetNativeWindow()->bounds().ToString(),
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            widget_two->GetNativeWindow()->bounds().ToString());
18665e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  EXPECT_EQ(area_when_shelf_shown,
18675e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)            widget_one->GetNativeWindow()->bounds().size().GetArea());
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that the shelf is dimmed only when content is maximized and
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// shelf is not autohidden.
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, Dimming) {
18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetShelfLayoutManager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateTestWindow());
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w1->Show();
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(w1.get());
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Normal window doesn't dim shelf.
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShelfWidget* shelf = GetShelfWidget();
18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(shelf->GetDimsShelf());
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maximized window does.
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED);
18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shelf->GetDimsShelf());
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change back to normal stops dimming.
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(shelf->GetDimsShelf());
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Changing back to maximized dims again.
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED);
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shelf->GetDimsShelf());
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Changing shelf to autohide stops dimming.
18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetShelfLayoutManager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(shelf->GetDimsShelf());
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that the shelf will not hide if the mouse is between a bubble and
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the shelf.
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShelfLayoutManagerTest, BubbleEnlargesShelfMouseHitArea) {
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StatusAreaWidget* status_area_widget =
19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetPrimaryRootWindowController()->shelf()->status_area_widget();
19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SystemTray* tray = GetSystemTray();
19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a visible window so auto-hide behavior is enforced.
19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateTestWidget();
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->LayoutShelf();
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make two iterations - first without a message bubble which should make
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the shelf disappear and then with a message bubble which should keep it
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // visible.
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 2; i++) {
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the shelf is visible and position the mouse over it. Then
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // allow auto hide.
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(status_area_widget->IsMessageBubbleShown());
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point center =
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status_area_widget->GetWindowBoundsInScreen().CenterPoint();
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.MoveMouseTo(center.x(), center.y());
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(shelf->IsVisible());
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!i) {
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // In our first iteration we make sure there is no bubble.
1929868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      tray->CloseSystemBubble();
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(status_area_widget->IsMessageBubbleShown());
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // In our second iteration we show a bubble.
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestItem *item = new TestItem;
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tray->AddTrayItem(item);
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tray->ShowNotificationView(item);
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(status_area_widget->IsMessageBubbleShown());
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the pointer over the edge of the shelf.
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.MoveMouseTo(
194090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        center.x(), status_area_widget->GetWindowBoundsInScreen().y() - 8);
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shelf->UpdateVisibilityState();
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i) {
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(shelf->IsVisible());
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(status_area_widget->IsMessageBubbleShown());
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(shelf->IsVisible());
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(status_area_widget->IsMessageBubbleShown());
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19527dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(ShelfLayoutManagerTest, ShelfBackgroundColor) {
19537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(SHELF_BACKGROUND_DEFAULT, GetShelfWidget()->GetBackgroundType());
19547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
19557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<aura::Window> w1(CreateTestWindow());
19567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  w1->Show();
19577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  wm::ActivateWindow(w1.get());
19587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(SHELF_BACKGROUND_DEFAULT, GetShelfWidget()->GetBackgroundType());
19597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED);
19607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(SHELF_BACKGROUND_MAXIMIZED, GetShelfWidget()->GetBackgroundType());
19617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
19627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<aura::Window> w2(CreateTestWindow());
19637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  w2->Show();
19647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  wm::ActivateWindow(w2.get());
19657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Overlaps with shelf.
19667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  w2->SetBounds(GetShelfLayoutManager()->GetIdealBounds());
19677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
19687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Still background is 'maximized'.
19697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(SHELF_BACKGROUND_MAXIMIZED, GetShelfWidget()->GetBackgroundType());
19707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
19717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED);
19727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(SHELF_BACKGROUND_OVERLAP, GetShelfWidget()->GetBackgroundType());
19737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  w2->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED);
19747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(SHELF_BACKGROUND_DEFAULT, GetShelfWidget()->GetBackgroundType());
19757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
19767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED);
19777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(SHELF_BACKGROUND_MAXIMIZED, GetShelfWidget()->GetBackgroundType());
19787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  w1.reset();
19797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(SHELF_BACKGROUND_DEFAULT, GetShelfWidget()->GetBackgroundType());
19807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
19817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
19827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Verify that the shelf doesn't have the opaque background if it's auto-hide
19837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// status.
19847dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(ShelfLayoutManagerTest, ShelfBackgroundColorAutoHide) {
19857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(SHELF_BACKGROUND_DEFAULT, GetShelfWidget ()->GetBackgroundType());
19867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
19877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GetShelfLayoutManager()->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
19887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<aura::Window> w1(CreateTestWindow());
19897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  w1->Show();
19907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  wm::ActivateWindow(w1.get());
19917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(SHELF_BACKGROUND_OVERLAP, GetShelfWidget()->GetBackgroundType());
19927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED);
19937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(SHELF_BACKGROUND_OVERLAP, GetShelfWidget()->GetBackgroundType());
19947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
19957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1996d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_CHROMEOS)
1997d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define MAYBE_StatusAreaHitBoxCoversEdge StatusAreaHitBoxCoversEdge
1998d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#else
1999d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define MAYBE_StatusAreaHitBoxCoversEdge DISABLED_StatusAreaHitBoxCoversEdge
2000d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
2001d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2002d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Verify the hit bounds of the status area extend to the edge of the shelf.
2003d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(ShelfLayoutManagerTest, MAYBE_StatusAreaHitBoxCoversEdge) {
2004d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  UpdateDisplay("400x400");
2005d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
2006d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  StatusAreaWidget* status_area_widget =
2007d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      Shell::GetPrimaryRootWindowController()->shelf()->status_area_widget();
2008d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
2009d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  generator.MoveMouseTo(399,399);
2010d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2011d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Test bottom right pixel for bottom alignment.
2012d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(status_area_widget->IsMessageBubbleShown());
2013d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  generator.ClickLeftButton();
2014d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(status_area_widget->IsMessageBubbleShown());
2015d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  generator.ClickLeftButton();
2016d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(status_area_widget->IsMessageBubbleShown());
2017d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2018d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Test bottom right pixel for right alignment.
2019d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  shelf->SetAlignment(SHELF_ALIGNMENT_RIGHT);
2020d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(status_area_widget->IsMessageBubbleShown());
2021d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  generator.ClickLeftButton();
2022d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(status_area_widget->IsMessageBubbleShown());
2023d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  generator.ClickLeftButton();
2024d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(status_area_widget->IsMessageBubbleShown());
2025d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2026d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Test bottom left pixel for left alignment.
2027d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  generator.MoveMouseTo(0, 399);
2028d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  shelf->SetAlignment(SHELF_ALIGNMENT_LEFT);
2029d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(status_area_widget->IsMessageBubbleShown());
2030d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  generator.ClickLeftButton();
2031d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(status_area_widget->IsMessageBubbleShown());
2032d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  generator.ClickLeftButton();
2033d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(status_area_widget->IsMessageBubbleShown());
2034d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
2035d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
203646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Tests that entering maximize mode resets auto-hide behaviour to be off by
203746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// default.
203846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ShelfLayoutManagerTest, MaximizeModeResetsAutohide) {
203946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ShelfLayoutManager* shelf = GetShelfLayoutManager();
204046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  shelf->SetAutoHideBehavior(ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
204146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  views::Widget* widget = new views::Widget;
204246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
204346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
204446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  params.context = CurrentContext();
204546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Widget is now owned by the parent window.
204646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  widget->Init(params);
204746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  widget->Maximize();
204846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  widget->Show();
204946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
205046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
205146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
205246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  shelf->OnMaximizeModeStarted();
205346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // LayoutShelf() forces the animation to completion
205446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  shelf->LayoutShelf();
205546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
205646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_NEVER, shelf->auto_hide_behavior());
205746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
205846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2059bee9932bab44713b74b422b4b759b49f5a222977Bo Liu// Tests that when the auto-hide behaviour is changed during an animation the
2060bee9932bab44713b74b422b4b759b49f5a222977Bo Liu// target bounds are updated to reflect the new state.
2061bee9932bab44713b74b422b4b759b49f5a222977Bo LiuTEST_F(ShelfLayoutManagerTest,
2062bee9932bab44713b74b422b4b759b49f5a222977Bo Liu       ShelfAutoHideToggleDuringAnimationUpdatesBounds) {
2063bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  ShelfLayoutManager* shelf_manager = GetShelfLayoutManager();
2064bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  aura::Window* status_window = GetShelfWidget()->status_area_widget()->
2065bee9932bab44713b74b422b4b759b49f5a222977Bo Liu      GetNativeView();
2066bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  gfx::Rect initial_bounds = status_window->bounds();
2067bee9932bab44713b74b422b4b759b49f5a222977Bo Liu
2068bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  ui::ScopedAnimationDurationScaleMode regular_animations(
2069bee9932bab44713b74b422b4b759b49f5a222977Bo Liu      ui::ScopedAnimationDurationScaleMode::SLOW_DURATION);
2070bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  shelf_manager->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN);
2071bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  gfx::Rect hide_target_bounds =  status_window->GetTargetBounds();
2072bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  EXPECT_GT(hide_target_bounds.y(), initial_bounds.y());
2073bee9932bab44713b74b422b4b759b49f5a222977Bo Liu
2074bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  shelf_manager->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
2075bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  gfx::Rect reshow_target_bounds = status_window->GetTargetBounds();
2076bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  EXPECT_EQ(initial_bounds, reshow_target_bounds);
2077bee9932bab44713b74b422b4b759b49f5a222977Bo Liu}
2078bee9932bab44713b74b422b4b759b49f5a222977Bo Liu
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
2080