#include "components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h"
#include <map>
#include <memory>
#include <tuple>
#include <utility>
#include "base/check.h"
#include "base/command_line.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/run_loop.h"
#include "base/strings/stringprintf.h"
#include "base/task/single_thread_task_runner.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/test_simple_task_runner.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "components/content_settings/browser/page_specific_content_settings.h"
#include "components/content_settings/core/common/content_settings_types.h"
#include "components/infobars/content/content_infobar_manager.h"
#include "components/infobars/core/confirm_infobar_delegate.h"
#include "components/infobars/core/infobar.h"
#include "components/subresource_filter/content/browser/content_subresource_filter_web_contents_helper.h"
#include "components/subresource_filter/content/browser/fake_safe_browsing_database_manager.h"
#include "components/subresource_filter/content/browser/profile_interaction_manager.h"
#include "components/subresource_filter/content/browser/subresource_filter_observer_manager.h"
#include "components/subresource_filter/content/browser/throttle_manager_test_support.h"
#include "components/subresource_filter/content/mojom/subresource_filter.mojom.h"
#include "components/subresource_filter/content/shared/browser/child_frame_navigation_test_utils.h"
#include "components/subresource_filter/core/browser/async_document_subresource_filter.h"
#include "components/subresource_filter/core/browser/subresource_filter_features.h"
#include "components/subresource_filter/core/common/common_features.h"
#include "components/subresource_filter/core/common/constants.h"
#include "components/subresource_filter/core/common/test_ruleset_creator.h"
#include "components/subresource_filter/core/common/test_ruleset_utils.h"
#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h"
#include "components/url_pattern_index/proto/rules.pb.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/navigation_throttle.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/back_forward_cache_util.h"
#include "content/public/test/mock_render_process_host.h"
#include "content/public/test/navigation_simulator.h"
#include "content/public/test/test_renderer_host.h"
#include "content/public/test/test_utils.h"
#include "mojo/public/cpp/bindings/associated_receiver.h"
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
#include "net/base/net_errors.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
#include "third_party/blink/public/common/features.h"
#include "url/url_constants.h"
#if BUILDFLAG(IS_ANDROID)
#include "components/messages/android/mock_message_dispatcher_bridge.h"
#include "components/subresource_filter/content/browser/ads_blocked_message_delegate.h"
#endif
namespace subresource_filter {
proto;
const char kTestURLWithActivation[] = …;
const char kTestURLWithActivation2[] = …;
const char kTestURLWithDryRun[] = …;
const char kTestURLWithNoActivation[] = …;
const char kReadyToCommitResultsInCommitHistogram[] = …;
const char kReadyToCommitResultsInCommitRestrictedAdFrameNavigationHistogram[] = …;
enum PageActivationNotificationTiming { … };
class FakeSubresourceFilterAgent : public mojom::SubresourceFilterAgent { … };
class MockPageStateActivationThrottle : public content::NavigationThrottle { … };
class ContentSubresourceFilterThrottleManagerTest
: public content::RenderViewHostTestHarness,
public content::WebContentsObserver,
public ::testing::WithParamInterface<PageActivationNotificationTiming> { … };
INSTANTIATE_TEST_SUITE_P(…);
TEST_P(ContentSubresourceFilterThrottleManagerTest,
ActivateMainFrameAndFilterSubframeNavigation) { … }
#if BUILDFLAG(IS_ANDROID)
TEST_P(ContentSubresourceFilterThrottleManagerTest,
NoCrashWhenMessageDelegateIsNotPresent) {
auto* web_contents = RenderViewHostTestHarness::web_contents();
web_contents->RemoveUserData(
subresource_filter::AdsBlockedMessageDelegate::UserDataKey());
NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
ExpectActivationSignalForFrame(main_rfh(), true );
CreateSubframeWithTestNavigation(
GURL("https://www.example.com/disallowed.html"), main_rfh());
EXPECT_EQ(content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE,
SimulateStartAndGetResult(navigation_simulator()));
EXPECT_TRUE(ads_blocked_in_content_settings());
}
#endif
TEST_P(ContentSubresourceFilterThrottleManagerTest, NoPageActivation) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
ActivateMainFrameAndDoNotFilterDryRun) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
ActivateMainFrameAndFilterSubframeNavigationOnRedirect) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
ActivateMainFrameAndDoNotFilterSubframeNavigation) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
ActivateMainFrameAndFilterTwoSubframeNavigations) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
ActivateTwoMainFramesAndFilterTwoSubframeNavigations) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
DoNotFilterForInactiveFrame) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest, RulesetHandleRegeneration) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
SameSiteNavigation_RulesetGoesAway) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
SameSiteFailedNavigation_MaintainActivation) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
FailedNavigationToErrorPage_NoActivation) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest, ActivationPropagation) { … }
#if BUILDFLAG(IS_WIN)
#define MAYBE_ActivationPropagation2 …
#else
#define MAYBE_ActivationPropagation2 …
#endif
TEST_P(ContentSubresourceFilterThrottleManagerTest,
MAYBE_ActivationPropagation2) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
SameSiteNavigationStopsActivation) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
CreateHelperForWebContents) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
ActivateMainFrameAndFilterSubframeNavigationTaggedAsAd) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
SubframeNavigationTaggedAsAdByRenderer) { … }
class SitePerProcessContentSubresourceFilterThrottleManagerTest
: public ContentSubresourceFilterThrottleManagerTest { … };
INSTANTIATE_TEST_SUITE_P(…);
TEST_P(SitePerProcessContentSubresourceFilterThrottleManagerTest,
AdTagCarriesAcrossProcesses) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
GrandchildNavigationTaggedAsAdByRenderer) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
DryRun_FrameTaggingDeleted) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
DryRun_FrameTaggingAsAdPropagatesToChildFrame) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
DryRun_AllowedFrameNotTaggedAsAd) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
FirstDisallowedLoadCalledOutOfOrder) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
NavigationIsReadyToCommitThenFinishes_HistogramIssued) { … }
TEST_P(
ContentSubresourceFilterThrottleManagerTest,
RestrictedAdFrameNavigationIsReadyToCommitThenFinishes_HistogramsIssued) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
ReadyToCommitNavigationThenRenderFrameDeletes_MetricsNotRecorded) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
ThrottleManagerLifetime_Basic) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
ThrottleManagerLifetime_Subframe) { … }
TEST_P(ContentSubresourceFilterThrottleManagerTest,
ThrottleManagerLifetime_SameDocument) { … }
class ContentSubresourceFilterThrottleManagerFencedFrameTest
: public ContentSubresourceFilterThrottleManagerTest { … };
INSTANTIATE_TEST_SUITE_P(…);
TEST_P(ContentSubresourceFilterThrottleManagerFencedFrameTest,
ActivateMainFrameAndFilterFencedFrameNavigation) { … }
TEST_P(ContentSubresourceFilterThrottleManagerFencedFrameTest,
ActivateMainFrameAndFilterFencedFrameNavigationOnRedirect) { … }
TEST_P(ContentSubresourceFilterThrottleManagerFencedFrameTest,
ActivationPropagation) { … }
TEST_P(ContentSubresourceFilterThrottleManagerFencedFrameTest,
SafeBrowsingThrottleCreation) { … }
TEST_P(ContentSubresourceFilterThrottleManagerFencedFrameTest, LogActivation) { … }
TEST_P(ContentSubresourceFilterThrottleManagerFencedFrameTest,
ThrottleManagerLifetime_FencedFrame) { … }
class ContentSubresourceFilterThrottleManagerInfoBarUiTest
: public ContentSubresourceFilterThrottleManagerTest { … };
INSTANTIATE_TEST_SUITE_P(…);
#if BUILDFLAG(IS_ANDROID)
TEST_P(ContentSubresourceFilterThrottleManagerInfoBarUiTest,
NoCrashWhenInfoBarManagerIsNotPresent) {
auto* web_contents = RenderViewHostTestHarness::web_contents();
web_contents->RemoveUserData(infobars::ContentInfoBarManager::UserDataKey());
NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
ExpectActivationSignalForFrame(main_rfh(), true );
CreateSubframeWithTestNavigation(
GURL("https://www.example.com/disallowed.html"), main_rfh());
EXPECT_EQ(content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE,
SimulateStartAndGetResult(navigation_simulator()));
EXPECT_TRUE(ads_blocked_in_content_settings());
}
#endif
TEST_P(ContentSubresourceFilterThrottleManagerInfoBarUiTest,
InfoBarStaysPresentAfterSameDocumentNav) { … }
TEST_P(ContentSubresourceFilterThrottleManagerInfoBarUiTest,
ActivateMainFrameAndFilterTwoSubframeNavigations) { … }
TEST_P(ContentSubresourceFilterThrottleManagerInfoBarUiTest,
ActivateTwoMainFramesAndFilterTwoSubframeNavigations) { … }
TEST_P(ContentSubresourceFilterThrottleManagerInfoBarUiTest,
RulesetHandleRegeneration) { … }
}