Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(117)

Unified Diff: extensions/common/api/declarative_net_request/ruleset_indexer.cc

Issue 2881453002: DNR Prototype: With flatbuffers
Patch Set: -- Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « extensions/common/api/declarative_net_request/ruleset_indexer.h ('k') | extensions/common/api/schema.gni » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « extensions/common/api/declarative_net_request/ruleset_indexer.h ('k') | extensions/common/api/schema.gni » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698