blob: ef7ac78863ec92e1791cc8a5a52cc0bc2ff45c73 [file] [log] [blame]
// Copyright 2017 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.
module page_load_metrics.mojom;
import "mojo/public/mojom/base/time.mojom";
import "third_party/blink/public/platform/web_feature.mojom";
// TimeDeltas below relative to navigation start.
struct DocumentTiming {
// Time immediately before the DOMContentLoaded event is fired.
mojo_base.mojom.TimeDelta? dom_content_loaded_event_start;
// Time immediately before the load event is fired.
mojo_base.mojom.TimeDelta? load_event_start;
// Time when the first layout is completed.
mojo_base.mojom.TimeDelta? first_layout;
};
// TimeDeltas below relative to navigation start.
struct PaintTiming {
// Time when the first paint is performed.
mojo_base.mojom.TimeDelta? first_paint;
// Time when the first image is painted.
mojo_base.mojom.TimeDelta? first_image_paint;
// Time when the first contentful thing (image, text, etc.) is painted.
mojo_base.mojom.TimeDelta? first_contentful_paint;
// (Experimental) Time when the page's primary content is painted.
mojo_base.mojom.TimeDelta? first_meaningful_paint;
// (Experimental) Time when the page's largest image is painted.
mojo_base.mojom.TimeDelta? largest_image_paint;
// (Experimental) Size of the largest image of the largest image paint, by
// Size = Height * Width.
uint64 largest_image_paint_size;
// (Experimental) Time when the page's last image is painted.
mojo_base.mojom.TimeDelta? last_image_paint;
// (Experimental) Size of the last image of the last image paint.
uint64 last_image_paint_size;
// (Experimental) Time when the page's largest text is painted.
mojo_base.mojom.TimeDelta? largest_text_paint;
// (Experimental) Size of the largest text of the largest text paint, by
// Size = Height * Width.
uint64 largest_text_paint_size;
// (Experimental) Time when the page's last text is painted.
mojo_base.mojom.TimeDelta? last_text_paint;
// (Experimental) Size of the last text of the last text paint.
uint64 last_text_paint_size;
};
// TimeDeltas below represent durations of time during the page load.
struct ParseTiming {
// Time that the document's parser started and stopped parsing main resource
// content.
mojo_base.mojom.TimeDelta? parse_start;
mojo_base.mojom.TimeDelta? parse_stop;
// Sum of times when the parser is blocked waiting on the load of a script.
// This duration takes place between parser_start and parser_stop, and thus
// must be less than or equal to parser_stop - parser_start. Note that this
// value may be updated multiple times during the period between parse_start
// and parse_stop.
mojo_base.mojom.TimeDelta? parse_blocked_on_script_load_duration;
// Sum of times when the parser is blocked waiting on the load of a script
// that was inserted from document.write. This duration must be less than or
// equal to parse_blocked_on_script_load_duration. Note that this value may be
// updated multiple times during the period between parse_start and
// parse_stop. Note that some uncommon cases where scripts are loaded via
// document.write are not currently covered by this field. See crbug/600711
// for details.
mojo_base.mojom.TimeDelta? parse_blocked_on_script_load_from_document_write_duration;
// Sum of times when the parser is executing a script. This duration takes
// place between parser_start and parser_stop, and thus must be less than or
// equal to parser_stop - parser_start. Note that this value may be updated
// multiple times during the period between parse_start and parse_stop.
mojo_base.mojom.TimeDelta? parse_blocked_on_script_execution_duration;
// Sum of times when the parser is executing a script that was inserted from
// document.write. This duration must be less than or equal to
// parse_blocked_on_script_load_duration. Note that this value may be updated
// multiple times during the period between parse_start and parse_stop. Note
// that some uncommon cases where scripts are loaded via document.write are
// not currently covered by this field. See crbug/600711 for details.
mojo_base.mojom.TimeDelta? parse_blocked_on_script_execution_from_document_write_duration;
};
struct InteractiveTiming {
// The first time the page is considered 'interactive'. This is determined
// using heuristics based on main thread and network activity. Time delta is
// relative to navigation_start.
mojo_base.mojom.TimeDelta? interactive;
// The time of when we detect the page is interactive. There is a delay
// between when the page was interactive and when we were able to detect it.
// Time delta is relative to navigation_start.
// This is a page load metrics internal value and not generally intended for
// consumption by observers.
mojo_base.mojom.TimeDelta? interactive_detection;
// The time of when a significant input event happened that may cause
// observers to discard the value of Time to Interactive. Time delta is
// relative to navigation start.
// This is a page load metrics internal value and not generally intended for
// consumption by observers.
mojo_base.mojom.TimeDelta? first_invalidating_input;
// Queueing Time of the first click, tap, key press, cancellable touchstart,
// or pointer down followed by a pointer up.
mojo_base.mojom.TimeDelta? first_input_delay;
// The timestamp of the event whose delay is reported by GetFirstInputDelay().
mojo_base.mojom.TimeDelta? first_input_timestamp;
// Queueing Time of the meaningful input event with longest delay. Meaningful
// input events are click, tap, key press, cancellable touchstart, or pointer
// down followed by a pointer up.
mojo_base.mojom.TimeDelta? longest_input_delay;
// The timestamp of the event whose delay is reported as longest_input_delay.
mojo_base.mojom.TimeDelta? longest_input_timestamp;
};
// PageLoadTiming contains timing metrics associated with a page load. Many of
// the metrics here are based on the Navigation Timing spec:
// http://www.w3.org/TR/navigation-timing/.
struct PageLoadTiming {
// Time that the navigation for the associated page was initiated. Note that
// this field is only used for internal tracking purposes and should not be
// used by PageLoadMetricsObservers. This field will likely be removed in the
// future.
mojo_base.mojom.Time navigation_start;
// Time relative to navigation_start that the first byte of the response is
// received.
mojo_base.mojom.TimeDelta? response_start;
DocumentTiming document_timing;
InteractiveTiming interactive_timing;
PaintTiming paint_timing;
ParseTiming parse_timing;
// Time between user input and navigation start. This is set for navigations
// where the input start timing is known; currently when the navigation is
// initiated by a link click in the renderer, or from the desktop omnibox.
mojo_base.mojom.TimeDelta? input_to_navigation_start;
// If you add additional members, also be sure to update page_load_timing.h.
};
struct PageLoadMetadata {
// These are packed blink::WebLoadingBehaviorFlag enums.
int32 behavior_flags = 0;
};
// PageLoadFeatures contains a list of features newly observed by use counter.
// In a given page load, no PageLoadFeatures sent will contain previously seen
// values.
struct PageLoadFeatures {
// These features are defined as blink::mojom::WebFeature enums.
array<blink.mojom.WebFeature> features;
// These ints represent CSSSampleID for histogram converted from CSSPropertyId
// by blink::UseCounter::MapCSSPropertyIdToCSSSampleIdForHistogram.
array<int32> css_properties;
array<int32> animated_css_properties;
};
struct ResourceDataUpdate {
// The id for the resource request.
int32 request_id = 0;
// Network bytes received for the resource since the last timing update
// from renderer to browser.
int64 delta_bytes = 0;
// Total network bytes received for the resource across timing updates. This
// is the aggregate of the |delta_bytes| from each timing update.
int64 received_data_length = 0;
// The length of the response body for the resource before removing any
// content encodings. Only set for complete resources.
int64 encoded_body_length = 0;
// Whether this resource load has completed.
bool is_complete;
// Compression ratio estimated from the response headers if data saver was
// used.
double data_reduction_proxy_compression_ratio_estimate;
// Whether this resource was tagged as an ad in the renderer. This flag can
// be set to true at any point during a resource load. A more recent
// ResourceDataUpdate can have a different flag than the previous update.
// Once this is set to true, it will be true for all future updates.
bool reported_as_ad_resource;
// Whether this resource was loaded in the top-level frame.
bool is_main_frame_resource;
// Whether this resource was fetched from the http cache.
bool was_fetched_via_cache;
// Whether this resource is the primary resource for a frame.
bool is_primary_frame_resource;
// Mime type for the resource found in the network response header.
string mime_type;
// Whether the scheme of this resource indicates a secure connection.
bool is_secure_scheme;
// Whether this resource was fetched via proxy.
bool proxy_used;
};
// Metrics about how the page rendered during the browsing session.
struct PageRenderData {
// How much visible elements in the frame shifted (bit.ly/lsm-explainer).
float layout_jank_score;
};
// Sent from renderer to browser process when the PageLoadTiming for the
// associated frame changed.
interface PageLoadMetrics {
UpdateTiming(PageLoadTiming page_load_timing,
PageLoadMetadata page_load_metadata,
PageLoadFeatures new_features,
array<ResourceDataUpdate> resources,
PageRenderData render_data);
};