| Index: components/subresource_filter/content/renderer/document_subresource_filter.cc
|
| diff --git a/components/subresource_filter/content/renderer/document_subresource_filter.cc b/components/subresource_filter/content/renderer/document_subresource_filter.cc
|
| index f1e4fcebce86070a5773899b2e311ad1a8191a18..7f48ef5f6604400684a84ed58e598239060161ea 100644
|
| --- a/components/subresource_filter/content/renderer/document_subresource_filter.cc
|
| +++ b/components/subresource_filter/content/renderer/document_subresource_filter.cc
|
| @@ -12,15 +12,74 @@
|
| #include "base/trace_event/trace_event.h"
|
| #include "components/subresource_filter/core/common/memory_mapped_ruleset.h"
|
| #include "third_party/WebKit/public/platform/WebURL.h"
|
| -#include "url/gurl.h"
|
|
|
| namespace subresource_filter {
|
|
|
| +namespace {
|
| +
|
| +proto::ElementType ToElementType(
|
| + blink::WebURLRequest::RequestContext request_context) {
|
| + switch (request_context) {
|
| + case blink::WebURLRequest::RequestContextAudio:
|
| + case blink::WebURLRequest::RequestContextVideo:
|
| + case blink::WebURLRequest::RequestContextTrack:
|
| + return proto::ELEMENT_TYPE_MEDIA;
|
| + case blink::WebURLRequest::RequestContextBeacon:
|
| + case blink::WebURLRequest::RequestContextPing:
|
| + return proto::ELEMENT_TYPE_PING;
|
| + case blink::WebURLRequest::RequestContextEmbed:
|
| + case blink::WebURLRequest::RequestContextObject:
|
| + case blink::WebURLRequest::RequestContextPlugin:
|
| + return proto::ELEMENT_TYPE_OBJECT;
|
| + case blink::WebURLRequest::RequestContextEventSource:
|
| + case blink::WebURLRequest::RequestContextFetch:
|
| + case blink::WebURLRequest::RequestContextXMLHttpRequest:
|
| + return proto::ELEMENT_TYPE_XMLHTTPREQUEST;
|
| + case blink::WebURLRequest::RequestContextFavicon:
|
| + case blink::WebURLRequest::RequestContextImage:
|
| + case blink::WebURLRequest::RequestContextImageSet:
|
| + return proto::ELEMENT_TYPE_IMAGE;
|
| + case blink::WebURLRequest::RequestContextFont:
|
| + return proto::ELEMENT_TYPE_FONT;
|
| + case blink::WebURLRequest::RequestContextFrame:
|
| + case blink::WebURLRequest::RequestContextForm:
|
| + case blink::WebURLRequest::RequestContextHyperlink:
|
| + case blink::WebURLRequest::RequestContextIframe:
|
| + case blink::WebURLRequest::RequestContextInternal:
|
| + case blink::WebURLRequest::RequestContextLocation:
|
| + return proto::ELEMENT_TYPE_SUBDOCUMENT;
|
| + case blink::WebURLRequest::RequestContextScript:
|
| + case blink::WebURLRequest::RequestContextServiceWorker:
|
| + case blink::WebURLRequest::RequestContextSharedWorker:
|
| + return proto::ELEMENT_TYPE_SCRIPT;
|
| + case blink::WebURLRequest::RequestContextStyle:
|
| + case blink::WebURLRequest::RequestContextXSLT:
|
| + return proto::ELEMENT_TYPE_STYLESHEET;
|
| +
|
| + case blink::WebURLRequest::RequestContextPrefetch:
|
| + case blink::WebURLRequest::RequestContextSubresource:
|
| + return proto::ELEMENT_TYPE_OTHER;
|
| +
|
| + case blink::WebURLRequest::RequestContextCSPReport:
|
| + case blink::WebURLRequest::RequestContextDownload:
|
| + case blink::WebURLRequest::RequestContextImport:
|
| + case blink::WebURLRequest::RequestContextManifest:
|
| + case blink::WebURLRequest::RequestContextUnspecified:
|
| + default:
|
| + return proto::ELEMENT_TYPE_UNSPECIFIED;
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| DocumentSubresourceFilter::DocumentSubresourceFilter(
|
| ActivationState activation_state,
|
| const scoped_refptr<const MemoryMappedRuleset>& ruleset,
|
| - std::vector<GURL> /* ignored_ancestor_document_urls */)
|
| - : activation_state_(activation_state), ruleset_(ruleset) {
|
| + std::vector<GURL> ancestor_document_urls)
|
| + : activation_state_(activation_state),
|
| + ruleset_(ruleset),
|
| + matcher_(ruleset_->data(), ruleset_->length()),
|
| + ancestor_document_urls_(std::move(ancestor_document_urls)) {
|
| DCHECK_NE(activation_state_, ActivationState::DISABLED);
|
| DCHECK(ruleset);
|
| }
|
| @@ -29,11 +88,20 @@ DocumentSubresourceFilter::~DocumentSubresourceFilter() = default;
|
|
|
| bool DocumentSubresourceFilter::allowLoad(
|
| const blink::WebURL& resourceUrl,
|
| - blink::WebURLRequest::RequestContext /* ignored */) {
|
| + blink::WebURLRequest::RequestContext request_context) {
|
| TRACE_EVENT1("loader", "DocumentSubresourceFilter::allowLoad", "url",
|
| resourceUrl.string().utf8());
|
| +
|
| + // TODO(pkalinnikov): Check all |ancestor_document_urls| for activation bit
|
| + // here or once in the constructor.
|
| ++num_loads_evaluated_;
|
| - if (DoesLoadMatchFilteringRules(GURL(resourceUrl))) {
|
| +
|
| + url::Origin initiator;
|
| + if (!ancestor_document_urls_.empty())
|
| + initiator = url::Origin(ancestor_document_urls_.front());
|
| +
|
| + if (!matcher_.IsAllowed(GURL(resourceUrl), initiator,
|
| + ToElementType(request_context))) {
|
| ++num_loads_matching_rules_;
|
| if (activation_state_ == ActivationState::ENABLED) {
|
| ++num_loads_disallowed_;
|
| @@ -43,14 +111,4 @@ bool DocumentSubresourceFilter::allowLoad(
|
| return true;
|
| }
|
|
|
| -bool DocumentSubresourceFilter::DoesLoadMatchFilteringRules(
|
| - const GURL& resource_url) {
|
| - static_assert(CHAR_BIT == 8, "Assumed char was 8 bits.");
|
| - base::StringPiece disallowed_suffix = base::StringPiece(
|
| - reinterpret_cast<const char*>(ruleset_->data()), ruleset_->length());
|
| - return !disallowed_suffix.empty() &&
|
| - base::EndsWith(resource_url.path_piece(), disallowed_suffix,
|
| - base::CompareCase::SENSITIVE);
|
| -}
|
| -
|
| } // namespace subresource_filter
|
|
|