<!DOCTYPE html>
<!--
Copyright (c) 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="/tracing/base/iteration_helpers.html">
<link rel="import" href="/tracing/model/helpers/chrome_model_helper.html">
<link rel="import" href="/tracing/value/value.html">

<script>
'use strict';

tr.exportTo('pi.m', function() {
  function ThreadGrouping() {
    this.groupNameForThreadGUID_ = {};
  }

  ThreadGrouping.prototype = {
    autoInitUsingHelpers: function(model) {
      // Everything is 'other' by default.
      model.getAllThreads().forEach(function(thread) {
        this.groupNameForThreadGUID_[thread.guid] = 'Other';
      }, this);
      var chromeHelper = model.getOrCreateHelper(
          tr.model.helpers.ChromeModelHelper);

      if (chromeHelper) {
        var browserHelper = chromeHelper.browserHelper;
        this.addThreadsInProcessToGroup_(browserHelper.process, 'Browser');

        var gpuHelper = chromeHelper.gpuHelper;
        if (gpuHelper) {
          this.addThreadsInProcessToGroup_(gpuHelper.process, 'GPU');
        }

        for (var pid in chromeHelper.rendererHelpers) {
          var rendererHelper = chromeHelper.rendererHelpers[pid];
          this.addThreadsInProcessToGroup_(rendererHelper.process, 'Renderer');
        }

        // TODO(nduca): Modify the helpers to detect plugin processes
        // and include those in separate processes.
      }

      // It would be very easy to add processes recognized by android helper
      // here, too.
    },

    getGroupNameForThread: function(thread) {
      if (!(thread instanceof tr.model.EventContainer))
        return 'error';

      var groupName = this.groupNameForThreadGUID_[thread.guid];
      if (groupName === undefined)
        return 'Other';
      return groupName;
    },

    getGroupNameForEvent: function(event) {
      var parentContainer = event.parentContainer;
      if (parentContainer === undefined)
        return 'Unknown';
      return this.getGroupNameForThread(parentContainer);
    },

    addThreadsInProcessToGroup_: function(process, groupName,
                                          opt_predicate, opt_this) {
      var predicate = opt_predicate || tr.b.identity;

      for (var tid in process.threads) {
        var thread = process.threads[tid];
        if (predicate.call(opt_this, thread))
          this.groupNameForThreadGUID_[thread.guid] = groupName;
      }
    },

    divideEventSetIntoSubGroups: function(eventSet) {
      var resultingEventSets = {
        other: new tr.model.EventSet()
      };
      tr.b.iterItems(this.groupNameForThreadGUID_, function(guid, groupName) {
        if (resultingEventSets[groupName] !== undefined)
          return;
        resultingEventSets[groupName] = new tr.model.EventSet();
      });

      eventSet.forEach(function(event) {
        var parentContainer = event.parentContainer;
        if (parentContainer === undefined)
          return;

        if (!(parentContainer instanceof tr.model.EventContainer))
          return;

        var groupName = this.groupNameForThreadGUID_[parentContainer.guid];
        if (groupName === undefined)
          groupName = 'Other';
        resultingEventSets[groupName].push(event);

      }, this);

      return resultingEventSets;
    }
  };

  return {
    ThreadGrouping: ThreadGrouping
  };
});
</script>
