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 "chrome/browser/command_updater.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/command_observer.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/command_updater_delegate.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeCommandUpdaterDelegate : public CommandUpdaterDelegate { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ExecuteCommandWithDisposition(int id, 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition) OVERRIDE { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, id); 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeCommandObserver : public CommandObserver { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeCommandObserver() : enabled_(true) {} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void EnabledStateChangedForCommand(int id, bool enabled) OVERRIDE { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_ = enabled; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enabled() const { return enabled_; } 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enabled_; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CommandUpdaterTest, TestBasicAPI) { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeCommandUpdaterDelegate delegate; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandUpdater command_updater(&delegate); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unsupported command 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(command_updater.SupportsCommand(0)); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(command_updater.IsCommandEnabled(0)); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // FakeCommandUpdaterDelegate::ExecuteCommand should not be called, since 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the command is not supported. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.ExecuteCommand(0); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Supported, enabled command 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.UpdateCommandEnabled(1, true); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(command_updater.SupportsCommand(1)); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(command_updater.IsCommandEnabled(1)); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.ExecuteCommand(1); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Supported, disabled command 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.UpdateCommandEnabled(2, false); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(command_updater.SupportsCommand(2)); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(command_updater.IsCommandEnabled(2)); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // FakeCommandUpdaterDelegate::ExecuteCommmand should not be called, since 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the command_updater is disabled 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.ExecuteCommand(2); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CommandUpdaterTest, TestObservers) { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeCommandUpdaterDelegate delegate; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandUpdater command_updater(&delegate); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create an observer for the command 2 and add it to the controller, then 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // update the command. 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeCommandObserver observer; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.AddCommandObserver(2, &observer); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.UpdateCommandEnabled(2, true); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(observer.enabled()); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.UpdateCommandEnabled(2, false); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(observer.enabled()); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the observer and update the command. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.RemoveCommandObserver(2, &observer); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.UpdateCommandEnabled(2, true); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(observer.enabled()); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(CommandUpdaterTest, TestObserverRemovingAllCommands) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeCommandUpdaterDelegate delegate; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandUpdater command_updater(&delegate); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create two observers for the commands 1-3 as true, remove one using the 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // single remove command, then set the command to false. Ensure that the 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // removed observer still thinks all commands are true and the one left 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // observing picked up the change. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeCommandObserver observer_remove, observer_keep; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.AddCommandObserver(1, &observer_remove); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.AddCommandObserver(2, &observer_remove); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.AddCommandObserver(3, &observer_remove); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.AddCommandObserver(1, &observer_keep); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.AddCommandObserver(2, &observer_keep); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.AddCommandObserver(3, &observer_keep); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.UpdateCommandEnabled(1, true); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.UpdateCommandEnabled(2, true); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.UpdateCommandEnabled(3, true); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(observer_remove.enabled()); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove one observer and update the command. Check the states, which 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be different. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.RemoveCommandObserver(&observer_remove); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.UpdateCommandEnabled(1, false); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.UpdateCommandEnabled(2, false); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater.UpdateCommandEnabled(3, false); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(observer_remove.enabled()); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(observer_keep.enabled()); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 109