[go: nahoru, domu]

blob: b08ac804d9267289e9213b2a5f050578d9ebcd75 [file] [log] [blame]
// Copyright 2019 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/replacement_apps.h"
#include <memory>
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.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() {}
ReplacementAppsInfo::~ReplacementAppsInfo() {}
// 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();
}
// static
bool ReplacementAppsInfo::HasReplacementAndroidApp(const Extension* extension) {
const ReplacementAppsInfo* info = GetReplacementAppsInfo(extension);
return info && !info->replacement_android_app.empty();
}
// static
const std::string& ReplacementAppsInfo::GetReplacementAndroidApp(
const Extension* extension) {
const ReplacementAppsInfo* info = GetReplacementAppsInfo(extension);
if (info && !info->replacement_android_app.empty()) {
return info->replacement_android_app;
}
return base::EmptyString();
}
bool ReplacementAppsInfo::LoadWebApp(const Extension* extension,
std::u16string* error) {
const base::Value* app_value = nullptr;
if (!extension->manifest()->Get(keys::kReplacementWebApp, &app_value)) {
return true;
}
DCHECK(app_value);
if (!app_value->is_string()) {
*error = base::ASCIIToUTF16(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 = base::ASCIIToUTF16(errors::kInvalidReplacementWebApp);
return false;
}
replacement_web_app = std::move(web_app_url);
return true;
}
bool ReplacementAppsInfo::LoadAndroidApp(const Extension* extension,
std::u16string* error) {
const base::Value* app_value = nullptr;
if (!extension->manifest()->Get(keys::kReplacementAndroidApp, &app_value)) {
return true;
}
DCHECK(app_value);
if (!app_value->is_string()) {
*error = base::ASCIIToUTF16(errors::kInvalidReplacementAndroidApp);
return false;
}
replacement_android_app = std::move(app_value->GetString());
return true;
}
bool ReplacementAppsInfo::Parse(const Extension* extension,
std::u16string* error) {
if (!LoadWebApp(extension, error) || !LoadAndroidApp(extension, error)) {
return false;
}
return true;
}
ReplacementAppsHandler::ReplacementAppsHandler() {}
ReplacementAppsHandler::~ReplacementAppsHandler() {}
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,
keys::kReplacementAndroidApp};
return kKeys;
}
} // namespace extensions