atom-nuclide
Version:
A unified developer experience for web and mobile development, built as a suite of features on top of Atom to provide hackability and the support of an active community.
298 lines (265 loc) • 12.2 kB
JavaScript
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
/*
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the license found in the LICENSE file in
* the root directory of this source tree.
*/
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _NuclideBridge2;
function _NuclideBridge() {
return _NuclideBridge2 = _interopRequireDefault(require('./NuclideBridge'));
}
var _react2;
function _react() {
return _react2 = _interopRequireDefault(require('react'));
}
var _reactDom2;
function _reactDom() {
return _reactDom2 = _interopRequireDefault(require('react-dom'));
}
var _libWebInspector2;
function _libWebInspector() {
return _libWebInspector2 = _interopRequireDefault(require('../../lib/WebInspector'));
}
var ThreadsWindowComponent = (function (_default$Component) {
_inherits(ThreadsWindowComponent, _default$Component);
function ThreadsWindowComponent(props) {
_classCallCheck(this, ThreadsWindowComponent);
_get(Object.getPrototypeOf(ThreadsWindowComponent.prototype), 'constructor', this).call(this, props);
this._registerUpdate();
this.state = {
threadData: null
};
this._stoppedThread = null;
this._handleThreadsUpdated = this._handleThreadsUpdated.bind(this);
this._handleClearInterface = this._handleClearInterface.bind(this);
}
_createClass(ThreadsWindowComponent, [{
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this._unregisterUpdate();
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate() {
// We can currently scroll to the stopped thread after each render
// because we are only rendering when we update the threads. If we
// add more UI functionality and state changes then we may need to add
// flags so that we are only scrolling at the correct times.
this._scrollToStoppedThread();
}
}, {
key: '_handleThreadsUpdated',
value: function _handleThreadsUpdated(event) {
this.setState(this._getState());
}
}, {
key: '_getState',
value: function _getState() {
var threadData = null;
var mainTarget = (_libWebInspector2 || _libWebInspector()).default.targetManager.mainTarget();
if (mainTarget != null) {
threadData = mainTarget.debuggerModel.threadStore.getData();
}
return { threadData: threadData };
}
}, {
key: '_registerUpdate',
value: function _registerUpdate() {
(_libWebInspector2 || _libWebInspector()).default.targetManager.addModelListener((_libWebInspector2 || _libWebInspector()).default.DebuggerModel, (_libWebInspector2 || _libWebInspector()).default.DebuggerModel.Events.ThreadsUpdated, this._handleThreadsUpdated, this);
(_libWebInspector2 || _libWebInspector()).default.targetManager.addModelListener((_libWebInspector2 || _libWebInspector()).default.DebuggerModel, (_libWebInspector2 || _libWebInspector()).default.DebuggerModel.Events.SelectedThreadChanged, this._handleThreadsUpdated, this);
(_libWebInspector2 || _libWebInspector()).default.targetManager.addModelListener((_libWebInspector2 || _libWebInspector()).default.DebuggerModel, (_libWebInspector2 || _libWebInspector()).default.DebuggerModel.Events.ClearInterface, this._handleClearInterface, this);
}
}, {
key: '_handleClearInterface',
value: function _handleClearInterface(event) {
this.setState({ threadData: null });
}
}, {
key: '_unregisterUpdate',
value: function _unregisterUpdate() {
(_libWebInspector2 || _libWebInspector()).default.targetManager.removeModelListener((_libWebInspector2 || _libWebInspector()).default.DebuggerModel, (_libWebInspector2 || _libWebInspector()).default.DebuggerModel.Events.ThreadsUpdated, this._handleThreadsUpdated, this);
(_libWebInspector2 || _libWebInspector()).default.targetManager.removeModelListener((_libWebInspector2 || _libWebInspector()).default.DebuggerModel, (_libWebInspector2 || _libWebInspector()).default.DebuggerModel.Events.SelectedThreadChanged, this._handleThreadsUpdated, this);
(_libWebInspector2 || _libWebInspector()).default.targetManager.removeModelListener((_libWebInspector2 || _libWebInspector()).default.DebuggerModel, (_libWebInspector2 || _libWebInspector()).default.DebuggerModel.Events.ClearInterface, this._handleClearInterface, this);
}
}, {
key: '_handleDoubleClick',
value: function _handleDoubleClick(thread) {
(_NuclideBridge2 || _NuclideBridge()).default.selectThread(thread.id);
}
/**
* '>' means the stopped thread.
* '*' means the current selected thread.
* Empty space for other threads.
*/
}, {
key: '_getIndicator',
value: function _getIndicator(thread, stopThreadId, selectedThreadId) {
return thread.id === stopThreadId ? '>' : thread.id === selectedThreadId ? '*' : ' ';
}
}, {
key: '_setStoppedThread',
value: function _setStoppedThread(ref) {
this._stoppedThread = ref;
}
}, {
key: '_scrollToStoppedThread',
value: function _scrollToStoppedThread() {
if (this._stoppedThread != null) {
this._stoppedThread.scrollIntoView();
}
}
}, {
key: 'render',
value: function render() {
var _this = this;
var children = [];
var threadData = this.state.threadData;
if (threadData && threadData.threadMap) {
for (var thread of threadData.threadMap.values()) {
var indicator = this._getIndicator(thread, threadData.stopThreadId, threadData.selectedThreadId);
var rowStyle = {};
if (thread.id === threadData.selectedThreadId) {
rowStyle.backgroundColor = '#cfcfcf';
}
if (indicator === '>') {
children.push((_react2 || _react()).default.createElement(
'tr',
{
onDoubleClick: this._handleDoubleClick.bind(this, thread),
style: rowStyle,
ref: function (ref) {
return _this._setStoppedThread(ref);
} },
(_react2 || _react()).default.createElement(
'td',
null,
indicator
),
(_react2 || _react()).default.createElement(
'td',
null,
thread.id
),
(_react2 || _react()).default.createElement(
'td',
null,
thread.address
),
(_react2 || _react()).default.createElement(
'td',
null,
thread.stopReason
)
));
} else {
children.push((_react2 || _react()).default.createElement(
'tr',
{
onDoubleClick: this._handleDoubleClick.bind(this, thread),
style: rowStyle },
(_react2 || _react()).default.createElement(
'td',
null,
indicator
),
(_react2 || _react()).default.createElement(
'td',
null,
thread.id
),
(_react2 || _react()).default.createElement(
'td',
null,
thread.address
),
(_react2 || _react()).default.createElement(
'td',
null,
thread.stopReason
)
));
}
}
}
var containerStyle = {
maxHeight: '20em',
overflow: 'auto'
};
if (children.length > 0) {
return (_react2 || _react()).default.createElement(
'div',
{ style: containerStyle, className: 'nuclide-chrome-debugger-data-grid' },
(_react2 || _react()).default.createElement(
'table',
{ width: '100%' },
(_react2 || _react()).default.createElement(
'thead',
null,
(_react2 || _react()).default.createElement(
'tr',
{ key: 0 },
(_react2 || _react()).default.createElement('td', null),
(_react2 || _react()).default.createElement(
'td',
null,
'ID'
),
(_react2 || _react()).default.createElement(
'td',
null,
'Address'
),
(_react2 || _react()).default.createElement(
'td',
null,
'Stop Reason'
)
)
),
(_react2 || _react()).default.createElement(
'tbody',
null,
children
)
)
);
} else {
return (_react2 || _react()).default.createElement(
'div',
{ className: 'info' },
'No Threads'
);
}
}
}]);
return ThreadsWindowComponent;
})((_react2 || _react()).default.Component);
var ThreadsWindowPane = (function (_default$SidebarPane) {
_inherits(ThreadsWindowPane, _default$SidebarPane);
function ThreadsWindowPane() {
_classCallCheck(this, ThreadsWindowPane);
// WebInspector classes are not es6 classes, but babel forces a super call.
_get(Object.getPrototypeOf(ThreadsWindowPane.prototype), 'constructor', this).call(this);
// Actual super call.
(_libWebInspector2 || _libWebInspector()).default.SidebarPane.call(this, 'Threads');
// TODO: change.
this.registerRequiredCSS('components/breakpointsList.css');
(_reactDom2 || _reactDom()).default.render((_react2 || _react()).default.createElement(ThreadsWindowComponent, null), this.bodyElement);
this.expand();
}
// This is implemented by various UI views, but is not declared anywhere as
// an official interface. There's callers to various `reset` functions, so
// it's probably safer to have this.
_createClass(ThreadsWindowPane, [{
key: 'reset',
value: function reset() {}
}]);
return ThreadsWindowPane;
})((_libWebInspector2 || _libWebInspector()).default.SidebarPane);
module.exports = ThreadsWindowPane;