blob: 046eca1195e8d77c9fffdc0a7ca2c0cc1238a9a6 [file] [log] [blame]
// Copyright 2014 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.
/**
* @constructor
* @extends {WebInspector.View}
* @implements {WebInspector.TargetManager.Observer}
*/
WebInspector.ThreadsSidebarPane = function()
{
WebInspector.View.call(this, WebInspector.UIString("Threads"));
this.requestSetVisible(false);
/** @type {!Map.<!WebInspector.DebuggerModel, !WebInspector.UIList.Item>} */
this._debuggerModelToListItems = new Map();
/** @type {!Map.<!WebInspector.UIList.Item, !WebInspector.Target>} */
this._listItemsToTargets = new Map();
/** @type {?WebInspector.UIList.Item} */
this._selectedListItem = null;
this.threadList = new WebInspector.UIList();
this.threadList.show(this.element);
WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.DebuggerPaused, this._onDebuggerStateChanged, this);
WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.DebuggerResumed, this._onDebuggerStateChanged, this);
WebInspector.targetManager.addModelListener(WebInspector.RuntimeModel, WebInspector.RuntimeModel.Events.ExecutionContextChanged, this._onExecutionContextChanged, this);
WebInspector.context.addFlavorChangeListener(WebInspector.Target, this._targetChanged, this);
WebInspector.targetManager.observeTargets(this);
}
WebInspector.ThreadsSidebarPane.prototype = {
/**
* @override
* @param {!WebInspector.Target} target
*/
targetAdded: function(target)
{
var debuggerModel = WebInspector.DebuggerModel.fromTarget(target)
if (!debuggerModel) {
this._updateVisibility();
return;
}
var executionContext = target.runtimeModel.defaultExecutionContext();
var label = executionContext && executionContext.label() ? executionContext.label() : target.name();
var listItem = new WebInspector.UIList.Item(label, "");
listItem.element.addEventListener("click", this._onListItemClick.bind(this, listItem), false);
var currentTarget = WebInspector.context.flavor(WebInspector.Target);
if (currentTarget === target)
this._selectListItem(listItem);
this._debuggerModelToListItems.set(debuggerModel, listItem);
this._listItemsToTargets.set(listItem, target);
this.threadList.addItem(listItem);
this._updateDebuggerState(debuggerModel);
this._updateVisibility();
},
_updateVisibility: function()
{
this._wasVisibleAtLeastOnce = this._wasVisibleAtLeastOnce || this._debuggerModelToListItems.size > 1;
this.requestSetVisible(this._wasVisibleAtLeastOnce);
},
/**
* @override
* @param {!WebInspector.Target} target
*/
targetRemoved: function(target)
{
var debuggerModel = WebInspector.DebuggerModel.fromTarget(target)
if (!debuggerModel)
return;
var listItem = this._debuggerModelToListItems.remove(debuggerModel);
if (listItem) {
this._listItemsToTargets.remove(listItem);
this.threadList.removeItem(listItem);
}
this._updateVisibility();
},
/**
* @param {!WebInspector.Event} event
*/
_targetChanged: function(event)
{
var newTarget = /** @type {!WebInspector.Target} */(event.data);
var debuggerModel = WebInspector.DebuggerModel.fromTarget(newTarget)
if (!debuggerModel)
return;
var listItem = /** @type {!WebInspector.UIList.Item} */ (this._debuggerModelToListItems.get(debuggerModel));
this._selectListItem(listItem);
},
/**
* @param {!WebInspector.Event} event
*/
_onDebuggerStateChanged: function(event)
{
var debuggerModel = /** @type {!WebInspector.DebuggerModel} */ (event.target);
this._updateDebuggerState(debuggerModel);
},
/**
* @param {!WebInspector.Event} event
*/
_onExecutionContextChanged: function(event)
{
var executionContext = /** @type {!WebInspector.ExecutionContext} */ (event.data);
if (!executionContext.isDefault)
return;
var debuggerModel = /** @type {!WebInspector.DebuggerModel} */ (WebInspector.DebuggerModel.fromTarget(executionContext.target()));
var listItem = this._debuggerModelToListItems.get(debuggerModel);
if (listItem && executionContext.label())
listItem.setTitle(executionContext.label());
},
/**
* @param {!WebInspector.DebuggerModel} debuggerModel
*/
_updateDebuggerState: function(debuggerModel)
{
var listItem = this._debuggerModelToListItems.get(debuggerModel);
listItem.setSubtitle(WebInspector.UIString(debuggerModel.isPaused() ? "paused" : ""));
},
/**
* @param {!WebInspector.UIList.Item} listItem
*/
_selectListItem: function(listItem)
{
if (listItem === this._selectedListItem)
return;
if (this._selectedListItem)
this._selectedListItem.setSelected(false);
this._selectedListItem = listItem;
listItem.setSelected(true);
},
/**
* @param {!WebInspector.UIList.Item} listItem
*/
_onListItemClick: function(listItem)
{
WebInspector.context.setFlavor(WebInspector.Target, this._listItemsToTargets.get(listItem));
listItem.element.scrollIntoViewIfNeeded();
},
__proto__: WebInspector.View.prototype
}