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)