Headers for resource tracking.
The BackgroundLoaderOffliner needs signals to do a better job of knowing
when a page is loaded enough to take a snapshot. One such signal is to
track the precentages of resources that have been requested that actually
get loaded.
This change adds the headers in the design documented below.
Design doc here:
https://docs.google.com/document/d/1dxGOMsUkmxfoNUfQKqZRi4qAhWVGh9DZDiFI1arkiJ0
BUG=699313
Review-Url: https://codereview.chromium.org/2933193003
Cr-Commit-Position: refs/heads/master@{#480210}
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index b1747d4..d55a75d 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -2208,12 +2208,15 @@
"android/offline_pages/request_coordinator_factory.h",
"offline_pages/background_loader_offliner.cc",
"offline_pages/background_loader_offliner.h",
+ "offline_pages/offliner_user_data.cc",
+ "offline_pages/offliner_user_data.h",
"offline_pages/prefetch/offline_metrics_collector_impl.cc",
"offline_pages/prefetch/offline_metrics_collector_impl.h",
"offline_pages/prefetch/prefetch_instance_id_proxy.cc",
"offline_pages/prefetch/prefetch_instance_id_proxy.h",
"offline_pages/prefetch/prefetch_service_factory.cc",
"offline_pages/prefetch/prefetch_service_factory.h",
+ "offline_pages/resource_loading_observer.h",
]
if (is_android) {
sources += [
diff --git a/chrome/browser/offline_pages/background_loader_offliner.cc b/chrome/browser/offline_pages/background_loader_offliner.cc
index fa299ab..c5203bb 100644
--- a/chrome/browser/offline_pages/background_loader_offliner.cc
+++ b/chrome/browser/offline_pages/background_loader_offliner.cc
@@ -14,6 +14,7 @@
#include "chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h"
#include "chrome/browser/android/offline_pages/offliner_helper.h"
#include "chrome/browser/loader/chrome_navigation_data.h"
+#include "chrome/browser/offline_pages/offliner_user_data.h"
#include "chrome/browser/profiles/profile.h"
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
#include "components/offline_pages/core/background/offliner_policy.h"
@@ -38,28 +39,6 @@
"Content-Transfer-Encoding: binary";
const char kXHeaderForSignals[] = "X-Chrome-Loading-Metrics-Data: 1";
-class OfflinerData : public content::WebContentsUserData<OfflinerData> {
- public:
- static void AddToWebContents(content::WebContents* webcontents,
- BackgroundLoaderOffliner* offliner) {
- DCHECK(offliner);
- webcontents->SetUserData(UserDataKey(), std::unique_ptr<OfflinerData>(
- new OfflinerData(offliner)));
- }
-
- explicit OfflinerData(BackgroundLoaderOffliner* offliner) {
- offliner_ = offliner;
- }
- BackgroundLoaderOffliner* offliner() { return offliner_; }
-
- private:
- // The offliner that the WebContents is attached to. The offliner owns the
- // Delegate which owns the WebContents that this data is attached to.
- // Therefore, its lifetime should exceed that of the WebContents, so this
- // should always be non-null.
- BackgroundLoaderOffliner* offliner_;
-};
-
std::string AddHistogramSuffix(const ClientId& client_id,
const char* histogram_name) {
if (client_id.name_space.empty()) {
@@ -138,9 +117,11 @@
// static
BackgroundLoaderOffliner* BackgroundLoaderOffliner::FromWebContents(
content::WebContents* contents) {
- OfflinerData* data = OfflinerData::FromWebContents(contents);
- if (data)
- return data->offliner();
+ Offliner* offliner = OfflinerUserData::OfflinerFromWebContents(contents);
+ // Today we only have one kind of offliner that uses OfflinerUserData. If we
+ // add other types, revisit this cast.
+ if (offliner)
+ return static_cast<BackgroundLoaderOffliner*>(offliner);
return nullptr;
}
@@ -364,6 +345,12 @@
std::unique_ptr<SnapshotController> controller) {
snapshot_controller_ = std::move(controller);
}
+void BackgroundLoaderOffliner::ObserveResourceLoading(
+ ResourceLoadingObserver::ResourceDataType type,
+ bool started) {
+ // TODO(petewil) Not implemented yet.
+ return;
+}
void BackgroundLoaderOffliner::OnNetworkBytesChanged(int64_t bytes) {
if (pending_request_ && save_state_ != SAVING) {
@@ -521,7 +508,7 @@
void BackgroundLoaderOffliner::AttachObservers() {
content::WebContents* contents = loader_->web_contents();
content::WebContentsObserver::Observe(contents);
- OfflinerData::AddToWebContents(contents, this);
+ OfflinerUserData::AddToWebContents(contents, this);
}
void BackgroundLoaderOffliner::AddLoadingSignal(const char* signal_name) {
@@ -536,5 +523,3 @@
}
} // namespace offline_pages
-
-DEFINE_WEB_CONTENTS_USER_DATA_KEY(offline_pages::OfflinerData);
diff --git a/chrome/browser/offline_pages/background_loader_offliner.h b/chrome/browser/offline_pages/background_loader_offliner.h
index bace442..560e830 100644
--- a/chrome/browser/offline_pages/background_loader_offliner.h
+++ b/chrome/browser/offline_pages/background_loader_offliner.h
@@ -9,6 +9,7 @@
#include "base/memory/weak_ptr.h"
#include "base/values.h"
+#include "chrome/browser/offline_pages/resource_loading_observer.h"
#include "components/offline_pages/content/background_loader/background_loader_contents.h"
#include "components/offline_pages/core/background/load_termination_listener.h"
#include "components/offline_pages/core/background/offliner.h"
@@ -30,7 +31,8 @@
// OfflinePageModel to save it. Only one request may be active at a time.
class BackgroundLoaderOffliner : public Offliner,
public content::WebContentsObserver,
- public SnapshotController::Client {
+ public SnapshotController::Client,
+ public ResourceLoadingObserver {
public:
BackgroundLoaderOffliner(
content::BrowserContext* browser_context,
@@ -63,7 +65,11 @@
void SetSnapshotControllerForTest(
std::unique_ptr<SnapshotController> controller);
- void OnNetworkBytesChanged(int64_t bytes);
+
+ // ResourceLoadingObserver implemenation
+ void ObserveResourceLoading(ResourceLoadingObserver::ResourceDataType type,
+ bool started) override;
+ void OnNetworkBytesChanged(int64_t bytes) override;
protected:
// Called to reset the loader.
diff --git a/chrome/browser/offline_pages/offliner_user_data.cc b/chrome/browser/offline_pages/offliner_user_data.cc
new file mode 100644
index 0000000..0dc7273a
--- /dev/null
+++ b/chrome/browser/offline_pages/offliner_user_data.cc
@@ -0,0 +1,41 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/offline_pages/offliner_user_data.h"
+
+class ResourceTrackerObserver;
+
+namespace offline_pages {
+
+void OfflinerUserData::AddToWebContents(content::WebContents* webcontents,
+ BackgroundLoaderOffliner* offliner) {
+ DCHECK(offliner);
+ webcontents->SetUserData(UserDataKey(), std::unique_ptr<OfflinerUserData>(
+ new OfflinerUserData(offliner)));
+}
+
+// static - gets the data pointer as a BackgroundLoaderOffliner
+BackgroundLoaderOffliner* OfflinerUserData::OfflinerFromWebContents(
+ content::WebContents* webcontents) {
+ OfflinerUserData* data = OfflinerUserData::FromWebContents(webcontents);
+ if (data)
+ return data->offliner();
+
+ return nullptr;
+}
+
+// static - gets the data pointer as a ResourceLoadingObserver
+ResourceLoadingObserver*
+OfflinerUserData::ResourceLoadingObserverFromWebContents(
+ content::WebContents* webcontents) {
+ OfflinerUserData* data = OfflinerUserData::FromWebContents(webcontents);
+ if (data)
+ return data->offliner();
+
+ return nullptr;
+}
+
+} // namespace offline_pages
+
+DEFINE_WEB_CONTENTS_USER_DATA_KEY(offline_pages::OfflinerUserData);
diff --git a/chrome/browser/offline_pages/offliner_user_data.h b/chrome/browser/offline_pages/offliner_user_data.h
new file mode 100644
index 0000000..9ed7c6a
--- /dev/null
+++ b/chrome/browser/offline_pages/offliner_user_data.h
@@ -0,0 +1,41 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_OFFLINE_PAGES_OFFLINER_USER_DATA_H_
+#define CHROME_BROWSER_OFFLINE_PAGES_OFFLINER_USER_DATA_H_
+
+#include "chrome/browser/offline_pages/background_loader_offliner.h"
+#include "chrome/browser/offline_pages/resource_loading_observer.h"
+#include "components/offline_pages/features/features.h"
+#include "content/public/browser/web_contents_user_data.h"
+
+namespace offline_pages {
+
+class OfflinerUserData : public content::WebContentsUserData<OfflinerUserData> {
+ public:
+ static void AddToWebContents(content::WebContents* webcontents,
+ BackgroundLoaderOffliner* offliner);
+
+ static BackgroundLoaderOffliner* OfflinerFromWebContents(
+ content::WebContents* webcontents);
+
+ static ResourceLoadingObserver* ResourceLoadingObserverFromWebContents(
+ content::WebContents* webcontents);
+
+ explicit OfflinerUserData(BackgroundLoaderOffliner* offliner) {
+ offliner_ = offliner;
+ }
+ BackgroundLoaderOffliner* offliner() { return offliner_; }
+
+ private:
+ // The offliner that the WebContents is attached to. The offliner owns the
+ // Delegate which owns the WebContents that this data is attached to.
+ // Therefore, its lifetime should exceed that of the WebContents, so this
+ // should always be non-null.
+ BackgroundLoaderOffliner* offliner_;
+};
+
+} // namespace offline_pages
+
+#endif // CHROME_BROWSER_OFFLINE_PAGES_OFFLINER_USER_DATA_H_
diff --git a/chrome/browser/offline_pages/resource_loading_observer.h b/chrome/browser/offline_pages/resource_loading_observer.h
new file mode 100644
index 0000000..6a6e90d
--- /dev/null
+++ b/chrome/browser/offline_pages/resource_loading_observer.h
@@ -0,0 +1,32 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_OFFLINE_PAGES_RESOURCE_LOADING_OBSERVER_H_
+#define CHROME_BROWSER_OFFLINE_PAGES_RESOURCE_LOADING_OBSERVER_H_
+
+#include <stdint.h>
+
+namespace offline_pages {
+
+// This interface is used by clients who want to be notified when a resource is
+// requested or completes loading, and to report the size of the resource.
+class ResourceLoadingObserver {
+ public:
+ enum ResourceDataType {
+ IMAGE,
+ TEXT_CSS,
+ OTHER,
+ RESOURCE_DATA_TYPE_COUNT,
+ };
+
+ // Report when a resource starts or completes loading.
+ virtual void ObserveResourceLoading(ResourceDataType type, bool started) = 0;
+
+ // Report how many bytes were received for a resource.
+ virtual void OnNetworkBytesChanged(int64_t received_bytes) = 0;
+};
+
+} // namespace offline_pages
+
+#endif // CHROME_BROWSER_OFFLINE_PAGES_RESOURCE_LOADING_OBSERVER_H_