mirror of
https://github.com/servo/servo.git
synced 2025-08-10 07:55:33 +01:00
Auto merge of #18670 - avadacatavra:interactive-metrics, r=jdm
added time to interactive metrics <!-- Please describe your changes on the following line: --> Added time to interactive metrics and refactored metrics/lib I need to write tests, but wanted to submit the PR for review --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [ ] `./mach build -d` does not report any errors - [ ] `./mach test-tidy` does not report any errors - [ ] These changes fix #__ (github issue number if applicable). <!-- Either: --> - [ ] There are tests for these changes OR - [ ] These changes do not require tests because _____ <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/18670) <!-- Reviewable:end -->
This commit is contained in:
commit
e438b094f6
28 changed files with 738 additions and 182 deletions
112
tests/unit/metrics/interactive_time.rs
Normal file
112
tests/unit/metrics/interactive_time.rs
Normal file
|
@ -0,0 +1,112 @@
|
|||
/* 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 http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use ipc_channel::ipc;
|
||||
use metrics::{InteractiveMetrics, InteractiveFlag, InteractiveWindow};
|
||||
use metrics::{ProfilerMetadataFactory, ProgressiveWebMetric};
|
||||
use profile_traits::time::{ProfilerChan, TimerMetadata};
|
||||
use time;
|
||||
|
||||
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);
|
||||
|
||||
assert_eq!((&interactive).get_navigation_start(), None);
|
||||
assert_eq!(interactive.get_tti(), None);
|
||||
|
||||
interactive.set_navigation_start(time::precise_time_ns() as f64);
|
||||
|
||||
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 t = time::precise_time_ns();
|
||||
interactive.maybe_set_tti(
|
||||
&profiler_metadata_factory,
|
||||
InteractiveFlag::TimeToInteractive(t as f64),
|
||||
);
|
||||
let mta = interactive.get_main_thread_available();
|
||||
assert!(mta.is_some());
|
||||
assert_eq!(mta, Some(t as f64));
|
||||
|
||||
//try to overwrite
|
||||
interactive.maybe_set_tti(
|
||||
&profiler_metadata_factory,
|
||||
InteractiveFlag::TimeToInteractive(time::precise_time_ns() as f64),
|
||||
);
|
||||
assert_eq!(interactive.get_main_thread_available(), mta);
|
||||
assert_eq!(interactive.get_tti(), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_set_tti_dcl() {
|
||||
let profiler_metadata_factory = DummyProfilerMetadataFactory {};
|
||||
|
||||
let interactive = test_interactive();
|
||||
let t = time::precise_time_ns();
|
||||
interactive.maybe_set_tti(
|
||||
&profiler_metadata_factory,
|
||||
InteractiveFlag::TimeToInteractive(t as f64),
|
||||
);
|
||||
let mta = interactive.get_main_thread_available();
|
||||
assert!(mta.is_some());
|
||||
|
||||
interactive.maybe_set_tti(&profiler_metadata_factory, InteractiveFlag::DOMContentLoaded);
|
||||
let dcl = interactive.get_dom_content_loaded();
|
||||
assert!(dcl.is_some());
|
||||
|
||||
let interactive_time = dcl.unwrap() - (&interactive).get_navigation_start().unwrap();
|
||||
assert_eq!(interactive.get_tti(), Some(interactive_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 t = time::precise_time_ns();
|
||||
interactive.maybe_set_tti(
|
||||
&profiler_metadata_factory,
|
||||
InteractiveFlag::TimeToInteractive(t as f64),
|
||||
);
|
||||
let mta = interactive.get_main_thread_available();
|
||||
assert!(mta.is_some());
|
||||
|
||||
let interactive_time = mta.unwrap() - (&interactive).get_navigation_start().unwrap();
|
||||
assert_eq!(interactive.get_tti(), Some(interactive_time));
|
||||
}
|
||||
|
||||
// TODO InteractiveWindow tests
|
|
@ -13,5 +13,7 @@ extern crate profile_traits;
|
|||
extern crate style;
|
||||
extern crate time;
|
||||
|
||||
#[cfg(test)]
|
||||
mod interactive_time;
|
||||
#[cfg(test)]
|
||||
mod paint_time;
|
||||
|
|
|
@ -7,7 +7,7 @@ use gfx::display_list::{BaseDisplayItem, WebRenderImageInfo};
|
|||
use gfx::display_list::{DisplayItem, DisplayList, ImageDisplayItem};
|
||||
use gfx_traits::Epoch;
|
||||
use ipc_channel::ipc;
|
||||
use metrics::{PaintTimeMetrics, ProfilerMetadataFactory};
|
||||
use metrics::{PaintTimeMetrics, ProfilerMetadataFactory, ProgressiveWebMetric};
|
||||
use msg::constellation_msg::TEST_PIPELINE_ID;
|
||||
use net_traits::image::base::PixelFormat;
|
||||
use profile_traits::time::{ProfilerChan, TimerMetadata};
|
||||
|
@ -27,10 +27,27 @@ fn test_paint_metrics_construction() {
|
|||
let profiler_chan = ProfilerChan(sender);
|
||||
let (layout_sender, _) = ipc::channel().unwrap();
|
||||
let (script_sender, _) = ipc::channel().unwrap();
|
||||
let paint_time_metrics = PaintTimeMetrics::new(TEST_PIPELINE_ID, profiler_chan, layout_sender, script_sender);
|
||||
assert_eq!(paint_time_metrics.get_navigation_start(), None, "navigation start is None");
|
||||
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 paint_time_metrics = PaintTimeMetrics::new(
|
||||
TEST_PIPELINE_ID,
|
||||
profiler_chan,
|
||||
layout_sender,
|
||||
script_sender,
|
||||
);
|
||||
assert_eq!(
|
||||
(&paint_time_metrics).get_navigation_start(),
|
||||
None,
|
||||
"navigation start is None"
|
||||
);
|
||||
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: &DisplayList, epoch: Epoch) -> PaintTimeMetrics {
|
||||
|
@ -38,22 +55,40 @@ fn test_common(display_list: &DisplayList, epoch: Epoch) -> PaintTimeMetrics {
|
|||
let profiler_chan = ProfilerChan(sender);
|
||||
let (layout_sender, _) = ipc::channel().unwrap();
|
||||
let (script_sender, _) = ipc::channel().unwrap();
|
||||
let mut paint_time_metrics = PaintTimeMetrics::new(TEST_PIPELINE_ID, profiler_chan, layout_sender, script_sender);
|
||||
let mut paint_time_metrics = PaintTimeMetrics::new(
|
||||
TEST_PIPELINE_ID,
|
||||
profiler_chan,
|
||||
layout_sender,
|
||||
script_sender,
|
||||
);
|
||||
let dummy_profiler_metadata_factory = DummyProfilerMetadataFactory {};
|
||||
|
||||
paint_time_metrics.maybe_observe_paint_time(&dummy_profiler_metadata_factory,
|
||||
epoch,
|
||||
&display_list);
|
||||
paint_time_metrics.maybe_observe_paint_time(
|
||||
&dummy_profiler_metadata_factory,
|
||||
epoch,
|
||||
&display_list,
|
||||
);
|
||||
|
||||
// Should not set any metric until navigation start is set.
|
||||
paint_time_metrics.maybe_set_metric(epoch, 0.);
|
||||
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");
|
||||
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 = time::precise_time_ns() as f64;
|
||||
paint_time_metrics.set_navigation_start(navigation_start);
|
||||
assert_eq!(paint_time_metrics.get_navigation_start().unwrap(),
|
||||
navigation_start, "navigation start is set");
|
||||
assert_eq!(
|
||||
(&paint_time_metrics).get_navigation_start().unwrap(),
|
||||
navigation_start,
|
||||
"navigation start is set"
|
||||
);
|
||||
|
||||
paint_time_metrics
|
||||
}
|
||||
|
@ -65,11 +100,18 @@ fn test_first_paint_setter() {
|
|||
clip_scroll_nodes: Vec::new(),
|
||||
};
|
||||
let epoch = Epoch(0);
|
||||
let mut paint_time_metrics = test_common(&empty_display_list, epoch);
|
||||
let paint_time_metrics = test_common(&empty_display_list, epoch);
|
||||
let now = time::precise_time_ns() as f64;
|
||||
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");
|
||||
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]
|
||||
|
@ -92,9 +134,15 @@ fn test_first_contentful_paint_setter() {
|
|||
clip_scroll_nodes: Vec::new(),
|
||||
};
|
||||
let epoch = Epoch(0);
|
||||
let mut paint_time_metrics = test_common(&display_list, epoch);
|
||||
let paint_time_metrics = test_common(&display_list, epoch);
|
||||
let now = time::precise_time_ns() as f64;
|
||||
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");
|
||||
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