blob: a990a1ce66a336b746f77a85df96e2a7632c14d8 [file] [log] [blame]
// Copyright 2016 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.
#ifndef COMPONENTS_SUBRESOURCE_FILTER_CONTENT_RENDERER_SUBRESOURCE_FILTER_AGENT_H_
#define COMPONENTS_SUBRESOURCE_FILTER_CONTENT_RENDERER_SUBRESOURCE_FILTER_AGENT_H_
#include <memory>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "components/subresource_filter/core/common/activation_state.h"
#include "content/public/renderer/render_frame_observer.h"
#include "url/gurl.h"
namespace blink {
class WebDocumentSubresourceFilter;
} // namespace blink
namespace subresource_filter {
struct DocumentLoadStatistics;
class UnverifiedRulesetDealer;
class WebDocumentSubresourceFilterImpl;
// The renderer-side agent of ContentSubresourceFilterDriverFactory. There is
// one instance per RenderFrame, responsible for setting up the subresource
// filter for the ongoing provisional document load in the frame when instructed
// to do so by the driver.
class SubresourceFilterAgent
: public content::RenderFrameObserver,
public base::SupportsWeakPtr<SubresourceFilterAgent> {
public:
// The |ruleset_dealer| must not be null and must outlive this instance. The
// |render_frame| may be null in unittests.
explicit SubresourceFilterAgent(content::RenderFrame* render_frame,
UnverifiedRulesetDealer* ruleset_dealer);
~SubresourceFilterAgent() override;
protected:
// Below methods are protected virtual so they can be mocked out in tests.
// Returns the URL of the currently committed document.
virtual GURL GetDocumentURL();
// Injects the provided subresource |filter| into the DocumentLoader
// orchestrating the most recently committed load.
virtual void SetSubresourceFilterForCommittedLoad(
std::unique_ptr<blink::WebDocumentSubresourceFilter> filter);
// Informs the browser that the first subresource load has been disallowed for
// the most recently committed load. Not called if all resources are allowed.
virtual void SignalFirstSubresourceDisallowedForCommittedLoad();
// Sends statistics about the DocumentSubresourceFilter's work to the browser.
virtual void SendDocumentLoadStatistics(
const DocumentLoadStatistics& statistics);
private:
void OnActivateForNextCommittedLoad(ActivationState activation_state);
void RecordHistogramsOnLoadCommitted();
void RecordHistogramsOnLoadFinished();
void ResetActivatonStateForNextCommit();
// content::RenderFrameObserver:
void OnDestruct() override;
void DidCommitProvisionalLoad(bool is_new_navigation,
bool is_same_document_navigation) override;
void DidFailProvisionalLoad(const blink::WebURLError& error) override;
void DidFinishLoad() override;
bool OnMessageReceived(const IPC::Message& message) override;
void WillCreateWorkerFetchContext(blink::WebWorkerFetchContext*) override;
// Owned by the ChromeContentRendererClient and outlives us.
UnverifiedRulesetDealer* ruleset_dealer_;
ActivationState activation_state_for_next_commit_;
base::WeakPtr<WebDocumentSubresourceFilterImpl>
filter_for_last_committed_load_;
DISALLOW_COPY_AND_ASSIGN(SubresourceFilterAgent);
};
} // namespace subresource_filter
#endif // COMPONENTS_SUBRESOURCE_FILTER_CONTENT_RENDERER_SUBRESOURCE_FILTER_AGENT_H_