166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Copyright (c) 2013 The Chromium Authors. All rights reserved. 266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Use of this source code is governed by a BSD-style license that can be 366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// found in the LICENSE file. 466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict'; 666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/** 866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @fileoverview Displays an analysis of the selection. 966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */ 1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.requireStylesheet('tracing.analysis.analysis_view'); 1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 1266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('base.guid'); 1366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.analysis.analysis_results'); 1466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.analysis.analyze_selection'); 1566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.analysis.default_object_view'); 1666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.analysis.object_instance_view'); 1766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.analysis.object_snapshot_view'); 1866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.analysis.slice_view'); 1966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.analysis.util'); 2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('ui'); 2166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.exportTo('tracing.analysis', function() { 2266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 2366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var AnalysisView = ui.define('div'); 2466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis AnalysisView.prototype = { 2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis __proto__: HTMLDivElement.prototype, 2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis decorate: function() { 2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.className = 'analysis-view'; 3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.currentView_ = undefined; 3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.currentSelection_ = undefined; 3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.selections_ = []; 3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.guid_ = base.GUID.allocate(); 3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis window.addEventListener('popstate', this.onPopState.bind(this)); 3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis changeViewType: function(viewType) { 4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (this.currentView_ instanceof viewType) 4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.textContent = ''; 4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis try { 4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.currentView_ = new viewType(); 4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.appendChild(this.currentView_); 4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } catch (e) { 4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.currentView_ = undefined; 4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw e; 4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (this.currentView_ instanceof tracing.analysis. AnalysisResults) 5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.classList.remove('viewing-object'); 5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis else 5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.classList.add('viewing-object'); 5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis get currentView() { 5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return this.currentView_; 5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis get selection() { 6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return this.currentSelection_; 6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis set selection(selection) { 6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.selections_.push(selection); 6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var state = { 6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis view_guid: this.guid_, 6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis selection_guid: selection.guid 7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }; 7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis window.history.pushState(state); 7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.processSelection(selection); 7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis clearSelectionHistory: function() { 7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.selections_ = []; 7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis onPopState: function(event) { 8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if ((event.state === null) || 8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis (event.state.view_guid !== this.guid_)) 8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 8466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 8566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var idx; 8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis for (idx = 0; idx < this.selections_.length; ++idx) { 8766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (this.selections_[idx].guid === event.state.selection_guid) 8866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis break; 8966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 9066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 9166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (idx >= this.selections_.length) 9266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 9366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 9466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.processSelection(this.selections_[idx]); 9566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis event.stopPropagation(); 9666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 9766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 9866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis processSelection: function(selection) { 9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var hitsByType = selection.getHitsOrganizedByType(); 10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (selection.length == 1 && 10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis hitsByType.counterSamples.length == 0) { 10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (this.tryToProcessSelectionUsingCustomViewer(selection[0])) 10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.changeViewType(tracing.analysis.AnalysisResults); 10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.currentView.clear(); 10866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.currentSelection_ = selection; 10966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tracing.analysis.analyzeHitsByType(this.currentView, hitsByType); 11066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 11166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 11266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tryToProcessSelectionUsingCustomViewer: function(hit) { 11366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var obj; 11466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var typeName; 11566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var viewBaseType; 11666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var defaultViewType; 11766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var viewProperty; 11866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var obj = hit.modelObject; 11966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (hit instanceof tracing.SelectionObjectSnapshotHit) { 12066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis typeName = obj.objectInstance.typeName; 12166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis viewBaseType = tracing.analysis.ObjectSnapshotView; 12266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis defaultViewType = tracing.analysis.DefaultObjectSnapshotView; 12366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } else if (hit instanceof tracing.SelectionObjectInstanceHit) { 12466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis typeName = obj.typeName; 12566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis viewBaseType = tracing.analysis.ObjectInstanceView; 12666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis defaultViewType = tracing.analysis.DefaultObjectInstanceView; 12766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } else if (hit instanceof tracing.SelectionSliceHit) { 12866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis typeName = obj.title; 12966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis viewBaseType = tracing.analysis.SliceView; 13066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis defaultViewType = undefined; 13166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } else { 13266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return false; 13366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 13466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 13566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var customViewInfo = viewBaseType.getViewInfo(typeName); 13666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 13766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var viewType = customViewInfo ? 13866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis customViewInfo.constructor : defaultViewType; 13966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 14066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis // Some view types don't have default viewers. In those cases, we fall 14166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis // back to the standard analysis sytem. 14266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (!viewType) 14366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return false; 14466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 14566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.changeViewType(viewType); 14666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.currentView.modelObject = obj; 14766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return true; 14866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 14966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }; 15066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 15166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return { 15266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis AnalysisView: AnalysisView 15366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }; 15466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis}); 155