| OLD | NEW |
| 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 Loading... |
| 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; |
| OLD | NEW |