Adding data savings for Offline Previews

Bug: 615565
Change-Id: I6dc6e12d59ef94d50e05c772527d88e145de885b
Reviewed-on: https://chromium-review.googlesource.com/792111
Commit-Queue: Ryan Sturm <[email protected]>
Reviewed-by: Jian Li <[email protected]>
Reviewed-by: Tarun Bansal <[email protected]>
Cr-Commit-Position: refs/heads/master@{#523015}
diff --git a/chrome/browser/offline_pages/offline_page_tab_helper.cc b/chrome/browser/offline_pages/offline_page_tab_helper.cc
index 4dea8b8..9e1a33ee 100644
--- a/chrome/browser/offline_pages/offline_page_tab_helper.cc
+++ b/chrome/browser/offline_pages/offline_page_tab_helper.cc
@@ -217,11 +217,12 @@
   return provisional_offline_info_.offline_page.get();
 }
 
-bool OfflinePageTabHelper::IsShowingOfflinePreview() const {
-  // TODO(ryansturm): Change this once offline pages infrastructure uses
-  // NavigationHandle instead of a back channel. crbug.com/658899
-  return provisional_offline_info_.is_showing_offline_preview ||
-         offline_info_.is_showing_offline_preview;
+const OfflinePageItem* OfflinePageTabHelper::GetOfflinePreviewItem() const {
+  if (provisional_offline_info_.is_showing_offline_preview)
+    return provisional_offline_info_.offline_page.get();
+  if (offline_info_.is_showing_offline_preview)
+    return offline_info_.offline_page.get();
+  return nullptr;
 }
 
 void OfflinePageTabHelper::ScheduleDownloadHelper(
diff --git a/chrome/browser/offline_pages/offline_page_tab_helper.h b/chrome/browser/offline_pages/offline_page_tab_helper.h
index cb355aa..0712f96 100644
--- a/chrome/browser/offline_pages/offline_page_tab_helper.h
+++ b/chrome/browser/offline_pages/offline_page_tab_helper.h
@@ -43,8 +43,9 @@
     return offline_info_.offline_header;
   }
 
-  // Whether the page is an offline preview.
-  bool IsShowingOfflinePreview() const;
+  // Returns nullptr if the page is not an offline preview. Returns the
+  // OfflinePageItem related to the page if the page is an offline preview.
+  const OfflinePageItem* GetOfflinePreviewItem() const;
 
   // Returns provisional offline page since actual navigation does not happen
   // during unit tests.
diff --git a/chrome/browser/offline_pages/offline_page_utils.cc b/chrome/browser/offline_pages/offline_page_utils.cc
index 1b0c631..d06a896 100644
--- a/chrome/browser/offline_pages/offline_page_utils.cc
+++ b/chrome/browser/offline_pages/offline_page_utils.cc
@@ -203,7 +203,7 @@
     content::WebContents* web_contents) {
   OfflinePageTabHelper* tab_helper =
       OfflinePageTabHelper::FromWebContents(web_contents);
-  return tab_helper && tab_helper->IsShowingOfflinePreview();
+  return tab_helper && tab_helper->GetOfflinePreviewItem();
 }
 
 // static
diff --git a/chrome/browser/page_load_metrics/observers/offline_page_previews_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/offline_page_previews_page_load_metrics_observer.cc
index e045bab..78cdf2b5 100644
--- a/chrome/browser/page_load_metrics/observers/offline_page_previews_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/offline_page_previews_page_load_metrics_observer.cc
@@ -125,7 +125,7 @@
 #if BUILDFLAG(ENABLE_OFFLINE_PAGES)
   offline_pages::OfflinePageTabHelper* tab_helper =
       offline_pages::OfflinePageTabHelper::FromWebContents(web_contents);
-  return tab_helper && tab_helper->IsShowingOfflinePreview();
+  return tab_helper && tab_helper->GetOfflinePreviewItem();
 #else
   return false;
 #endif  // BUILDFLAG(ENABLE_OFFLINE_PAGES)
