1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/services/app_service/public/cpp/shortcut/shortcut.h"
#include <memory>
#include <sstream>
#include "base/check.h"
#include "base/strings/strcat.h"
#include "components/app_constants/constants.h"
#include "components/crx_file/id_util.h"
namespace apps {
std::ostream& operator<<(std::ostream& os, ShortcutSource v) {
switch (v) {
case ShortcutSource::kUnknown:
return os << "ShortcutSource::kUnknown";
case ShortcutSource::kUser:
return os << "ShortcutSource::kUser";
case ShortcutSource::kPolicy:
return os << "ShortcutSource::kPolicy";
case ShortcutSource::kDefault:
return os << "ShortcutSource::kDefault";
}
// Just in case, where the value comes from outside of the chrome code
// then casted without checks.
return os << "(unknown: " << static_cast<int>(v) << ")";
}
Shortcut::Shortcut(const std::string& host_app_id, const std::string& local_id)
: host_app_id(host_app_id),
local_id(local_id),
shortcut_id(GenerateShortcutId(host_app_id, local_id)) {}
Shortcut::~Shortcut() = default;
bool Shortcut::operator==(const Shortcut& rhs) const {
return this->shortcut_id == rhs.shortcut_id &&
this->host_app_id == rhs.host_app_id &&
this->local_id == rhs.local_id && this->name == rhs.name &&
this->shortcut_source == rhs.shortcut_source &&
this->icon_key == rhs.icon_key &&
this->allow_removal == rhs.allow_removal;
}
std::unique_ptr<Shortcut> Shortcut::Clone() const {
auto shortcut = std::make_unique<Shortcut>(host_app_id, local_id);
shortcut->name = name;
shortcut->shortcut_source = shortcut_source;
if (icon_key.has_value()) {
shortcut->icon_key = std::move(*icon_key->Clone());
}
shortcut->allow_removal = allow_removal;
return shortcut;
}
std::string Shortcut::ToString() const {
std::stringstream out;
out << "shortcut_id: " << shortcut_id << std::endl;
if (name.has_value()) {
out << "- name: " << name.value() << std::endl;
}
out << "- shortcut_source: " << shortcut_source << std::endl;
out << "- host_app_id: " << host_app_id << std::endl;
out << "- local_id: " << local_id << std::endl;
if (allow_removal.has_value()) {
out << "- allow_removal: " << allow_removal.value() << std::endl;
}
return out.str();
}
Shortcuts CloneShortcuts(const Shortcuts& source_shortcuts) {
Shortcuts shortcuts;
for (const auto& shortcut : source_shortcuts) {
DCHECK(shortcut);
shortcuts.push_back(shortcut->Clone());
}
return shortcuts;
}
ShortcutId GenerateShortcutId(const std::string& host_app_id,
const std::string& local_id) {
// For web app based browser shortcut, we just use the local_id
// that is generated in the web app system, so that we can keep
// all the launcher and shelf locations without needing to migrate the sync
// data.
if (host_app_id == app_constants::kChromeAppId) {
return ShortcutId(local_id);
}
const std::string input = base::StrCat({host_app_id, "#", local_id});
return ShortcutId(crx_file::id_util::GenerateId(input));
}
} // namespace apps
|