url_request_rewrite_rules_manager_browsertest.cc 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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 "base/base_paths.h"
  5. #include "base/files/file_path.h"
  6. #include "base/memory/raw_ptr.h"
  7. #include "base/path_service.h"
  8. #include "base/test/scoped_feature_list.h"
  9. #include "components/url_rewrite/browser/url_request_rewrite_rules_manager.h"
  10. #include "content/public/test/browser_test.h"
  11. #include "content/public/test/content_browser_test.h"
  12. #include "content/public/test/content_browser_test_utils.h"
  13. #include "content/public/test/test_navigation_observer.h"
  14. #include "content/shell/browser/shell.h"
  15. #include "net/dns/mock_host_resolver.h"
  16. #include "net/test/embedded_test_server/embedded_test_server.h"
  17. #include "testing/gmock/include/gmock/gmock.h"
  18. #include "testing/gtest/include/gtest/gtest.h"
  19. #include "third_party/blink/public/common/features.h"
  20. namespace url_rewrite {
  21. using ::testing::IsEmpty;
  22. using ::testing::SizeIs;
  23. // Attaches an inner WebContents to the UrlRequestRewriteRulesManager.
  24. class InnerWebContentsHandler : public content::WebContentsObserver {
  25. public:
  26. InnerWebContentsHandler(
  27. content::WebContents* web_contents,
  28. UrlRequestRewriteRulesManager* url_request_rewrite_rules_manager)
  29. : content::WebContentsObserver(web_contents),
  30. url_request_rewrite_rules_manager_(url_request_rewrite_rules_manager) {}
  31. void Wait() { run_loop_.Run(); }
  32. private:
  33. // content::WebContentsObserver implementation.
  34. void InnerWebContentsCreated(
  35. content::WebContents* inner_web_contents) override {
  36. CHECK(
  37. url_request_rewrite_rules_manager_->AddWebContents(inner_web_contents));
  38. run_loop_.Quit();
  39. }
  40. base::RunLoop run_loop_{base::RunLoop::Type::kNestableTasksAllowed};
  41. raw_ptr<UrlRequestRewriteRulesManager> url_request_rewrite_rules_manager_;
  42. };
  43. class UrlRequestRewriteRulesManagerBrowserTest
  44. : public content::ContentBrowserTest {
  45. public:
  46. protected:
  47. void SetUp() override {
  48. // Enable portals to emulate creation of inner WebContents.
  49. scoped_feature_list_.InitWithFeatures(
  50. /*enabled_features=*/{blink::features::kPortals,
  51. blink::features::kPortalsCrossOrigin},
  52. /*disabled_features=*/{});
  53. ContentBrowserTest::SetUp();
  54. }
  55. void SetUpOnMainThread() override {
  56. base::FilePath root_dir;
  57. base::PathService::Get(base::DIR_SOURCE_ROOT, &root_dir);
  58. embedded_test_server()->ServeFilesFromDirectory(
  59. root_dir.AppendASCII("components/test/data/url_rewrite"));
  60. ASSERT_TRUE(embedded_test_server()->Start());
  61. ContentBrowserTest::SetUpOnMainThread();
  62. }
  63. base::test::ScopedFeatureList scoped_feature_list_;
  64. UrlRequestRewriteRulesManager url_request_rewrite_rules_manager_;
  65. };
  66. IN_PROC_BROWSER_TEST_F(UrlRequestRewriteRulesManagerBrowserTest,
  67. AddRemoveWebContentsSucceeds) {
  68. ASSERT_TRUE(url_request_rewrite_rules_manager_.AddWebContents(
  69. shell()->web_contents()));
  70. ASSERT_FALSE(url_request_rewrite_rules_manager_.AddWebContents(
  71. shell()->web_contents()));
  72. ASSERT_TRUE(url_request_rewrite_rules_manager_.RemoveWebContents(
  73. shell()->web_contents()));
  74. }
  75. IN_PROC_BROWSER_TEST_F(UrlRequestRewriteRulesManagerBrowserTest,
  76. RulesUpdatedWithSingleWebContents) {
  77. ASSERT_TRUE(url_request_rewrite_rules_manager_.AddWebContents(
  78. shell()->web_contents()));
  79. // Load a simple HTML page.
  80. GURL url = embedded_test_server()->GetURL("/single_web_contents.html");
  81. content::TestNavigationObserver navigation_observer(shell()->web_contents());
  82. ASSERT_TRUE(NavigateToURL(shell(), url));
  83. navigation_observer.Wait();
  84. // Verify there were no inner WebContents created, and updaters size is 1.
  85. ASSERT_THAT(shell()->web_contents()->GetInnerWebContents(), IsEmpty());
  86. ASSERT_EQ(url_request_rewrite_rules_manager_.GetUpdatersSizeForTesting(), 1u);
  87. ASSERT_TRUE(url_request_rewrite_rules_manager_.OnRulesUpdated(
  88. mojom::UrlRequestRewriteRules::New()));
  89. }
  90. IN_PROC_BROWSER_TEST_F(UrlRequestRewriteRulesManagerBrowserTest,
  91. RulesUpdatedWithMultipleWebContents) {
  92. ASSERT_TRUE(url_request_rewrite_rules_manager_.AddWebContents(
  93. shell()->web_contents()));
  94. // Load an HTML page with portal element. This will results in creation of the
  95. // second inner WebContents that is signaled by the
  96. // |inner_web_contents_waiter|. As the operation is finished, the 2nd
  97. // WebContents will be registered with |url_request_rewrite_rules_manager_|
  98. // and rewrite rules' update will be verified.
  99. GURL url = embedded_test_server()->GetURL("/multiple_web_contents.html");
  100. InnerWebContentsHandler inner_web_contents_waiter(
  101. shell()->web_contents(), &url_request_rewrite_rules_manager_);
  102. content::TestNavigationObserver navigation_observer(shell()->web_contents());
  103. ASSERT_TRUE(NavigateToURL(shell(), url));
  104. navigation_observer.Wait();
  105. inner_web_contents_waiter.Wait();
  106. ASSERT_THAT(shell()->web_contents()->GetInnerWebContents(), SizeIs(1));
  107. ASSERT_EQ(url_request_rewrite_rules_manager_.GetUpdatersSizeForTesting(), 2u);
  108. ASSERT_TRUE(url_request_rewrite_rules_manager_.OnRulesUpdated(
  109. mojom::UrlRequestRewriteRules::New()));
  110. }
  111. // Tests that adding a WebContents after a navigation has already occurred
  112. // does not trigger a DCHECK on destruction. This is a regression test for
  113. // https://crbug.com/1152930.
  114. IN_PROC_BROWSER_TEST_F(UrlRequestRewriteRulesManagerBrowserTest,
  115. WebContentsAddedAfterNavigation) {
  116. // Load a simple HTML page.
  117. GURL url = embedded_test_server()->GetURL("/single_web_contents.html");
  118. content::TestNavigationObserver navigation_observer(shell()->web_contents());
  119. ASSERT_TRUE(NavigateToURL(shell(), url));
  120. navigation_observer.Wait();
  121. // Add the WebContents to the manager. At this point, an RFH has already been
  122. // created. Eventually, it will be destroyed.
  123. ASSERT_TRUE(url_request_rewrite_rules_manager_.AddWebContents(
  124. shell()->web_contents()));
  125. // Verify there were no inner WebContents created, and updaters size is 1.
  126. ASSERT_THAT(shell()->web_contents()->GetInnerWebContents(), IsEmpty());
  127. ASSERT_EQ(url_request_rewrite_rules_manager_.GetUpdatersSizeForTesting(), 1u);
  128. ASSERT_TRUE(url_request_rewrite_rules_manager_.OnRulesUpdated(
  129. mojom::UrlRequestRewriteRules::New()));
  130. }
  131. } // namespace url_rewrite