172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// found in the LICENSE file. 4513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 5513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/message_loop.h" 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/reload_button.h" 7513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 9513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass ReloadButtonTest : public testing::Test { 10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public: 11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ReloadButtonTest(); 12513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 13513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void CheckState(bool enabled, 14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ReloadButton::Mode intended_mode, 15513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ReloadButton::Mode visible_mode, 16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool double_click_timer_running, 17513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool stop_to_reload_timer_running); 18513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // These accessors eliminate the need to declare each testcase as a friend. 20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void set_mouse_hovered(bool hovered) { 21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.testing_mouse_hovered_ = hovered; 22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int reload_count() { return reload_.testing_reload_count_; } 24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch protected: 26513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // We need a message loop for the timers to post events. 27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch MessageLoop loop_; 28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ReloadButton reload_; 30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}; 31513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 32513209b27ff55e2841eac0e4120199c23acce758Ben MurdochReloadButtonTest::ReloadButtonTest() : reload_(NULL, NULL) { 33513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Set the timer delays to 0 so that timers will fire as soon as we tell the 34513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // message loop to run pending tasks. 35513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.double_click_timer_delay_ = base::TimeDelta(); 36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.stop_to_reload_timer_delay_ = base::TimeDelta(); 37513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 39513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid ReloadButtonTest::CheckState(bool enabled, 40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ReloadButton::Mode intended_mode, 41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ReloadButton::Mode visible_mode, 42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool double_click_timer_running, 43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool stop_to_reload_timer_running) { 44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(enabled, reload_.IsEnabled()); 45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(intended_mode, reload_.intended_mode_); 46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(visible_mode, reload_.visible_mode_); 47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(double_click_timer_running, 48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.double_click_timer_.IsRunning()); 49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(stop_to_reload_timer_running, 50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.stop_to_reload_timer_.IsRunning()); 51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 53513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(ReloadButtonTest, Basic) { 54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The stop/reload button starts in the "enabled reload" state with no timers 55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // running. 56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CheckState(true, ReloadButton::MODE_RELOAD, ReloadButton::MODE_RELOAD, false, 57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch false); 58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Press the button. This should start the double-click timer. 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen views::MouseEvent e(ui::ET_MOUSE_PRESSED, 0, 0, 0); 61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.ButtonPressed(&reload_, e); 62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CheckState(true, ReloadButton::MODE_RELOAD, ReloadButton::MODE_RELOAD, true, 63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch false); 64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Now change the mode (as if the browser had started loading the page). This 66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // should cancel the double-click timer since the button is not hovered. 67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.ChangeMode(ReloadButton::MODE_STOP, false); 68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CheckState(true, ReloadButton::MODE_STOP, ReloadButton::MODE_STOP, false, 69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch false); 70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Press the button again. This should change back to reload. 72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.ButtonPressed(&reload_, e); 73513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CheckState(true, ReloadButton::MODE_RELOAD, ReloadButton::MODE_RELOAD, false, 74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch false); 75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 77513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(ReloadButtonTest, DoubleClickTimer) { 78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Start by pressing the button. 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen views::MouseEvent e(ui::ET_MOUSE_PRESSED, 0, 0, 0); 80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.ButtonPressed(&reload_, e); 81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Try to press the button again. This should do nothing because the timer is 83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // running. 84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int original_reload_count = reload_count(); 85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.ButtonPressed(&reload_, e); 86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CheckState(true, ReloadButton::MODE_RELOAD, ReloadButton::MODE_RELOAD, true, 87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch false); 88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(original_reload_count, reload_count()); 89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Hover the button, and change mode. The visible mode should not change, 91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // again because the timer is running. 92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch set_mouse_hovered(true); 93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.ChangeMode(ReloadButton::MODE_STOP, false); 94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CheckState(true, ReloadButton::MODE_STOP, ReloadButton::MODE_RELOAD, true, 95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch false); 96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Now fire the timer. This should complete the mode change. 98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch loop_.RunAllPending(); 99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CheckState(true, ReloadButton::MODE_STOP, ReloadButton::MODE_STOP, false, 100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch false); 101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 103513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(ReloadButtonTest, DisableOnHover) { 104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Change to stop and hover. 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen views::MouseEvent e(ui::ET_MOUSE_PRESSED, 0, 0, 0); 106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.ButtonPressed(&reload_, e); 107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.ChangeMode(ReloadButton::MODE_STOP, false); 108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch set_mouse_hovered(true); 109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Now change back to reload. This should result in a disabled stop button 111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // due to the hover. 112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.ChangeMode(ReloadButton::MODE_RELOAD, false); 113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CheckState(false, ReloadButton::MODE_RELOAD, ReloadButton::MODE_STOP, false, 114513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch true); 115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Un-hover the button, which should allow it to reset. 117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch set_mouse_hovered(false); 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen views::MouseEvent e2(ui::ET_MOUSE_MOVED, 0, 0, 0); 119513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.OnMouseExited(e2); 120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CheckState(true, ReloadButton::MODE_RELOAD, ReloadButton::MODE_RELOAD, false, 121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch false); 122513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 123513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 124513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(ReloadButtonTest, ResetOnClick) { 125513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Change to stop and hover. 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen views::MouseEvent e(ui::ET_MOUSE_PRESSED, 0, 0, 0); 127513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.ButtonPressed(&reload_, e); 128513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.ChangeMode(ReloadButton::MODE_STOP, false); 129513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch set_mouse_hovered(true); 130513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 131513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Press the button. This should change back to reload despite the hover, 132513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // because it's a direct user action. 133513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.ButtonPressed(&reload_, e); 134513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CheckState(true, ReloadButton::MODE_RELOAD, ReloadButton::MODE_RELOAD, false, 135513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch false); 136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 138513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(ReloadButtonTest, ResetOnTimer) { 139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Change to stop, hover, and change back to reload. 14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen views::MouseEvent e(ui::ET_MOUSE_PRESSED, 0, 0, 0); 141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.ButtonPressed(&reload_, e); 142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.ChangeMode(ReloadButton::MODE_STOP, false); 143513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch set_mouse_hovered(true); 144513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reload_.ChangeMode(ReloadButton::MODE_RELOAD, false); 145513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 146513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Now fire the stop-to-reload timer. This should reset the button. 147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch loop_.RunAllPending(); 148513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CheckState(true, ReloadButton::MODE_RELOAD, ReloadButton::MODE_RELOAD, false, 149513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch false); 150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 151