1<!DOCTYPE html> 2<!-- 3Copyright (c) 2014 The Chromium Authors. All rights reserved. 4Use of this source code is governed by a BSD-style license that can be 5found in the LICENSE file. 6--> 7 8<link rel="import" href="/tracing/model/helpers/chrome_process_helper.html"> 9 10<script> 11'use strict'; 12 13/** 14 * @fileoverview Utilities for accessing trace data about the Chrome browser. 15 */ 16tr.exportTo('tr.model.helpers', function() { 17 function ChromeBrowserHelper(modelHelper, process) { 18 tr.model.helpers.ChromeProcessHelper.call(this, modelHelper, process); 19 this.mainThread_ = process.findAtMostOneThreadNamed('CrBrowserMain'); 20 } 21 22 ChromeBrowserHelper.isBrowserProcess = function(process) { 23 return !!process.findAtMostOneThreadNamed('CrBrowserMain'); 24 }; 25 26 ChromeBrowserHelper.prototype = { 27 __proto__: tr.model.helpers.ChromeProcessHelper.prototype, 28 29 get rendererHelpers() { 30 return this.modelHelper.rendererHelpers; 31 }, 32 33 getLoadingEventsInRange: function(rangeOfInterest) { 34 return this.getAllAsyncSlicesMatching(function(slice) { 35 return slice.title.indexOf('WebContentsImpl Loading') === 0 && 36 rangeOfInterest.intersectsExplicitRangeInclusive( 37 slice.start, slice.end); 38 }); 39 }, 40 41 getCommitProvisionalLoadEventsInRange: function(rangeOfInterest) { 42 return this.getAllAsyncSlicesMatching(function(slice) { 43 return slice.title === 'RenderFrameImpl::didCommitProvisionalLoad' && 44 rangeOfInterest.intersectsExplicitRangeInclusive( 45 slice.start, slice.end); 46 }); 47 }, 48 49 get hasLatencyEvents() { 50 var hasLatency = false; 51 this.modelHelper.model.getAllThreads().some(function(thread) { 52 thread.iterateAllEvents(function(event) { 53 if (!event.isTopLevel) 54 return; 55 if (!(event instanceof tr.e.cc.InputLatencyAsyncSlice)) 56 return; 57 hasLatency = true; 58 }); 59 return hasLatency; 60 }); 61 return hasLatency; 62 }, 63 64 getLatencyEventsInRange: function(rangeOfInterest) { 65 return this.getAllAsyncSlicesMatching(function(slice) { 66 return (slice.title.indexOf('InputLatency') === 0) && 67 rangeOfInterest.intersectsExplicitRangeInclusive( 68 slice.start, slice.end); 69 }); 70 }, 71 72 getAllAsyncSlicesMatching: function(pred, opt_this) { 73 var events = []; 74 this.iterAllThreads(function(thread) { 75 thread.iterateAllEvents(function(slice) { 76 if (pred.call(opt_this, slice)) 77 events.push(slice); 78 }); 79 }); 80 return events; 81 }, 82 83 getAllNetworkEventsInRange: function(rangeOfInterest) { 84 var networkEvents = []; 85 this.modelHelper.model.getAllThreads().forEach(function(thread) { 86 thread.asyncSliceGroup.slices.forEach(function(slice) { 87 var match = false; 88 if (slice.category == 'net' || // old-style URLRequest/Resource 89 slice.category == 'disabled-by-default-netlog' || 90 slice.category == 'netlog') { 91 match = true; 92 } 93 94 if (!match) 95 return; 96 97 if (rangeOfInterest.intersectsExplicitRangeInclusive( 98 slice.start, slice.end)) 99 networkEvents.push(slice); 100 }); 101 }); 102 return networkEvents; 103 }, 104 105 iterAllThreads: function(func, opt_this) { 106 tr.b.iterItems(this.process.threads, function(tid, thread) { 107 func.call(opt_this, thread); 108 }); 109 110 tr.b.iterItems(this.rendererHelpers, function(pid, rendererHelper) { 111 var rendererProcess = rendererHelper.process; 112 tr.b.iterItems(rendererProcess.threads, function(tid, thread) { 113 func.call(opt_this, thread); 114 }); 115 }, this); 116 } 117 }; 118 119 return { 120 ChromeBrowserHelper: ChromeBrowserHelper 121 }; 122}); 123</script> 124