OLD | NEW |
(Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "components/subresource_filter/content/renderer/web_document_subresourc
e_filter_impl.h" |
| 6 |
| 7 #include <utility> |
| 8 |
| 9 #include "base/memory/ref_counted.h" |
| 10 #include "components/subresource_filter/core/common/activation_state.h" |
| 11 #include "components/subresource_filter/core/common/memory_mapped_ruleset.h" |
| 12 #include "components/subresource_filter/core/common/proto/rules.pb.h" |
| 13 #include "third_party/WebKit/public/platform/WebURL.h" |
| 14 #include "third_party/WebKit/public/platform/WebURLRequest.h" |
| 15 #include "url/gurl.h" |
| 16 #include "url/origin.h" |
| 17 |
| 18 namespace subresource_filter { |
| 19 |
| 20 namespace { |
| 21 |
| 22 using WebLoadPolicy = blink::WebDocumentSubresourceFilter::LoadPolicy; |
| 23 |
| 24 proto::ElementType ToElementType( |
| 25 blink::WebURLRequest::RequestContext request_context) { |
| 26 switch (request_context) { |
| 27 case blink::WebURLRequest::RequestContextAudio: |
| 28 case blink::WebURLRequest::RequestContextVideo: |
| 29 case blink::WebURLRequest::RequestContextTrack: |
| 30 return proto::ELEMENT_TYPE_MEDIA; |
| 31 case blink::WebURLRequest::RequestContextBeacon: |
| 32 case blink::WebURLRequest::RequestContextPing: |
| 33 return proto::ELEMENT_TYPE_PING; |
| 34 case blink::WebURLRequest::RequestContextEmbed: |
| 35 case blink::WebURLRequest::RequestContextObject: |
| 36 case blink::WebURLRequest::RequestContextPlugin: |
| 37 return proto::ELEMENT_TYPE_OBJECT; |
| 38 case blink::WebURLRequest::RequestContextEventSource: |
| 39 case blink::WebURLRequest::RequestContextFetch: |
| 40 case blink::WebURLRequest::RequestContextXMLHttpRequest: |
| 41 return proto::ELEMENT_TYPE_XMLHTTPREQUEST; |
| 42 case blink::WebURLRequest::RequestContextFavicon: |
| 43 case blink::WebURLRequest::RequestContextImage: |
| 44 case blink::WebURLRequest::RequestContextImageSet: |
| 45 return proto::ELEMENT_TYPE_IMAGE; |
| 46 case blink::WebURLRequest::RequestContextFont: |
| 47 return proto::ELEMENT_TYPE_FONT; |
| 48 case blink::WebURLRequest::RequestContextFrame: |
| 49 case blink::WebURLRequest::RequestContextForm: |
| 50 case blink::WebURLRequest::RequestContextHyperlink: |
| 51 case blink::WebURLRequest::RequestContextIframe: |
| 52 case blink::WebURLRequest::RequestContextInternal: |
| 53 case blink::WebURLRequest::RequestContextLocation: |
| 54 return proto::ELEMENT_TYPE_SUBDOCUMENT; |
| 55 case blink::WebURLRequest::RequestContextScript: |
| 56 case blink::WebURLRequest::RequestContextServiceWorker: |
| 57 case blink::WebURLRequest::RequestContextSharedWorker: |
| 58 return proto::ELEMENT_TYPE_SCRIPT; |
| 59 case blink::WebURLRequest::RequestContextStyle: |
| 60 case blink::WebURLRequest::RequestContextXSLT: |
| 61 return proto::ELEMENT_TYPE_STYLESHEET; |
| 62 |
| 63 case blink::WebURLRequest::RequestContextPrefetch: |
| 64 case blink::WebURLRequest::RequestContextSubresource: |
| 65 return proto::ELEMENT_TYPE_OTHER; |
| 66 |
| 67 case blink::WebURLRequest::RequestContextCSPReport: |
| 68 case blink::WebURLRequest::RequestContextDownload: |
| 69 case blink::WebURLRequest::RequestContextImport: |
| 70 case blink::WebURLRequest::RequestContextManifest: |
| 71 case blink::WebURLRequest::RequestContextUnspecified: |
| 72 default: |
| 73 return proto::ELEMENT_TYPE_UNSPECIFIED; |
| 74 } |
| 75 } |
| 76 |
| 77 WebLoadPolicy ToWebLoadPolicy(LoadPolicy load_policy) { |
| 78 switch (load_policy) { |
| 79 case LoadPolicy::ALLOW: |
| 80 return WebLoadPolicy::Allow; |
| 81 case LoadPolicy::DISALLOW: |
| 82 return WebLoadPolicy::Disallow; |
| 83 case LoadPolicy::WOULD_DISALLOW: |
| 84 return WebLoadPolicy::WouldDisallow; |
| 85 default: |
| 86 NOTREACHED(); |
| 87 return WebLoadPolicy::Allow; |
| 88 } |
| 89 } |
| 90 |
| 91 } // namespace |
| 92 |
| 93 WebDocumentSubresourceFilterImpl::~WebDocumentSubresourceFilterImpl() = default; |
| 94 |
| 95 WebDocumentSubresourceFilterImpl::WebDocumentSubresourceFilterImpl( |
| 96 url::Origin document_origin, |
| 97 ActivationState activation_state, |
| 98 scoped_refptr<const MemoryMappedRuleset> ruleset, |
| 99 base::OnceClosure first_disallowed_load_callback) |
| 100 : filter_(std::move(document_origin), activation_state, std::move(ruleset)), |
| 101 first_disallowed_load_callback_( |
| 102 std::move(first_disallowed_load_callback)) {} |
| 103 |
| 104 blink::WebDocumentSubresourceFilter::LoadPolicy |
| 105 WebDocumentSubresourceFilterImpl::getLoadPolicy( |
| 106 const blink::WebURL& resourceUrl, |
| 107 blink::WebURLRequest::RequestContext request_context) { |
| 108 if (filter_.activation_state().filtering_disabled_for_document || |
| 109 resourceUrl.protocolIs(url::kDataScheme)) { |
| 110 ++filter_.statistics().num_loads_total; |
| 111 return WebLoadPolicy::Allow; |
| 112 } |
| 113 |
| 114 // TODO(pkalinnikov): Would be good to avoid converting to GURL. |
| 115 return ToWebLoadPolicy( |
| 116 filter_.GetLoadPolicy(GURL(resourceUrl), ToElementType(request_context))); |
| 117 } |
| 118 |
| 119 void WebDocumentSubresourceFilterImpl::reportDisallowedLoad() { |
| 120 if (!first_disallowed_load_callback_.is_null()) |
| 121 std::move(first_disallowed_load_callback_).Run(); |
| 122 } |
| 123 |
| 124 } // namespace subresource_filter |
OLD | NEW |