Index: components/subresource_filter/content/renderer/subresource_filter_agent.cc |
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent.cc b/components/subresource_filter/content/renderer/subresource_filter_agent.cc |
index 4330a5e6e410e6c310e9d0139408cbc283d58168..b7b7ccae80c6b3d2058a53825b16d524d7ab75e5 100644 |
--- a/components/subresource_filter/content/renderer/subresource_filter_agent.cc |
+++ b/components/subresource_filter/content/renderer/subresource_filter_agent.cc |
@@ -4,65 +4,52 @@ |
#include "components/subresource_filter/content/renderer/subresource_filter_agent.h" |
-#include <climits> |
- |
+#include "base/logging.h" |
#include "base/memory/ref_counted.h" |
-#include "base/strings/string_piece.h" |
-#include "base/strings/string_util.h" |
#include "components/subresource_filter/content/common/subresource_filter_messages.h" |
+#include "components/subresource_filter/content/renderer/document_subresource_filter.h" |
#include "components/subresource_filter/content/renderer/ruleset_dealer.h" |
#include "components/subresource_filter/core/common/memory_mapped_ruleset.h" |
#include "content/public/renderer/render_frame.h" |
#include "ipc/ipc_message.h" |
-#include "third_party/WebKit/public/platform/WebDocumentSubresourceFilter.h" |
-#include "third_party/WebKit/public/platform/WebURL.h" |
-#include "third_party/WebKit/public/platform/WebURLRequest.h" |
#include "third_party/WebKit/public/web/WebDataSource.h" |
+#include "third_party/WebKit/public/web/WebDocument.h" |
#include "third_party/WebKit/public/web/WebLocalFrame.h" |
+#include "url/gurl.h" |
namespace subresource_filter { |
-namespace { |
- |
-// Placeholder subresource filter implementation that treats the entire ruleset |
-// as the UTF-8 representation of a string, and will disallow subresource loads |
-// from URL paths having this string as a suffix. |
-// TODO(engedy): Replace this with the actual filtering logic. |
-class PathSuffixFilter : public blink::WebDocumentSubresourceFilter { |
- public: |
- explicit PathSuffixFilter(const scoped_refptr<MemoryMappedRuleset>& ruleset) |
- : ruleset_(ruleset) { |
- static_assert(CHAR_BIT == 8, "Assumed char was 8 bits."); |
- disallowed_suffix_ = base::StringPiece( |
- reinterpret_cast<const char*>(ruleset_->data()), ruleset_->length()); |
- } |
- ~PathSuffixFilter() override {} |
- |
- bool allowLoad(const blink::WebURL& resourceUrl, |
- blink::WebURLRequest::RequestContext) override { |
- return disallowed_suffix_.empty() || |
- !base::EndsWith(GURL(resourceUrl).path(), disallowed_suffix_, |
- base::CompareCase::SENSITIVE); |
- } |
- |
- private: |
- scoped_refptr<MemoryMappedRuleset> ruleset_; |
- base::StringPiece disallowed_suffix_; |
- |
- DISALLOW_COPY_AND_ASSIGN(PathSuffixFilter); |
-}; |
- |
-} // namespace |
- |
SubresourceFilterAgent::SubresourceFilterAgent( |
content::RenderFrame* render_frame, |
RulesetDealer* ruleset_dealer) |
: content::RenderFrameObserver(render_frame), |
ruleset_dealer_(ruleset_dealer), |
- activation_state_for_provisional_load_(ActivationState::DISABLED) {} |
+ activation_state_for_provisional_load_(ActivationState::DISABLED) { |
+ DCHECK(ruleset_dealer); |
+} |
SubresourceFilterAgent::~SubresourceFilterAgent() = default; |
+std::vector<GURL> SubresourceFilterAgent::GetAncestorDocumentURLs() { |
+ std::vector<GURL> urls; |
+ for (blink::WebFrame* frame = render_frame()->GetWebFrame(); frame; |
+ frame = frame->parent()) { |
+ urls.push_back(frame->document().url()); |
+ } |
+ return urls; |
+} |
+ |
+void SubresourceFilterAgent::SetSubresourceFilterForCommittedLoad( |
+ std::unique_ptr<blink::WebDocumentSubresourceFilter> filter) { |
+ blink::WebLocalFrame* web_frame = render_frame()->GetWebFrame(); |
+ web_frame->dataSource()->setSubresourceFilter(filter.release()); |
+} |
+ |
+void SubresourceFilterAgent::ActivateForProvisionalLoad( |
+ ActivationState activation_state) { |
+ activation_state_for_provisional_load_ = activation_state; |
+} |
+ |
void SubresourceFilterAgent::OnDestruct() { |
delete this; |
} |
@@ -74,27 +61,26 @@ void SubresourceFilterAgent::DidStartProvisionalLoad() { |
void SubresourceFilterAgent::DidCommitProvisionalLoad( |
bool is_new_navigation, |
bool is_same_page_navigation) { |
- if (activation_state_for_provisional_load_ == ActivationState::ENABLED && |
+ if (activation_state_for_provisional_load_ != ActivationState::DISABLED && |
ruleset_dealer_->ruleset()) { |
- blink::WebLocalFrame* web_frame = render_frame()->GetWebFrame(); |
- web_frame->dataSource()->setSubresourceFilter( |
- new PathSuffixFilter(ruleset_dealer_->ruleset())); |
+ std::vector<GURL> ancestor_document_urls = GetAncestorDocumentURLs(); |
+ std::unique_ptr<DocumentSubresourceFilter> filter( |
+ new DocumentSubresourceFilter(activation_state_for_provisional_load_, |
+ ruleset_dealer_->ruleset(), |
+ std::move(ancestor_document_urls))); |
+ SetSubresourceFilterForCommittedLoad(std::move(filter)); |
} |
+ activation_state_for_provisional_load_ = ActivationState::DISABLED; |
} |
bool SubresourceFilterAgent::OnMessageReceived(const IPC::Message& message) { |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP(SubresourceFilterAgent, message) |
IPC_MESSAGE_HANDLER(SubresourceFilterMsg_ActivateForProvisionalLoad, |
- OnActivateForProvisionalLoad) |
+ ActivateForProvisionalLoad) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
return handled; |
} |
-void SubresourceFilterAgent::OnActivateForProvisionalLoad( |
- ActivationState activation_state) { |
- activation_state_for_provisional_load_ = activation_state; |
-} |
- |
} // namespace subresource_filter |