Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(244)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/timeline/TimelineController.js

Issue 2563383003: DevTools: add extension API to contribute trace events to timeline (Closed)
Patch Set: Review comments + better test Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** @typedef {!{range: !Protocol.CSS.SourceRange, styleSheetId: !Protocol.CSS.St yleSheetId, wasUsed: boolean}} */
6 SDK.CSSModel.RuleUsage;
7
8 /** 5 /**
9 * @implements {SDK.TargetManager.Observer} 6 * @implements {SDK.TargetManager.Observer}
10 * @implements {SDK.TracingManagerClient} 7 * @implements {SDK.TracingManagerClient}
11 * @unrestricted 8 * @unrestricted
12 */ 9 */
13 Timeline.TimelineController = class { 10 Timeline.TimelineController = class {
14 /** 11 /**
15 * @param {!SDK.Target} target 12 * @param {!SDK.Target} target
16 * @param {!Timeline.TimelineLifecycleDelegate} delegate 13 * @param {!Timeline.TimelineLifecycleDelegate} delegate
17 * @param {!SDK.TracingModel} tracingModel 14 * @param {!SDK.TracingModel} tracingModel
18 */ 15 */
19 constructor(target, delegate, tracingModel) { 16 constructor(target, delegate, tracingModel) {
20 this._delegate = delegate; 17 this._delegate = delegate;
21 this._target = target; 18 this._target = target;
22 this._tracingModel = tracingModel; 19 this._tracingModel = tracingModel;
23 this._targets = []; 20 this._targets = [];
21 /** @type {!Array<!Timeline.ExtensionTracingSession>} */
22 this._extensionSessions = [];
24 SDK.targetManager.observeTargets(this); 23 SDK.targetManager.observeTargets(this);
25 24
26 if (Runtime.experiments.isEnabled('timelineRuleUsageRecording')) 25 if (Runtime.experiments.isEnabled('timelineRuleUsageRecording'))
27 this._markUnusedCSS = Common.settings.createSetting('timelineMarkUnusedCSS ', false); 26 this._markUnusedCSS = Common.settings.createSetting('timelineMarkUnusedCSS ', false);
28 } 27 }
29 28
30 /** 29 /**
31 * @param {boolean} captureCauses 30 * @param {!Timeline.TimelineController.CaptureOptions} options
32 * @param {boolean} enableJSSampling 31 * @param {!Array<!Extensions.ExtensionTraceProvider>} providers
33 * @param {boolean} captureMemory
34 * @param {boolean} capturePictures
35 * @param {boolean} captureFilmStrip
36 */ 32 */
37 startRecording(captureCauses, enableJSSampling, captureMemory, capturePictures , captureFilmStrip) { 33 startRecording(options, providers) {
38 this._extensionTraceProviders = Extensions.extensionServer.traceProviders(). slice(); 34 this._extensionTraceProviders = Extensions.extensionServer.traceProviders(). slice();
39 35
40 function disabledByDefault(category) { 36 function disabledByDefault(category) {
41 return 'disabled-by-default-' + category; 37 return 'disabled-by-default-' + category;
42 } 38 }
43 var categoriesArray = [ 39 var categoriesArray = [
44 '-*', 'devtools.timeline', 'v8.execute', disabledByDefault('devtools.timel ine'), 40 '-*', 'devtools.timeline', 'v8.execute', disabledByDefault('devtools.timel ine'),
45 disabledByDefault('devtools.timeline.frame'), SDK.TracingModel.TopLevelEve ntCategory, 41 disabledByDefault('devtools.timeline.frame'), SDK.TracingModel.TopLevelEve ntCategory,
46 TimelineModel.TimelineModel.Category.Console, TimelineModel.TimelineModel. Category.UserTiming 42 TimelineModel.TimelineModel.Category.Console, TimelineModel.TimelineModel. Category.UserTiming
47 ]; 43 ];
48 categoriesArray.push(TimelineModel.TimelineModel.Category.LatencyInfo); 44 categoriesArray.push(TimelineModel.TimelineModel.Category.LatencyInfo);
49 45
50 if (Runtime.experiments.isEnabled('timelineV8RuntimeCallStats') && enableJSS ampling) 46 if (Runtime.experiments.isEnabled('timelineV8RuntimeCallStats') && options.e nableJSSampling)
51 categoriesArray.push(disabledByDefault('v8.runtime_stats_sampling')); 47 categoriesArray.push(disabledByDefault('v8.runtime_stats_sampling'));
52 if (Runtime.experiments.isEnabled('timelineTracingJSProfile') && enableJSSam pling) { 48 if (Runtime.experiments.isEnabled('timelineTracingJSProfile') && options.ena bleJSSampling) {
53 categoriesArray.push(disabledByDefault('v8.cpu_profiler')); 49 categoriesArray.push(disabledByDefault('v8.cpu_profiler'));
54 if (Common.moduleSetting('highResolutionCpuProfiling').get()) 50 if (Common.moduleSetting('highResolutionCpuProfiling').get())
55 categoriesArray.push(disabledByDefault('v8.cpu_profiler.hires')); 51 categoriesArray.push(disabledByDefault('v8.cpu_profiler.hires'));
56 } 52 }
57 if (captureCauses || enableJSSampling) 53 if (options.captureCauses || options.enableJSSampling)
58 categoriesArray.push(disabledByDefault('devtools.timeline.stack')); 54 categoriesArray.push(disabledByDefault('devtools.timeline.stack'));
59 if (captureCauses && Runtime.experiments.isEnabled('timelineInvalidationTrac king')) 55 if (options.captureCauses && Runtime.experiments.isEnabled('timelineInvalida tionTracking'))
60 categoriesArray.push(disabledByDefault('devtools.timeline.invalidationTrac king')); 56 categoriesArray.push(disabledByDefault('devtools.timeline.invalidationTrac king'));
61 if (capturePictures) { 57 if (options.capturePictures) {
62 categoriesArray.push( 58 categoriesArray.push(
63 disabledByDefault('devtools.timeline.layers'), disabledByDefault('devt ools.timeline.picture'), 59 disabledByDefault('devtools.timeline.layers'), disabledByDefault('devt ools.timeline.picture'),
64 disabledByDefault('blink.graphics_context_annotations')); 60 disabledByDefault('blink.graphics_context_annotations'));
65 } 61 }
66 if (captureFilmStrip) 62 if (options.captureFilmStrip)
67 categoriesArray.push(disabledByDefault('devtools.screenshot')); 63 categoriesArray.push(disabledByDefault('devtools.screenshot'));
68 64
69 for (var traceProvider of this._extensionTraceProviders) 65 this._extensionSessions = providers.map(provider => new Timeline.ExtensionTr acingSession(provider, this._delegate));
70 traceProvider.start(); 66 this._extensionSessions.forEach(session => session.start());
71
72 var categories = categoriesArray.join(','); 67 var categories = categoriesArray.join(',');
73 this._startRecordingWithCategories(categories, enableJSSampling); 68 this._startRecordingWithCategories(categories, options.enableJSSampling);
74 } 69 }
75 70
76 stopRecording() { 71 stopRecording() {
77 var tracingStoppedPromises = []; 72 var tracingStoppedPromises = [];
78 tracingStoppedPromises.push(new Promise(resolve => this._tracingCompleteCall back = resolve)); 73 tracingStoppedPromises.push(new Promise(resolve => this._tracingCompleteCall back = resolve));
79 tracingStoppedPromises.push(this._stopProfilingOnAllTargets()); 74 tracingStoppedPromises.push(this._stopProfilingOnAllTargets());
80 this._target.tracingManager.stop(); 75 this._target.tracingManager.stop();
81 76
82 if (!Runtime.experiments.isEnabled('timelineRuleUsageRecording') || !this._m arkUnusedCSS.get()) 77 if (!Runtime.experiments.isEnabled('timelineRuleUsageRecording') || !this._m arkUnusedCSS.get())
83 tracingStoppedPromises.push(SDK.targetManager.resumeAllTargets()); 78 tracingStoppedPromises.push(SDK.targetManager.resumeAllTargets());
84 else 79 else
85 this._addUnusedRulesToCoverage(); 80 this._addUnusedRulesToCoverage();
86 81
87 Promise.all(tracingStoppedPromises).then(() => this._allSourcesFinished());
88
89 this._delegate.loadingStarted(); 82 this._delegate.loadingStarted();
90 83
91 for (var traceProvider of this._extensionTraceProviders) 84 var extensionCompletionPromises = this._extensionSessions.map(session => ses sion.stop());
92 traceProvider.stop(); 85 if (extensionCompletionPromises.length) {
86 var timerId;
87 var timeoutPromise = new Promise(fulfill => timerId = setTimeout(fulfill, 5000));
88 tracingStoppedPromises.push(
89 Promise.race([Promise.all(extensionCompletionPromises).then(() => clea rTimeout(timerId)), timeoutPromise]));
90 }
91 Promise.all(tracingStoppedPromises).then(() => this._allSourcesFinished());
93 } 92 }
94 93
95 /** 94 /**
96 * @override 95 * @override
97 * @param {!SDK.Target} target 96 * @param {!SDK.Target} target
98 */ 97 */
99 targetAdded(target) { 98 targetAdded(target) {
100 this._targets.push(target); 99 this._targets.push(target);
101 if (this._profiling) 100 if (this._profiling)
102 this._startProfilingOnTarget(target); 101 this._startProfilingOnTarget(target);
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 } 300 }
302 301
303 /** 302 /**
304 * @param {number} progress 303 * @param {number} progress
305 * @override 304 * @override
306 */ 305 */
307 eventsRetrievalProgress(progress) { 306 eventsRetrievalProgress(progress) {
308 this._delegate.loadingProgress(progress); 307 this._delegate.loadingProgress(progress);
309 } 308 }
310 }; 309 };
310
311 /** @typedef {!{
312 * captureCauses: (boolean|undefined),
313 * enableJSSampling: (boolean|undefined),
314 * captureMemory: (boolean|undefined),
315 * capturePictures: (boolean|undefined),
316 * captureFilmStrip: (boolean|undefined)
317 * }}
318 */
319 Timeline.TimelineController.CaptureOptions;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698