| <!DOCTYPE html> |
| <!-- |
| Copyright (c) 2013 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. |
| --> |
| |
| <link rel="import" href="/base/base.html"> |
| <link rel="import" href="/base/range_utils.html"> |
| <link rel="import" href="/core/auditor.html"> |
| <link rel="import" href="/extras/chrome/cc/input_latency_async_slice.html"> |
| <link rel="import" href="/extras/chrome/chrome_model_helper.html"> |
| <link rel="import" href="/extras/rail/rail_ir_finder.html"> |
| <link rel="import" href="/model/event_info.html"> |
| |
| <script> |
| 'use strict'; |
| |
| /** |
| * @fileoverview Base class for trace data Auditors. |
| */ |
| tr.exportTo('tr.e.audits', function() { |
| var Auditor = tr.c.Auditor; |
| |
| /** |
| * Auditor for Chrome-specific traces. |
| * @constructor |
| */ |
| function ChromeAuditor(model) { |
| Auditor.call(this, model); |
| |
| if (tr.e.audits.ChromeModelHelper.supportsModel(this.model)) { |
| var modelHelper = new tr.e.audits.ChromeModelHelper(this.model); |
| |
| // Must be a browserHelper in order to do audits. |
| if (modelHelper.browserHelper === undefined) |
| this.modelHelper = undefined; |
| else |
| this.modelHelper = modelHelper; |
| } else { |
| this.modelHelper = undefined; |
| } |
| }; |
| |
| ChromeAuditor.prototype = { |
| __proto__: Auditor.prototype, |
| |
| runAnnotate: function() { |
| if (!this.modelHelper) |
| return; |
| |
| this.model.getAllProcesses().forEach(function(process) { |
| if (process.labels !== undefined && |
| process.labels.length == 1 && |
| process.labels[0] == 'chrome://tracing') |
| process.important = false; |
| }); |
| }, |
| |
| runAudit: function() { |
| if (!this.modelHelper) |
| return; |
| |
| // ChromeAuditor is disabled when used directly inside about://tracing, |
| // for now. |
| if (tr.isExported('profilingView')) |
| return; |
| |
| if (tr.e.rail.RAILIRFinder.supportsModelHelper(this.modelHelper)) { |
| var rirf = new tr.e.rail.RAILIRFinder(this.model, this.modelHelper); |
| rirf.findAllInteractionRecords().forEach(function(ir) { |
| this.model.addInteractionRecord(ir); |
| |
| var alerts = this.createAlertsForIR_(ir); |
| alerts.forEach(function(alert) { |
| this.model.alerts.push(alert); |
| }, this); |
| }, this); |
| } |
| }, |
| |
| createAlertsForIR_: function(ir) { |
| var allAlerts = []; |
| ir.associatedEvents.forEach(function(event) { |
| if (!(event instanceof tr.model.Slice)) |
| return; |
| var slice = event; |
| |
| if (slice.category != 'toplevel') |
| return; |
| if (slice.duration > 75.0) { |
| var alertInfo = new tr.model.EventInfo( |
| 'Task too long', |
| 'Tasks taking >= 75ms are bad, and should be broken up to ' + |
| 'ensure the main thread is responsive'); |
| var center = slice.start + 0.5 * slice.duration; |
| var alert = new tr.model.Alert( |
| alertInfo, center, [slice]); |
| allAlerts.push(alert); |
| } |
| }); |
| return allAlerts; |
| } |
| }; |
| |
| Auditor.register(ChromeAuditor); |
| |
| return { |
| ChromeAuditor: ChromeAuditor |
| }; |
| }); |
| </script> |