Chromium Code Reviews| 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..a8e0c78645e32878ce15c947d4a46cf0ffd78659 100644 |
| --- a/components/subresource_filter/content/renderer/document_subresource_filter.cc |
| +++ b/components/subresource_filter/content/renderer/document_subresource_filter.cc |
| @@ -12,15 +12,53 @@ |
| #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( |
|
pkalinnikov
2016/07/22 13:20:03
Please review this conversion carefully.
|
| + blink::WebURLRequest::RequestContext request_context) { |
| + switch (request_context) { |
| + case blink::WebURLRequest::RequestContextAudio: |
| + case blink::WebURLRequest::RequestContextVideo: |
|
engedy
2016/07/22 14:19:58
Also Track
pkalinnikov
2016/07/25 11:41:11
Done.
|
| + return proto::ELEMENT_TYPE_MEDIA; |
| + case blink::WebURLRequest::RequestContextFont: |
| + return proto::ELEMENT_TYPE_FONT; |
| + case blink::WebURLRequest::RequestContextFrame: |
| + case blink::WebURLRequest::RequestContextIframe: |
| + return proto::ELEMENT_TYPE_SUBDOCUMENT; |
| + case blink::WebURLRequest::RequestContextImage: |
|
engedy
2016/07/22 14:19:58
Also ImageSet
pkalinnikov
2016/07/25 11:41:11
Done.
|
| + return proto::ELEMENT_TYPE_IMAGE; |
| + case blink::WebURLRequest::RequestContextObject: |
| + case blink::WebURLRequest::RequestContextPlugin: |
|
engedy
2016/07/22 14:19:58
According to web_url_request_util.cc:68, Embed and
pkalinnikov
2016/07/25 11:41:11
Done.
|
| + return proto::ELEMENT_TYPE_OBJECT; |
| + case blink::WebURLRequest::RequestContextPing: |
|
engedy
2016/07/22 14:19:58
Also Beacon.
pkalinnikov
2016/07/25 11:41:11
Done.
|
| + return proto::ELEMENT_TYPE_PING; |
| + case blink::WebURLRequest::RequestContextScript: |
| + return proto::ELEMENT_TYPE_SCRIPT; |
| + case blink::WebURLRequest::RequestContextStyle: |
| + return proto::ELEMENT_TYPE_STYLESHEET; |
|
engedy
2016/07/22 14:19:58
Let's classify XSLT as a stylesheet too.
pkalinnikov
2016/07/25 11:41:11
Done.
|
| + case blink::WebURLRequest::RequestContextXMLHttpRequest: |
|
engedy
2016/07/22 14:19:58
EventSource and Fetch should probably be considere
pkalinnikov
2016/07/25 11:41:11
Done.
|
| + return proto::ELEMENT_TYPE_XMLHTTPREQUEST; |
| + |
| + case blink::WebURLRequest::RequestContextUnspecified: |
| + return proto::ELEMENT_TYPE_UNSPECIFIED; |
| + default: |
| + return proto::ELEMENT_TYPE_OTHER; |
| + } |
|
engedy
2016/07/22 14:19:58
We'll have to carefully look into CSPReport, Favic
|
| +} |
| + |
| +} // 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 +67,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. |
|
pkalinnikov
2016/07/22 13:20:03
Or check |ancestor_document_rules| once during con
pkalinnikov
2016/07/25 11:47:31
Added comment.
|
| ++num_loads_evaluated_; |
| - if (DoesLoadMatchFilteringRules(GURL(resourceUrl))) { |
| + |
| + url::Origin initiator; |
| + if (!ancestor_document_urls_.empty()) |
| + initiator = url::Origin(ancestor_document_urls_.front()); |
| + const bool load_is_allowed = matcher_.IsAllowed( |
|
engedy
2016/07/22 14:19:58
nit: How about just inlining this?
pkalinnikov
2016/07/25 11:41:11
Done.
|
| + GURL(resourceUrl), initiator, ToElementType(request_context)); |
|
engedy
2016/07/22 14:19:58
Either need to handle invalid URLs here, or verify
pkalinnikov
2016/07/25 11:47:31
The |matcher_| already takes care of invalid GURLs
engedy
2016/07/25 14:06:38
Yes, it has a DCHECK, but then we still need to ve
pkalinnikov
2016/07/25 17:34:54
Wait, I'm talking about IndexedRulesetMatcher::IsA
engedy
2016/07/25 19:47:00
Oh, right, I didn't noticed that. Ack.
|
| + |
| + if (!load_is_allowed) { |
| ++num_loads_matching_rules_; |
| if (activation_state_ == ActivationState::ENABLED) { |
| ++num_loads_disallowed_; |
| @@ -43,14 +90,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 |