diff --git a/chrome/browser/previews/previews_infobar_tab_helper.cc b/chrome/browser/previews/previews_infobar_tab_helper.cc
index db56af13..f274719 100644
--- a/chrome/browser/previews/previews_infobar_tab_helper.cc
+++ b/chrome/browser/previews/previews_infobar_tab_helper.cc
@@ -13,8 +13,10 @@
 #include "chrome/browser/previews/previews_service.h"
 #include "chrome/browser/previews/previews_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
+#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h"
+#include "components/offline_pages/core/offline_page_item.h"
 #include "components/offline_pages/features/features.h"
 #include "components/previews/content/previews_content_util.h"
 #include "components/previews/content/previews_ui_service.h"
@@ -97,7 +99,7 @@
   offline_pages::OfflinePageTabHelper* tab_helper =
       offline_pages::OfflinePageTabHelper::FromWebContents(web_contents());
 
-  if (tab_helper && tab_helper->IsShowingOfflinePreview()) {
+  if (tab_helper && tab_helper->GetOfflinePreviewItem()) {
     if (navigation_handle->IsErrorPage()) {
       // TODO(ryansturm): Add UMA for errors.
       return;
@@ -106,11 +108,25 @@
         data_reduction_proxy_settings =
             DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
                 web_contents()->GetBrowserContext());
+
+    const offline_pages::OfflinePageItem* offline_page =
+        tab_helper->GetOfflinePreviewItem();
+    // From UMA, the median percent of network body bytes loaded out of total
+    // body bytes on a page load. See PageLoad.Experimental.Bytes.Network and
+    // PageLoad.Experimental.Bytes.Total.
+    int64_t uncached_size = offline_page->file_size * 0.55;
+
+    bool data_saver_enabled =
+        data_reduction_proxy_settings->IsDataReductionProxyEnabled();
+    data_reduction_proxy_settings->data_reduction_proxy_service()
+        ->UpdateContentLengths(0, uncached_size, data_saver_enabled,
+                               data_reduction_proxy::HTTPS,
+                               "multipart/related");
+
     PreviewsInfoBarDelegate::Create(
         web_contents(), previews::PreviewsType::OFFLINE,
         base::Time() /* previews_freshness */, false /* is_reload */,
-        data_reduction_proxy_settings &&
-            data_reduction_proxy_settings->IsDataReductionProxyEnabled(),
+        data_reduction_proxy_settings && data_saver_enabled,
         base::Bind(&AddPreviewNavigationCallback,
                    web_contents()->GetBrowserContext(),
                    navigation_handle->GetRedirectChain()[0],
diff --git a/chrome/browser/previews/previews_infobar_tab_helper_unittest.cc b/chrome/browser/previews/previews_infobar_tab_helper_unittest.cc
index f4bbdb06..00477492 100644
--- a/chrome/browser/previews/previews_infobar_tab_helper_unittest.cc
+++ b/chrome/browser/previews/previews_infobar_tab_helper_unittest.cc
@@ -17,6 +17,9 @@
 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings_factory.h"
 #include "chrome/browser/previews/previews_infobar_tab_helper.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h"
+#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
+#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
@@ -235,6 +238,8 @@
   SimulateCommit();
   offline_pages::OfflinePageItem item;
   item.url = GURL(kTestUrl);
+  item.file_size = 100;
+  int64_t expected_file_size = .55 * item.file_size;
   offline_pages::OfflinePageHeader header;
   offline_pages::OfflinePageTabHelper::FromWebContents(web_contents())
       ->SetOfflinePage(item, header, true);
@@ -249,6 +254,20 @@
   content::WebContentsTester::For(web_contents())
       ->NavigateAndCommit(GURL(kTestUrl));
 
+  auto* data_reduction_proxy_settings =
+      DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
+          web_contents()->GetBrowserContext());
+  EXPECT_EQ(0, data_reduction_proxy_settings->data_reduction_proxy_service()
+                   ->compression_stats()
+                   ->GetHttpReceivedContentLength());
+
+  // Returns the value the total original size of all HTTP content received from
+  // the network.
+  EXPECT_EQ(expected_file_size,
+            data_reduction_proxy_settings->data_reduction_proxy_service()
+                ->compression_stats()
+                ->GetHttpOriginalContentLength());
+
   EXPECT_FALSE(infobar_tab_helper->displayed_preview_infobar());
 }
 #endif  // BUILDFLAG(ENABLE_OFFLINE_PAGES)