blob: f348f0bafdcbe3c15cfd01ed831f05d53115edf3 [file]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef EXTENSIONS_COMMON_ICONS_EXTENSION_ICON_VARIANT_H_
#define EXTENSIONS_COMMON_ICONS_EXTENSION_ICON_VARIANT_H_
#include <optional>
#include <set>
#include <string>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/values.h"
#include "extensions/buildflags/buildflags.h"
#include "extensions/common/extension_resource.h"
#include "extensions/common/icons/extension_icon_variants_diagnostics.h"
static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE));
namespace extensions {
class Extension;
// Either `any` or `map` must have a non-empty and valid size and/or path.
class ExtensionIconVariant {
public:
ExtensionIconVariant();
ExtensionIconVariant(ExtensionIconVariant&& other);
ExtensionIconVariant(const ExtensionIconVariant& other);
~ExtensionIconVariant();
// Options for `"color_scheme"` in the `"icon_variants"` manifest key.
enum class ColorScheme {
kDark,
kLight,
};
// Parse the `base::Value` argument for the given extension and return an
// instance of this class.
static std::unique_ptr<ExtensionIconVariant> Parse(const Extension& extension,
const base::Value& dict);
std::vector<diagnostics::icon_variants::Diagnostic>& get_diagnostics() {
return diagnostics_;
}
using Size = short;
// Getters.
const std::optional<ExtensionResource>& GetAny() const { return any_; }
const std::set<ColorScheme>& GetColorSchemes() const {
return color_schemes_;
}
const base::flat_map<Size, ExtensionResource>& GetSizes() const {
return sizes_;
}
private:
// Returns true if the given path can be used for an icon. Otherwise adds a
// warning and returns false.
bool ValidateIconPath(const ExtensionResource& path);
// Helper methods that add to `this` object if the parameter is valid.
void MaybeAddColorSchemes(const base::Value& value);
void MaybeAddSizeEntry(
const Extension& extension,
const std::pair<const std::string&, const base::Value&>& entry);
// Either `any` or `<size>` keys must have at least one value.
bool IsValid() const;
// The any key can have a path that's for any size.
std::optional<ExtensionResource> any_;
// The color_schemes key can be omitted, or it can be an array with zero or
// more values.
std::set<ColorScheme> color_schemes_;
// Size keys are numbers represented as strings in JSON for which there is no
// IDL nor json_schema_compiler support.
base::flat_map<Size, ExtensionResource> sizes_;
// Warnings observed while parsing `icon_variants` from manifest.json. These
// will be cleared at the end of manifest parsing for memory optimization.
std::vector<diagnostics::icon_variants::Diagnostic> diagnostics_;
};
} // namespace extensions
#endif // EXTENSIONS_COMMON_ICONS_EXTENSION_ICON_VARIANT_H_