1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/command_updater_impl.h"
9 #include "base/check.h"
10 #include "base/observer_list.h"
11 #include "chrome/browser/command_observer.h"
12 #include "chrome/browser/command_updater_delegate.h"
14 class CommandUpdaterImpl::Command {
17 base::ObserverList<CommandObserver>::Unchecked observers;
19 Command() : enabled(true) {}
22 CommandUpdaterImpl::CommandUpdaterImpl(CommandUpdaterDelegate* delegate)
23 : delegate_(delegate) {
26 CommandUpdaterImpl::~CommandUpdaterImpl() {
29 bool CommandUpdaterImpl::SupportsCommand(int id) const {
30 return commands_.find(id) != commands_.end();
33 bool CommandUpdaterImpl::IsCommandEnabled(int id) const {
34 auto command = commands_.find(id);
35 if (command == commands_.end())
37 return command->second->enabled;
40 bool CommandUpdaterImpl::ExecuteCommand(int id, base::TimeTicks time_stamp) {
41 return ExecuteCommandWithDisposition(id, WindowOpenDisposition::CURRENT_TAB,
45 bool CommandUpdaterImpl::ExecuteCommandWithDisposition(
47 WindowOpenDisposition disposition,
48 base::TimeTicks time_stamp) {
49 if (SupportsCommand(id) && IsCommandEnabled(id)) {
50 delegate_->ExecuteCommandWithDisposition(id, disposition);
56 void CommandUpdaterImpl::AddCommandObserver(int id, CommandObserver* observer) {
57 GetCommand(id, true)->observers.AddObserver(observer);
60 void CommandUpdaterImpl::RemoveCommandObserver(
61 int id, CommandObserver* observer) {
62 GetCommand(id, false)->observers.RemoveObserver(observer);
65 void CommandUpdaterImpl::RemoveCommandObserver(CommandObserver* observer) {
66 for (const auto& command_pair : commands_) {
67 Command* command = command_pair.second.get();
69 command->observers.RemoveObserver(observer);
73 bool CommandUpdaterImpl::UpdateCommandEnabled(int id, bool enabled) {
74 Command* command = GetCommand(id, true);
75 if (command->enabled == enabled)
76 return true; // Nothing to do.
77 command->enabled = enabled;
78 for (auto& observer : command->observers)
79 observer.EnabledStateChangedForCommand(id, enabled);
83 void CommandUpdaterImpl::DisableAllCommands() {
84 for (const auto& command_pair : commands_)
85 UpdateCommandEnabled(command_pair.first, false);
88 std::vector<int> CommandUpdaterImpl::GetAllIds() {
89 std::vector<int> result;
90 for (const auto& command_pair : commands_)
91 result.push_back(command_pair.first);
95 CommandUpdaterImpl::Command*
96 CommandUpdaterImpl::GetCommand(int id, bool create) {
97 bool supported = SupportsCommand(id);
99 return commands_[id].get();
102 std::unique_ptr<Command>& entry = commands_[id];
103 entry = std::make_unique<Command>();