Commit 34236477 authored by Alexei Filippov's avatar Alexei Filippov Committed by Commit Bot

DevTools: Introduce FrameStartedLoading event

Show the navigation time mark on the timeline.

Change-Id: I1d8d832f40b17094f84ef1b1ae366beabe6016ec
Reviewed-on: https://chromium-review.googlesource.com/1036619Reviewed-by: default avatarDmitry Gozman <dgozman@chromium.org>
Commit-Queue: Alexei Filippov <alph@chromium.org>
Cr-Commit-Position: refs/heads/master@{#555208}
parent 952b653d
...@@ -2,6 +2,15 @@ Tests the load event. ...@@ -2,6 +2,15 @@ Tests the load event.
Page reloaded. Page reloaded.
Model records: Model records:
FrameStartedLoading Properties:
{
data : {
frame : <string>
}
endTime : <number>
startTime : <number>
type : "FrameStartedLoading"
}
MarkDOMContent Properties: MarkDOMContent Properties:
{ {
data : { data : {
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
await PerformanceTestRunner.stopTimeline(); await PerformanceTestRunner.stopTimeline();
TestRunner.addResult('Model records:'); TestRunner.addResult('Model records:');
PerformanceTestRunner.printTimelineRecords('FrameStartedLoading');
PerformanceTestRunner.printTimelineRecords('MarkDOMContent'); PerformanceTestRunner.printTimelineRecords('MarkDOMContent');
PerformanceTestRunner.printTimelineRecords('MarkLoad'); PerformanceTestRunner.printTimelineRecords('MarkLoad');
TestRunner.addResult('Timestamp records:'); TestRunner.addResult('Timestamp records:');
...@@ -30,8 +31,8 @@ ...@@ -30,8 +31,8 @@
PerformanceTestRunner.printTimestampRecords('MarkLoad'); PerformanceTestRunner.printTimestampRecords('MarkLoad');
PerformanceTestRunner.printTimestampRecords('MarkFirstPaint'); PerformanceTestRunner.printTimestampRecords('MarkFirstPaint');
const eventDividers = PerformanceTestRunner.timelineModel().eventDividers(); const markers = PerformanceTestRunner.timelineModel().timeMarkerEvents();
eventDividers.reduce((prev, current) => { markers.reduce((prev, current) => {
TestRunner.assertGreaterOrEqual(current.startTime, prev.startTime, TestRunner.assertGreaterOrEqual(current.startTime, prev.startTime,
'Event divider timestamps should be monotonically non-decreasing'); 'Event divider timestamps should be monotonically non-decreasing');
return current; return current;
......
...@@ -211,6 +211,12 @@ void InspectorTraceEvents::PaintTiming(Document* document, ...@@ -211,6 +211,12 @@ void InspectorTraceEvents::PaintTiming(Document* document,
"frame", ToTraceValue(document->GetFrame())); "frame", ToTraceValue(document->GetFrame()));
} }
void InspectorTraceEvents::FrameStartedLoading(LocalFrame* frame,
FrameLoadType) {
TRACE_EVENT_INSTANT1("devtools.timeline", "FrameStartedLoading",
TRACE_EVENT_SCOPE_THREAD, "frame", ToTraceValue(frame));
}
namespace { namespace {
void SetNodeInfo(TracedValue* value, void SetNodeInfo(TracedValue* value,
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/optional.h" #include "base/optional.h"
#include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/css/css_selector.h" #include "third_party/blink/renderer/core/css/css_selector.h"
#include "third_party/blink/renderer/core/loader/frame_loader_types.h"
#include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
#include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h"
...@@ -110,6 +111,8 @@ class CORE_EXPORT InspectorTraceEvents ...@@ -110,6 +111,8 @@ class CORE_EXPORT InspectorTraceEvents
void PaintTiming(Document*, const char* name, double timestamp); void PaintTiming(Document*, const char* name, double timestamp);
void FrameStartedLoading(LocalFrame*, FrameLoadType);
void Trace(blink::Visitor*) {} void Trace(blink::Visitor*) {}
private: private:
......
...@@ -198,6 +198,7 @@ ...@@ -198,6 +198,7 @@
"didFinishLoading", "didFinishLoading",
"didReceiveData", "didReceiveData",
"didReceiveResourceResponse", "didReceiveResourceResponse",
"frameStartedLoading",
"paintTiming", "paintTiming",
"willSendRequest", "willSendRequest",
] ]
......
...@@ -207,7 +207,7 @@ PerformanceTestRunner.walkTimelineEventTreeUnderNode = function(callback, root, ...@@ -207,7 +207,7 @@ PerformanceTestRunner.walkTimelineEventTreeUnderNode = function(callback, root,
}; };
PerformanceTestRunner.printTimestampRecords = function(typeName) { PerformanceTestRunner.printTimestampRecords = function(typeName) {
const dividers = PerformanceTestRunner.timelineModel().eventDividers(); const dividers = PerformanceTestRunner.timelineModel().timeMarkerEvents();
for (const event of dividers) { for (const event of dividers) {
if (event.name === typeName) if (event.name === typeName)
......
...@@ -745,7 +745,7 @@ Timeline.TimelinePanel = class extends UI.Panel { ...@@ -745,7 +745,7 @@ Timeline.TimelinePanel = class extends UI.Panel {
const recordTypes = TimelineModel.TimelineModel.RecordType; const recordTypes = TimelineModel.TimelineModel.RecordType;
const zeroTime = timelineModel.minimumRecordTime(); const zeroTime = timelineModel.minimumRecordTime();
const filter = Timeline.TimelineUIUtils.paintEventsFilter(); const filter = Timeline.TimelineUIUtils.paintEventsFilter();
for (const event of timelineModel.eventDividers()) { for (const event of timelineModel.timeMarkerEvents()) {
if (event.name === recordTypes.TimeStamp || event.name === recordTypes.ConsoleTime) if (event.name === recordTypes.TimeStamp || event.name === recordTypes.ConsoleTime)
continue; continue;
if (!filter.accept(event)) if (!filter.accept(event))
......
...@@ -109,6 +109,8 @@ Timeline.TimelineUIUtils = class { ...@@ -109,6 +109,8 @@ Timeline.TimelineUIUtils = class {
new Timeline.TimelineRecordStyle(Common.UIString('Evaluate Module'), categories['scripting']); new Timeline.TimelineRecordStyle(Common.UIString('Evaluate Module'), categories['scripting']);
eventStyles[recordTypes.ParseScriptOnBackground] = eventStyles[recordTypes.ParseScriptOnBackground] =
new Timeline.TimelineRecordStyle(Common.UIString('Parse Script'), categories['scripting']); new Timeline.TimelineRecordStyle(Common.UIString('Parse Script'), categories['scripting']);
eventStyles[recordTypes.FrameStartedLoading] =
new Timeline.TimelineRecordStyle(Common.UIString('Frame Started Loading'), categories['loading'], true);
eventStyles[recordTypes.MarkLoad] = eventStyles[recordTypes.MarkLoad] =
new Timeline.TimelineRecordStyle(Common.UIString('Load event'), categories['scripting'], true); new Timeline.TimelineRecordStyle(Common.UIString('Load event'), categories['scripting'], true);
eventStyles[recordTypes.MarkDOMContent] = eventStyles[recordTypes.MarkDOMContent] =
...@@ -1778,8 +1780,12 @@ Timeline.TimelineUIUtils = class { ...@@ -1778,8 +1780,12 @@ Timeline.TimelineUIUtils = class {
} }
const recordTypes = TimelineModel.TimelineModel.RecordType; const recordTypes = TimelineModel.TimelineModel.RecordType;
let tall = false; let tall = false;
let color = 'green'; let color = 'grey';
switch (event.name) { switch (event.name) {
case recordTypes.FrameStartedLoading:
color = 'green';
tall = true;
break;
case recordTypes.MarkDOMContent: case recordTypes.MarkDOMContent:
color = 'blue'; color = 'blue';
tall = true; tall = true;
......
...@@ -91,6 +91,7 @@ TimelineModel.TimelineModel = class { ...@@ -91,6 +91,7 @@ TimelineModel.TimelineModel = class {
static isMarkerEvent(event) { static isMarkerEvent(event) {
const recordTypes = TimelineModel.TimelineModel.RecordType; const recordTypes = TimelineModel.TimelineModel.RecordType;
switch (event.name) { switch (event.name) {
case recordTypes.FrameStartedLoading:
case recordTypes.TimeStamp: case recordTypes.TimeStamp:
case recordTypes.MarkFirstPaint: case recordTypes.MarkFirstPaint:
case recordTypes.MarkFCP: case recordTypes.MarkFCP:
...@@ -124,7 +125,7 @@ TimelineModel.TimelineModel = class { ...@@ -124,7 +125,7 @@ TimelineModel.TimelineModel = class {
*/ */
static eventFrameId(event) { static eventFrameId(event) {
const data = event.args['data'] || event.args['beginData']; const data = event.args['data'] || event.args['beginData'];
return (data && data['frame']) || ''; return data && data['frame'] || '';
} }
/** /**
...@@ -538,7 +539,7 @@ TimelineModel.TimelineModel = class { ...@@ -538,7 +539,7 @@ TimelineModel.TimelineModel = class {
eventStack.push(event); eventStack.push(event);
} }
if (TimelineModel.TimelineModel.isMarkerEvent(event)) if (TimelineModel.TimelineModel.isMarkerEvent(event))
this._eventDividers.push(event); this._timeMarkerEvents.push(event);
track.events.push(event); track.events.push(event);
this._inspectedTargetEvents.push(event); this._inspectedTargetEvents.push(event);
...@@ -848,10 +849,15 @@ TimelineModel.TimelineModel = class { ...@@ -848,10 +849,15 @@ TimelineModel.TimelineModel = class {
break; break;
} }
case recordTypes.FrameStartedLoading:
if (this._mainFrame.frameId !== event.args['frame'])
return false;
break;
case recordTypes.MarkDOMContent: case recordTypes.MarkDOMContent:
case recordTypes.MarkLoad: { case recordTypes.MarkLoad: {
const frameId = TimelineModel.TimelineModel.eventFrameId(event); const frameId = TimelineModel.TimelineModel.eventFrameId(event);
if (!this._pageFrames.get(frameId)) if (!this._pageFrames.has(frameId))
return false; return false;
break; break;
} }
...@@ -1012,7 +1018,7 @@ TimelineModel.TimelineModel = class { ...@@ -1012,7 +1018,7 @@ TimelineModel.TimelineModel = class {
/** @type {!Array<!SDK.TracingModel.Event>} */ /** @type {!Array<!SDK.TracingModel.Event>} */
this._inspectedTargetEvents = []; this._inspectedTargetEvents = [];
/** @type {!Array<!SDK.TracingModel.Event>} */ /** @type {!Array<!SDK.TracingModel.Event>} */
this._eventDividers = []; this._timeMarkerEvents = [];
/** @type {?string} */ /** @type {?string} */
this._sessionId = null; this._sessionId = null;
/** @type {?number} */ /** @type {?number} */
...@@ -1081,8 +1087,8 @@ TimelineModel.TimelineModel = class { ...@@ -1081,8 +1087,8 @@ TimelineModel.TimelineModel = class {
/** /**
* @return {!Array<!SDK.TracingModel.Event>} * @return {!Array<!SDK.TracingModel.Event>}
*/ */
eventDividers() { timeMarkerEvents() {
return this._eventDividers; return this._timeMarkerEvents;
} }
/** /**
...@@ -1199,6 +1205,7 @@ TimelineModel.TimelineModel.RecordType = { ...@@ -1199,6 +1205,7 @@ TimelineModel.TimelineModel.RecordType = {
CompileModule: 'v8.compileModule', CompileModule: 'v8.compileModule',
EvaluateModule: 'v8.evaluateModule', EvaluateModule: 'v8.evaluateModule',
FrameStartedLoading: 'FrameStartedLoading',
CommitLoad: 'CommitLoad', CommitLoad: 'CommitLoad',
MarkLoad: 'MarkLoad', MarkLoad: 'MarkLoad',
MarkDOMContent: 'MarkDOMContent', MarkDOMContent: 'MarkDOMContent',
......
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