Index: components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc |
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc |
index 1f701be98ac04039ab52dbf69e2dda0401ceda6d..e35dc95f2f8e190729dabe3d2a9384d3b89ae387 100644 |
--- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc |
+++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc |
@@ -10,13 +10,43 @@ |
#include "components/subresource_filter/content/browser/activation_state_computing_navigation_throttle.h" |
#include "components/subresource_filter/content/browser/async_document_subresource_filter.h" |
#include "components/subresource_filter/content/browser/subframe_navigation_filtering_throttle.h" |
+#include "components/subresource_filter/content/common/subresource_filter_messages.h" |
#include "content/public/browser/navigation_handle.h" |
+#include "content/public/browser/navigation_throttle.h" |
#include "content/public/browser/render_frame_host.h" |
#include "content/public/browser/web_contents.h" |
#include "net/base/net_errors.h" |
namespace subresource_filter { |
+namespace { |
+ |
+// Used to forward calls to WillProcessResonse to the driver. |
+// TODO(https://crbug.com/708181): Remove this once the safe browsing navigation |
+// throttle is responsible for all activation decisions. |
+class ForwardingNavigationThrottle : public content::NavigationThrottle { |
+ public: |
+ ForwardingNavigationThrottle( |
+ content::NavigationHandle* handle, |
+ ContentSubresourceFilterThrottleManager::Delegate* delegate) |
+ : content::NavigationThrottle(handle), delegate_(delegate) {} |
+ ~ForwardingNavigationThrottle() override {} |
+ |
+ // content::NavigationThrottle: |
+ content::NavigationThrottle::ThrottleCheckResult WillProcessResponse() |
+ override { |
+ delegate_->WillProcessResponse(navigation_handle()); |
+ return content::NavigationThrottle::PROCEED; |
+ } |
+ |
+ private: |
+ ContentSubresourceFilterThrottleManager::Delegate* delegate_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ForwardingNavigationThrottle); |
+}; |
+ |
+} // namespace |
+ |
bool ContentSubresourceFilterThrottleManager::Delegate:: |
ShouldSuppressActivation(content::NavigationHandle* navigation_handle) { |
return false; |
@@ -62,17 +92,22 @@ void ContentSubresourceFilterThrottleManager::ReadyToCommitNavigation( |
if (throttle == ongoing_activation_throttles_.end()) |
return; |
+ // A filter with DISABLED activation indicates a corrupted ruleset. |
AsyncDocumentSubresourceFilter* filter = throttle->second->filter(); |
if (!filter || navigation_handle->GetNetErrorCode() != net::OK || |
+ filter->activation_state().activation_level == |
+ ActivationLevel::DISABLED || |
delegate_->ShouldSuppressActivation(navigation_handle)) { |
return; |
} |
- DCHECK_NE(ActivationLevel::DISABLED, |
- filter->activation_state().activation_level); |
- |
throttle->second->WillSendActivationToRenderer(); |
- // TODO(csharrison): Send an IPC to the renderer. |
+ |
+ content::RenderFrameHost* frame_host = |
+ navigation_handle->GetRenderFrameHost(); |
+ frame_host->Send(new SubresourceFilterMsg_ActivateForNextCommittedLoad( |
+ frame_host->GetRoutingID(), filter->activation_state().activation_level, |
+ filter->activation_state().measure_performance)); |
} |
void ContentSubresourceFilterThrottleManager::DidFinishNavigation( |
@@ -110,10 +145,28 @@ void ContentSubresourceFilterThrottleManager::DidFinishNavigation( |
DestroyRulesetHandleIfNoLongerUsed(); |
} |
+bool ContentSubresourceFilterThrottleManager::OnMessageReceived( |
+ const IPC::Message& message, |
+ content::RenderFrameHost* render_frame_host) { |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(ContentSubresourceFilterThrottleManager, message) |
+ IPC_MESSAGE_HANDLER(SubresourceFilterHostMsg_DidDisallowFirstSubresource, |
+ MaybeCallFirstDisallowedLoad) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ return handled; |
+} |
+ |
void ContentSubresourceFilterThrottleManager::MaybeAppendNavigationThrottles( |
content::NavigationHandle* navigation_handle, |
std::vector<std::unique_ptr<content::NavigationThrottle>>* throttles) { |
DCHECK(!navigation_handle->IsSameDocument()); |
+ if (navigation_handle->IsInMainFrame()) { |
+ throttles->push_back(base::MakeUnique<ForwardingNavigationThrottle>( |
+ navigation_handle, delegate_)); |
+ } |
+ if (!dealer_handle_) |
+ return; |
if (auto filtering_throttle = |
MaybeCreateSubframeNavigationFilteringThrottle(navigation_handle)) { |
throttles->push_back(std::move(filtering_throttle)); |