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
|
// Copyright 2013 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/requirements_info.h"
#include <memory>
#include "base/containers/contains.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "extensions/common/api/requirements.h"
#include "extensions/common/error_utils.h"
#include "extensions/common/manifest_constants.h"
namespace extensions {
namespace errors = manifest_errors;
using ManifestKeys = api::requirements::ManifestKeys;
RequirementsInfo::RequirementsInfo() = default;
RequirementsInfo::~RequirementsInfo() = default;
// static
const RequirementsInfo& RequirementsInfo::GetRequirements(
const Extension* extension) {
RequirementsInfo* info = static_cast<RequirementsInfo*>(
extension->GetManifestData(ManifestKeys::kRequirements));
// We should be guaranteed to have requirements, since they are parsed for all
// extension types.
CHECK(info);
return *info;
}
RequirementsHandler::RequirementsHandler() = default;
RequirementsHandler::~RequirementsHandler() = default;
base::span<const char* const> RequirementsHandler::Keys() const {
static constexpr const char* kKeys[] = {ManifestKeys::kRequirements};
return kKeys;
}
bool RequirementsHandler::AlwaysParseForType(Manifest::Type type) const {
return true;
}
bool RequirementsHandler::Parse(Extension* extension, std::u16string* error) {
ManifestKeys manifest_keys;
if (!ManifestKeys::ParseFromDictionary(
extension->manifest()->available_values(), manifest_keys, *error)) {
return false;
}
auto requirements_info = std::make_unique<RequirementsInfo>();
if (!manifest_keys.requirements) {
extension->SetManifestData(ManifestKeys::kRequirements,
std::move(requirements_info));
return true;
}
const auto& requirements = *manifest_keys.requirements;
// The plugins requirement is deprecated. Raise an install warning. If the
// extension explicitly requires npapi plugins, raise an error.
if (requirements.plugins) {
extension->AddInstallWarning(
InstallWarning(errors::kPluginsRequirementDeprecated));
if (requirements.plugins->npapi && *requirements.plugins->npapi) {
*error = errors::kNPAPIPluginsNotSupported;
return false;
}
}
if (requirements._3d) {
// css3d is always available, so no check is needed, but no error is
// generated.
requirements_info->webgl = base::Contains(
requirements._3d->features, api::requirements::_3DFeature::kWebgl);
}
extension->SetManifestData(ManifestKeys::kRequirements,
std::move(requirements_info));
return true;
}
} // namespace extensions
|