| Index: components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc
|
| diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc b/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc
|
| deleted file mode 100644
|
| index 3c773cb94cf08942ded81dd8f04a8567d1b827a9..0000000000000000000000000000000000000000
|
| --- a/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc
|
| +++ /dev/null
|
| @@ -1,476 +0,0 @@
|
| -// Copyright (c) 2015 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 "components/page_load_metrics/browser/metrics_web_contents_observer.h"
|
| -
|
| -#include <memory>
|
| -#include <vector>
|
| -
|
| -#include "base/macros.h"
|
| -#include "base/memory/ptr_util.h"
|
| -#include "base/process/kill.h"
|
| -#include "base/test/histogram_tester.h"
|
| -#include "base/time/time.h"
|
| -#include "components/page_load_metrics/browser/page_load_metrics_observer.h"
|
| -#include "components/page_load_metrics/common/page_load_metrics_messages.h"
|
| -#include "content/public/browser/navigation_handle.h"
|
| -#include "content/public/browser/render_frame_host.h"
|
| -#include "content/public/test/test_renderer_host.h"
|
| -#include "content/public/test/web_contents_tester.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "url/gurl.h"
|
| -
|
| -namespace page_load_metrics {
|
| -
|
| -namespace {
|
| -
|
| -const char kDefaultTestUrl[] = "https://google.com/";
|
| -const char kDefaultTestUrlAnchor[] = "https://google.com/#samepage";
|
| -const char kDefaultTestUrl2[] = "https://whatever.com/";
|
| -
|
| -// 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)
|
| - : updated_timings_(updated_timings),
|
| - complete_timings_(complete_timings),
|
| - observed_committed_urls_(observed_committed_urls) {}
|
| -
|
| - void OnStart(content::NavigationHandle* navigation_handle,
|
| - const GURL& currently_committed_url,
|
| - bool started_in_foreground) override {
|
| - observed_committed_urls_->push_back(currently_committed_url);
|
| - }
|
| -
|
| - void OnTimingUpdate(const PageLoadTiming& timing,
|
| - const PageLoadExtraInfo& extra_info) override {
|
| - updated_timings_->push_back(timing);
|
| - }
|
| -
|
| - void OnComplete(const PageLoadTiming& timing,
|
| - const PageLoadExtraInfo& extra_info) override {
|
| - complete_timings_->push_back(timing);
|
| - }
|
| -
|
| - private:
|
| - std::vector<PageLoadTiming>* const updated_timings_;
|
| - std::vector<PageLoadTiming>* const complete_timings_;
|
| - std::vector<GURL>* const observed_committed_urls_;
|
| -};
|
| -
|
| -class TestPageLoadMetricsEmbedderInterface
|
| - : public PageLoadMetricsEmbedderInterface {
|
| - public:
|
| - TestPageLoadMetricsEmbedderInterface()
|
| - : is_prerendering_(false), is_ntp_(false) {}
|
| -
|
| - bool IsPrerendering(content::WebContents* web_contents) override {
|
| - return is_prerendering_;
|
| - }
|
| - bool IsNewTabPageUrl(const GURL& url) override { return is_ntp_; }
|
| - void set_is_prerendering(bool is_prerendering) {
|
| - is_prerendering_ = is_prerendering;
|
| - }
|
| - void set_is_ntp(bool is_ntp) { is_ntp_ = is_ntp; }
|
| - void RegisterObservers(PageLoadTracker* tracker) override {
|
| - tracker->AddObserver(base::WrapUnique(new TestPageLoadMetricsObserver(
|
| - &updated_timings_, &complete_timings_, &observed_committed_urls_)));
|
| - }
|
| - const std::vector<PageLoadTiming>& updated_timings() const {
|
| - return updated_timings_;
|
| - }
|
| - const std::vector<PageLoadTiming>& complete_timings() const {
|
| - return complete_timings_;
|
| - }
|
| -
|
| - // currently_committed_urls passed to OnStart().
|
| - const std::vector<GURL>& observed_committed_urls_from_on_start() const {
|
| - return observed_committed_urls_;
|
| - }
|
| -
|
| - private:
|
| - std::vector<PageLoadTiming> updated_timings_;
|
| - std::vector<PageLoadTiming> complete_timings_;
|
| - std::vector<GURL> observed_committed_urls_;
|
| - bool is_prerendering_;
|
| - bool is_ntp_;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -class MetricsWebContentsObserverTest
|
| - : public content::RenderViewHostTestHarness {
|
| - public:
|
| - MetricsWebContentsObserverTest() : num_errors_(0) {}
|
| -
|
| - void SetUp() override {
|
| - RenderViewHostTestHarness::SetUp();
|
| - AttachObserver();
|
| - }
|
| -
|
| - void SimulateTimingUpdate(const PageLoadTiming& timing) {
|
| - SimulateTimingUpdate(timing, web_contents()->GetMainFrame());
|
| - }
|
| -
|
| - void SimulateTimingUpdate(const PageLoadTiming& timing,
|
| - content::RenderFrameHost* render_frame_host) {
|
| - ASSERT_TRUE(observer_->OnMessageReceived(
|
| - PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing,
|
| - PageLoadMetadata()),
|
| - render_frame_host));
|
| - }
|
| -
|
| - void AttachObserver() {
|
| - embedder_interface_ = new TestPageLoadMetricsEmbedderInterface();
|
| - observer_.reset(new MetricsWebContentsObserver(
|
| - web_contents(), base::WrapUnique(embedder_interface_)));
|
| - observer_->WasShown();
|
| - }
|
| -
|
| - void CheckErrorEvent(InternalErrorLoadEvent error, int count) {
|
| - histogram_tester_.ExpectBucketCount(internal::kErrorEvents, error, count);
|
| - num_errors_ += count;
|
| - }
|
| -
|
| - void CheckTotalErrorEvents() {
|
| - histogram_tester_.ExpectTotalCount(internal::kErrorEvents, num_errors_);
|
| - }
|
| -
|
| - void CheckNoErrorEvents() {
|
| - histogram_tester_.ExpectTotalCount(internal::kErrorEvents, 0);
|
| - }
|
| -
|
| - int CountEmptyCompleteTimingReported() {
|
| - int empty = 0;
|
| - for (const auto& timing : embedder_interface_->complete_timings()) {
|
| - if (timing.IsEmpty())
|
| - ++empty;
|
| - }
|
| - return empty;
|
| - }
|
| -
|
| - int CountCompleteTimingReported() {
|
| - return embedder_interface_->complete_timings().size();
|
| - }
|
| - int CountUpdatedTimingReported() {
|
| - return embedder_interface_->updated_timings().size();
|
| - }
|
| -
|
| - const std::vector<GURL>& observed_committed_urls_from_on_start() const {
|
| - return embedder_interface_->observed_committed_urls_from_on_start();
|
| - }
|
| -
|
| - protected:
|
| - base::HistogramTester histogram_tester_;
|
| - TestPageLoadMetricsEmbedderInterface* embedder_interface_;
|
| - std::unique_ptr<MetricsWebContentsObserver> observer_;
|
| -
|
| - private:
|
| - int num_errors_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(MetricsWebContentsObserverTest);
|
| -};
|
| -
|
| -TEST_F(MetricsWebContentsObserverTest, SuccessfulMainFrameNavigation) {
|
| - PageLoadTiming timing;
|
| - timing.navigation_start = base::Time::FromDoubleT(1);
|
| - timing.response_start = base::TimeDelta::FromMilliseconds(2);
|
| -
|
| - content::WebContentsTester* web_contents_tester =
|
| - content::WebContentsTester::For(web_contents());
|
| -
|
| - ASSERT_TRUE(observed_committed_urls_from_on_start().empty());
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
|
| - ASSERT_EQ(1u, observed_committed_urls_from_on_start().size());
|
| - ASSERT_TRUE(observed_committed_urls_from_on_start().at(0).is_empty());
|
| -
|
| - ASSERT_EQ(0, CountUpdatedTimingReported());
|
| - SimulateTimingUpdate(timing);
|
| - ASSERT_EQ(1, CountUpdatedTimingReported());
|
| - ASSERT_EQ(0, CountCompleteTimingReported());
|
| -
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
|
| - ASSERT_EQ(1, CountCompleteTimingReported());
|
| - ASSERT_EQ(0, CountEmptyCompleteTimingReported());
|
| - ASSERT_EQ(2u, observed_committed_urls_from_on_start().size());
|
| - ASSERT_EQ(kDefaultTestUrl,
|
| - observed_committed_urls_from_on_start().at(1).spec());
|
| - ASSERT_EQ(1, CountUpdatedTimingReported());
|
| -
|
| - CheckNoErrorEvents();
|
| -}
|
| -
|
| -TEST_F(MetricsWebContentsObserverTest, NotInMainFrame) {
|
| - PageLoadTiming timing;
|
| - timing.navigation_start = base::Time::FromDoubleT(1);
|
| -
|
| - content::WebContentsTester* web_contents_tester =
|
| - content::WebContentsTester::For(web_contents());
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
|
| -
|
| - content::RenderFrameHostTester* rfh_tester =
|
| - content::RenderFrameHostTester::For(main_rfh());
|
| - content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe");
|
| -
|
| - content::RenderFrameHostTester* subframe_tester =
|
| - content::RenderFrameHostTester::For(subframe);
|
| - subframe_tester->SimulateNavigationStart(GURL(kDefaultTestUrl2));
|
| - subframe_tester->SimulateNavigationCommit(GURL(kDefaultTestUrl2));
|
| - SimulateTimingUpdate(timing, subframe);
|
| - subframe_tester->SimulateNavigationStop();
|
| -
|
| - // Navigate again to see if the timing updated for a subframe message.
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
|
| -
|
| - ASSERT_EQ(0, CountUpdatedTimingReported());
|
| - ASSERT_EQ(1, CountCompleteTimingReported());
|
| - ASSERT_EQ(1, CountEmptyCompleteTimingReported());
|
| - CheckErrorEvent(ERR_IPC_FROM_WRONG_FRAME, 1);
|
| - CheckErrorEvent(ERR_NO_IPCS_RECEIVED, 1);
|
| - CheckTotalErrorEvents();
|
| -}
|
| -
|
| -TEST_F(MetricsWebContentsObserverTest, SamePageNoTrigger) {
|
| - PageLoadTiming timing;
|
| - timing.navigation_start = base::Time::FromDoubleT(1);
|
| -
|
| - content::WebContentsTester* web_contents_tester =
|
| - content::WebContentsTester::For(web_contents());
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
|
| - ASSERT_EQ(0, CountUpdatedTimingReported());
|
| - SimulateTimingUpdate(timing);
|
| - ASSERT_EQ(1, CountUpdatedTimingReported());
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrlAnchor));
|
| - // Send the same timing update. The original tracker for kDefaultTestUrl
|
| - // should dedup the update, and the tracker for kDefaultTestUrlAnchor should
|
| - // have been destroyed as a result of its being a same page navigation, so
|
| - // CountUpdatedTimingReported() should continue to return 1.
|
| - SimulateTimingUpdate(timing);
|
| -
|
| - ASSERT_EQ(1, CountUpdatedTimingReported());
|
| - ASSERT_EQ(0, CountCompleteTimingReported());
|
| -
|
| - // Navigate again to force histogram logging.
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
|
| -
|
| - // A same page navigation shouldn't trigger logging UMA for the original.
|
| - ASSERT_EQ(1, CountUpdatedTimingReported());
|
| - ASSERT_EQ(1, CountCompleteTimingReported());
|
| - ASSERT_EQ(0, CountEmptyCompleteTimingReported());
|
| - CheckNoErrorEvents();
|
| -}
|
| -
|
| -TEST_F(MetricsWebContentsObserverTest, DontLogPrerender) {
|
| - PageLoadTiming timing;
|
| - timing.navigation_start = base::Time::FromDoubleT(1);
|
| -
|
| - content::WebContentsTester* web_contents_tester =
|
| - content::WebContentsTester::For(web_contents());
|
| - embedder_interface_->set_is_prerendering(true);
|
| -
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
|
| - SimulateTimingUpdate(timing);
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
|
| - ASSERT_EQ(0, CountUpdatedTimingReported());
|
| - ASSERT_EQ(0, CountCompleteTimingReported());
|
| - CheckErrorEvent(ERR_IPC_WITH_NO_RELEVANT_LOAD, 1);
|
| - CheckTotalErrorEvents();
|
| -}
|
| -
|
| -TEST_F(MetricsWebContentsObserverTest, DontLogNewTabPage) {
|
| - PageLoadTiming timing;
|
| - timing.navigation_start = base::Time::FromDoubleT(1);
|
| -
|
| - content::WebContentsTester* web_contents_tester =
|
| - content::WebContentsTester::For(web_contents());
|
| - embedder_interface_->set_is_ntp(true);
|
| -
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
|
| - SimulateTimingUpdate(timing);
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
|
| - ASSERT_EQ(0, CountUpdatedTimingReported());
|
| - ASSERT_EQ(0, CountCompleteTimingReported());
|
| - CheckErrorEvent(ERR_IPC_WITH_NO_RELEVANT_LOAD, 1);
|
| - CheckTotalErrorEvents();
|
| -}
|
| -
|
| -TEST_F(MetricsWebContentsObserverTest, DontLogIrrelevantNavigation) {
|
| - PageLoadTiming timing;
|
| - timing.navigation_start = base::Time::FromDoubleT(10);
|
| -
|
| - content::WebContentsTester* web_contents_tester =
|
| - content::WebContentsTester::For(web_contents());
|
| -
|
| - GURL about_blank_url = GURL("about:blank");
|
| - web_contents_tester->NavigateAndCommit(about_blank_url);
|
| - SimulateTimingUpdate(timing);
|
| - ASSERT_EQ(0, CountUpdatedTimingReported());
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
|
| - ASSERT_EQ(0, CountUpdatedTimingReported());
|
| - ASSERT_EQ(0, CountCompleteTimingReported());
|
| -
|
| - CheckErrorEvent(ERR_IPC_FROM_BAD_URL_SCHEME, 1);
|
| - CheckErrorEvent(ERR_IPC_WITH_NO_RELEVANT_LOAD, 1);
|
| - CheckTotalErrorEvents();
|
| -}
|
| -
|
| -TEST_F(MetricsWebContentsObserverTest, NotInMainError) {
|
| - PageLoadTiming timing;
|
| - timing.navigation_start = base::Time::FromDoubleT(1);
|
| -
|
| - content::WebContentsTester* web_contents_tester =
|
| - content::WebContentsTester::For(web_contents());
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
|
| -
|
| - content::RenderFrameHostTester* rfh_tester =
|
| - content::RenderFrameHostTester::For(main_rfh());
|
| - content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe");
|
| -
|
| - content::RenderFrameHostTester* subframe_tester =
|
| - content::RenderFrameHostTester::For(subframe);
|
| - subframe_tester->SimulateNavigationStart(GURL(kDefaultTestUrl2));
|
| - subframe_tester->SimulateNavigationCommit(GURL(kDefaultTestUrl2));
|
| - SimulateTimingUpdate(timing, subframe);
|
| - CheckErrorEvent(ERR_IPC_FROM_WRONG_FRAME, 1);
|
| - CheckTotalErrorEvents();
|
| - ASSERT_EQ(0, CountUpdatedTimingReported());
|
| - ASSERT_EQ(0, CountCompleteTimingReported());
|
| -}
|
| -
|
| -TEST_F(MetricsWebContentsObserverTest, BadIPC) {
|
| - PageLoadTiming timing;
|
| - timing.navigation_start = base::Time::FromDoubleT(10);
|
| - PageLoadTiming timing2;
|
| - timing2.navigation_start = base::Time::FromDoubleT(100);
|
| -
|
| - content::WebContentsTester* web_contents_tester =
|
| - content::WebContentsTester::For(web_contents());
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
|
| -
|
| - SimulateTimingUpdate(timing);
|
| - ASSERT_EQ(1, CountUpdatedTimingReported());
|
| - SimulateTimingUpdate(timing2);
|
| - ASSERT_EQ(1, CountUpdatedTimingReported());
|
| -
|
| - CheckErrorEvent(ERR_BAD_TIMING_IPC, 1);
|
| - CheckTotalErrorEvents();
|
| -}
|
| -
|
| -TEST_F(MetricsWebContentsObserverTest, ObservePartialNavigation) {
|
| - // Delete the observer for this test, add it once the navigation has started.
|
| - observer_.reset();
|
| - PageLoadTiming timing;
|
| - timing.navigation_start = base::Time::FromDoubleT(10);
|
| -
|
| - content::WebContentsTester* web_contents_tester =
|
| - content::WebContentsTester::For(web_contents());
|
| - content::RenderFrameHostTester* rfh_tester =
|
| - content::RenderFrameHostTester::For(main_rfh());
|
| -
|
| - // Start the navigation, then start observing the web contents. This used to
|
| - // crash us. Make sure we bail out and don't log histograms.
|
| - web_contents_tester->StartNavigation(GURL(kDefaultTestUrl));
|
| - AttachObserver();
|
| - rfh_tester->SimulateNavigationCommit(GURL(kDefaultTestUrl));
|
| -
|
| - SimulateTimingUpdate(timing);
|
| -
|
| - // Navigate again to force histogram logging.
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
|
| - ASSERT_EQ(0, CountCompleteTimingReported());
|
| - ASSERT_EQ(0, CountUpdatedTimingReported());
|
| - CheckErrorEvent(ERR_IPC_WITH_NO_RELEVANT_LOAD, 1);
|
| - CheckTotalErrorEvents();
|
| -}
|
| -
|
| -TEST_F(MetricsWebContentsObserverTest, DontLogAbortChains) {
|
| - NavigateAndCommit(GURL(kDefaultTestUrl));
|
| - NavigateAndCommit(GURL(kDefaultTestUrl2));
|
| - NavigateAndCommit(GURL(kDefaultTestUrl));
|
| - histogram_tester_.ExpectTotalCount(internal::kAbortChainSizeNewNavigation, 0);
|
| - CheckErrorEvent(ERR_NO_IPCS_RECEIVED, 2);
|
| - CheckTotalErrorEvents();
|
| -}
|
| -
|
| -TEST_F(MetricsWebContentsObserverTest, LogAbortChains) {
|
| - content::WebContentsTester* web_contents_tester =
|
| - content::WebContentsTester::For(web_contents());
|
| - content::RenderFrameHostTester* rfh_tester =
|
| - content::RenderFrameHostTester::For(main_rfh());
|
| - // Start and abort three loads before one finally commits.
|
| - web_contents_tester->StartNavigation(GURL(kDefaultTestUrl));
|
| - rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), net::ERR_ABORTED);
|
| - rfh_tester->SimulateNavigationStop();
|
| -
|
| - web_contents_tester->StartNavigation(GURL(kDefaultTestUrl2));
|
| - rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl2), net::ERR_ABORTED);
|
| - rfh_tester->SimulateNavigationStop();
|
| -
|
| - web_contents_tester->StartNavigation(GURL(kDefaultTestUrl));
|
| - rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), net::ERR_ABORTED);
|
| - rfh_tester->SimulateNavigationStop();
|
| -
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
|
| - histogram_tester_.ExpectTotalCount(internal::kAbortChainSizeNewNavigation, 1);
|
| - histogram_tester_.ExpectBucketCount(internal::kAbortChainSizeNewNavigation, 3,
|
| - 1);
|
| - CheckNoErrorEvents();
|
| -}
|
| -
|
| -TEST_F(MetricsWebContentsObserverTest, LogAbortChainsSameURL) {
|
| - content::WebContentsTester* web_contents_tester =
|
| - content::WebContentsTester::For(web_contents());
|
| - content::RenderFrameHostTester* rfh_tester =
|
| - content::RenderFrameHostTester::For(main_rfh());
|
| - // Start and abort three loads before one finally commits.
|
| - web_contents_tester->StartNavigation(GURL(kDefaultTestUrl));
|
| - rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), net::ERR_ABORTED);
|
| - rfh_tester->SimulateNavigationStop();
|
| -
|
| - web_contents_tester->StartNavigation(GURL(kDefaultTestUrl));
|
| - rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), net::ERR_ABORTED);
|
| - rfh_tester->SimulateNavigationStop();
|
| -
|
| - web_contents_tester->StartNavigation(GURL(kDefaultTestUrl));
|
| - rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), net::ERR_ABORTED);
|
| - rfh_tester->SimulateNavigationStop();
|
| -
|
| - web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
|
| - histogram_tester_.ExpectTotalCount(internal::kAbortChainSizeNewNavigation, 1);
|
| - histogram_tester_.ExpectBucketCount(internal::kAbortChainSizeNewNavigation, 3,
|
| - 1);
|
| - histogram_tester_.ExpectTotalCount(internal::kAbortChainSizeSameURL, 1);
|
| - histogram_tester_.ExpectBucketCount(internal::kAbortChainSizeSameURL, 3, 1);
|
| -}
|
| -
|
| -TEST_F(MetricsWebContentsObserverTest, LogAbortChainsNoCommit) {
|
| - content::WebContentsTester* web_contents_tester =
|
| - content::WebContentsTester::For(web_contents());
|
| - content::RenderFrameHostTester* rfh_tester =
|
| - content::RenderFrameHostTester::For(main_rfh());
|
| - // Start and abort three loads before one finally commits.
|
| - web_contents_tester->StartNavigation(GURL(kDefaultTestUrl));
|
| - rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), net::ERR_ABORTED);
|
| - rfh_tester->SimulateNavigationStop();
|
| -
|
| - web_contents_tester->StartNavigation(GURL(kDefaultTestUrl2));
|
| - rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl2), net::ERR_ABORTED);
|
| - rfh_tester->SimulateNavigationStop();
|
| -
|
| - web_contents_tester->StartNavigation(GURL(kDefaultTestUrl));
|
| - rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), net::ERR_ABORTED);
|
| - rfh_tester->SimulateNavigationStop();
|
| -
|
| - web_contents()->Stop();
|
| -
|
| - histogram_tester_.ExpectTotalCount(internal::kAbortChainSizeNoCommit, 1);
|
| - histogram_tester_.ExpectBucketCount(internal::kAbortChainSizeNoCommit, 3,
|
| - 1);
|
| -}
|
| -
|
| -} // namespace page_load_metrics
|
|
|