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