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 100 101 102 103 104 105 106 107 108 109
|
// Copyright 2019 The Chromium Authors
// 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/replacement_apps.h"
#include <memory>
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "extensions/common/manifest.h"
#include "extensions/common/manifest_constants.h"
#include "url/gurl.h"
#include "url/url_constants.h"
namespace extensions {
namespace keys = manifest_keys;
namespace errors = manifest_errors;
namespace {
const char kReplacementApps[] = "replacement_apps";
const ReplacementAppsInfo* GetReplacementAppsInfo(const Extension* extension) {
return static_cast<ReplacementAppsInfo*>(
extension->GetManifestData(kReplacementApps));
}
} // namespace
ReplacementAppsInfo::ReplacementAppsInfo() = default;
ReplacementAppsInfo::~ReplacementAppsInfo() = default;
// static
bool ReplacementAppsInfo::HasReplacementWebApp(const Extension* extension) {
const ReplacementAppsInfo* info = GetReplacementAppsInfo(extension);
return info && !info->replacement_web_app.is_empty();
}
// static
GURL ReplacementAppsInfo::GetReplacementWebApp(const Extension* extension) {
const ReplacementAppsInfo* info = GetReplacementAppsInfo(extension);
if (info && !info->replacement_web_app.is_empty()) {
return info->replacement_web_app;
}
return GURL();
}
bool ReplacementAppsInfo::LoadWebApp(const Extension* extension,
std::u16string* error) {
const base::Value* app_value =
extension->manifest()->FindPath(keys::kReplacementWebApp);
if (app_value == nullptr) {
return true;
}
DCHECK(app_value);
if (!app_value->is_string()) {
*error = errors::kInvalidReplacementWebApp;
return false;
}
const GURL web_app_url(app_value->GetString());
if (!web_app_url.is_valid() || !web_app_url.SchemeIs(url::kHttpsScheme)) {
*error = errors::kInvalidReplacementWebApp;
return false;
}
replacement_web_app = std::move(web_app_url);
return true;
}
bool ReplacementAppsInfo::Parse(const Extension* extension,
std::u16string* error) {
if (!LoadWebApp(extension, error)) {
return false;
}
return true;
}
ReplacementAppsHandler::ReplacementAppsHandler() = default;
ReplacementAppsHandler::~ReplacementAppsHandler() = default;
bool ReplacementAppsHandler::Parse(Extension* extension,
std::u16string* error) {
std::unique_ptr<ReplacementAppsInfo> info(new ReplacementAppsInfo);
if (!info->Parse(extension, error)) {
return false;
}
extension->SetManifestData(kReplacementApps, std::move(info));
return true;
}
base::span<const char* const> ReplacementAppsHandler::Keys() const {
static constexpr const char* kKeys[] = {
keys::kReplacementWebApp,
};
return kKeys;
}
} // namespace extensions
|