| Index: components/subresource_filter/core/common/url_pattern_index.cc
|
| diff --git a/components/subresource_filter/core/common/url_pattern_index.cc b/components/subresource_filter/core/common/url_pattern_index.cc
|
| index 574f577a32533c1d0811f55d579d152c22f0a3d7..0116049a5b82cd2e670a74581c636a4a3359f5ef 100644
|
| --- a/components/subresource_filter/core/common/url_pattern_index.cc
|
| +++ b/components/subresource_filter/core/common/url_pattern_index.cc
|
| @@ -24,6 +24,39 @@ namespace {
|
| using FlatStringOffset = flatbuffers::Offset<flatbuffers::String>;
|
| using FlatDomains = flatbuffers::Vector<FlatStringOffset>;
|
| using FlatDomainsOffset = flatbuffers::Offset<FlatDomains>;
|
| +using ActivationMaskPair =
|
| + std::pair<proto::ActivationType, flat::ActivationType>;
|
| +using ElementTypeMaskPair = std::pair<proto::ElementType, flat::ElementType>;
|
| +
|
| +const ActivationMaskPair kActivationMaskPairs[] = {
|
| + {proto::ACTIVATION_TYPE_DOCUMENT, flat::ActivationType_DOCUMENT},
|
| + {proto::ACTIVATION_TYPE_ELEMHIDE,
|
| + flat::ActivationType_NONE}, // ELEMHIDE is not supported.
|
| + {proto::ACTIVATION_TYPE_GENERICHIDE,
|
| + flat::ActivationType_NONE}, // Generic block is not supported.
|
| + {proto::ACTIVATION_TYPE_GENERICBLOCK, flat::ActivationType_GENERIC_BLOCK},
|
| +};
|
| +
|
| +const ElementTypeMaskPair kElementTypeMaskPairs[] = {
|
| + {proto::ELEMENT_TYPE_OTHER, flat::ElementType_OTHER},
|
| + {proto::ELEMENT_TYPE_SCRIPT, flat::ElementType_SCRIPT},
|
| + {proto::ELEMENT_TYPE_IMAGE, flat::ElementType_IMAGE},
|
| + {proto::ELEMENT_TYPE_STYLESHEET, flat::ElementType_STYLESHEET},
|
| + {proto::ELEMENT_TYPE_OBJECT, flat::ElementType_OBJECT},
|
| + {proto::ELEMENT_TYPE_XMLHTTPREQUEST, flat::ElementType_XMLHTTPREQUEST},
|
| + {proto::ELEMENT_TYPE_OBJECT_SUBREQUEST,
|
| + flat::ElementType_OBJECT}, // Normally we can not distinguish between the
|
| + // main plugin resource and any other loads it
|
| + // makes. We treat them both as OBJECT
|
| + // requests.
|
| + {proto::ELEMENT_TYPE_SUBDOCUMENT, flat::ElementType_SUBDOCUMENT},
|
| + {proto::ELEMENT_TYPE_PING, flat::ElementType_PING},
|
| + {proto::ELEMENT_TYPE_MEDIA, flat::ElementType_MEDIA},
|
| + {proto::ELEMENT_TYPE_FONT, flat::ElementType_FONT},
|
| + {proto::ELEMENT_TYPE_POPUP,
|
| + flat::ElementType_NONE}, // Filterning popups is not supported.
|
| + {proto::ELEMENT_TYPE_WEBSOCKET, flat::ElementType_WEBSOCKET},
|
| +};
|
|
|
| base::StringPiece ToStringPiece(const flatbuffers::String* string) {
|
| DCHECK(string);
|
| @@ -142,6 +175,9 @@ class UrlRuleFlatBufferConverter {
|
| }
|
|
|
| bool InitializeOptions() {
|
| + static_assert(flat::OptionFlag_ANY <= std::numeric_limits<uint8_t>::max(),
|
| + "Option flags can not be stored in uint8_t.");
|
| +
|
| if (rule_.semantics() == proto::RULE_SEMANTICS_WHITELIST) {
|
| options_ |= flat::OptionFlag_IS_WHITELIST;
|
| } else if (rule_.semantics() != proto::RULE_SEMANTICS_BLACKLIST) {
|
| @@ -170,33 +206,27 @@ class UrlRuleFlatBufferConverter {
|
| }
|
|
|
| bool InitializeElementTypes() {
|
| - static_assert(
|
| - proto::ELEMENT_TYPE_ALL <= std::numeric_limits<uint16_t>::max(),
|
| - "Element types can not be stored in uint16_t.");
|
| - element_types_ = static_cast<uint16_t>(rule_.element_types());
|
| + static_assert(flat::ElementType_ANY <= std::numeric_limits<uint16_t>::max(),
|
| + "Element types can not be stored in uint16_t.");
|
|
|
| - // Note: Normally we can not distinguish between the main plugin resource
|
| - // and any other loads it makes. We treat them both as OBJECT requests.
|
| - if (element_types_ & proto::ELEMENT_TYPE_OBJECT_SUBREQUEST)
|
| - element_types_ |= proto::ELEMENT_TYPE_OBJECT;
|
| + element_types_ = flat::ElementType_NONE;
|
|
|
| - // Ignore unknown element types.
|
| - element_types_ &= proto::ELEMENT_TYPE_ALL;
|
| - // Filtering popups is not supported.
|
| - element_types_ &= ~proto::ELEMENT_TYPE_POPUP;
|
| + for (const auto& pair : kElementTypeMaskPairs)
|
| + if (rule_.element_types() & pair.first)
|
| + element_types_ |= pair.second;
|
|
|
| return true;
|
| }
|
|
|
| bool InitializeActivationTypes() {
|
| static_assert(
|
| - proto::ACTIVATION_TYPE_ALL <= std::numeric_limits<uint8_t>::max(),
|
| + flat::ActivationType_ANY <= std::numeric_limits<uint8_t>::max(),
|
| "Activation types can not be stored in uint8_t.");
|
| - activation_types_ = static_cast<uint8_t>(rule_.activation_types());
|
| + activation_types_ = flat::ActivationType_NONE;
|
|
|
| - // Only the following activation types are supported, ignore the others.
|
| - activation_types_ &=
|
| - proto::ACTIVATION_TYPE_DOCUMENT | proto::ACTIVATION_TYPE_GENERICBLOCK;
|
| + for (const auto& pair : kActivationMaskPairs)
|
| + if (rule_.activation_types() & pair.first)
|
| + activation_types_ |= pair.second;
|
|
|
| return true;
|
| }
|
| @@ -407,8 +437,9 @@ size_t GetLongestMatchingSubdomain(const url::Origin& origin,
|
| bool DoesOriginMatchDomainList(const url::Origin& origin,
|
| const flat::UrlRule& rule,
|
| bool disable_generic_rules) {
|
| - const bool is_generic = !rule.domains_included();
|
| - DCHECK(is_generic || rule.domains_included()->size());
|
| + const bool is_generic =
|
| + !rule.domains_included() || !rule.domains_included()->size();
|
| + // DCHECK(is_generic || rule.domains_included()->size());
|
| if (disable_generic_rules && is_generic)
|
| return false;
|
|
|
|
|