| Index: chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc
|
| diff --git a/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc b/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc
|
| index 4629d78eff7aeb826b5826056b09e1457b4cf118..9864608fee1337c04da829c71c342b96b3eb7047 100644
|
| --- a/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc
|
| +++ b/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc
|
| @@ -30,15 +30,15 @@ namespace {
|
| const char kDefaultTestUrl[] = "https://google.com/";
|
| const char kDefaultTestUrlAnchor[] = "https://google.com/#samepage";
|
| const char kDefaultTestUrl2[] = "https://whatever.com/";
|
| +const char kFilteredCommitUrl[] = "https://whatever.com/ignore-on-commit";
|
|
|
| // Simple PageLoadMetricsObserver that copies observed PageLoadTimings into the
|
| // provided std::vector, so they can be analyzed by unit tests.
|
| class TestPageLoadMetricsObserver : public PageLoadMetricsObserver {
|
| public:
|
| - explicit TestPageLoadMetricsObserver(
|
| - std::vector<PageLoadTiming>* updated_timings,
|
| - std::vector<PageLoadTiming>* complete_timings,
|
| - std::vector<GURL>* observed_committed_urls)
|
| + TestPageLoadMetricsObserver(std::vector<PageLoadTiming>* updated_timings,
|
| + std::vector<PageLoadTiming>* complete_timings,
|
| + std::vector<GURL>* observed_committed_urls)
|
| : updated_timings_(updated_timings),
|
| complete_timings_(complete_timings),
|
| observed_committed_urls_(observed_committed_urls) {}
|
| @@ -71,6 +71,29 @@ class TestPageLoadMetricsObserver : public PageLoadMetricsObserver {
|
| std::vector<GURL>* const observed_committed_urls_;
|
| };
|
|
|
| +// Test PageLoadMetricsObserver that stops observing page loads with certain
|
| +// substrings in the URL.
|
| +class FilteringPageLoadMetricsObserver : public PageLoadMetricsObserver {
|
| + public:
|
| + explicit FilteringPageLoadMetricsObserver(
|
| + std::vector<GURL>* completed_filtered_urls)
|
| + : completed_filtered_urls_(completed_filtered_urls) {}
|
| +
|
| + ObservePolicy OnCommit(content::NavigationHandle* handle) override {
|
| + const bool should_ignore =
|
| + handle->GetURL().spec().find("ignore-on-commit") != std::string::npos;
|
| + return should_ignore ? STOP_OBSERVING : CONTINUE_OBSERVING;
|
| + }
|
| +
|
| + void OnComplete(const PageLoadTiming& timing,
|
| + const PageLoadExtraInfo& extra_info) override {
|
| + completed_filtered_urls_->push_back(extra_info.committed_url);
|
| + }
|
| +
|
| + private:
|
| + std::vector<GURL>* const completed_filtered_urls_;
|
| +};
|
| +
|
| class TestPageLoadMetricsEmbedderInterface
|
| : public PageLoadMetricsEmbedderInterface {
|
| public:
|
| @@ -88,6 +111,8 @@ class TestPageLoadMetricsEmbedderInterface
|
| void RegisterObservers(PageLoadTracker* tracker) override {
|
| tracker->AddObserver(base::MakeUnique<TestPageLoadMetricsObserver>(
|
| &updated_timings_, &complete_timings_, &observed_committed_urls_));
|
| + tracker->AddObserver(base::MakeUnique<FilteringPageLoadMetricsObserver>(
|
| + &completed_filtered_urls_));
|
| }
|
| const std::vector<PageLoadTiming>& updated_timings() const {
|
| return updated_timings_;
|
| @@ -101,10 +126,16 @@ class TestPageLoadMetricsEmbedderInterface
|
| return observed_committed_urls_;
|
| }
|
|
|
| + // committed URLs passed to FilteringPageLoadMetricsObserver::OnComplete().
|
| + const std::vector<GURL>& completed_filtered_urls() const {
|
| + return completed_filtered_urls_;
|
| + }
|
| +
|
| private:
|
| std::vector<PageLoadTiming> updated_timings_;
|
| std::vector<PageLoadTiming> complete_timings_;
|
| std::vector<GURL> observed_committed_urls_;
|
| + std::vector<GURL> completed_filtered_urls_;
|
| bool is_prerendering_;
|
| bool is_ntp_;
|
| };
|
| @@ -176,6 +207,10 @@ class MetricsWebContentsObserverTest : public ChromeRenderViewHostTestHarness {
|
| return embedder_interface_->observed_committed_urls_from_on_start();
|
| }
|
|
|
| + const std::vector<GURL>& completed_filtered_urls() const {
|
| + return embedder_interface_->completed_filtered_urls();
|
| + }
|
| +
|
| protected:
|
| base::HistogramTester histogram_tester_;
|
| TestPageLoadMetricsEmbedderInterface* embedder_interface_;
|
| @@ -523,4 +558,27 @@ TEST_F(MetricsWebContentsObserverTest, FlushMetricsOnAppEnterBackground) {
|
| internal::kPageLoadCompletedAfterAppBackground, true, 1);
|
| }
|
|
|
| +TEST_F(MetricsWebContentsObserverTest, StopObservingOnCommit) {
|
| + content::WebContentsTester* web_contents_tester =
|
| + content::WebContentsTester::For(web_contents());
|
| + ASSERT_TRUE(completed_filtered_urls().empty());
|
| +
|
| + web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
|
| + ASSERT_TRUE(completed_filtered_urls().empty());
|
| +
|
| + // kFilteredCommitUrl should stop observing in OnCommit, and thus should not
|
| + // reach OnComplete().
|
| + web_contents_tester->NavigateAndCommit(GURL(kFilteredCommitUrl));
|
| + ASSERT_EQ(std::vector<GURL>({GURL(kDefaultTestUrl)}),
|
| + completed_filtered_urls());
|
| +
|
| + web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
|
| + ASSERT_EQ(std::vector<GURL>({GURL(kDefaultTestUrl)}),
|
| + completed_filtered_urls());
|
| +
|
| + web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
|
| + ASSERT_EQ(std::vector<GURL>({GURL(kDefaultTestUrl), GURL(kDefaultTestUrl2)}),
|
| + completed_filtered_urls());
|
| +}
|
| +
|
| } // namespace page_load_metrics
|
|
|