mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
metrics: Simplify ProgressiveWebMetrics
(#35985)
Simply how `ProgressiveWebMetrics` works: 1. Keep only a single struct instead of one in layout and one script that both implement the `ProgressiveWebMetrics` trait. Since layout and script are the same thread these can now just be a single `ProgressiveWebMetrics` struct stored in script. 2. Have the compositor be responsible for informing the Constellation (which informs the ScripThread) about paint metrics. This makes communication flow one way and removes one dependency between the compositor and script (of two). 3. All units tests are moved into the `metrics` crate itself since there is only one struct there now. Signed-off-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
parent
1f232eb17c
commit
5424479768
26 changed files with 416 additions and 787 deletions
|
@ -1,20 +0,0 @@
|
|||
[package]
|
||||
name = "metrics_tests"
|
||||
version.workspace = true
|
||||
authors.workspace = true
|
||||
license.workspace = true
|
||||
edition.workspace = true
|
||||
publish.workspace = true
|
||||
rust-version.workspace = true
|
||||
|
||||
[lib]
|
||||
name = "metrics_tests"
|
||||
path = "lib.rs"
|
||||
doctest = false
|
||||
|
||||
[dependencies]
|
||||
base = { workspace = true }
|
||||
ipc-channel = { workspace = true }
|
||||
metrics = { path = "../../../components/metrics" }
|
||||
profile_traits = { workspace = true }
|
||||
servo_url = { path = "../../../components/url" }
|
|
@ -1,125 +0,0 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use base::cross_process_instant::CrossProcessInstant;
|
||||
use ipc_channel::ipc;
|
||||
use metrics::{InteractiveFlag, InteractiveMetrics, ProfilerMetadataFactory, ProgressiveWebMetric};
|
||||
use profile_traits::time::{ProfilerChan, TimerMetadata};
|
||||
use servo_url::ServoUrl;
|
||||
|
||||
struct DummyProfilerMetadataFactory {}
|
||||
impl ProfilerMetadataFactory for DummyProfilerMetadataFactory {
|
||||
fn new_metadata(&self) -> Option<TimerMetadata> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn test_interactive() -> InteractiveMetrics {
|
||||
let (sender, _) = ipc::channel().unwrap();
|
||||
let profiler_chan = ProfilerChan(sender);
|
||||
let mut interactive =
|
||||
InteractiveMetrics::new(profiler_chan, ServoUrl::parse("about:blank").unwrap());
|
||||
|
||||
assert_eq!((&interactive).get_navigation_start(), None);
|
||||
assert_eq!(interactive.get_tti(), None);
|
||||
|
||||
interactive.set_navigation_start(CrossProcessInstant::now());
|
||||
|
||||
interactive
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_set_dcl() {
|
||||
let profiler_metadata_factory = DummyProfilerMetadataFactory {};
|
||||
|
||||
let interactive = test_interactive();
|
||||
interactive.maybe_set_tti(
|
||||
&profiler_metadata_factory,
|
||||
InteractiveFlag::DOMContentLoaded,
|
||||
);
|
||||
let dcl = interactive.get_dom_content_loaded();
|
||||
assert!(dcl.is_some());
|
||||
|
||||
//try to overwrite
|
||||
interactive.maybe_set_tti(
|
||||
&profiler_metadata_factory,
|
||||
InteractiveFlag::DOMContentLoaded,
|
||||
);
|
||||
assert_eq!(interactive.get_dom_content_loaded(), dcl);
|
||||
assert_eq!(interactive.get_tti(), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_set_mta() {
|
||||
let profiler_metadata_factory = DummyProfilerMetadataFactory {};
|
||||
|
||||
let interactive = test_interactive();
|
||||
let now = CrossProcessInstant::now();
|
||||
interactive.maybe_set_tti(
|
||||
&profiler_metadata_factory,
|
||||
InteractiveFlag::TimeToInteractive(now),
|
||||
);
|
||||
let main_thread_available_time = interactive.get_main_thread_available();
|
||||
assert!(main_thread_available_time.is_some());
|
||||
assert_eq!(main_thread_available_time, Some(now));
|
||||
|
||||
//try to overwrite
|
||||
interactive.maybe_set_tti(
|
||||
&profiler_metadata_factory,
|
||||
InteractiveFlag::TimeToInteractive(CrossProcessInstant::now()),
|
||||
);
|
||||
assert_eq!(
|
||||
interactive.get_main_thread_available(),
|
||||
main_thread_available_time
|
||||
);
|
||||
assert_eq!(interactive.get_tti(), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_set_tti_dcl() {
|
||||
let profiler_metadata_factory = DummyProfilerMetadataFactory {};
|
||||
|
||||
let interactive = test_interactive();
|
||||
let now = CrossProcessInstant::now();
|
||||
interactive.maybe_set_tti(
|
||||
&profiler_metadata_factory,
|
||||
InteractiveFlag::TimeToInteractive(now),
|
||||
);
|
||||
let main_thread_available_time = interactive.get_main_thread_available();
|
||||
assert!(main_thread_available_time.is_some());
|
||||
|
||||
interactive.maybe_set_tti(
|
||||
&profiler_metadata_factory,
|
||||
InteractiveFlag::DOMContentLoaded,
|
||||
);
|
||||
let dom_content_loaded_time = interactive.get_dom_content_loaded();
|
||||
assert!(dom_content_loaded_time.is_some());
|
||||
|
||||
assert_eq!(interactive.get_tti(), dom_content_loaded_time);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_set_tti_mta() {
|
||||
let profiler_metadata_factory = DummyProfilerMetadataFactory {};
|
||||
|
||||
let interactive = test_interactive();
|
||||
interactive.maybe_set_tti(
|
||||
&profiler_metadata_factory,
|
||||
InteractiveFlag::DOMContentLoaded,
|
||||
);
|
||||
let dcl = interactive.get_dom_content_loaded();
|
||||
assert!(dcl.is_some());
|
||||
|
||||
let time = CrossProcessInstant::now();
|
||||
interactive.maybe_set_tti(
|
||||
&profiler_metadata_factory,
|
||||
InteractiveFlag::TimeToInteractive(time),
|
||||
);
|
||||
let mta = interactive.get_main_thread_available();
|
||||
assert!(mta.is_some());
|
||||
|
||||
assert_eq!(interactive.get_tti(), mta);
|
||||
}
|
||||
|
||||
// TODO InteractiveWindow tests
|
|
@ -1,8 +0,0 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#![cfg(test)]
|
||||
|
||||
mod interactive_time;
|
||||
mod paint_time;
|
|
@ -1,129 +0,0 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use base::Epoch;
|
||||
use base::cross_process_instant::CrossProcessInstant;
|
||||
use base::id::{TEST_PIPELINE_ID, TEST_WEBVIEW_ID};
|
||||
use ipc_channel::ipc;
|
||||
use metrics::{PaintTimeMetrics, ProfilerMetadataFactory, ProgressiveWebMetric};
|
||||
use profile_traits::time::{ProfilerChan, TimerMetadata};
|
||||
use servo_url::ServoUrl;
|
||||
|
||||
struct DummyProfilerMetadataFactory {}
|
||||
impl ProfilerMetadataFactory for DummyProfilerMetadataFactory {
|
||||
fn new_metadata(&self) -> Option<TimerMetadata> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_paint_metrics_construction() {
|
||||
let (sender, _) = ipc::channel().unwrap();
|
||||
let profiler_chan = ProfilerChan(sender);
|
||||
let (layout_sender, _) = ipc::channel().unwrap();
|
||||
let (script_sender, _) = ipc::channel().unwrap();
|
||||
let start_time = CrossProcessInstant::now();
|
||||
let paint_time_metrics = PaintTimeMetrics::new(
|
||||
TEST_WEBVIEW_ID,
|
||||
TEST_PIPELINE_ID,
|
||||
profiler_chan,
|
||||
layout_sender,
|
||||
script_sender,
|
||||
ServoUrl::parse("about:blank").unwrap(),
|
||||
start_time,
|
||||
);
|
||||
assert_eq!(
|
||||
(&paint_time_metrics).get_navigation_start(),
|
||||
Some(start_time),
|
||||
"navigation start is set properly"
|
||||
);
|
||||
assert_eq!(
|
||||
paint_time_metrics.get_first_paint(),
|
||||
None,
|
||||
"first paint is None"
|
||||
);
|
||||
assert_eq!(
|
||||
paint_time_metrics.get_first_contentful_paint(),
|
||||
None,
|
||||
"first contentful paint is None"
|
||||
);
|
||||
}
|
||||
|
||||
fn test_common(display_list_is_contentful: bool, epoch: Epoch) -> PaintTimeMetrics {
|
||||
let (sender, _) = ipc::channel().unwrap();
|
||||
let profiler_chan = ProfilerChan(sender);
|
||||
let (layout_sender, _) = ipc::channel().unwrap();
|
||||
let (script_sender, _) = ipc::channel().unwrap();
|
||||
let start_time = CrossProcessInstant::now();
|
||||
let mut paint_time_metrics = PaintTimeMetrics::new(
|
||||
TEST_WEBVIEW_ID,
|
||||
TEST_PIPELINE_ID,
|
||||
profiler_chan,
|
||||
layout_sender,
|
||||
script_sender,
|
||||
ServoUrl::parse("about:blank").unwrap(),
|
||||
start_time,
|
||||
);
|
||||
let dummy_profiler_metadata_factory = DummyProfilerMetadataFactory {};
|
||||
|
||||
paint_time_metrics.maybe_observe_paint_time(
|
||||
&dummy_profiler_metadata_factory,
|
||||
epoch,
|
||||
display_list_is_contentful,
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
paint_time_metrics.get_first_paint(),
|
||||
None,
|
||||
"first paint is None"
|
||||
);
|
||||
assert_eq!(
|
||||
paint_time_metrics.get_first_contentful_paint(),
|
||||
None,
|
||||
"first contentful paint is None"
|
||||
);
|
||||
|
||||
let navigation_start = CrossProcessInstant::now();
|
||||
paint_time_metrics.set_navigation_start(navigation_start);
|
||||
assert_eq!(
|
||||
(&paint_time_metrics).get_navigation_start().unwrap(),
|
||||
navigation_start,
|
||||
"navigation start is set"
|
||||
);
|
||||
|
||||
paint_time_metrics
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_first_paint_setter() {
|
||||
let epoch = Epoch(0);
|
||||
let paint_time_metrics = test_common(false, epoch);
|
||||
let now = CrossProcessInstant::now();
|
||||
paint_time_metrics.maybe_set_metric(epoch, now);
|
||||
assert!(
|
||||
paint_time_metrics.get_first_paint().is_some(),
|
||||
"first paint is set"
|
||||
);
|
||||
assert_eq!(
|
||||
paint_time_metrics.get_first_contentful_paint(),
|
||||
None,
|
||||
"first contentful paint is None"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_first_contentful_paint_setter() {
|
||||
let epoch = Epoch(0);
|
||||
let paint_time_metrics = test_common(true, epoch);
|
||||
let now = CrossProcessInstant::now();
|
||||
paint_time_metrics.maybe_set_metric(epoch, now);
|
||||
assert!(
|
||||
paint_time_metrics.get_first_contentful_paint().is_some(),
|
||||
"first contentful paint is set"
|
||||
);
|
||||
assert!(
|
||||
paint_time_metrics.get_first_paint().is_some(),
|
||||
"first paint is set"
|
||||
);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue