Index: components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc |
diff --git a/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f506d419508ee9a57b94430e70b0f7742fac2e31 |
--- /dev/null |
+++ b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc |
@@ -0,0 +1,118 @@ |
+// 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 "components/subresource_filter/content/renderer/web_document_subresource_filter_impl.h" |
+ |
+#include <utility> |
+ |
+#include "components/subresource_filter/core/common/memory_mapped_ruleset.h" |
+#include "components/subresource_filter/core/common/proto/rules.pb.h" |
+ |
+namespace subresource_filter { |
+ |
+namespace { |
+ |
+using BlinkLoadPolicy = blink::WebDocumentSubresourceFilter::LoadPolicy; |
+ |
+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; |
+ } |
+} |
+ |
+BlinkLoadPolicy ToBlinkLoadPolicy(LoadPolicy load_policy) { |
engedy
2017/02/17 16:44:04
By tradition, name this WebLoadPolicy.
pkalinnikov
2017/02/17 17:16:48
Done.
|
+ switch (load_policy) { |
+ case LoadPolicy::ALLOW: |
+ return BlinkLoadPolicy::Allow; |
+ case LoadPolicy::DISALLOW: |
+ return BlinkLoadPolicy::Disallow; |
+ case LoadPolicy::WOULD_DISALLOW: |
+ return BlinkLoadPolicy::WouldDisallow; |
+ } |
+ NOTREACHED(); |
engedy
2017/02/17 16:44:04
nit: Move this under a default: label.
pkalinnikov
2017/02/17 17:16:48
Done.
|
+ return BlinkLoadPolicy::Allow; |
+} |
+ |
+} // namespace |
+ |
+WebDocumentSubresourceFilterImpl::~WebDocumentSubresourceFilterImpl() = default; |
+ |
+WebDocumentSubresourceFilterImpl::WebDocumentSubresourceFilterImpl( |
+ url::Origin document_origin, |
+ ActivationState activation_state, |
+ scoped_refptr<const MemoryMappedRuleset> ruleset, |
+ base::OnceClosure first_disallowed_load_callback) |
+ : filter_(std::move(document_origin), activation_state, std::move(ruleset)), |
engedy
2017/02/17 16:44:04
nit: #include "base/memory/ref_counted.h" for the
pkalinnikov
2017/02/17 17:16:48
Done.
|
+ first_disallowed_load_callback_( |
+ std::move(first_disallowed_load_callback)) {} |
+ |
+blink::WebDocumentSubresourceFilter::LoadPolicy |
+WebDocumentSubresourceFilterImpl::getLoadPolicy( |
+ const blink::WebURL& resourceUrl, |
+ blink::WebURLRequest::RequestContext request_context) { |
+ ++filter_.statistics().num_loads_total; |
+ |
+ if (filter_.activation_state().filtering_disabled_for_document) |
+ return BlinkLoadPolicy::Allow; |
+ if (resourceUrl.protocolIs(url::kDataScheme)) |
+ return BlinkLoadPolicy::Allow; |
+ |
+ // TODO(pkalinnikov): Would be good to avoid converting to GURL. |
+ return ToBlinkLoadPolicy( |
+ filter_.GetLoadPolicy(GURL(resourceUrl), ToElementType(request_context))); |
+} |
+ |
+void WebDocumentSubresourceFilterImpl::reportDisallowedLoad() { |
+ if (!first_disallowed_load_callback_.is_null()) |
+ std::move(first_disallowed_load_callback_).Run(); |
+} |
+ |
+} // namespace subresource_filter |