Commit 58c1f7a9 authored by Sigurdur Asgeirsson's avatar Sigurdur Asgeirsson Committed by Commit Bot

RC: Start measurement on PageAlmostIdle.

This way there's a consistent measurement point, irrespecive the
setting of how TabLoadTracker assesses the loaded state.

Bug: 755840
Change-Id: I42790bff863e1787db2ac804eecd117b185b5afb
Reviewed-on: https://chromium-review.googlesource.com/1119062Reviewed-by: default avatarFrançois Doray <fdoray@chromium.org>
Commit-Queue: Sigurður Ásgeirsson <siggi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#572218}
parent a48b5be5
...@@ -12,27 +12,23 @@ namespace resource_coordinator { ...@@ -12,27 +12,23 @@ namespace resource_coordinator {
using LoadingState = TabLoadTracker::LoadingState; using LoadingState = TabLoadTracker::LoadingState;
PerformanceMeasurementManager::PerformanceMeasurementManager( PerformanceMeasurementManager::PerformanceMeasurementManager(
TabLoadTracker* tab_load_tracker, PageSignalReceiver* page_signal_receiver,
RenderProcessProbe* render_process_probe) RenderProcessProbe* render_process_probe)
: scoped_observer_(this), render_process_probe_(render_process_probe) { : scoped_observer_(this),
scoped_observer_.Add(tab_load_tracker); page_signal_receiver_(page_signal_receiver),
render_process_probe_(render_process_probe) {
scoped_observer_.Add(page_signal_receiver);
} }
PerformanceMeasurementManager::~PerformanceMeasurementManager() = default; PerformanceMeasurementManager::~PerformanceMeasurementManager() = default;
void PerformanceMeasurementManager::OnStartTracking( void PerformanceMeasurementManager::OnPageAlmostIdle(
content::WebContents* web_contents, content::WebContents* web_contents,
LoadingState loading_state) { const PageNavigationIdentity& page_navigation_id) {
if (loading_state == LoadingState::LOADED) if (page_signal_receiver_->GetNavigationIDForWebContents(web_contents) ==
render_process_probe_->StartSingleGather(); page_navigation_id.navigation_id) {
}
void PerformanceMeasurementManager::OnLoadingStateChange(
content::WebContents* web_contents,
LoadingState old_loading_state,
LoadingState new_loading_state) {
if (new_loading_state == LoadingState::LOADED)
render_process_probe_->StartSingleGather(); render_process_probe_->StartSingleGather();
}
} }
} // namespace resource_coordinator } // namespace resource_coordinator
...@@ -8,34 +8,30 @@ ...@@ -8,34 +8,30 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/scoped_observer.h" #include "base/scoped_observer.h"
#include "base/sequence_checker.h" #include "base/sequence_checker.h"
#include "chrome/browser/resource_coordinator/tab_load_tracker.h" #include "chrome/browser/resource_coordinator/page_signal_receiver.h"
namespace resource_coordinator { namespace resource_coordinator {
class RenderProcessProbe; class RenderProcessProbe;
class TabLoadTracker;
// This class observes the PageAlmostIdle signal from the PageSignalGenerator
// This class observes tab state change notifications issued by the // and uses it to fire off performance measurements for tabs that have reached
// TabLoadTracker and uses them to drive performance measurement requests // idle state.
// to the RenderProcessProbe. Results then funnel through the resource class PerformanceMeasurementManager : public PageSignalObserver {
// coordinator service, back to this class, which stores them in the feature
// database.
class PerformanceMeasurementManager : public TabLoadTracker::Observer {
public: public:
PerformanceMeasurementManager(TabLoadTracker* tab_load_tracker, PerformanceMeasurementManager(PageSignalReceiver* receiver,
RenderProcessProbe* render_process_probe); RenderProcessProbe* render_process_probe);
~PerformanceMeasurementManager() override; ~PerformanceMeasurementManager() override;
// TabLoadTracker::Observer implementation. // PageSignalObserver overrides.
void OnStartTracking(content::WebContents* web_contents, void OnPageAlmostIdle(
LoadingState loading_state) override; content::WebContents* web_contents,
void OnLoadingStateChange(content::WebContents* web_contents, const PageNavigationIdentity& page_navigation_id) override;
LoadingState old_loading_state,
LoadingState new_loading_state) override;
private: private:
ScopedObserver<TabLoadTracker, PerformanceMeasurementManager> ScopedObserver<PageSignalReceiver, PerformanceMeasurementManager>
scoped_observer_; scoped_observer_;
PageSignalReceiver* page_signal_receiver_;
RenderProcessProbe* render_process_probe_; RenderProcessProbe* render_process_probe_;
DISALLOW_COPY_AND_ASSIGN(PerformanceMeasurementManager); DISALLOW_COPY_AND_ASSIGN(PerformanceMeasurementManager);
......
...@@ -3,10 +3,14 @@ ...@@ -3,10 +3,14 @@
// found in the LICENSE file. // found in the LICENSE file.
#include "chrome/browser/resource_coordinator/performance_measurement_manager.h" #include "chrome/browser/resource_coordinator/performance_measurement_manager.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/resource_coordinator/page_signal_receiver.h"
#include "chrome/browser/resource_coordinator/render_process_probe.h" #include "chrome/browser/resource_coordinator/render_process_probe.h"
#include "chrome/browser/resource_coordinator/tab_helper.h" #include "chrome/browser/resource_coordinator/tab_helper.h"
#include "chrome/browser/resource_coordinator/tab_load_tracker.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "services/resource_coordinator/public/cpp/coordination_unit_id.h"
#include "services/resource_coordinator/public/cpp/resource_coordinator_features.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -37,22 +41,32 @@ class PerformanceMeasurementManagerTest ...@@ -37,22 +41,32 @@ class PerformanceMeasurementManagerTest
MockRenderProcessProbe mock_render_process_probe_; MockRenderProcessProbe mock_render_process_probe_;
}; };
TEST_F(PerformanceMeasurementManagerTest, NoMeasurementOnCreation) { TEST_F(PerformanceMeasurementManagerTest, StartMeasurementOnPageAlmostIdle) {
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(features::kPageAlmostIdle);
ASSERT_TRUE(resource_coordinator::IsPageAlmostIdleSignalEnabled());
PageSignalReceiver psr;
PerformanceMeasurementManager performance_measurement_manager( PerformanceMeasurementManager performance_measurement_manager(
TabLoadTracker::Get(), &mock_render_process_probe()); &psr, &mock_render_process_probe());
auto contents = CreateWebContents(); auto contents = CreateWebContents();
} const CoordinationUnitID contents_id(CoordinationUnitType::kPage,
CoordinationUnitID::RANDOM_ID);
psr.AssociateCoordinationUnitIDWithWebContents(contents_id, contents.get());
psr.SetNavigationID(contents.get(), 100);
TEST_F(PerformanceMeasurementManagerTest, StartMeasurementOnLoaded) { const CoordinationUnitID dummy_id(CoordinationUnitType::kPage,
PerformanceMeasurementManager performance_measurement_manager( CoordinationUnitID::RANDOM_ID);
TabLoadTracker::Get(), &mock_render_process_probe()); // There should be no measurement when signaling an unknown CU ID.
psr.NotifyPageAlmostIdle(PageNavigationIdentity{dummy_id, 100, ""});
auto contents = CreateWebContents(); // There should be no measurement when signaling the "wrong" navigation ID.
psr.NotifyPageAlmostIdle(PageNavigationIdentity{contents_id, 99, ""});
// A measurement should happen on signaling the right navigation ID.
EXPECT_CALL(mock_render_process_probe(), StartSingleGather()); EXPECT_CALL(mock_render_process_probe(), StartSingleGather());
TabLoadTracker::Get()->TransitionStateForTesting( psr.NotifyPageAlmostIdle(PageNavigationIdentity{contents_id, 100, ""});
contents.get(), TabLoadTracker::LoadingState::LOADED);
} }
} // namespace resource_coordinator } // namespace resource_coordinator
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