ad_tagging_browsertest.cc 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. // Copyright 2021 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. #include <string>
  5. #include "build/build_config.h"
  6. #include "components/content_settings/core/browser/host_content_settings_map.h"
  7. #include "components/content_settings/core/common/content_settings.h"
  8. #include "components/content_settings/core/common/content_settings_types.h"
  9. #include "components/subresource_filter/content/browser/ad_tagging_browser_test_utils.h"
  10. #include "components/subresource_filter/content/browser/subresource_filter_observer_test_utils.h"
  11. #include "components/subresource_filter/core/common/test_ruleset_utils.h"
  12. #include "testing/gtest/include/gtest/gtest.h"
  13. #include "url/gurl.h"
  14. #include "weblayer/browser/host_content_settings_map_factory.h"
  15. #include "weblayer/test/subresource_filter_browser_test_harness.h"
  16. #include "weblayer/test/weblayer_browser_test_utils.h"
  17. namespace weblayer {
  18. // Tests of ad tagging integration in WebLayer. A minimal port of //chrome's
  19. // ad_tagging_browsertest.cc.
  20. class AdTaggingBrowserTest : public SubresourceFilterBrowserTest {
  21. public:
  22. AdTaggingBrowserTest() = default;
  23. ~AdTaggingBrowserTest() override = default;
  24. void SetUpOnMainThread() override {
  25. SubresourceFilterBrowserTest::SetUpOnMainThread();
  26. SetRulesetWithRules(
  27. {subresource_filter::testing::CreateSuffixRule("ad_script.js"),
  28. subresource_filter::testing::CreateSuffixRule("ad=true")});
  29. }
  30. GURL GetURL(const std::string& page) {
  31. return embedded_test_server()->GetURL("/ad_tagging/" + page);
  32. }
  33. };
  34. IN_PROC_BROWSER_TEST_F(AdTaggingBrowserTest,
  35. AdContentSettingAllowed_AdTaggingDisabled) {
  36. HostContentSettingsMapFactory::GetForBrowserContext(
  37. web_contents()->GetBrowserContext())
  38. ->SetDefaultContentSetting(ContentSettingsType::ADS,
  39. CONTENT_SETTING_ALLOW);
  40. subresource_filter::TestSubresourceFilterObserver observer(web_contents());
  41. NavigateAndWaitForCompletion(GetURL("frame_factory.html"), shell());
  42. // Create an ad frame.
  43. GURL ad_url = GetURL("frame_factory.html?2&ad=true");
  44. content::RenderFrameHost* ad_frame =
  45. subresource_filter::CreateSrcFrame(web_contents(), ad_url);
  46. // Verify that we are not evaluating subframe loads.
  47. EXPECT_FALSE(observer.GetChildFrameLoadPolicy(ad_url).has_value());
  48. EXPECT_FALSE(observer.GetIsAdFrame(ad_frame->GetFrameTreeNodeId()));
  49. // Child frame created by ad script.
  50. content::RenderFrameHost* ad_frame_tagged_by_script =
  51. subresource_filter::CreateSrcFrameFromAdScript(
  52. web_contents(), GetURL("frame_factory.html?1"));
  53. // No frames should be detected by script heuristics.
  54. EXPECT_FALSE(
  55. observer.GetIsAdFrame(ad_frame_tagged_by_script->GetFrameTreeNodeId()));
  56. }
  57. // TODO(crbug.com/1210190): This test is flaky.
  58. IN_PROC_BROWSER_TEST_F(AdTaggingBrowserTest,
  59. DISABLED_AdContentSettingBlocked_AdTaggingEnabled) {
  60. HostContentSettingsMapFactory::GetForBrowserContext(
  61. web_contents()->GetBrowserContext())
  62. ->SetDefaultContentSetting(ContentSettingsType::ADS,
  63. CONTENT_SETTING_BLOCK);
  64. subresource_filter::TestSubresourceFilterObserver observer(web_contents());
  65. NavigateAndWaitForCompletion(GetURL("frame_factory.html"), shell());
  66. // Create an ad frame.
  67. GURL ad_url = GetURL("frame_factory.html?2&ad=true");
  68. content::RenderFrameHost* ad_frame =
  69. subresource_filter::CreateSrcFrame(web_contents(), ad_url);
  70. // Verify that we are evaluating subframe loads.
  71. EXPECT_TRUE(observer.GetChildFrameLoadPolicy(ad_url).has_value());
  72. EXPECT_TRUE(observer.GetIsAdFrame(ad_frame->GetFrameTreeNodeId()));
  73. // Child frame created by ad script.
  74. content::RenderFrameHost* ad_frame_tagged_by_script =
  75. subresource_filter::CreateSrcFrameFromAdScript(
  76. web_contents(), GetURL("frame_factory.html?1"));
  77. // Frames should be detected by script heuristics.
  78. EXPECT_TRUE(
  79. observer.GetIsAdFrame(ad_frame_tagged_by_script->GetFrameTreeNodeId()));
  80. }
  81. // TODO(crbug.com/1210190): This test is flaky.
  82. IN_PROC_BROWSER_TEST_F(AdTaggingBrowserTest, DISABLED_FramesByURL) {
  83. subresource_filter::TestSubresourceFilterObserver observer(web_contents());
  84. // Main frame.
  85. NavigateAndWaitForCompletion(GetURL("frame_factory.html"), shell());
  86. EXPECT_FALSE(observer.GetIsAdFrame(
  87. web_contents()->GetPrimaryMainFrame()->GetFrameTreeNodeId()));
  88. // (1) Vanilla child.
  89. content::RenderFrameHost* vanilla_child = subresource_filter::CreateSrcFrame(
  90. web_contents(), GetURL("frame_factory.html?1"));
  91. EXPECT_FALSE(observer.GetIsAdFrame(vanilla_child->GetFrameTreeNodeId()));
  92. // (2) Ad child.
  93. content::RenderFrameHost* ad_child = subresource_filter::CreateSrcFrame(
  94. web_contents(), GetURL("frame_factory.html?2&ad=true"));
  95. EXPECT_TRUE(observer.GetIsAdFrame(ad_child->GetFrameTreeNodeId()));
  96. EXPECT_TRUE(subresource_filter::EvidenceForFrameComprises(
  97. ad_child, /*parent_is_ad=*/false,
  98. blink::mojom::FilterListResult::kMatchedBlockingRule,
  99. blink::mojom::FrameCreationStackEvidence::kNotCreatedByAdScript));
  100. // (3) Ad child of 2.
  101. content::RenderFrameHost* ad_child_2 = subresource_filter::CreateSrcFrame(
  102. ad_child, GetURL("frame_factory.html?sub=1&3&ad=true"));
  103. EXPECT_TRUE(observer.GetIsAdFrame(ad_child_2->GetFrameTreeNodeId()));
  104. EXPECT_TRUE(subresource_filter::EvidenceForFrameComprises(
  105. ad_child_2, /*parent_is_ad=*/true,
  106. blink::mojom::FilterListResult::kMatchedBlockingRule,
  107. blink::mojom::FrameCreationStackEvidence::kCreatedByAdScript));
  108. // (4) Vanilla child of 2.
  109. content::RenderFrameHost* vanilla_child_2 =
  110. subresource_filter::CreateSrcFrame(ad_child,
  111. GetURL("frame_factory.html?4"));
  112. EXPECT_TRUE(observer.GetIsAdFrame(vanilla_child_2->GetFrameTreeNodeId()));
  113. EXPECT_TRUE(subresource_filter::EvidenceForFrameComprises(
  114. vanilla_child_2, /*parent_is_ad=*/true,
  115. blink::mojom::FilterListResult::kMatchedNoRules,
  116. blink::mojom::FrameCreationStackEvidence::kCreatedByAdScript));
  117. // (5) Vanilla child of 1. This tests something subtle.
  118. // frame_factory.html?ad=true loads the same script that frame_factory.html
  119. // uses to load frames. This tests that even though the script is tagged as an
  120. // ad in the ad iframe, it's not considered an ad in the main frame, hence
  121. // it's able to create an iframe that's not labeled as an ad.
  122. content::RenderFrameHost* vanilla_child_3 =
  123. subresource_filter::CreateSrcFrame(vanilla_child,
  124. GetURL("frame_factory.html?5"));
  125. EXPECT_FALSE(observer.GetIsAdFrame(vanilla_child_3->GetFrameTreeNodeId()));
  126. }
  127. } // namespace weblayer