blob: dd095e0a904436062eeff1cfd65486b3bac430eb [file] [log] [blame]
// Copyright (c) 2016 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/webui/bookmarks/bookmarks_ui.h"
#include <algorithm>
#include <memory>
#include <string>
#include <utility>
#include "base/bind.h"
#include "base/stl_util.h"
#include "base/strings/string16.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.h"
#include "chrome/browser/ui/webui/dark_mode_handler.h"
#include "chrome/browser/ui/webui/managed_ui_handler.h"
#include "chrome/browser/ui/webui/metrics_handler.h"
#include "chrome/browser/ui/webui/plural_string_handler.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/browser_resources.h"
#include "chrome/grit/generated_resources.h"
#include "chrome/grit/theme_resources.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
#include "content/public/common/content_features.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
namespace {
void AddLocalizedString(content::WebUIDataSource* source,
const std::string& message,
int id) {
base::string16 str = l10n_util::GetStringUTF16(id);
base::Erase(str, '&');
source->AddString(message, str);
}
content::WebUIDataSource* CreateBookmarksUIHTMLSource(Profile* profile) {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUIBookmarksHost);
// Build an Accelerator to describe undo shortcut
// NOTE: the undo shortcut is also defined in bookmarks/command_manager.js
// TODO(crbug/893033): de-duplicate shortcut by moving all shortcut
// definitions from JS to C++.
ui::Accelerator undoAccelerator(ui::VKEY_Z, ui::EF_PLATFORM_ACCELERATOR);
source->AddString("undoDescription", l10n_util::GetStringFUTF16(
IDS_BOOKMARK_BAR_UNDO_DESCRIPTION,
undoAccelerator.GetShortcutText()));
// Localized strings (alphabetical order).
AddLocalizedString(source, "addBookmarkTitle",
IDS_BOOKMARK_MANAGER_ADD_BOOKMARK_TITLE);
AddLocalizedString(source, "addFolderTitle",
IDS_BOOKMARK_MANAGER_ADD_FOLDER_TITLE);
AddLocalizedString(source, "cancel", IDS_CANCEL);
AddLocalizedString(source, "clearSearch", IDS_BOOKMARK_MANAGER_CLEAR_SEARCH);
AddLocalizedString(source, "delete", IDS_DELETE);
AddLocalizedString(source, "editBookmarkTitle", IDS_BOOKMARK_EDITOR_TITLE);
AddLocalizedString(source, "editDialogInvalidUrl",
IDS_BOOKMARK_MANAGER_INVALID_URL);
AddLocalizedString(source, "editDialogNameInput",
IDS_BOOKMARK_MANAGER_NAME_INPUT_PLACE_HOLDER);
AddLocalizedString(source, "editDialogUrlInput",
IDS_BOOKMARK_MANAGER_URL_INPUT_PLACE_HOLDER);
AddLocalizedString(source, "emptyList", IDS_BOOKMARK_MANAGER_EMPTY_LIST);
AddLocalizedString(source, "emptyUnmodifiableList",
IDS_BOOKMARK_MANAGER_EMPTY_UNMODIFIABLE_LIST);
AddLocalizedString(source, "folderLabel", IDS_BOOKMARK_MANAGER_FOLDER_LABEL);
AddLocalizedString(source, "itemsSelected",
IDS_BOOKMARK_MANAGER_ITEMS_SELECTED);
AddLocalizedString(source, "listAxLabel", IDS_BOOKMARK_MANAGER_LIST_AX_LABEL);
AddLocalizedString(source, "menuAddBookmark",
IDS_BOOKMARK_MANAGER_MENU_ADD_BOOKMARK);
AddLocalizedString(source, "menuAddFolder",
IDS_BOOKMARK_MANAGER_MENU_ADD_FOLDER);
AddLocalizedString(source, "menuCopyURL", IDS_BOOKMARK_MANAGER_MENU_COPY_URL);
AddLocalizedString(source, "menuDelete", IDS_DELETE);
AddLocalizedString(source, "menuEdit", IDS_EDIT);
AddLocalizedString(source, "menuExport", IDS_BOOKMARK_MANAGER_MENU_EXPORT);
AddLocalizedString(source, "menuHelpCenter",
IDS_BOOKMARK_MANAGER_MENU_HELP_CENTER);
AddLocalizedString(source, "menuImport", IDS_BOOKMARK_MANAGER_MENU_IMPORT);
AddLocalizedString(source, "menuOpenAllNewTab",
IDS_BOOKMARK_MANAGER_MENU_OPEN_ALL);
AddLocalizedString(source, "menuOpenAllNewWindow",
IDS_BOOKMARK_MANAGER_MENU_OPEN_ALL_NEW_WINDOW);
AddLocalizedString(source, "menuOpenAllIncognito",
IDS_BOOKMARK_MANAGER_MENU_OPEN_ALL_INCOGNITO);
AddLocalizedString(source, "menuOpenNewTab",
IDS_BOOKMARK_MANAGER_MENU_OPEN_IN_NEW_TAB);
AddLocalizedString(source, "menuOpenNewWindow",
IDS_BOOKMARK_MANAGER_MENU_OPEN_IN_NEW_WINDOW);
AddLocalizedString(source, "menuOpenIncognito",
IDS_BOOKMARK_MANAGER_MENU_OPEN_INCOGNITO);
AddLocalizedString(source, "menuRename", IDS_BOOKMARK_MANAGER_MENU_RENAME);
AddLocalizedString(source, "menuShowInFolder",
IDS_BOOKMARK_MANAGER_MENU_SHOW_IN_FOLDER);
AddLocalizedString(source, "menuSort", IDS_BOOKMARK_MANAGER_MENU_SORT);
AddLocalizedString(source, "moreActionsButtonTitle",
IDS_BOOKMARK_MANAGER_MORE_ACTIONS);
AddLocalizedString(source, "moreActionsButtonAxLabel",
IDS_BOOKMARK_MANAGER_MORE_ACTIONS_AX_LABEL);
AddLocalizedString(source, "noSearchResults", IDS_SEARCH_NO_RESULTS);
AddLocalizedString(source, "openDialogBody",
IDS_BOOKMARK_BAR_SHOULD_OPEN_ALL);
AddLocalizedString(source, "openDialogConfirm",
IDS_BOOKMARK_MANAGER_OPEN_DIALOG_CONFIRM);
AddLocalizedString(source, "openDialogTitle",
IDS_BOOKMARK_MANAGER_OPEN_DIALOG_TITLE);
AddLocalizedString(source, "organizeButtonTitle",
IDS_BOOKMARK_MANAGER_ORGANIZE_MENU);
AddLocalizedString(source, "renameFolderTitle",
IDS_BOOKMARK_MANAGER_FOLDER_RENAME_TITLE);
AddLocalizedString(source, "searchPrompt",
IDS_BOOKMARK_MANAGER_SEARCH_BUTTON);
AddLocalizedString(source, "sidebarAxLabel",
IDS_BOOKMARK_MANAGER_SIDEBAR_AX_LABEL);
AddLocalizedString(source, "searchCleared", IDS_SEARCH_CLEARED);
AddLocalizedString(source, "searchResults", IDS_SEARCH_RESULTS);
AddLocalizedString(source, "saveEdit", IDS_SAVE);
AddLocalizedString(source, "title", IDS_BOOKMARK_MANAGER_TITLE);
AddLocalizedString(source, "toastFolderSorted",
IDS_BOOKMARK_MANAGER_TOAST_FOLDER_SORTED);
AddLocalizedString(source, "toastItemCopied",
IDS_BOOKMARK_MANAGER_TOAST_ITEM_COPIED);
AddLocalizedString(source, "toastItemDeleted",
IDS_BOOKMARK_MANAGER_TOAST_ITEM_DELETED);
AddLocalizedString(source, "toastUrlCopied",
IDS_BOOKMARK_MANAGER_TOAST_URL_COPIED);
AddLocalizedString(source, "undo", IDS_BOOKMARK_BAR_UNDO);
// Resources.
source->AddResourcePath("images/folder_open.svg",
IDR_BOOKMARKS_IMAGES_FOLDER_OPEN_SVG);
source->AddResourcePath("images/folder.svg", IDR_BOOKMARKS_IMAGES_FOLDER_SVG);
#if BUILDFLAG(OPTIMIZE_WEBUI)
source->AddResourcePath("crisper.js", IDR_BOOKMARKS_CRISPER_JS);
source->SetDefaultResource(
base::FeatureList::IsEnabled(features::kWebUIPolymer2)
? IDR_BOOKMARKS_VULCANIZED_P2_HTML
: IDR_BOOKMARKS_VULCANIZED_HTML);
source->UseGzip(base::BindRepeating([](const std::string& path) {
return path != "images/folder_open.svg" && path != "images/folder.svg";
}));
#else
source->AddResourcePath("actions.html", IDR_BOOKMARKS_ACTIONS_HTML);
source->AddResourcePath("actions.js", IDR_BOOKMARKS_ACTIONS_JS);
source->AddResourcePath("api_listener.html", IDR_BOOKMARKS_API_LISTENER_HTML);
source->AddResourcePath("api_listener.js", IDR_BOOKMARKS_API_LISTENER_JS);
source->AddResourcePath("app.html", IDR_BOOKMARKS_APP_HTML);
source->AddResourcePath("app.js", IDR_BOOKMARKS_APP_JS);
source->AddResourcePath("command_manager.html",
IDR_BOOKMARKS_COMMAND_MANAGER_HTML);
source->AddResourcePath("command_manager.js",
IDR_BOOKMARKS_COMMAND_MANAGER_JS);
source->AddResourcePath("constants.html", IDR_BOOKMARKS_CONSTANTS_HTML);
source->AddResourcePath("constants.js", IDR_BOOKMARKS_CONSTANTS_JS);
source->AddResourcePath("debouncer.html", IDR_BOOKMARKS_DEBOUNCER_HTML);
source->AddResourcePath("debouncer.js", IDR_BOOKMARKS_DEBOUNCER_JS);
source->AddResourcePath("dialog_focus_manager.html",
IDR_BOOKMARKS_DIALOG_FOCUS_MANAGER_HTML);
source->AddResourcePath("dialog_focus_manager.js",
IDR_BOOKMARKS_DIALOG_FOCUS_MANAGER_JS);
source->AddResourcePath("dnd_manager.html", IDR_BOOKMARKS_DND_MANAGER_HTML);
source->AddResourcePath("dnd_manager.js", IDR_BOOKMARKS_DND_MANAGER_JS);
source->AddResourcePath("edit_dialog.html", IDR_BOOKMARKS_EDIT_DIALOG_HTML);
source->AddResourcePath("edit_dialog.js", IDR_BOOKMARKS_EDIT_DIALOG_JS);
source->AddResourcePath("folder_node.html", IDR_BOOKMARKS_FOLDER_NODE_HTML);
source->AddResourcePath("folder_node.js", IDR_BOOKMARKS_FOLDER_NODE_JS);
source->AddResourcePath("item.html", IDR_BOOKMARKS_ITEM_HTML);
source->AddResourcePath("item.js", IDR_BOOKMARKS_ITEM_JS);
source->AddResourcePath("list.html", IDR_BOOKMARKS_LIST_HTML);
source->AddResourcePath("list.js", IDR_BOOKMARKS_LIST_JS);
source->AddResourcePath("mouse_focus_behavior.html",
IDR_BOOKMARKS_MOUSE_FOCUS_BEHAVIOR_HTML);
source->AddResourcePath("mouse_focus_behavior.js",
IDR_BOOKMARKS_MOUSE_FOCUS_BEHAVIOR_JS);
source->AddResourcePath("reducers.html", IDR_BOOKMARKS_REDUCERS_HTML);
source->AddResourcePath("reducers.js", IDR_BOOKMARKS_REDUCERS_JS);
source->AddResourcePath("router.html", IDR_BOOKMARKS_ROUTER_HTML);
source->AddResourcePath("router.js", IDR_BOOKMARKS_ROUTER_JS);
source->AddResourcePath("shared_style.html", IDR_BOOKMARKS_SHARED_STYLE_HTML);
source->AddResourcePath("shared_vars.html", IDR_BOOKMARKS_SHARED_VARS_HTML);
source->AddResourcePath("store.html", IDR_BOOKMARKS_STORE_HTML);
source->AddResourcePath("store.js", IDR_BOOKMARKS_STORE_JS);
source->AddResourcePath("store_client.html", IDR_BOOKMARKS_STORE_CLIENT_HTML);
source->AddResourcePath("store_client.js", IDR_BOOKMARKS_STORE_CLIENT_JS);
source->AddResourcePath("strings.html", IDR_BOOKMARKS_STRINGS_HTML);
source->AddResourcePath("toolbar.html", IDR_BOOKMARKS_TOOLBAR_HTML);
source->AddResourcePath("toolbar.js", IDR_BOOKMARKS_TOOLBAR_JS);
source->AddResourcePath("util.html", IDR_BOOKMARKS_UTIL_HTML);
source->AddResourcePath("util.js", IDR_BOOKMARKS_UTIL_JS);
source->SetDefaultResource(IDR_BOOKMARKS_BOOKMARKS_HTML);
#endif
source->SetJsonPath("strings.js");
return source;
}
} // namespace
BookmarksUI::BookmarksUI(content::WebUI* web_ui) : WebUIController(web_ui) {
// Set up the chrome://bookmarks/ source.
Profile* profile = Profile::FromWebUI(web_ui);
auto* source = CreateBookmarksUIHTMLSource(profile);
DarkModeHandler::Initialize(web_ui, source);
ManagedUIHandler::Initialize(web_ui, source);
content::WebUIDataSource::Add(profile, source);
auto plural_string_handler = std::make_unique<PluralStringHandler>();
plural_string_handler->AddLocalizedString(
"listChanged", IDS_BOOKMARK_MANAGER_FOLDER_LIST_CHANGED);
plural_string_handler->AddLocalizedString(
"toastItemsDeleted", IDS_BOOKMARK_MANAGER_TOAST_ITEMS_DELETED);
plural_string_handler->AddLocalizedString(
"toastItemsCopied", IDS_BOOKMARK_MANAGER_TOAST_ITEMS_COPIED);
web_ui->AddMessageHandler(std::move(plural_string_handler));
web_ui->AddMessageHandler(std::make_unique<BookmarksMessageHandler>());
web_ui->AddMessageHandler(std::make_unique<MetricsHandler>());
}
// static
base::RefCountedMemory* BookmarksUI::GetFaviconResourceBytes(
ui::ScaleFactor scale_factor) {
return ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytesForScale(
IDR_BOOKMARKS_FAVICON, scale_factor);
}