Refactor subresource redirect to use feature

Allow subresource redirect to be enabled via field trial

Bug: 1013776
Change-Id: I72e8221a584005cb8d351b65d9a53c6c8be1e744
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1861276
Commit-Queue: rajendrant <[email protected]>
Reviewed-by: Tarun Bansal <[email protected]>
Reviewed-by: Kinuko Yasuda <[email protected]>
Reviewed-by: John Abd-El-Malek <[email protected]>
Reviewed-by: Robert Ogden <[email protected]>
Cr-Commit-Position: refs/heads/master@{#707622}
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index dbb4418f..959ba7d 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2095,7 +2095,7 @@
     {"enable-subresource-redirect",
      flag_descriptions::kEnableSubresourceRedirectName,
      flag_descriptions::kEnableSubresourceRedirectDescription, kOsAll,
-     SINGLE_VALUE_TYPE(switches::kEnableSubresourceRedirect)},
+     FEATURE_VALUE_TYPE(blink::features::kSubresourceRedirect)},
 #if defined(OS_ANDROID)
     {"enable-offline-previews", flag_descriptions::kEnableOfflinePreviewsName,
      flag_descriptions::kEnableOfflinePreviewsDescription, kOsAndroid,
diff --git a/chrome/browser/data_saver/subresource_redirect_browsertest.cc b/chrome/browser/data_saver/subresource_redirect_browsertest.cc
index e00d470..2706b0a 100644
--- a/chrome/browser/data_saver/subresource_redirect_browsertest.cc
+++ b/chrome/browser/data_saver/subresource_redirect_browsertest.cc
@@ -4,19 +4,27 @@
 
 #include "base/task/thread_pool/thread_pool_instance.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h"
+#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
 #include "chrome/browser/metrics/subprocess_metrics_provider.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "content/public/test/browser_test_utils.h"
 #include "net/base/escape.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
+#include "third_party/blink/public/common/features.h"
 
 namespace {
 
+// TODO(rajendrant): Add tests to verify subresource redirect is applied only
+// for data saver users and also not applied for incognito profiles.
+
 // Retries fetching |histogram_name| until it contains at least |count| samples.
+// TODO(rajendrant): Convert the tests to wait for image load to complete or the
+// page load complete, instead of waiting on the histograms.
 void RetryForHistogramUntilCountReached(base::HistogramTester* histogram_tester,
                                         const std::string& histogram_name,
                                         size_t count) {
@@ -41,50 +49,42 @@
 
 class SubresourceRedirectBrowserTest : public InProcessBrowserTest {
  public:
-  SubresourceRedirectBrowserTest() {}
+  explicit SubresourceRedirectBrowserTest(
+      const std::string& included_path_suffixes = "")
+      : included_path_suffixes_(included_path_suffixes),
+        https_server_(net::EmbeddedTestServer::TYPE_HTTPS),
+        compression_server_(net::EmbeddedTestServer::TYPE_HTTPS) {}
 
   void SetUp() override {
     // |http_server| setup.
-    http_server_.reset(
-        new net::EmbeddedTestServer(net::EmbeddedTestServer::TYPE_HTTP));
-    http_server_->ServeFilesFromSourceDirectory("chrome/test/data");
-
-    ASSERT_TRUE(http_server_->Start());
-
-    http_url_ = http_server_->GetURL("insecure.com", "/");
+    http_server_.ServeFilesFromSourceDirectory("chrome/test/data");
+    ASSERT_TRUE(http_server_.Start());
+    http_url_ = http_server_.GetURL("insecure.com", "/");
     ASSERT_TRUE(http_url_.SchemeIs(url::kHttpScheme));
 
     // |https_server| setup.
-    https_server_.reset(
-        new net::EmbeddedTestServer(net::EmbeddedTestServer::TYPE_HTTPS));
-    https_server_->ServeFilesFromSourceDirectory("chrome/test/data");
-
-    ASSERT_TRUE(https_server_->Start());
-
-    https_url_ = https_server_->GetURL("secure.com", "/");
+    https_server_.ServeFilesFromSourceDirectory("chrome/test/data");
+    ASSERT_TRUE(https_server_.Start());
+    https_url_ = https_server_.GetURL("secure.com", "/");
     ASSERT_TRUE(https_url_.SchemeIs(url::kHttpsScheme));
 
     // |compression_server| setup.
-    compression_server_.reset(
-        new net::EmbeddedTestServer(net::EmbeddedTestServer::TYPE_HTTPS));
-    compression_server_->RegisterRequestHandler(base::BindRepeating(
+    compression_server_.RegisterRequestHandler(base::BindRepeating(
         &SubresourceRedirectBrowserTest::HandleCompressionServerRequest,
         base::Unretained(this)));
-
-    ASSERT_TRUE(compression_server_->Start());
-
-    compression_url_ = compression_server_->GetURL("compression.com", "/");
+    ASSERT_TRUE(compression_server_.Start());
+    compression_url_ = compression_server_.GetURL("compression.com", "/");
     ASSERT_TRUE(compression_url_.SchemeIs(url::kHttpsScheme));
 
+    scoped_feature_list_.InitAndEnableFeatureWithParameters(
+        blink::features::kSubresourceRedirect,
+        {{"included_path_suffixes", included_path_suffixes_},
+         {"lite_page_subresource_origin", compression_url_.spec()}});
+
     InProcessBrowserTest::SetUp();
   }
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
-    command_line->AppendSwitchASCII("litepage-server-subresource-host",
-                                    compression_url_.spec());
-
-    command_line->AppendSwitch("enable-subresource-redirect");
-
     //  Need to resolve all 3 of the above servers to 127.0.0.1:port, and
     //  the servers themselves can't serve using 127.0.0.1:port as the
     //  compressed resource URLs rely on subdomains, and subdomains
@@ -112,10 +112,10 @@
   GURL request_url() const { return request_url_; }
 
   GURL HttpURLWithPath(const std::string& path) {
-    return http_server_->GetURL("insecure.com", path);
+    return http_server_.GetURL("insecure.com", path);
   }
   GURL HttpsURLWithPath(const std::string& path) {
-    return https_server_->GetURL("secure.com", path);
+    return https_server_.GetURL("secure.com", path);
   }
 
   void SetCompressionServerToFail() { compression_server_fail_ = true; }
@@ -124,7 +124,7 @@
 
  private:
   void TearDownOnMainThread() override {
-    EXPECT_TRUE(https_server_->ShutdownAndWaitUntilComplete());
+    EXPECT_TRUE(https_server_.ShutdownAndWaitUntilComplete());
 
     InProcessBrowserTest::TearDownOnMainThread();
   }
@@ -163,14 +163,17 @@
     return std::move(response);
   }
 
+  base::test::ScopedFeatureList scoped_feature_list_;
+  const std::string included_path_suffixes_;
+
   GURL compression_url_;
   GURL http_url_;
   GURL https_url_;
   GURL request_url_;
 
-  std::unique_ptr<net::EmbeddedTestServer> http_server_;
-  std::unique_ptr<net::EmbeddedTestServer> https_server_;
-  std::unique_ptr<net::EmbeddedTestServer> compression_server_;
+  net::EmbeddedTestServer http_server_;
+  net::EmbeddedTestServer https_server_;
+  net::EmbeddedTestServer compression_server_;
 
   base::HistogramTester histogram_tester_;
 
@@ -182,15 +185,8 @@
 class DifferentMediaInclusionSubresourceRedirectBrowserTest
     : public SubresourceRedirectBrowserTest {
  public:
-  void SetUp() override {
-    feature_list_.InitAndEnableFeatureWithParameters(
-        features::kSubresourceRedirectIncludedMediaSuffixes,
-        {{"included_path_suffixes", ".svg"}});
-    SubresourceRedirectBrowserTest::SetUp();
-  }
-
- private:
-  base::test::ScopedFeatureList feature_list_;
+  DifferentMediaInclusionSubresourceRedirectBrowserTest()
+      : SubresourceRedirectBrowserTest(".svg") {}
 };
 
 //  NOTE: It is indirectly verified that correct requests are being sent to
@@ -386,7 +382,7 @@
 //  SubresourceRedirectIncludedMediaSuffixes set to only allow .svg, so no
 //  internal redirect should occur.
 IN_PROC_BROWSER_TEST_F(DifferentMediaInclusionSubresourceRedirectBrowserTest,
-                       NoTriggerWhenNotIncludedInMeidaSuffixes) {
+                       NoTriggerWhenNotIncludedInMediaSuffixes) {
   ui_test_utils::NavigateToURL(browser(),
                                HttpsURLWithPath("/load_image/image.html"));