Home | History | Annotate | Download | only in analysis
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 'use strict';
      6 
      7 base.requireStylesheet('tracing.analysis.analysis_link');
      8 
      9 base.require('base.events');
     10 base.require('tracing.selection');
     11 base.require('tracing.analysis.util');
     12 base.require('ui');
     13 
     14 base.exportTo('tracing.analysis', function() {
     15 
     16   var tsRound = tracing.analysis.tsRound;
     17 
     18   var RequestSelectionChangeEvent = base.Event.bind(
     19       undefined, 'requestSelectionChange', true, false);
     20 
     21   /**
     22    * A clickable link that requests a change of selection to the return value of
     23    * this.selectionGenerator when clicked.
     24    *
     25    * @constructor
     26    */
     27   var AnalysisLink = ui.define('a');
     28 
     29   AnalysisLink.prototype = {
     30     __proto__: HTMLAnchorElement.prototype,
     31     decorate: function() {
     32       this.classList.add('analysis-link');
     33       this.selectionGenerator;
     34       this.addEventListener('click', this.onClicked_.bind(this));
     35     },
     36     onClicked_: function() {
     37       var event = new RequestSelectionChangeEvent();
     38       event.selection = this.selectionGenerator();
     39       this.dispatchEvent(event);
     40     }
     41   };
     42 
     43   /**
     44    * Changes the selection to the given ObjectSnapshot when clicked.
     45    * @constructor
     46    */
     47   var ObjectSnapshotLink = ui.define(
     48       'object-snapshot-link', AnalysisLink);
     49 
     50   ObjectSnapshotLink.prototype = {
     51     __proto__: AnalysisLink.prototype,
     52 
     53     decorate: function() {
     54       AnalysisLink.prototype.decorate.apply(this);
     55     },
     56 
     57     set objectSnapshot(snapshot) {
     58       this.textContent =
     59           snapshot.objectInstance.typeName + ' ' +
     60           snapshot.objectInstance.id + ' @ ' +
     61           tsRound(snapshot.ts) + ' ms';
     62       this.selectionGenerator = function() {
     63         return tracing.createSelectionFromObjectAndView(snapshot, this);
     64       }.bind(this);
     65     }
     66   };
     67 
     68   /**
     69    * Changes the selection to the given ObjectInstance when clicked.
     70    * @constructor
     71    */
     72   var ObjectInstanceLink = ui.define(
     73       'object-instance-link', AnalysisLink);
     74 
     75   ObjectInstanceLink.prototype = {
     76     __proto__: AnalysisLink.prototype,
     77 
     78     decorate: function() {
     79       AnalysisLink.prototype.decorate.apply(this);
     80     },
     81 
     82     set objectInstance(instance) {
     83       this.textContent = instance.typeName + ' ' + instance.id;
     84       this.selectionGenerator = function() {
     85         return tracing.createSelectionFromObjectAndView(instance, this);
     86       }.bind(this);
     87     }
     88   };
     89 
     90   return {
     91     RequestSelectionChangeEvent: RequestSelectionChangeEvent,
     92     AnalysisLink: AnalysisLink,
     93     ObjectSnapshotLink: ObjectSnapshotLink,
     94     ObjectInstanceLink: ObjectInstanceLink
     95   };
     96 });
     97