| Index: extensions/common/api/declarative_net_request/ruleset_indexer.cc
|
| diff --git a/extensions/common/api/declarative_net_request/ruleset_indexer.cc b/extensions/common/api/declarative_net_request/ruleset_indexer.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c1a6e1e9571a9e7330eb5af1a21fe84a61987936
|
| --- /dev/null
|
| +++ b/extensions/common/api/declarative_net_request/ruleset_indexer.cc
|
| @@ -0,0 +1,147 @@
|
| +// Copyright 2017 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/api/declarative_net_request/ruleset_indexer.h"
|
| +
|
| +#include <algorithm>
|
| +
|
| +#include "base/numerics/safe_conversions.h"
|
| +#include "components/subresource_filter/core/common/flat/url_pattern_index_generated.h"
|
| +#include "extensions/common/api/declarative_net_request.h"
|
| +#include "extensions/common/api/declarative_net_request/constants.h"
|
| +#include "extensions/common/api/declarative_net_request/indexed_rule.h"
|
| +
|
| +namespace extensions {
|
| +namespace declarative_net_request {
|
| +
|
| +namespace {
|
| +using UrlRule = ::subresource_filter::flat::UrlRule;
|
| +using UrlRuleOffset = ::flatbuffers::Offset<UrlRule>;
|
| +using FlatStringOffset = ::flatbuffers::Offset<flatbuffers::String>;
|
| +using FlatStringListOffset =
|
| + ::flatbuffers::Offset<flatbuffers::Vector<FlatStringOffset>>;
|
| +
|
| +FlatStringListOffset CreateVectorOfSharedStrings(
|
| + flatbuffers::FlatBufferBuilder* builder_,
|
| + const std::vector<std::string>& vec) {
|
| + std::vector<FlatStringOffset> offsets(vec.size());
|
| + for (size_t i = 0; i < vec.size(); i++)
|
| + offsets[i] = builder_->CreateSharedString(vec[i]);
|
| + return builder_->CreateVector(offsets);
|
| +}
|
| +
|
| +api::declarative_net_request::RuleActionType GetRuleActionType(
|
| + const IndexedRule& indexed_rule) {
|
| + if (indexed_rule.options & OptionFlag::OptionFlag_IS_WHITELIST)
|
| + return api::declarative_net_request::RULE_ACTION_TYPE_WHITELIST;
|
| + if (!indexed_rule.redirect_url.empty())
|
| + return api::declarative_net_request::RULE_ACTION_TYPE_REDIRECT;
|
| + return api::declarative_net_request::RULE_ACTION_TYPE_BLOCK;
|
| +}
|
| +
|
| +// std::string string_to_hex(const std::string& input)
|
| +// {
|
| +// static const char* const lut = "0123456789ABCDEF";
|
| +// size_t len = input.length();
|
| +
|
| +// std::string output;
|
| +// output.reserve(2 * len);
|
| +// for (size_t i = 0; i < len; ++i)
|
| +// {
|
| +// const unsigned char c = input[i];
|
| +// output.push_back(lut[c >> 4]);
|
| +// output.push_back(lut[c & 15]);
|
| +// }
|
| +// return output;
|
| +// }
|
| +}
|
| +
|
| +RulesetIndexer::RulesetIndexer()
|
| + : blacklist_index_builder_(&builder_),
|
| + whitelist_index_builder_(&builder_),
|
| + redirect_index_builder_(&builder_),
|
| + finished_(false) {}
|
| +
|
| +RulesetIndexer::~RulesetIndexer() = default;
|
| +
|
| +ParseResult RulesetIndexer::AddUrlRule(const IndexedRule& indexed_rule) {
|
| + cnt_++;
|
| + DCHECK(std::is_sorted(indexed_rule.domains_included.begin(),
|
| + indexed_rule.domains_included.end()));
|
| + DCHECK(std::is_sorted(indexed_rule.domains_excluded.begin(),
|
| + indexed_rule.domains_excluded.end()));
|
| + DCHECK_NE(UrlPatternType::UrlPatternType_REGEXP,
|
| + indexed_rule.url_pattern_type);
|
| + DCHECK(!(indexed_rule.element_types &
|
| + (ElementType::ElementType_OBJECT_SUBREQUEST |
|
| + ElementType::ElementType_POPUP)));
|
| +
|
| + auto domains_included_offset =
|
| + CreateVectorOfSharedStrings(&builder_, indexed_rule.domains_included);
|
| + auto domains_excluded_offset =
|
| + CreateVectorOfSharedStrings(&builder_, indexed_rule.domains_excluded);
|
| + auto url_pattern_offset =
|
| + builder_.CreateSharedString(indexed_rule.url_pattern);
|
| + UrlRuleOffset offset = subresource_filter::flat::CreateUrlRule(
|
| + builder_, indexed_rule.options, indexed_rule.element_types,
|
| + indexed_rule.activation_types, indexed_rule.url_pattern_type,
|
| + indexed_rule.anchor_left, indexed_rule.anchor_right,
|
| + domains_included_offset, domains_excluded_offset, url_pattern_offset,
|
| + indexed_rule.id, indexed_rule.priority);
|
| + const api::declarative_net_request::RuleActionType type =
|
| + GetRuleActionType(indexed_rule);
|
| + GetBuilder(type)->IndexUrlRule(offset);
|
| +
|
| + if (type == api::declarative_net_request::RULE_ACTION_TYPE_REDIRECT) {
|
| + DCHECK(!indexed_rule.redirect_url.empty());
|
| + auto redirect_url_offset =
|
| + builder_.CreateSharedString(indexed_rule.redirect_url);
|
| + metadata_.push_back(flat::CreateExtensionRuleMetadata(
|
| + builder_, indexed_rule.id, redirect_url_offset));
|
| + }
|
| + return ParseResult::SUCCESS;
|
| +}
|
| +
|
| +RulesetIndexer::SerializedData RulesetIndexer::FinishAndGetData() {
|
| + if (!finished_) {
|
| + finished_ = true;
|
| + auto blacklist_index_offset = blacklist_index_builder_.Finish();
|
| + auto whitelist_index_offset = whitelist_index_builder_.Finish();
|
| + auto redirect_index_offset = redirect_index_builder_.Finish();
|
| + // TODO why does this take a pointer?
|
| + auto extension_metadata_offset =
|
| + builder_.CreateVectorOfSortedTables(&metadata_);
|
| +
|
| + auto root_offset = flat::CreateExtensionIndexedRuleset(
|
| + builder_, blacklist_index_offset, whitelist_index_offset,
|
| + redirect_index_offset, extension_metadata_offset);
|
| + flat::FinishExtensionIndexedRulesetBuffer(builder_, root_offset);
|
| + }
|
| + LOG(ERROR) << "--------cnt_ " << cnt_ << "\n";
|
| + return SerializedData(builder_.GetBufferPointer(),
|
| + base::strict_cast<size_t>(builder_.GetSize()));
|
| +}
|
| +
|
| +RulesetIndexer::UrlPatternIndexBuilder* RulesetIndexer::GetBuilder(
|
| + api::declarative_net_request::RuleActionType type) {
|
| + switch (type) {
|
| + case api::declarative_net_request::RULE_ACTION_TYPE_BLOCK:
|
| + return &blacklist_index_builder_;
|
| + case api::declarative_net_request::RULE_ACTION_TYPE_WHITELIST:
|
| + return &whitelist_index_builder_;
|
| + case api::declarative_net_request::RULE_ACTION_TYPE_REDIRECT:
|
| + return &redirect_index_builder_;
|
| + case api::declarative_net_request::RULE_ACTION_TYPE_NONE:
|
| + NOTREACHED();
|
| + }
|
| + return nullptr;
|
| +}
|
| +
|
| +bool VerifyRuleset(const RulesetIndexer::SerializedData& data) {
|
| + flatbuffers::Verifier verifier(data.first, data.second);
|
| + return flat::VerifyExtensionIndexedRulesetBuffer(verifier);
|
| +}
|
| +
|
| +} // namespace declarative_net_request
|
| +} // namespace extensions
|
|
|