| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ui/commander/simple_command_source.h" |
| |
| #include "base/bind.h" |
| #include "base/i18n/case_conversion.h" |
| #include "chrome/app/chrome_command_ids.h" |
| #include "chrome/browser/ui/accelerator_utils.h" |
| #include "chrome/browser/ui/browser_commands.h" |
| #include "chrome/browser/ui/commander/fuzzy_finder.h" |
| #include "chrome/grit/generated_resources.h" |
| #include "components/strings/grit/components_strings.h" |
| #include "ui/base/accelerators/accelerator.h" |
| #include "ui/base/l10n/l10n_util.h" |
| |
| namespace commander { |
| |
| SimpleCommandSource::SimpleCommandSource() { |
| weak_this_ = weak_ptr_factory_.GetWeakPtr(); |
| } |
| SimpleCommandSource::~SimpleCommandSource() = default; |
| |
| CommandSource::CommandResults SimpleCommandSource::GetCommands( |
| const base::string16& input, |
| Browser* browser) const { |
| static constexpr struct { |
| int command_id; |
| int string_constant; |
| } command_map[] = { |
| {IDC_SHOW_HISTORY, IDS_HISTORY_SHOWFULLHISTORY_LINK}, |
| {IDC_FIND, IDS_FIND}, |
| {IDC_RELOAD, IDS_TOOLTIP_RELOAD}, |
| {IDC_SAVE_PAGE, IDS_SAVE_PAGE}, |
| {IDC_PRINT, IDS_PRINT}, |
| }; |
| |
| CommandSource::CommandResults results; |
| const base::string16& folded_input = base::i18n::FoldCase(input); |
| std::vector<gfx::Range> ranges; |
| for (const auto& command_spec : command_map) { |
| if (!chrome::IsCommandEnabled(browser, command_spec.command_id)) |
| continue; |
| const base::string16 title = |
| l10n_util::GetStringUTF16(command_spec.string_constant); |
| double score = FuzzyFind(folded_input, title, &ranges); |
| if (score == 0) |
| continue; |
| |
| auto item = std::make_unique<CommandItem>(); |
| item->title = title; |
| item->score = score; |
| item->matched_ranges = ranges; |
| |
| ui::Accelerator accelerator; |
| ui::AcceleratorProvider* provider = |
| chrome::AcceleratorProviderForBrowser(browser); |
| if (provider->GetAcceleratorForCommandId(command_spec.command_id, |
| &accelerator)) { |
| item->annotation = accelerator.GetShortcutText(); |
| } |
| |
| // TODO(lgrey): For base::Unretained to be safe here, we need to ensure |
| // that if |browser| is destroyed, the palette is reset. It's likely |
| // that this will be the case anyway, but leaving this comment so: |
| // - it doesn't get dropped/forgotten |
| // - as a reminder to replace the comment with the actual explanation |
| // when we have it |
| item->command = |
| base::BindOnce(&SimpleCommandSource::ExecuteCommand, weak_this_, |
| base::Unretained(browser), command_spec.command_id); |
| results.push_back(std::move(item)); |
| } |
| |
| return results; |
| } |
| |
| // Why this is necessary: |
| // chrome::ExecuteCommand has a third default argument |time_stamp| which |
| // makes it difficult to use with BindOnce. Pre-binding it at command creation |
| // is wrong since it defaults to base::TimeTicks::Now(); that means if pre-bound |
| // it would get the timestamp when the command was generated, rather than when |
| // it was invoked. |
| void SimpleCommandSource::ExecuteCommand(Browser* browser, int command_id) { |
| chrome::ExecuteCommand(browser, command_id); |
| } |
| |
| } // namespace commander |