OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/subresource_filter/content/common/document_subresource_filt
er.h" | 5 #include "components/subresource_filter/core/common/document_subresource_filter.
h" |
6 | 6 |
7 #include <climits> | 7 #include <utility> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/strings/string_piece.h" | |
11 #include "base/strings/string_util.h" | |
12 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
13 #include "components/subresource_filter/core/common/first_party_origin.h" | 11 #include "components/subresource_filter/core/common/first_party_origin.h" |
14 #include "components/subresource_filter/core/common/memory_mapped_ruleset.h" | 12 #include "components/subresource_filter/core/common/memory_mapped_ruleset.h" |
15 #include "components/subresource_filter/core/common/scoped_timers.h" | 13 #include "components/subresource_filter/core/common/scoped_timers.h" |
16 #include "components/subresource_filter/core/common/time_measurements.h" | 14 #include "components/subresource_filter/core/common/time_measurements.h" |
17 #include "third_party/WebKit/public/platform/WebURL.h" | 15 #include "url/gurl.h" |
| 16 #include "url/origin.h" |
18 | 17 |
19 namespace subresource_filter { | 18 namespace subresource_filter { |
20 | 19 |
21 namespace { | 20 namespace { |
22 | 21 |
23 proto::ElementType ToElementType( | |
24 blink::WebURLRequest::RequestContext request_context) { | |
25 switch (request_context) { | |
26 case blink::WebURLRequest::RequestContextAudio: | |
27 case blink::WebURLRequest::RequestContextVideo: | |
28 case blink::WebURLRequest::RequestContextTrack: | |
29 return proto::ELEMENT_TYPE_MEDIA; | |
30 case blink::WebURLRequest::RequestContextBeacon: | |
31 case blink::WebURLRequest::RequestContextPing: | |
32 return proto::ELEMENT_TYPE_PING; | |
33 case blink::WebURLRequest::RequestContextEmbed: | |
34 case blink::WebURLRequest::RequestContextObject: | |
35 case blink::WebURLRequest::RequestContextPlugin: | |
36 return proto::ELEMENT_TYPE_OBJECT; | |
37 case blink::WebURLRequest::RequestContextEventSource: | |
38 case blink::WebURLRequest::RequestContextFetch: | |
39 case blink::WebURLRequest::RequestContextXMLHttpRequest: | |
40 return proto::ELEMENT_TYPE_XMLHTTPREQUEST; | |
41 case blink::WebURLRequest::RequestContextFavicon: | |
42 case blink::WebURLRequest::RequestContextImage: | |
43 case blink::WebURLRequest::RequestContextImageSet: | |
44 return proto::ELEMENT_TYPE_IMAGE; | |
45 case blink::WebURLRequest::RequestContextFont: | |
46 return proto::ELEMENT_TYPE_FONT; | |
47 case blink::WebURLRequest::RequestContextFrame: | |
48 case blink::WebURLRequest::RequestContextForm: | |
49 case blink::WebURLRequest::RequestContextHyperlink: | |
50 case blink::WebURLRequest::RequestContextIframe: | |
51 case blink::WebURLRequest::RequestContextInternal: | |
52 case blink::WebURLRequest::RequestContextLocation: | |
53 return proto::ELEMENT_TYPE_SUBDOCUMENT; | |
54 case blink::WebURLRequest::RequestContextScript: | |
55 case blink::WebURLRequest::RequestContextServiceWorker: | |
56 case blink::WebURLRequest::RequestContextSharedWorker: | |
57 return proto::ELEMENT_TYPE_SCRIPT; | |
58 case blink::WebURLRequest::RequestContextStyle: | |
59 case blink::WebURLRequest::RequestContextXSLT: | |
60 return proto::ELEMENT_TYPE_STYLESHEET; | |
61 | |
62 case blink::WebURLRequest::RequestContextPrefetch: | |
63 case blink::WebURLRequest::RequestContextSubresource: | |
64 return proto::ELEMENT_TYPE_OTHER; | |
65 | |
66 case blink::WebURLRequest::RequestContextCSPReport: | |
67 case blink::WebURLRequest::RequestContextDownload: | |
68 case blink::WebURLRequest::RequestContextImport: | |
69 case blink::WebURLRequest::RequestContextManifest: | |
70 case blink::WebURLRequest::RequestContextUnspecified: | |
71 default: | |
72 return proto::ELEMENT_TYPE_UNSPECIFIED; | |
73 } | |
74 } | |
75 | |
76 ActivationState ComputeActivationStateImpl( | 22 ActivationState ComputeActivationStateImpl( |
77 const GURL& document_url, | 23 const GURL& document_url, |
78 const url::Origin& parent_document_origin, | 24 const url::Origin& parent_document_origin, |
79 const ActivationState& parent_activation_state, | 25 const ActivationState& parent_activation_state, |
80 const IndexedRulesetMatcher& matcher) { | 26 const IndexedRulesetMatcher& matcher) { |
81 ActivationState activation_state = parent_activation_state; | 27 ActivationState activation_state = parent_activation_state; |
82 if (activation_state.filtering_disabled_for_document) | 28 if (activation_state.filtering_disabled_for_document) |
83 return activation_state; | 29 return activation_state; |
84 | 30 |
85 // TODO(pkalinnikov): Match several activation types in a batch. | 31 // TODO(pkalinnikov): Match several activation types in a batch. |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 document_url, parent_document_origin, activation_state, matcher); | 80 document_url, parent_document_origin, activation_state, matcher); |
135 parent_document_origin = url::Origin(document_url); | 81 parent_document_origin = url::Origin(document_url); |
136 } | 82 } |
137 | 83 |
138 return activation_state; | 84 return activation_state; |
139 } | 85 } |
140 | 86 |
141 DocumentSubresourceFilter::DocumentSubresourceFilter( | 87 DocumentSubresourceFilter::DocumentSubresourceFilter( |
142 url::Origin document_origin, | 88 url::Origin document_origin, |
143 ActivationState activation_state, | 89 ActivationState activation_state, |
144 scoped_refptr<const MemoryMappedRuleset> ruleset, | 90 scoped_refptr<const MemoryMappedRuleset> ruleset) |
145 base::OnceClosure first_disallowed_load_callback) | |
146 : activation_state_(activation_state), | 91 : activation_state_(activation_state), |
147 ruleset_(std::move(ruleset)), | 92 ruleset_(std::move(ruleset)), |
148 ruleset_matcher_(ruleset_->data(), ruleset_->length()), | 93 ruleset_matcher_(ruleset_->data(), ruleset_->length()) { |
149 first_disallowed_load_callback_( | |
150 std::move(first_disallowed_load_callback)) { | |
151 DCHECK_NE(activation_state_.activation_level, ActivationLevel::DISABLED); | 94 DCHECK_NE(activation_state_.activation_level, ActivationLevel::DISABLED); |
152 if (!activation_state_.filtering_disabled_for_document) | 95 if (!activation_state_.filtering_disabled_for_document) |
153 document_origin_.reset(new FirstPartyOrigin(std::move(document_origin))); | 96 document_origin_.reset(new FirstPartyOrigin(std::move(document_origin))); |
154 } | 97 } |
155 | 98 |
156 DocumentSubresourceFilter::~DocumentSubresourceFilter() = default; | 99 DocumentSubresourceFilter::~DocumentSubresourceFilter() = default; |
157 | 100 |
158 blink::WebDocumentSubresourceFilter::LoadPolicy | 101 LoadPolicy DocumentSubresourceFilter::GetLoadPolicy( |
159 DocumentSubresourceFilter::getLoadPolicy( | 102 const GURL& subresource_url, |
160 const blink::WebURL& resourceUrl, | 103 proto::ElementType subresource_type) { |
161 blink::WebURLRequest::RequestContext request_context) { | 104 TRACE_EVENT1("loader", "DocumentSubresourceFilter::GetLoadPolicy", "url", |
| 105 subresource_url.spec()); |
| 106 |
162 ++statistics_.num_loads_total; | 107 ++statistics_.num_loads_total; |
163 | 108 |
164 if (activation_state_.filtering_disabled_for_document) | 109 if (activation_state_.filtering_disabled_for_document) |
165 return Allow; | 110 return LoadPolicy::ALLOW; |
166 if (resourceUrl.protocolIs(url::kDataScheme)) | 111 if (subresource_url.SchemeIs(url::kDataScheme)) |
167 return Allow; | 112 return LoadPolicy::ALLOW; |
168 | |
169 // TODO(pkalinnikov): Would be good to avoid converting to GURL. | |
170 return EvaluateLoadPolicy(GURL(resourceUrl), ToElementType(request_context)); | |
171 } | |
172 | |
173 blink::WebDocumentSubresourceFilter::LoadPolicy | |
174 DocumentSubresourceFilter::GetLoadPolicyForSubdocument( | |
175 const GURL& subdocument_url) { | |
176 ++statistics_.num_loads_total; | |
177 | |
178 if (activation_state_.filtering_disabled_for_document) | |
179 return Allow; | |
180 if (subdocument_url.SchemeIs(url::kDataScheme)) | |
181 return Allow; | |
182 return EvaluateLoadPolicy(subdocument_url, proto::ELEMENT_TYPE_SUBDOCUMENT); | |
183 } | |
184 | |
185 void DocumentSubresourceFilter::reportDisallowedLoad() { | |
186 if (first_disallowed_load_callback_.is_null()) | |
187 return; | |
188 std::move(first_disallowed_load_callback_).Run(); | |
189 } | |
190 | |
191 blink::WebDocumentSubresourceFilter::LoadPolicy | |
192 DocumentSubresourceFilter::EvaluateLoadPolicy(const GURL& resource_url, | |
193 proto::ElementType element_type) { | |
194 TRACE_EVENT1("loader", "DocumentSubresourceFilter::EvaluateLoadPolicy", "url", | |
195 resource_url.spec()); | |
196 | 113 |
197 auto wall_duration_timer = ScopedTimers::StartIf( | 114 auto wall_duration_timer = ScopedTimers::StartIf( |
198 activation_state_.measure_performance && | 115 activation_state_.measure_performance && |
199 ScopedThreadTimers::IsSupported(), | 116 ScopedThreadTimers::IsSupported(), |
200 [this](base::TimeDelta delta) { | 117 [this](base::TimeDelta delta) { |
201 statistics_.evaluation_total_wall_duration += delta; | 118 statistics_.evaluation_total_wall_duration += delta; |
202 UMA_HISTOGRAM_MICRO_TIMES( | 119 UMA_HISTOGRAM_MICRO_TIMES( |
203 "SubresourceFilter.SubresourceLoad.Evaluation.WallDuration", delta); | 120 "SubresourceFilter.SubresourceLoad.Evaluation.WallDuration", delta); |
204 }); | 121 }); |
205 auto cpu_duration_timer = ScopedThreadTimers::StartIf( | 122 auto cpu_duration_timer = ScopedThreadTimers::StartIf( |
206 activation_state_.measure_performance, [this](base::TimeDelta delta) { | 123 activation_state_.measure_performance, [this](base::TimeDelta delta) { |
207 statistics_.evaluation_total_cpu_duration += delta; | 124 statistics_.evaluation_total_cpu_duration += delta; |
208 UMA_HISTOGRAM_MICRO_TIMES( | 125 UMA_HISTOGRAM_MICRO_TIMES( |
209 "SubresourceFilter.SubresourceLoad.Evaluation.CPUDuration", delta); | 126 "SubresourceFilter.SubresourceLoad.Evaluation.CPUDuration", delta); |
210 }); | 127 }); |
211 | 128 |
212 ++statistics_.num_loads_evaluated; | 129 ++statistics_.num_loads_evaluated; |
213 DCHECK(document_origin_); | 130 DCHECK(document_origin_); |
214 if (ruleset_matcher_.ShouldDisallowResourceLoad( | 131 if (ruleset_matcher_.ShouldDisallowResourceLoad( |
215 resource_url, *document_origin_, element_type, | 132 subresource_url, *document_origin_, subresource_type, |
216 activation_state_.generic_blocking_rules_disabled)) { | 133 activation_state_.generic_blocking_rules_disabled)) { |
217 ++statistics_.num_loads_matching_rules; | 134 ++statistics_.num_loads_matching_rules; |
218 if (activation_state_.activation_level == ActivationLevel::ENABLED) { | 135 if (activation_state_.activation_level == ActivationLevel::ENABLED) { |
219 ++statistics_.num_loads_disallowed; | 136 ++statistics_.num_loads_disallowed; |
220 return Disallow; | 137 return LoadPolicy::DISALLOW; |
221 } else if (activation_state_.activation_level == ActivationLevel::DRYRUN) { | 138 } else if (activation_state_.activation_level == ActivationLevel::DRYRUN) { |
222 return WouldDisallow; | 139 return LoadPolicy::WOULD_DISALLOW; |
223 } | 140 } |
224 } | 141 } |
225 return Allow; | 142 return LoadPolicy::ALLOW; |
226 } | 143 } |
227 | 144 |
228 } // namespace subresource_filter | 145 } // namespace subresource_filter |
OLD | NEW |