910e62b5创建于 1月15日历史提交
// Copyright 2017 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/api/declarative_net_request/dnr_manifest_data.h"

#include <utility>

#include "base/check_op.h"
#include "base/no_destructor.h"
#include "extensions/common/api/declarative_net_request.h"

namespace extensions {

namespace dnr_api = api::declarative_net_request;
namespace declarative_net_request {

DNRManifestData::RulesetInfo::RulesetInfo() = default;
DNRManifestData::RulesetInfo::~RulesetInfo() = default;
DNRManifestData::RulesetInfo::RulesetInfo(RulesetInfo&&) = default;
DNRManifestData::RulesetInfo& DNRManifestData::RulesetInfo::operator=(
    RulesetInfo&&) = default;

DNRManifestData::DNRManifestData(std::vector<RulesetInfo> rulesets)
    : rulesets(std::move(rulesets)) {
  for (const RulesetInfo& info : this->rulesets)
    manifest_id_to_ruleset_map.emplace(info.manifest_id, &info);
}

DNRManifestData::~DNRManifestData() = default;

// static
const std::vector<DNRManifestData::RulesetInfo>& DNRManifestData::GetRulesets(
    const Extension& extension) {
  // Since we return a reference, use a function local static for the case where
  // the extension didn't specify any rulesets.
  static const base::NoDestructor<std::vector<DNRManifestData::RulesetInfo>>
      empty_vector;

  Extension::ManifestData* data =
      extension.GetManifestData(dnr_api::ManifestKeys::kDeclarativeNetRequest);
  if (!data)
    return *empty_vector;

  return static_cast<DNRManifestData*>(data)->rulesets;
}

const DNRManifestData::ManifestIDToRulesetMap&
DNRManifestData::GetManifestIDToRulesetMap(const Extension& extension) {
  // Since we return a reference, use a function local static for the case where
  // the extension didn't specify any rulesets.
  static const base::NoDestructor<ManifestIDToRulesetMap> empty_map;

  Extension::ManifestData* data =
      extension.GetManifestData(dnr_api::ManifestKeys::kDeclarativeNetRequest);
  if (!data)
    return *empty_map;

  return static_cast<DNRManifestData*>(data)->manifest_id_to_ruleset_map;
}

// static
const DNRManifestData::RulesetInfo& DNRManifestData::GetRuleset(
    const Extension& extension,
    RulesetID ruleset_id) {
  Extension::ManifestData* data =
      extension.GetManifestData(dnr_api::ManifestKeys::kDeclarativeNetRequest);
  DCHECK(data);

  const std::vector<DNRManifestData::RulesetInfo>& rulesets =
      static_cast<DNRManifestData*>(data)->rulesets;

  int index = ruleset_id.value() - kMinValidStaticRulesetID.value();
  CHECK_GE(index, 0);
  CHECK_LT(static_cast<size_t>(index), rulesets.size());

  return rulesets[index];
}

}  // namespace declarative_net_request
}  // namespace extensions