Index: perf_insights/perf_insights/mappers/v8_map_function.html |
diff --git a/perf_insights/perf_insights/mappers/v8_map_function.html b/perf_insights/perf_insights/mappers/v8_map_function.html |
deleted file mode 100644 |
index a8dc9f60422273d9f4ac4cd1cb1dc3cb916dadb0..0000000000000000000000000000000000000000 |
--- a/perf_insights/perf_insights/mappers/v8_map_function.html |
+++ /dev/null |
@@ -1,256 +0,0 @@ |
-<!DOCTYPE html> |
-<!-- |
-Copyright 2015 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="/perf_insights/mappers/slice_cost.html"> |
-<link rel="import" href="/perf_insights/mappers/thread_grouping.html"> |
-<link rel="import" href="/perf_insights/mre/function_handle.html"> |
-<link rel="import" href="/tracing/base/iteration_helpers.html"> |
-<link rel="import" href="/tracing/model/helpers/chrome_model_helper.html"> |
-<link rel="import" href="/tracing/model/ir_coverage.html"> |
-<link rel="import" href="/tracing/model/user_model/user_expectation.html"> |
-<link rel="import" href="/tracing/value/unit.html"> |
- |
-<script> |
-'use strict'; |
- |
- |
-tr.exportTo('pi.m', function() { |
- function v8ReportMapFunction(result, model) { |
- var allIRs = []; |
- model.userModel.expectations.forEach(function(ir) { |
- if (!(ir instanceof tr.model.um.UserExpectation)) |
- return; |
- allIRs.push(ir); |
- }); |
- |
- var railTypeNameByGUID = getStageTitleForEventsByGUID(model, allIRs); |
- |
- var threadGrouping = new pi.m.ThreadGrouping(); |
- threadGrouping.autoInitUsingHelpers(model); |
- var last_known_framework = ['Unknown/Uncategorized']; |
- |
- var sliceCosts = []; |
- |
- model.iterateAllEvents(function(event) { |
- if (!(event instanceof tr.model.ThreadSlice)) |
- return; |
- |
- if (!event.title.startsWith('V8.') && !event.title.startsWith('V8Test.')) |
- return; |
- |
- function _get_parent_data(event) { |
- var curSlice = event; |
- |
- var data = {}; |
- data['js'] = 'Unknown'; |
- while (curSlice) { |
- if (curSlice.title === 'v8.run') { |
- data['js'] = curSlice.args['fileName']; |
- } else if (curSlice.title === 'v8.compile') { |
- data['js'] = curSlice.args['fileName']; |
- } else if (curSlice.title === 'v8.callModuleMethod') { |
- data['js'] = 'Unknown'; |
- } else if (curSlice.title === 'FunctionCall') { |
- var scriptName = curSlice.args['data']['scriptName']; |
- if (scriptName.indexOf('http') != -1) { |
- data['js'] = scriptName; |
- } |
- } else if (curSlice.title === 'V8Test.ParseScript') { |
- data['js'] = curSlice.args['name']; |
- } else if (curSlice.title === 'V8Test.Compile') { |
- data['js'] = curSlice.args['name']; |
- } else if (curSlice.title === 'V8Test.CompileFullCode') { |
- data['js'] = curSlice.args['name']; |
- } |
- curSlice = curSlice.parentSlice; |
- } |
- return data; |
- } |
- |
- function _guess_framework_from_js_file(js_file) { |
- var frameworks = { |
- // Some commone js libs. |
- 'jQuery': ['jquery'], |
- 'Angular': ['angular'], |
- 'Underscore': ['underscore'], |
- 'Respond.js': ['respond.js'], |
- 'Easeljs': ['easeljs'], |
- 'Modernizr': ['modernizr'], |
- 'Cloudflare': ['cloudflare.min.js'], |
- 'Greensock': ['gsap/'], |
- 'Mootools': ['mootools'], |
- 'Zepto': ['zepto.'], |
- 'Webfont': ['webfont.js'], |
- 'Closure': ['closure/'], |
- 'Ektron': ['ektron'], |
- 'SWFObject': ['swfobject'], |
- 'Html5shiv': ['html5shiv'], |
- 'Requirejs': ['require.js'], |
- 'Tweenjs': ['tweenjs'], |
- |
- // Just dividing these out into common sites. |
- 'Google - Search': ['google.com/search?', 'www.google.'], |
- 'Google - Adsense': ['pagead2.googlesyndication.com/pagead/'], |
- 'Google - Analytics': ['google-analytics.com'], |
- 'Google - Misc': ['google.', 'googleapis.'], |
- 'Adobe - Misc': ['adobe.'], |
- 'Facebook': ['facebook.', 'fbcdn.'], |
- 'Outlook': ['outlook.', '.live.'], |
- 'Craigslist': ['craigslist.'], |
- 'Amazon': ['amazon.'], |
- 'Yandex': ['yandex.'], |
- 'Scene7': ['s7sdk/'], |
- 'DoubleClick': [ |
- '.doubleclick', 'gpt.js', 'gtm.js', '.googletagservices.'], |
- 'Baidu': ['baidu.'], |
- 'Bing': ['bing.'], |
- 'Twitter': ['twitter.'], |
- 'Wish': ['MobileWebsiteCore'], |
- 'Extensions - Misc': ['chrome-extension://', 'chrome://'] |
- }; |
- |
- var js_file_lowercase = js_file.toLowerCase(); |
- for (var k in frameworks) { |
- var keywords = frameworks[k]; |
- for (var i = 0; i < keywords.length; i++) { |
- if (js_file_lowercase.indexOf(keywords[i]) > -1) { |
- //last_known_framework[0] = k; |
- return k; |
- } |
- } |
- } |
- |
- // TODO: This is terrible, find a better way to attribute the |
- // unknown callers to a framework. Ideally we'd actually have |
- // access to data about the script or method that's running. |
- return last_known_framework[0]; |
- } |
- |
- function _cleanup_framework_name(name) { |
- var js_name = name; |
- if (js_name === '') { |
- js_name = 'Unknown'; |
- } |
- if (js_name.length > 120) { |
- js_name = js_name.substring(0, 120) + '...'; |
- } |
- return js_name; |
- } |
- |
- var ufc = model.getUserFriendlyCategoryFromEvent(event); |
- var data = _get_parent_data(event); |
- data.framework = _guess_framework_from_js_file(data.js); |
- var scriptURLClean = _cleanup_framework_name(data.js); |
- |
- var slice = event; |
- if (slice.title == 'V8.Execute') { |
- |
- // V8.Execute events may generate several sliceCostInfo, based on the |
- // origin of the JS being executed. |
- var range = new tr.b.Range(); |
- slice.addBoundsToRange(range); |
- var filtered = range.filterArray( |
- slice.parentContainer.samples, |
- function(sample) {return sample.start;}); |
- filtered.forEach(function(sample) { |
- // Let's use the state of the leaf frame. TODO(chiniforooshan): |
- // understand what it means if frames of a sample stack are in |
- // different states (BUG #1542). |
- var sliceData = { |
- threadGroup: threadGrouping.getGroupNameForEvent(slice), |
- railTypeName: railTypeNameByGUID[slice.guid], |
- userFriendlyCategory: ufc || 'other', |
- title: tr.e.chrome.SliceTitleFixer.fromEvent(slice), |
- selfTime: sample.weight, |
- cpuSelfTime: sample.weight, |
- scriptURL: data.js, |
- scriptURLClean: scriptURLClean, |
- framework: data.framework, |
- traceURL: model.canonicalUrl |
- }; |
- |
- var JSSourceState = tr.model.source_info.JSSourceState; |
- sliceData.jsTimeByState = {}; |
- for (var state in JSSourceState) { |
- sliceData.jsTimeByState[JSSourceState[state]] = 0; |
- } |
- |
- var sourceInfo = sample.leafStackFrame.sourceInfo; |
- if (sourceInfo === undefined || |
- !(sourceInfo instanceof tr.model.source_info.JSSourceInfo)) { |
- sliceData.jsTime = sample.weight; |
- sliceData.jsTimeByState[JSSourceState.UNKNOWN] = sample.weight; |
- } else { |
- sliceData.jsTimeByState[sourceInfo.state] = sample.weight; |
- } |
- |
- var key = sliceData.threadGroup + '/' + |
- sliceData.railTypeName + '/' + |
- sliceData.framework + '/' + |
- //sliceData.scriptURLClean + '/' + |
- sliceData.title; |
- sliceCosts.push({key: key, value: sliceData}); |
- }); |
- return; |
- } |
- |
- var sliceData = { |
- threadGroup: threadGrouping.getGroupNameForEvent(event), |
- railTypeName: railTypeNameByGUID[event.guid], |
- userFriendlyCategory: ufc || 'other', |
- title: tr.e.chrome.SliceTitleFixer.fromEvent(event), |
- selfTime: event.selfTime, |
- cpuSelfTime: event.cpuSelfTime, |
- scriptURL: data.js, |
- scriptURLClean: scriptURLClean, |
- framework: data.framework, |
- traceURL: model.canonicalUrl |
- }; |
- |
- var key = sliceData.threadGroup + '/' + |
- sliceData.railTypeName + '/' + |
- sliceData.framework + '/' + |
- //sliceData.scriptURLClean + '/' + |
- sliceData.title; |
- |
- var newElement = { |
- key: key, |
- value: sliceData |
- }; |
- sliceCosts.push(newElement); |
- }); |
- |
- result.addPair('wr', sliceCosts); |
- } |
- |
- function getStageTitleForEventsByGUID(model, expectations) { |
- var stageTitleByGUID = {}; |
- expectations.forEach(function applyAssociatedToRTN(ir) { |
- ir.associatedEvents.forEach(function applyEventToRTN(event) { |
- // Unassociated events have already been assigned to a RTN. |
- if (stageTitleByGUID[event.guid] !== undefined) |
- return; |
- stageTitleByGUID[event.guid] = ir.stageTitle; |
- }, this); |
- }, this); |
- |
- model.iterateAllEvents(function storeEventToUnassociatedSet(event) { |
- if (stageTitleByGUID[event.guid] !== undefined) |
- return; |
- stageTitleByGUID[event.guid] = 'Unknown'; |
- }); |
- return stageTitleByGUID; |
- } |
- |
- pi.FunctionRegistry.register(v8ReportMapFunction); |
- |
- // Exporting for tests. |
- return { |
- v8ReportMapFunction: v8ReportMapFunction |
- }; |
-}); |
- |
-</script> |