[go: nahoru, domu]

blob: e089be027dc35f8cd9b68216cbd41cbea48de719 [file] [log] [blame]
// 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 "extensions/common/manifest_handlers/web_app_shortcut_icons_handler.h"
#include <memory>
#include <string>
#include <utility>
#include "base/no_destructor.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "extensions/common/extension.h"
#include "extensions/common/manifest_constants.h"
#include "extensions/common/manifest_handler_helpers.h"
namespace extensions {
namespace keys = manifest_keys;
namespace errors = manifest_errors;
WebAppShortcutIconsInfo::WebAppShortcutIconsInfo() = default;
WebAppShortcutIconsInfo::~WebAppShortcutIconsInfo() = default;
// static
const std::map<int, ExtensionIconSet>&
WebAppShortcutIconsInfo::GetShortcutIcons(const Extension* extension) {
DCHECK(extension);
WebAppShortcutIconsInfo* info = static_cast<WebAppShortcutIconsInfo*>(
extension->GetManifestData(keys::kWebAppShortcutIcons));
if (info)
return info->shortcut_icons_map;
static base::NoDestructor<std::map<int, ExtensionIconSet>>
empty_shortcut_icons_map;
return *empty_shortcut_icons_map;
}
// static
ExtensionResource WebAppShortcutIconsInfo::GetIconResource(
const Extension* extension,
int shortcut_index,
int size_in_px,
ExtensionIconSet::MatchType match_type) {
const std::string& path = GetShortcutIcons(extension)
.at(shortcut_index)
.Get(size_in_px, match_type);
return path.empty() ? ExtensionResource() : extension->GetResource(path);
}
WebAppShortcutIconsHandler::WebAppShortcutIconsHandler() = default;
WebAppShortcutIconsHandler::~WebAppShortcutIconsHandler() = default;
bool WebAppShortcutIconsHandler::Parse(Extension* extension,
std::u16string* error) {
// The "web_app_shortcut_icons" key is only available for Bookmark Apps.
// Including it elsewhere results in an install warning, and the shortcut
// icons are not parsed.
if (!extension->from_bookmark()) {
extension->AddInstallWarning(
InstallWarning(errors::kInvalidWebAppShortcutIconsNotBookmarkApp));
return true;
}
auto shortcut_icons_info = std::make_unique<WebAppShortcutIconsInfo>();
const base::Value* shortcut_icons_val = nullptr;
if (!extension->manifest()->GetDictionary(keys::kWebAppShortcutIcons,
&shortcut_icons_val)) {
*error = base::ASCIIToUTF16(errors::kInvalidWebAppShortcutIcons);
return false;
}
int shortcut_index = -1;
for (const auto& entry : shortcut_icons_val->DictItems()) {
++shortcut_index;
const base::DictionaryValue* shortcut_item_icons = nullptr;
if (!entry.second.GetAsDictionary(&shortcut_item_icons)) {
*error = base::ASCIIToUTF16(errors::kInvalidWebAppShortcutItemIcons);
return false;
}
if (!manifest_handler_helpers::LoadIconsFromDictionary(
shortcut_item_icons,
&shortcut_icons_info->shortcut_icons_map[shortcut_index], error)) {
return false;
}
}
extension->SetManifestData(keys::kWebAppShortcutIcons,
std::move(shortcut_icons_info));
return true;
}
base::span<const char* const> WebAppShortcutIconsHandler::Keys() const {
static constexpr const char* kKeys[] = {keys::kWebAppShortcutIcons};
return kKeys;
}
} // namespace extensions