Commit d1fee60d authored by Josh Karlin's avatar Josh Karlin Committed by Commit Bot

[AdsPageLoadMetrics] Track frames identified as ads by SubresourceFilter

Labels frames identified as ads by the SubresourceFilter as ads. Also adds an
AdType to each frame tracked by AdsPageLoadMetrics. When it's time to record
the metrics, the same logic is applied once to collect stats for each ad type.
There is also an additional ad type, "All", which records stats on all of the
identified ads, regardless of which detector discovered it.

Bug: 708570
Change-Id: Ic0f1f1cfd7176ffdba459b607735a6aa6b4318ff
Reviewed-on: https://chromium-review.googlesource.com/567324Reviewed-by: default avatarRobert Kaplow <rkaplow@chromium.org>
Reviewed-by: default avatarCharlie Harrison <csharrison@chromium.org>
Commit-Queue: Josh Karlin <jkarlin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#486797}
parent 2cccbe12
......@@ -21,7 +21,20 @@ namespace {
const base::Feature kAdsFeature{"AdsMetrics", base::FEATURE_ENABLED_BY_DEFAULT};
bool FrameIsAd(content::NavigationHandle* navigation_handle) {
#define ADS_HISTOGRAM(suffix, hist_macro, ad_type, value) \
switch (ad_type) { \
case AdsPageLoadMetricsObserver::AD_TYPE_GOOGLE: \
hist_macro("PageLoad.Clients.Ads.Google." suffix, value); \
break; \
case AdsPageLoadMetricsObserver::AD_TYPE_SUBRESOURCE_FILTER: \
hist_macro("PageLoad.Clients.Ads.SubresourceFilter." suffix, value); \
break; \
case AdsPageLoadMetricsObserver::AD_TYPE_ALL: \
hist_macro("PageLoad.Clients.Ads.All." suffix, value); \
break; \
}
bool DetectGoogleAd(content::NavigationHandle* navigation_handle) {
// Because sub-resource filtering isn't always enabled, and doesn't work
// well in monitoring mode (no CSS enforcement), it's difficult to identify
// ads. Google ads are prevalent and easy to track, so we'll start by
......@@ -55,18 +68,22 @@ bool FrameIsAd(content::NavigationHandle* navigation_handle) {
base::CompareCase::SENSITIVE);
}
void RecordParentExistsForSubFrame(bool parent_exists) {
UMA_HISTOGRAM_BOOLEAN("PageLoad.Clients.Ads.Google.ParentExistsForSubFrame",
parent_exists);
void RecordParentExistsForSubFrame(
bool parent_exists,
const AdsPageLoadMetricsObserver::AdTypes& ad_types) {
ADS_HISTOGRAM("ParentExistsForSubFrame", UMA_HISTOGRAM_BOOLEAN,
AdsPageLoadMetricsObserver::AD_TYPE_ALL, parent_exists);
}
} // namespace
AdsPageLoadMetricsObserver::AdFrameData::AdFrameData(
FrameTreeNodeId frame_tree_node_id)
FrameTreeNodeId frame_tree_node_id,
AdTypes ad_types)
: frame_bytes(0u),
frame_bytes_uncached(0u),
frame_tree_node_id(frame_tree_node_id) {}
frame_tree_node_id(frame_tree_node_id),
ad_types(ad_types) {}
// static
std::unique_ptr<AdsPageLoadMetricsObserver>
......@@ -76,9 +93,26 @@ AdsPageLoadMetricsObserver::CreateIfNeeded() {
return base::MakeUnique<AdsPageLoadMetricsObserver>();
}
AdsPageLoadMetricsObserver::AdsPageLoadMetricsObserver() = default;
AdsPageLoadMetricsObserver::AdsPageLoadMetricsObserver()
: subresource_observer_(this) {}
AdsPageLoadMetricsObserver::~AdsPageLoadMetricsObserver() = default;
page_load_metrics::PageLoadMetricsObserver::ObservePolicy
AdsPageLoadMetricsObserver::OnStart(
content::NavigationHandle* navigation_handle,
const GURL& currently_committed_url,
bool started_in_foreground) {
auto* observer_manager =
subresource_filter::SubresourceFilterObserverManager::FromWebContents(
navigation_handle->GetWebContents());
// |observer_manager| isn't constructed if the feature for subresource
// filtering isn't enabled.
if (observer_manager)
subresource_observer_.Add(observer_manager);
return CONTINUE_OBSERVING;
}
page_load_metrics::PageLoadMetricsObserver::ObservePolicy
AdsPageLoadMetricsObserver::OnCommit(
content::NavigationHandle* navigation_handle,
......@@ -103,6 +137,8 @@ void AdsPageLoadMetricsObserver::OnDidFinishSubFrameNavigation(
content::RenderFrameHost* parent_frame_host =
navigation_handle->GetParentFrame();
AdTypes ad_types = DetectAds(navigation_handle);
const auto& id_and_data = ad_frames_data_.find(frame_tree_node_id);
if (id_and_data != ad_frames_data_.end()) {
// An existing subframe is navigating again.
......@@ -112,17 +148,15 @@ void AdsPageLoadMetricsObserver::OnDidFinishSubFrameNavigation(
if (frame_tree_node_id == id_and_data->second->frame_tree_node_id) {
// This is the top-most frame in the ad.
UMA_HISTOGRAM_BOOLEAN(
"PageLoad.Clients.Ads.Google.Navigations.AdFrameRenavigatedToAd",
FrameIsAd(navigation_handle));
ADS_HISTOGRAM("Navigations.AdFrameRenavigatedToAd",
UMA_HISTOGRAM_BOOLEAN, AD_TYPE_ALL, ad_types.any());
}
return;
}
// This frame was previously not an ad, process it as usual. If it had
// any child frames that were ads, those will still be recorded.
UMA_HISTOGRAM_BOOLEAN(
"PageLoad.Clients.Ads.Google.Navigations.NonAdFrameRenavigatedToAd",
FrameIsAd(navigation_handle));
ADS_HISTOGRAM("Navigations.NonAdFrameRenavigatedToAd",
UMA_HISTOGRAM_BOOLEAN, AD_TYPE_ALL, ad_types.any());
}
// Determine who the parent frame's ad ancestor is.
......@@ -131,17 +165,16 @@ void AdsPageLoadMetricsObserver::OnDidFinishSubFrameNavigation(
if (parent_id_and_data == ad_frames_data_.end()) {
// We don't know who the parent for this frame is. One possibility is that
// it's a frame from a previous navigation.
RecordParentExistsForSubFrame(false /* parent_exists */);
RecordParentExistsForSubFrame(false /* parent_exists */, ad_types);
return;
}
RecordParentExistsForSubFrame(true /* parent_exists */);
RecordParentExistsForSubFrame(true /* parent_exists */, ad_types);
AdFrameData* ad_data = parent_id_and_data->second;
if (!ad_data && FrameIsAd(navigation_handle)) {
if (!ad_data && ad_types.any()) {
// This frame is not nested within an ad frame but is itself an ad.
ad_frames_data_storage_.emplace_back(frame_tree_node_id);
ad_frames_data_storage_.emplace_back(frame_tree_node_id, ad_types);
ad_data = &ad_frames_data_storage_.back();
}
......@@ -173,6 +206,40 @@ void AdsPageLoadMetricsObserver::OnComplete(
RecordHistograms();
}
void AdsPageLoadMetricsObserver::OnSubframeNavigationEvaluated(
content::NavigationHandle* navigation_handle,
subresource_filter::LoadPolicy load_policy) {
// We don't track DISALLOW frames because their resources won't be loaded
// and therefore would provide bad histogram data. Note that WOULD_DISALLOW
// is only seen in dry runs.
if (load_policy == subresource_filter::LoadPolicy::WOULD_DISALLOW) {
unfinished_subresource_ad_frames_.insert(
navigation_handle->GetFrameTreeNodeId());
}
}
void AdsPageLoadMetricsObserver::OnSubresourceFilterGoingAway() {
subresource_observer_.RemoveAll();
}
bool AdsPageLoadMetricsObserver::DetectSubresourceFilterAd(
FrameTreeNodeId frame_tree_node_id) {
return unfinished_subresource_ad_frames_.erase(frame_tree_node_id);
}
AdsPageLoadMetricsObserver::AdTypes AdsPageLoadMetricsObserver::DetectAds(
content::NavigationHandle* navigation_handle) {
AdTypes ad_types;
if (DetectGoogleAd(navigation_handle))
ad_types.set(AD_TYPE_GOOGLE);
if (DetectSubresourceFilterAd(navigation_handle->GetFrameTreeNodeId()))
ad_types.set(AD_TYPE_SUBRESOURCE_FILTER);
return ad_types;
}
void AdsPageLoadMetricsObserver::ProcessLoadedResource(
const page_load_metrics::ExtraRequestCompleteInfo& extra_request_info) {
const auto& id_and_data =
......@@ -201,7 +268,7 @@ void AdsPageLoadMetricsObserver::ProcessLoadedResource(
}
if (committed_) {
UMA_HISTOGRAM_ENUMERATION(
"PageLoad.Clients.Ads.Google.ResourceTypeWhenNoFrameFound",
"PageLoad.Clients.Ads.All.ResourceTypeWhenNoFrameFound",
extra_request_info.resource_type, content::RESOURCE_TYPE_LAST_TYPE);
}
......@@ -225,6 +292,12 @@ void AdsPageLoadMetricsObserver::ProcessLoadedResource(
}
void AdsPageLoadMetricsObserver::RecordHistograms() {
RecordHistogramsForType(AD_TYPE_GOOGLE);
RecordHistogramsForType(AD_TYPE_SUBRESOURCE_FILTER);
RecordHistogramsForType(AD_TYPE_ALL);
}
void AdsPageLoadMetricsObserver::RecordHistogramsForType(int ad_type) {
if (page_bytes_ == 0)
return;
......@@ -236,59 +309,58 @@ void AdsPageLoadMetricsObserver::RecordHistograms() {
if (ad_frame_data.frame_bytes == 0)
continue;
// If this isn't the type of ad we're looking for, move on to the next.
if (ad_type != AD_TYPE_ALL && !ad_frame_data.ad_types.test(ad_type))
continue;
non_zero_ad_frames += 1;
total_ad_frame_bytes += ad_frame_data.frame_bytes;
uncached_ad_frame_bytes += ad_frame_data.frame_bytes_uncached;
PAGE_BYTES_HISTOGRAM(
"PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Total",
ad_frame_data.frame_bytes);
PAGE_BYTES_HISTOGRAM(
"PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Network",
ad_frame_data.frame_bytes_uncached);
UMA_HISTOGRAM_PERCENTAGE(
"PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.PercentNetwork",
uncached_ad_frame_bytes += ad_frame_data.frame_bytes_uncached;
ADS_HISTOGRAM("Bytes.AdFrames.PerFrame.Total", PAGE_BYTES_HISTOGRAM,
ad_type, ad_frame_data.frame_bytes);
ADS_HISTOGRAM("Bytes.AdFrames.PerFrame.Network", PAGE_BYTES_HISTOGRAM,
ad_type, ad_frame_data.frame_bytes_uncached);
ADS_HISTOGRAM(
"Bytes.AdFrames.PerFrame.PercentNetwork", UMA_HISTOGRAM_PERCENTAGE,
ad_type,
ad_frame_data.frame_bytes_uncached * 100 / ad_frame_data.frame_bytes);
}
UMA_HISTOGRAM_COUNTS_1000(
"PageLoad.Clients.Ads.Google.FrameCounts.AnyParentFrame.AdFrames",
non_zero_ad_frames);
ADS_HISTOGRAM("FrameCounts.AnyParentFrame.AdFrames",
UMA_HISTOGRAM_COUNTS_1000, ad_type, non_zero_ad_frames);
// Don't post UMA for pages that don't have ads.
if (non_zero_ad_frames == 0)
return;
PAGE_BYTES_HISTOGRAM(
"PageLoad.Clients.Ads.Google.Bytes.NonAdFrames.Aggregate.Total",
page_bytes_ - total_ad_frame_bytes);
ADS_HISTOGRAM("Bytes.NonAdFrames.Aggregate.Total", PAGE_BYTES_HISTOGRAM,
ad_type, page_bytes_ - total_ad_frame_bytes);
ADS_HISTOGRAM("Bytes.FullPage.Total", PAGE_BYTES_HISTOGRAM, ad_type,
page_bytes_);
ADS_HISTOGRAM("Bytes.FullPage.Network", PAGE_BYTES_HISTOGRAM, ad_type,
uncached_page_bytes_);
PAGE_BYTES_HISTOGRAM("PageLoad.Clients.Ads.Google.Bytes.FullPage.Total",
page_bytes_);
PAGE_BYTES_HISTOGRAM("PageLoad.Clients.Ads.Google.Bytes.FullPage.Network",
uncached_page_bytes_);
if (page_bytes_) {
UMA_HISTOGRAM_PERCENTAGE(
"PageLoad.Clients.Ads.Google.Bytes.FullPage.Total.PercentAds",
total_ad_frame_bytes * 100 / page_bytes_);
ADS_HISTOGRAM("Bytes.FullPage.Total.PercentAds", UMA_HISTOGRAM_PERCENTAGE,
ad_type, total_ad_frame_bytes * 100 / page_bytes_);
}
if (uncached_page_bytes_ > 0) {
UMA_HISTOGRAM_PERCENTAGE(
"PageLoad.Clients.Ads.Google.Bytes.FullPage.Network.PercentAds",
uncached_ad_frame_bytes * 100 / uncached_page_bytes_);
ADS_HISTOGRAM("Bytes.FullPage.Network.PercentAds", UMA_HISTOGRAM_PERCENTAGE,
ad_type,
uncached_ad_frame_bytes * 100 / uncached_page_bytes_);
}
PAGE_BYTES_HISTOGRAM(
"PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Total",
total_ad_frame_bytes);
PAGE_BYTES_HISTOGRAM(
"PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Network",
uncached_ad_frame_bytes);
ADS_HISTOGRAM("Bytes.AdFrames.Aggregate.Total", PAGE_BYTES_HISTOGRAM, ad_type,
total_ad_frame_bytes);
ADS_HISTOGRAM("Bytes.AdFrames.Aggregate.Network", PAGE_BYTES_HISTOGRAM,
ad_type, uncached_ad_frame_bytes);
if (total_ad_frame_bytes) {
UMA_HISTOGRAM_PERCENTAGE(
"PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.PercentNetwork",
uncached_ad_frame_bytes * 100 / total_ad_frame_bytes);
ADS_HISTOGRAM("Bytes.AdFrames.Aggregate.PercentNetwork",
UMA_HISTOGRAM_PERCENTAGE, ad_type,
uncached_ad_frame_bytes * 100 / total_ad_frame_bytes);
}
}
......
......@@ -5,20 +5,36 @@
#ifndef CHROME_BROWSER_PAGE_LOAD_METRICS_OBSERVERS_ADS_PAGE_LOAD_METRICS_OBSERVER_H_
#define CHROME_BROWSER_PAGE_LOAD_METRICS_OBSERVERS_ADS_PAGE_LOAD_METRICS_OBSERVER_H_
#include <bitset>
#include <list>
#include <map>
#include <memory>
#include "base/macros.h"
#include "base/scoped_observer.h"
#include "chrome/browser/page_load_metrics/page_load_metrics_observer.h"
#include "components/subresource_filter/content/browser/subresource_filter_observer.h"
#include "components/subresource_filter/content/browser/subresource_filter_observer_manager.h"
#include "components/subresource_filter/core/common/load_policy.h"
#include "components/ukm/ukm_source.h"
#include "net/http/http_response_info.h"
// This observer labels each sub-frame as an ad or not, and keeps track of
// relevant per-frame and whole-page byte statistics.
class AdsPageLoadMetricsObserver
: public page_load_metrics::PageLoadMetricsObserver {
: public page_load_metrics::PageLoadMetricsObserver,
public subresource_filter::SubresourceFilterObserver {
public:
// The types of ads that one can filter on.
enum AdType {
AD_TYPE_GOOGLE = 0,
AD_TYPE_SUBRESOURCE_FILTER = 1,
AD_TYPE_ALL = 2,
AD_TYPE_MAX = AD_TYPE_ALL
};
using AdTypes = std::bitset<AD_TYPE_MAX>;
// Returns a new AdsPageLoadMetricObserver. If the feature is disabled it
// returns nullptr.
static std::unique_ptr<AdsPageLoadMetricsObserver> CreateIfNeeded();
......@@ -27,6 +43,9 @@ class AdsPageLoadMetricsObserver
~AdsPageLoadMetricsObserver() override;
// page_load_metrics::PageLoadMetricsObserver
ObservePolicy OnStart(content::NavigationHandle* navigation_handle,
const GURL& currently_committed_url,
bool started_in_foreground) override;
ObservePolicy OnCommit(content::NavigationHandle* navigation_handle,
ukm::SourceId source_id) override;
void OnDidFinishSubFrameNavigation(
......@@ -41,15 +60,33 @@ class AdsPageLoadMetricsObserver
private:
struct AdFrameData {
explicit AdFrameData(FrameTreeNodeId frame_tree_node_id);
AdFrameData(FrameTreeNodeId frame_tree_node_id, AdTypes ad_types);
size_t frame_bytes;
size_t frame_bytes_uncached;
const FrameTreeNodeId frame_tree_node_id;
AdTypes ad_types;
};
// subresource_filter::SubresourceFilterObserver:
void OnSubframeNavigationEvaluated(
content::NavigationHandle* navigation_handle,
subresource_filter::LoadPolicy load_policy) override;
void OnSubresourceFilterGoingAway() override;
// Determines if the URL of a frame matches the SubresourceFilter block
// list. Should only be called once per frame navigation.
bool DetectSubresourceFilterAd(FrameTreeNodeId frame_tree_node_id);
// This should only be called once per frame navigation, as the
// SubresourceFilter detector clears its state about detected frames after
// each call in order to free up memory.
AdTypes DetectAds(content::NavigationHandle* navigation_handle);
void ProcessLoadedResource(
const page_load_metrics::ExtraRequestCompleteInfo& extra_request_info);
void RecordHistograms();
void RecordHistogramsForType(int ad_type);
// Checks to see if a resource is waiting for a navigation with the given
// |frame_tree_node_id| to commit before it can be processed. If so, call
......@@ -67,6 +104,11 @@ class AdsPageLoadMetricsObserver
// nullptr.
std::map<FrameTreeNodeId, AdFrameData*> ad_frames_data_;
// The set of frames that have yet to finish but that the SubresourceFilter
// has reported are ads. Once DetectSubresourceFilterAd is called the id is
// removed from the set.
std::set<FrameTreeNodeId> unfinished_subresource_ad_frames_;
// When the observer receives report of a document resource loading for a
// sub-frame before the sub-frame commit occurs, hold onto the resource
// request info (delay it) until the sub-frame commits.
......@@ -77,6 +119,10 @@ class AdsPageLoadMetricsObserver
size_t uncached_page_bytes_ = 0u;
bool committed_ = false;
ScopedObserver<subresource_filter::SubresourceFilterObserverManager,
subresource_filter::SubresourceFilterObserver>
subresource_observer_;
DISALLOW_COPY_AND_ASSIGN(AdsPageLoadMetricsObserver);
};
......
......@@ -7,11 +7,14 @@
#include <string>
#include "base/macros.h"
#include "base/strings/stringprintf.h"
#include "base/test/histogram_tester.h"
#include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h"
#include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h"
#include "chrome/browser/page_load_metrics/page_load_metrics_observer.h"
#include "chrome/browser/page_load_metrics/page_load_tracker.h"
#include "components/subresource_filter/content/browser/subresource_filter_observer_manager.h"
#include "components/subresource_filter/core/common/load_policy.h"
#include "content/public/browser/global_request_id.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/navigation_throttle.h"
......@@ -36,10 +39,14 @@ struct ExpectedFrameBytes {
size_t uncached_kb;
};
enum class AdType { GOOGLE = 0, SUBRESOURCE_FILTER = 1, ALL = 2 };
enum class ResourceCached { NOT_CACHED, CACHED };
enum class FrameType { AD = 0, NON_AD };
const char kAdUrl[] = "https://tpc.googlesyndication.com/safeframe/1";
const char kSubresourceFilterWouldDisallowAdUrl[] = "https://ad.example.com/";
const char kSubresourceFilterDisallowAdUrl[] =
"https://ad.example.com/disallow";
const char kNonAdUrl[] = "https://foo.com/";
const char kNonAdUrl2[] = "https://bar.com/";
......@@ -117,13 +124,32 @@ class DelayWillProcessResponseObserver : public content::WebContentsObserver {
DISALLOW_COPY_AND_ASSIGN(DelayWillProcessResponseObserver);
};
std::string AdTypeToString(AdType ad_type) {
switch (ad_type) {
case AdType::GOOGLE:
return "Google";
case AdType::SUBRESOURCE_FILTER:
return "SubresourceFilter";
case AdType::ALL:
return "All";
}
ADD_FAILURE();
return "";
}
std::string TypedHistogram(const std::string& suffix, AdType ad_type) {
return base::StringPrintf("PageLoad.Clients.Ads.%s.%s",
AdTypeToString(ad_type).c_str(), suffix.c_str());
}
// Verifies that the histograms match what is expected given |google_ad_frames|
// ad frame byte counts and non-ad counts (|other_cached_kb| and
// |other_uncached_kb|).
void TestHistograms(const base::HistogramTester& histograms,
const std::vector<ExpectedFrameBytes>& google_ad_frames,
size_t non_ad_cached_kb,
size_t non_ad_uncached_kb) {
size_t non_ad_uncached_kb,
AdType ad_type) {
size_t total_ad_cached_kb = 0;
size_t total_ad_uncached_kb = 0;
size_t total_ad_kb = 0;
......@@ -155,7 +181,7 @@ void TestHistograms(const base::HistogramTester& histograms,
// Test the histograms.
histograms.ExpectUniqueSample(
"PageLoad.Clients.Ads.Google.FrameCounts.AnyParentFrame.AdFrames",
TypedHistogram("FrameCounts.AnyParentFrame.AdFrames", ad_type),
ad_frame_count, 1);
if (ad_frame_count == 0)
......@@ -163,46 +189,46 @@ void TestHistograms(const base::HistogramTester& histograms,
for (const auto& total_bytes_and_count : frames_with_total_byte_count) {
histograms.ExpectBucketCount(
"PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Total",
TypedHistogram("Bytes.AdFrames.PerFrame.Total", ad_type),
total_bytes_and_count.first, total_bytes_and_count.second);
}
for (const auto& network_bytes_and_count : frames_with_network_byte_count) {
histograms.ExpectBucketCount(
"PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Network",
TypedHistogram("Bytes.AdFrames.PerFrame.Network", ad_type),
network_bytes_and_count.first, network_bytes_and_count.second);
}
for (const auto& percent_network_and_count :
frames_with_percent_network_count) {
histograms.ExpectBucketCount(
"PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.PercentNetwork",
TypedHistogram("Bytes.AdFrames.PerFrame.PercentNetwork", ad_type),
percent_network_and_count.first, percent_network_and_count.second);
}
histograms.ExpectUniqueSample(
"PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Total", total_ad_kb,
TypedHistogram("Bytes.AdFrames.Aggregate.Total", ad_type), total_ad_kb,
1);
histograms.ExpectUniqueSample(
"PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Network",
TypedHistogram("Bytes.AdFrames.Aggregate.Network", ad_type),
total_ad_uncached_kb, 1);
histograms.ExpectUniqueSample(
"PageLoad.Clients.Ads.Google.Bytes.FullPage.Total",
TypedHistogram("Bytes.FullPage.Total", ad_type),
non_ad_cached_kb + non_ad_uncached_kb + total_ad_kb, 1);
histograms.ExpectUniqueSample(
"PageLoad.Clients.Ads.Google.Bytes.FullPage.Network",
TypedHistogram("Bytes.FullPage.Network", ad_type),
non_ad_uncached_kb + total_ad_uncached_kb, 1);
histograms.ExpectUniqueSample(
"PageLoad.Clients.Ads.Google.Bytes.NonAdFrames.Aggregate.Total",
TypedHistogram("Bytes.NonAdFrames.Aggregate.Total", ad_type),
non_ad_cached_kb + non_ad_uncached_kb, 1);
histograms.ExpectUniqueSample(
"PageLoad.Clients.Ads.Google.Bytes.FullPage.Total.PercentAds",
TypedHistogram("Bytes.FullPage.Total.PercentAds", ad_type),
(total_ad_kb * 100) /
(total_ad_kb + non_ad_cached_kb + non_ad_uncached_kb),
1);
histograms.ExpectUniqueSample(
"PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.PercentNetwork",
TypedHistogram("Bytes.AdFrames.Aggregate.PercentNetwork", ad_type),
((total_ad_uncached_kb * 100) / total_ad_kb), 1);
histograms.ExpectUniqueSample(
"PageLoad.Clients.Ads.Google.Bytes.FullPage.Network.PercentAds",
TypedHistogram("Bytes.FullPage.Network.PercentAds", ad_type),
(total_ad_uncached_kb * 100) /
(total_ad_uncached_kb + non_ad_uncached_kb),
1);
......@@ -215,6 +241,15 @@ class AdsPageLoadMetricsObserverTest
public:
AdsPageLoadMetricsObserverTest() {}
void SetUp() override {
page_load_metrics::PageLoadMetricsObserverTestHarness::SetUp();
subresource_filter::SubresourceFilterObserverManager::CreateForWebContents(
web_contents());
subresource_observer_manager_ =
subresource_filter::SubresourceFilterObserverManager::FromWebContents(
web_contents());
}
// Returns the final RenderFrameHost after navigation commits.
RenderFrameHost* NavigateFrame(const std::string& url,
content::RenderFrameHost* frame) {
......@@ -237,6 +272,22 @@ class AdsPageLoadMetricsObserverTest
RenderFrameHostTester::For(parent)->AppendChild(frame_name);
auto navigation_simulator =
NavigationSimulator::CreateRendererInitiated(GURL(url), subframe);
navigation_simulator->Start();
// Simulate subresource filter evaluation.
content::NavigationHandle* handle =
navigation_simulator->GetNavigationHandle();
if (url == kSubresourceFilterWouldDisallowAdUrl) {
subresource_observer_manager_->NotifySubframeNavigationEvaluated(
handle, subresource_filter::LoadPolicy::WOULD_DISALLOW);
} else if (url == kSubresourceFilterDisallowAdUrl) {
subresource_observer_manager_->NotifySubframeNavigationEvaluated(
handle, subresource_filter::LoadPolicy::DISALLOW);
} else {
subresource_observer_manager_->NotifySubframeNavigationEvaluated(
handle, subresource_filter::LoadPolicy::ALLOW);
}
navigation_simulator->Commit();
return navigation_simulator->GetFinalRenderFrameHost();
}
......@@ -252,11 +303,11 @@ class AdsPageLoadMetricsObserverTest
if (frame_type == FrameType::AD) {
tester.ExpectUniqueSample(
"PageLoad.Clients.Ads.Google.Navigations.AdFrameRenavigatedToAd",
bucket, 1);
"PageLoad.Clients.Ads.All.Navigations.AdFrameRenavigatedToAd", bucket,
1);
} else {
tester.ExpectUniqueSample(
"PageLoad.Clients.Ads.Google.Navigations.NonAdFrameRenavigatedToAd",
"PageLoad.Clients.Ads.All.Navigations.NonAdFrameRenavigatedToAd",
bucket, 1);
}
......@@ -281,6 +332,8 @@ class AdsPageLoadMetricsObserverTest
}
private:
subresource_filter::SubresourceFilterObserverManager*
subresource_observer_manager_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(AdsPageLoadMetricsObserverTest);
};
......@@ -298,7 +351,8 @@ TEST_F(AdsPageLoadMetricsObserverTest, PageWithNoAds) {
NavigateFrame(kNonAdUrl, main_frame);
TestHistograms(histogram_tester(), std::vector<ExpectedFrameBytes>(),
0 /* non_ad_cached_kb */, 30 /* non_ad_uncached_kb */);
0 /* non_ad_cached_kb */, 30 /* non_ad_uncached_kb */,
AdType::GOOGLE);
// Verify that other UMA wasn't written.
histogram_tester().ExpectTotalCount(
......@@ -327,10 +381,10 @@ TEST_F(AdsPageLoadMetricsObserverTest, ResourceBeforeAdFrameCommits) {
NavigateFrame(kNonAdUrl, main_frame);
TestHistograms(histogram_tester(), {{0, 10}}, 0 /* non_ad_cached_kb */,
10 /*non_ad_uncached_kb*/);
10 /*non_ad_uncached_kb*/, AdType::GOOGLE);
}
TEST_F(AdsPageLoadMetricsObserverTest, PageWithAdFrames) {
TEST_F(AdsPageLoadMetricsObserverTest, AllAdTypesInPage) {
RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
RenderFrameHost* non_ad_frame =
CreateAndNavigateSubFrame(kNonAdUrl, kNonAdName, main_frame);
......@@ -339,40 +393,54 @@ TEST_F(AdsPageLoadMetricsObserverTest, PageWithAdFrames) {
// nested ad frame doesn't get counted separately (but that its bytes are
// still counted). Also verify that the various ad signals (urls and names)
// are properly detected.
RenderFrameHost* ad_frame1 =
RenderFrameHost* google_frame1 =
CreateAndNavigateSubFrame(kNonAdUrl, "google_ads_iframe_1", main_frame);
RenderFrameHost* ad_frame2 =
CreateAndNavigateSubFrame(kNonAdUrl, "google_ads_frame_2", main_frame);
RenderFrameHost* ad_frame3 = CreateAndNavigateSubFrame(
"https://tpc.googlesyndication.com/safeframe/", "", main_frame);
RenderFrameHost* ad_frame4 = CreateAndNavigateSubFrame(
"https://tpc.googlesyndication.com/safeframe/1", "", main_frame);
RenderFrameHost* nested_ad_frame4 = CreateAndNavigateSubFrame(
"https://tpc.googlesyndication.com/safeframe/2", "", ad_frame4);
RenderFrameHost* google_frame2 =
CreateAndNavigateSubFrame(kAdUrl, kNonAdName, main_frame);
RenderFrameHost* srf_frame1 = CreateAndNavigateSubFrame(
kSubresourceFilterWouldDisallowAdUrl, kNonAdName, main_frame);
RenderFrameHost* srf_frame2 = CreateAndNavigateSubFrame(
kSubresourceFilterWouldDisallowAdUrl, kNonAdName, main_frame);
RenderFrameHost* nested_srf_frame3 = CreateAndNavigateSubFrame(
kSubresourceFilterWouldDisallowAdUrl, kNonAdName, srf_frame2);
// This frame should return DISALLOW by the SubresourceFilter so it won't
// count as an ad.
RenderFrameHost* disallowed_srf_frame = CreateAndNavigateSubFrame(
kSubresourceFilterDisallowAdUrl, kNonAdName, main_frame);
// Create an addditional ad frame without content. It shouldn't be counted
// as an ad frame.
CreateAndNavigateSubFrame(kAdUrl, kNonAdName, main_frame);
CreateAndNavigateSubFrame(kSubresourceFilterWouldDisallowAdUrl, kNonAdName,
main_frame);
// 70KB total in page, 50 from ads, 40 from network, and 30 of those
// are from ads.
LoadResource(main_frame, ResourceCached::NOT_CACHED, 10);
LoadResource(non_ad_frame, ResourceCached::CACHED, 10);
LoadResource(ad_frame1, ResourceCached::CACHED, 10);
LoadResource(ad_frame2, ResourceCached::NOT_CACHED, 10);
LoadResource(ad_frame3, ResourceCached::NOT_CACHED, 10);
LoadResource(ad_frame4, ResourceCached::NOT_CACHED, 10);
LoadResource(nested_ad_frame4, ResourceCached::CACHED, 10);
LoadResource(google_frame1, ResourceCached::CACHED, 10);
LoadResource(google_frame2, ResourceCached::NOT_CACHED, 10);
LoadResource(srf_frame1, ResourceCached::NOT_CACHED, 10);
LoadResource(srf_frame2, ResourceCached::NOT_CACHED, 10);
LoadResource(nested_srf_frame3, ResourceCached::CACHED, 10);
LoadResource(disallowed_srf_frame, ResourceCached::CACHED, 10);
// Navigate again to trigger histograms.
NavigateFrame(kNonAdUrl, main_frame);
TestHistograms(histogram_tester(), {{10, 0}, {0, 10}},
30 /* non_ad_cached_kb */, 30 /* non_ad_uncached_kb */,
AdType::GOOGLE);
TestHistograms(histogram_tester(), {{0, 10}, {10, 10}},
30 /* non_ad_cached_kb */, 20 /* non_ad_uncached_kb */,
AdType::SUBRESOURCE_FILTER);
TestHistograms(histogram_tester(), {{10, 0}, {0, 10}, {0, 10}, {10, 10}},
10 /* non_ad_cached_kb */, 10 /* non_ad_uncached_kb */);
20 /* non_ad_cached_kb */, 10 /* non_ad_uncached_kb */,
AdType::ALL);
histogram_tester().ExpectBucketCount(
"PageLoad.Clients.Ads.Google.ParentExistsForSubFrame", 0, 0);
"PageLoad.Clients.Ads.All.ParentExistsForSubFrame", 0, 0);
histogram_tester().ExpectTotalCount(
"PageLoad.Clients.Ads.Google.ResourceTypeWhenNoFrameFound", 0);
"PageLoad.Clients.Ads.All.ResourceTypeWhenNoFrameFound", 0);
}
TEST_F(AdsPageLoadMetricsObserverTest, PageLoadSubFrameRenavigationMetrics) {
......@@ -410,7 +478,7 @@ TEST_F(AdsPageLoadMetricsObserverTest, PageLoadSubFrameRenavigationMetrics) {
base::HistogramTester tester;
ad_sub_sub_frame = NavigateFrame(kNonAdUrl2, ad_sub_sub_frame);
tester.ExpectTotalCount(
"PageLoad.Clients.Ads.Google.Navigations.AdFrameRenavigatedToAd", 0);
"PageLoad.Clients.Ads.All.Navigations.AdFrameRenavigatedToAd", 0);
}
TEST_F(AdsPageLoadMetricsObserverTest, PageWithAdFrameThatRenavigates) {
......@@ -431,11 +499,11 @@ TEST_F(AdsPageLoadMetricsObserverTest, PageWithAdFrameThatRenavigates) {
NavigateFrame(kNonAdUrl, main_frame);
TestHistograms(histogram_tester(), {{0, 20}}, 0 /* non_ad_cached_kb */,
10 /* non_ad_uncached_kb */);
10 /* non_ad_uncached_kb */, AdType::GOOGLE);
histogram_tester().ExpectBucketCount(
"PageLoad.Clients.Ads.Google.ParentExistsForSubFrame", 0, 0);
"PageLoad.Clients.Ads.All.ParentExistsForSubFrame", 0, 0);
histogram_tester().ExpectTotalCount(
"PageLoad.Clients.Ads.Google.ResourceTypeWhenNoFrameFound", 0);
"PageLoad.Clients.Ads.All.ResourceTypeWhenNoFrameFound", 0);
}
TEST_F(AdsPageLoadMetricsObserverTest, PageWithNonAdFrameThatRenavigatesToAd) {
......@@ -466,11 +534,12 @@ TEST_F(AdsPageLoadMetricsObserverTest, PageWithNonAdFrameThatRenavigatesToAd) {
NavigateFrame(kNonAdUrl, main_frame);
TestHistograms(histogram_tester(), {{0, 10}, {0, 10}},
0 /* non_ad_cached_kb */, 20 /* non_ad_uncached_kb */);
0 /* non_ad_cached_kb */, 20 /* non_ad_uncached_kb */,
AdType::GOOGLE);
histogram_tester().ExpectBucketCount(
"PageLoad.Clients.Ads.Google.ParentExistsForSubFrame", 0, 0);
"PageLoad.Clients.Ads.All.ParentExistsForSubFrame", 0, 0);
histogram_tester().ExpectTotalCount(
"PageLoad.Clients.Ads.Google.ResourceTypeWhenNoFrameFound", 0);
"PageLoad.Clients.Ads.All.ResourceTypeWhenNoFrameFound", 0);
}
TEST_F(AdsPageLoadMetricsObserverTest, CountAbortedNavigation) {
......@@ -497,7 +566,7 @@ TEST_F(AdsPageLoadMetricsObserverTest, CountAbortedNavigation) {
NavigateFrame(kNonAdUrl, main_frame);
TestHistograms(histogram_tester(), {{0, 20}}, 0 /* non_ad_cached_kb */,
10 /* non_ad_uncached_kb */);
10 /* non_ad_uncached_kb */, AdType::GOOGLE);
}
TEST_F(AdsPageLoadMetricsObserverTest, CountAbortedSecondNavigationForFrame) {
......@@ -526,7 +595,7 @@ TEST_F(AdsPageLoadMetricsObserverTest, CountAbortedSecondNavigationForFrame) {
NavigateFrame(kNonAdUrl, main_frame);
TestHistograms(histogram_tester(), {{0, 20}}, 0 /* non_ad_cached_kb */,
20 /* non_ad_uncached_kb */);
20 /* non_ad_uncached_kb */, AdType::GOOGLE);
}
TEST_F(AdsPageLoadMetricsObserverTest, TwoResourceLoadsBeforeCommit) {
......@@ -561,12 +630,11 @@ TEST_F(AdsPageLoadMetricsObserverTest, TwoResourceLoadsBeforeCommit) {
NavigateFrame(kNonAdUrl, main_frame);
TestHistograms(histogram_tester(), {{0, 20}}, 0 /* non_ad_cached_kb */,
10 /* non_ad_uncached_kb */);
10 /* non_ad_uncached_kb */, AdType::GOOGLE);
histogram_tester().ExpectBucketCount(
"PageLoad.Clients.Ads.Google.ParentExistsForSubFrame", 0, 0);
"PageLoad.Clients.Ads.All.ParentExistsForSubFrame", 0, 0);
histogram_tester().ExpectUniqueSample(
"PageLoad.Clients.Ads.Google.ResourceTypeWhenNoFrameFound",
"PageLoad.Clients.Ads.All.ResourceTypeWhenNoFrameFound",
content::RESOURCE_TYPE_SUB_FRAME, 1);
}
......@@ -580,7 +648,7 @@ TEST_F(AdsPageLoadMetricsObserverTest, FrameWithNoParent) {
CreateAndNavigateSubFrame(kNonAdUrl, kNonAdName, main_frame);
histogram_tester().ExpectBucketCount(
"PageLoad.Clients.Ads.Google.ParentExistsForSubFrame", 0, 0);
"PageLoad.Clients.Ads.All.ParentExistsForSubFrame", 0, 0);
// Renavigate the child, but, while navigating, the main frame renavigates.
RenderFrameHost* child_of_subframe =
......@@ -596,15 +664,15 @@ TEST_F(AdsPageLoadMetricsObserverTest, FrameWithNoParent) {
navigation_simulator->Commit();
child_of_subframe = navigation_simulator->GetFinalRenderFrameHost();
histogram_tester().ExpectBucketCount(
"PageLoad.Clients.Ads.Google.ParentExistsForSubFrame", 0, 1);
"PageLoad.Clients.Ads.All.ParentExistsForSubFrame", 0, 1);
// Test that a resource loaded into an unknown frame doesn't cause any
// issues.
histogram_tester().ExpectTotalCount(
"PageLoad.Clients.Ads.Google.ResourceTypeWhenNoFrameFound", 0);
"PageLoad.Clients.Ads.All.ResourceTypeWhenNoFrameFound", 0);
LoadResource(child_of_subframe, ResourceCached::NOT_CACHED, 10);
histogram_tester().ExpectBucketCount(
"PageLoad.Clients.Ads.Google.ResourceTypeWhenNoFrameFound",
"PageLoad.Clients.Ads.All.ResourceTypeWhenNoFrameFound",
content::RESOURCE_TYPE_SUB_FRAME, 1);
}
......@@ -668,6 +736,6 @@ TEST_F(AdsPageLoadMetricsObserverTest, NoHistogramWithoutCommit) {
// There shouldn't be any histograms for an aborted main frame.
EXPECT_EQ(0u, histogram_tester()
.GetTotalCountsForPrefix("PageLoad.Clients.Ads.")
.GetTotalCountsForPrefix("PageLoad.Clients.Ads.Google.")
.size());
}
......@@ -50201,8 +50201,7 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
<histogram name="PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Network"
units="KB">
<histogram name="PageLoad.Bytes.AdFrames.Aggregate.Network" units="KB">
<owner>jkarlin@chromium.org</owner>
<summary>
The size (in KB) of the resources loaded for all of the ad frames on the
......@@ -50216,9 +50215,7 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
<histogram
name="PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.PercentNetwork"
units="%">
<histogram name="PageLoad.Bytes.AdFrames.Aggregate.PercentNetwork" units="%">
<owner>jkarlin@chromium.org</owner>
<summary>
The percentage of bytes loaded for all ad frames that were loaded over the
......@@ -50232,8 +50229,7 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
<histogram name="PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Total"
units="KB">
<histogram name="PageLoad.Bytes.AdFrames.Aggregate.Total" units="KB">
<owner>jkarlin@chromium.org</owner>
<summary>
The size (in KB) of the resources loaded for all of the ad frames on the
......@@ -50247,8 +50243,7 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
<histogram name="PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Network"
units="KB">
<histogram name="PageLoad.Bytes.AdFrames.PerFrame.Network" units="KB">
<owner>jkarlin@chromium.org</owner>
<summary>
The size (in KB) of the resources loaded for an ad frame from the network.
......@@ -50261,9 +50256,7 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
<histogram
name="PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.PercentNetwork"
units="%">
<histogram name="PageLoad.Bytes.AdFrames.PerFrame.PercentNetwork" units="%">
<owner>jkarlin@chromium.org</owner>
<summary>
The percentage of bytes loaded for a single ad frame that were loaded over
......@@ -50277,8 +50270,7 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
<histogram name="PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Total"
units="KB">
<histogram name="PageLoad.Bytes.AdFrames.PerFrame.Total" units="KB">
<owner>jkarlin@chromium.org</owner>
<summary>
The size (in KB) of the resources loaded for an ad frame.
......@@ -50291,7 +50283,7 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
<histogram name="PageLoad.Clients.Ads.Google.Bytes.FullPage.Network" units="KB">
<histogram name="PageLoad.Bytes.FullPage.Network" units="KB">
<owner>jkarlin@chromium.org</owner>
<summary>
The size (in KB) of all of the page's resources that loaded over the
......@@ -50303,8 +50295,7 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
<histogram name="PageLoad.Clients.Ads.Google.Bytes.FullPage.Network.PercentAds"
units="%">
<histogram name="PageLoad.Bytes.FullPage.Network.PercentAds" units="%">
<owner>jkarlin@chromium.org</owner>
<summary>
The percentage of bytes loaded for the page (from the network) that came
......@@ -50318,7 +50309,7 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
<histogram name="PageLoad.Clients.Ads.Google.Bytes.FullPage.Total" units="KB">
<histogram name="PageLoad.Bytes.FullPage.Total" units="KB">
<owner>jkarlin@chromium.org</owner>
<summary>
The size (in KB) of all of the page's resources.
......@@ -50329,8 +50320,7 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
<histogram name="PageLoad.Clients.Ads.Google.Bytes.FullPage.Total.PercentAds"
units="%">
<histogram name="PageLoad.Bytes.FullPage.Total.PercentAds" units="%">
<owner>jkarlin@chromium.org</owner>
<summary>
The percentage of bytes loaded for the page that came from resource loads in
......@@ -50344,8 +50334,7 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
<histogram name="PageLoad.Clients.Ads.Google.Bytes.NonAdFrames.Aggregate.Total"
units="KB">
<histogram name="PageLoad.Bytes.NonAdFrames.Aggregate.Total" units="KB">
<owner>jkarlin@chromium.org</owner>
<summary>
The size (in KB) of all of the page's resources except for those loaded in
......@@ -50359,18 +50348,51 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
<histogram name="PageLoad.Clients.Ads.All.Navigations.AdFrameRenavigatedToAd"
enum="DidNavigateToAd">
<owner>jkarlin@chromium.org</owner>
<summary>
When a frame that is (or previously was) an ad frame renavigates, record
whether it renavigated to an ad frame or a non-ad frame.
An ad frame consists of the identified ad frame and all of its children. Its
children (which may also be ads) are not counted when they renavigate.
This metric is recorded as the event happens. Note that this is unlike most
other Clients.Ads metrics, which are recorded when the page load is
complete.
</summary>
</histogram>
<histogram
name="PageLoad.Clients.Ads.Google.FrameCounts.AnyParentFrame.AdFrames"
units="Ad frames">
name="PageLoad.Clients.Ads.All.Navigations.NonAdFrameRenavigatedToAd"
enum="DidNavigateToAd">
<owner>jkarlin@chromium.org</owner>
<summary>
The number of frames on the page identified as Google Ad Frames that have
loaded more than 0 bytes of content.
When a frame that has never been part of an ad frame renavigates, record
whether it renavigated to an ad frame or a non-ad frame.
For pages with zero ad frames, the other PageLoad.Clients.Ads metrics are
not recorded unless otherwise specified.
This metric is recorded as the event happens. Note that this is unlike most
other Clients.Ads metrics, which are recorded when the page load is
complete.
</summary>
</histogram>
Child frames of an ad frame are not included in the count.
<histogram name="PageLoad.Clients.Ads.All.ParentExistsForSubFrame"
enum="ParentFrameKnown">
<owner>jkarlin@chromium.org</owner>
<summary>
Records whether or not a parent frame is found for a subframe that finishes
navigating.
</summary>
</histogram>
<histogram name="PageLoad.Clients.Ads.All.ResourceTypeWhenNoFrameFound"
enum="ContentResourceType2">
<owner>jkarlin@chromium.org</owner>
<summary>
Records the content::ResourceType when a resource finishes loading but the
ads metrics aren't aware of a committed frame for the resource.
</summary>
</histogram>
......@@ -50424,6 +50446,10 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
<histogram
name="PageLoad.Clients.Ads.Google.Navigations.AdFrameRenavigatedToAd"
enum="DidNavigateToAd">
<obsolete>
Deprecated In July 2017. Use
PageLoad.Clients.Ads.All.Navigations.AdFrameRenavigatedToAd instead.
</obsolete>
<owner>jkarlin@chromium.org</owner>
<summary>
When a frame that is (or previously was) an ad frame renavigates, record
......@@ -50441,6 +50467,10 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
<histogram
name="PageLoad.Clients.Ads.Google.Navigations.NonAdFrameRenavigatedToAd"
enum="DidNavigateToAd">
<obsolete>
Deprecated In July 2017. Use
PageLoad.Clients.Ads.All.Navigations.NonAdFrameRenavigatedToAd instead.
</obsolete>
<owner>jkarlin@chromium.org</owner>
<summary>
When a frame that has never been part of an ad frame renavigates, record
......@@ -50454,6 +50484,10 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
<histogram name="PageLoad.Clients.Ads.Google.ParentExistsForSubFrame"
enum="ParentFrameKnown">
<obsolete>
Deprecated In July 2017. Use
PageLoad.Clients.Ads.All.ParentExistsForSubFrame instead.
</obsolete>
<owner>jkarlin@chromium.org</owner>
<summary>
Records whether or not a parent frame is found for a subframe that finishes
......@@ -50463,6 +50497,10 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
<histogram name="PageLoad.Clients.Ads.Google.ResourceTypeWhenNoFrameFound"
enum="ContentResourceType2">
<obsolete>
Deprecated In July 2017. Use
PageLoad.Clients.Ads.All.ResourceTypeWhenNoFrameFound instead.
</obsolete>
<owner>jkarlin@chromium.org</owner>
<summary>
Records the content::ResourceType when a resource finishes loading but the
......@@ -51159,6 +51197,20 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
<histogram name="PageLoad.FrameCounts.AnyParentFrame.AdFrames"
units="Ad frames">
<owner>jkarlin@chromium.org</owner>
<summary>
The number of frames on the page that have loaded more than 0 bytes of
content.
For pages with zero ad frames, the other PageLoad.Clients.Ads metrics are
not recorded unless otherwise specified.
Child frames of an ad frame are not included in the count.
</summary>
</histogram>
<histogram name="PageLoad.InputTiming.NavigationToFirstNonScroll.AfterPaint"
units="ms">
<owner>tdresser@chromium.org</owner>
......@@ -88712,6 +88764,25 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
<affected-histogram name="MobileStartup.IntentToCreationTime"/>
</histogram_suffixes>
<histogram_suffixes name="AdsPageLoadMetrics" separator="." ordering="prefix">
<suffix name="Clients.Ads.Google" label="Includes only Google ads."/>
<suffix name="Clients.Ads.SubresourceFilter"
label="Includes only ads discovered by the SubResourceFilter."/>
<suffix name="Clients.Ads.All" label="Includes all discovered ads."/>
<affected-histogram name="PageLoad.Bytes.AdFrames.Aggregate.Network"/>
<affected-histogram name="PageLoad.Bytes.AdFrames.Aggregate.PercentNetwork"/>
<affected-histogram name="PageLoad.Bytes.AdFrames.Aggregate.Total"/>
<affected-histogram name="PageLoad.Bytes.AdFrames.PerFrame.Network"/>
<affected-histogram name="PageLoad.Bytes.AdFrames.PerFrame.PercentNetwork"/>
<affected-histogram name="PageLoad.Bytes.AdFrames.PerFrame.Total"/>
<affected-histogram name="PageLoad.Bytes.FullPage.Network"/>
<affected-histogram name="PageLoad.Bytes.FullPage.Network.PercentAds"/>
<affected-histogram name="PageLoad.Bytes.FullPage.Total"/>
<affected-histogram name="PageLoad.Bytes.FullPage.Total.PercentAds"/>
<affected-histogram name="PageLoad.Bytes.NonAdFrames.Aggregate.Total"/>
<affected-histogram name="PageLoad.FrameCounts.AnyParentFrame.AdFrames"/>
</histogram_suffixes>
<histogram_suffixes name="AffiliationDummyData" separator=".">
<suffix name="OnStartup"
label="with the dummy data being requested shortly after start-up"/>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment