electron-devtools-vendor
Version:
<div align="center"> <h2>electron-devtools-vendor</h2> <img alt="MIT" src="https://img.shields.io/github/license/BlackHole1/electron-devtools-vendor?color=9cf&style=flat-square"> <img alt="GitHub repo size" src="https://img.shields.io/github/r
1,717 lines (1,342 loc) • 491 kB
JavaScript
/* jshint ignore:start */
/* jshint ignore:end */
define('ember-inspector/adapters/basic', ['exports', 'ember', 'ember-inspector/config/environment'], function (exports, Ember, config) {
'use strict';
var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
/**
* The adapter stores logic specific to each environment.
* Extend this object with env specific code (such as chrome/firefox/test),
* then set the application's `adapter` property to the name of this adapter.
*
* example:
*
* ```javascript
* const EmberInspector = App.Create({
* adapter: 'chrome'
* });
* ```
*/
var computed = Ember['default'].computed;
var K = Ember['default'].K;
exports['default'] = Ember['default'].Object.extend({
/**
* Called when the adapter is created (when
* the inspector app boots).
*
* @method init
*/
init: function init() {
this._super.apply(this, arguments);
this._checkVersion();
},
/**
* Listens to `EmberInspectorDebugger` message about
* Ember version mismatch. If a mismatch message is received
* it means the current inspector app does not support the current
* Ember version and needs to switch to an inspector version
* that does.
*
* @method _checkVersion
* @private
*/
_checkVersion: function _checkVersion() {
var _this = this;
this.onMessageReceived(function (message) {
var name = message.name;
var version = message.version;
if (name === 'version-mismatch') {
var previousVersions = config['default'].previousEmberVersionsSupported;
var _config$emberVersionsSupported = _slicedToArray(config['default'].emberVersionsSupported, 2);
var fromVersion = _config$emberVersionsSupported[0];
var tillVersion = _config$emberVersionsSupported[1];
var neededVersion = undefined;
if (compareVersion(version, fromVersion) === -1) {
neededVersion = previousVersions[previousVersions.length - 1];
} else if (tillVersion && compareVersion(version, tillVersion) !== -1) {
neededVersion = tillVersion;
} else {
return;
}
_this.onVersionMismatch(neededVersion);
}
});
this.sendMessage({ type: 'check-version', from: 'devtools' });
},
/**
* Hook called when the Ember version is not
* supported by the current inspector version.
*
* Each adapter should implement this hook
* to switch to an older/new inspector version
* that supports this Ember version.
*
* @method onVersionMismatch
* @param {String} neededVersion (The version to go to)
*/
onVersionMismatch: K,
name: 'basic',
/**
Used to send messages to EmberDebug
@param type {Object} the message to the send
**/
sendMessage: function sendMessage() {},
/**
Register functions to be called
when a message from EmberDebug is received
**/
onMessageReceived: function onMessageReceived(callback) {
this.get('_messageCallbacks').pushObject(callback);
},
_messageCallbacks: computed(function () {
return [];
}),
_messageReceived: function _messageReceived(message) {
this.get('_messageCallbacks').forEach(function (callback) {
callback(message);
});
},
// Called when the "Reload" is clicked by the user
willReload: K,
canOpenResource: false,
openResource: function openResource() /* file, line */{}
});
/**
* Compares two Ember versions.
*
* Returns:
* `-1` if version < version
* 0 if version1 == version2
* 1 if version1 > version2
*
* @param {String} version1
* @param {String} version2
* @return {Boolean} result of the comparison
*/
function compareVersion(version1, version2) {
var compared, i;
version1 = cleanupVersion(version1).split('.');
version2 = cleanupVersion(version2).split('.');
for (i = 0; i < 3; i++) {
compared = compare(+version1[i], +version2[i]);
if (compared !== 0) {
return compared;
}
}
return 0;
}
/* Remove -alpha, -beta, etc from versions */
function cleanupVersion(version) {
return version.replace(/-.*/g, '');
}
function compare(val, number) {
if (val === number) {
return 0;
} else if (val < number) {
return -1;
} else if (val > number) {
return 1;
}
}
});
define('ember-inspector/adapters/bookmarklet', ['exports', 'ember-inspector/adapters/basic', 'ember'], function (exports, BasicAdapter, Ember) {
'use strict';
var computed = Ember['default'].computed;
exports['default'] = BasicAdapter['default'].extend({
name: 'bookmarklet',
/**
* Called when the adapter is created.
*
* @method init
*/
init: function init() {
this._connect();
return this._super.apply(this, arguments);
},
inspectedWindow: computed(function () {
return window.opener || window.parent;
}),
inspectedWindowURL: computed(function () {
return loadPageVar('inspectedWindowURL');
}),
sendMessage: function sendMessage(options) {
options = options || {};
this.get('inspectedWindow').postMessage(options, this.get('inspectedWindowURL'));
},
/**
* Redirect to the correct inspector version.
*
* @method onVersionMismatch
* @param {String} goToVersion
*/
onVersionMismatch: function onVersionMismatch(goToVersion) {
this.sendMessage({ name: 'version-mismatch', version: goToVersion });
window.location.href = '../panes-' + goToVersion.replace(/\./g, '-') + '/index.html' + window.location.search;
},
_connect: function _connect() {
var _this = this;
window.addEventListener('message', function (e) {
var message = e.data;
if (e.origin !== _this.get('inspectedWindowURL')) {
return;
}
// close inspector if inspected window is unloading
if (message && message.unloading) {
window.close();
}
if (message.from === 'inspectedWindow') {
_this._messageReceived(message);
}
});
}
});
function loadPageVar(sVar) {
return decodeURI(window.location.search.replace(new RegExp("^(?:.*[&\\?]" + encodeURI(sVar).replace(/[\.\+\*]/g, "\\$&") + "(?:\\=([^&]*))?)?.*$", "i"), "$1"));
}
});
define('ember-inspector/adapters/chrome', ['exports', 'ember-inspector/adapters/web-extension'], function (exports, WebExtension) {
'use strict';
exports['default'] = WebExtension['default'].extend({
name: 'chome',
canOpenResource: true,
openResource: function openResource(file, line) {
/*global chrome */
// For some reason it opens the line after the one specified
chrome.devtools.panels.openResource(file, line - 1);
},
onResourceAdded: function onResourceAdded() {
chrome.devtools.inspectedWindow.onResourceAdded.addListener(function (opts) {
if (opts.type === 'document') {
this.sendIframes([opts.url]);
}
});
}
});
});
define('ember-inspector/adapters/firefox', ['exports', 'ember-inspector/adapters/web-extension'], function (exports, WebExtension) {
'use strict';
exports['default'] = WebExtension['default'].extend({
name: 'firefox'
});
});
define('ember-inspector/adapters/web-extension', ['exports', 'ember-inspector/adapters/basic', 'ember', 'ember-inspector/config/environment'], function (exports, BasicAdapter, Ember, config) {
'use strict';
/* globals chrome */
var computed = Ember['default'].computed;
var emberDebug = null;
exports['default'] = BasicAdapter['default'].extend({
/**
* Called when the adapter is created.
*
* @method init
*/
init: function init() {
this._connect();
this._handleReload();
this._injectDebugger();
return this._super.apply(this, arguments);
},
name: 'web-extension',
sendMessage: function sendMessage(options) {
options = options || {};
this.get('_chromePort').postMessage(options);
},
_chromePort: computed(function () {
return chrome.runtime.connect();
}),
_connect: function _connect() {
var _this = this;
var chromePort = this.get('_chromePort');
chromePort.postMessage({ appId: chrome.devtools.inspectedWindow.tabId });
chromePort.onMessage.addListener(function (message) {
if (typeof message.type === 'string' && message.type === 'iframes') {
_this.sendIframes(message.urls);
}
_this._messageReceived(message);
});
},
_handleReload: function _handleReload() {
var self = this;
chrome.devtools.network.onNavigated.addListener(function () {
self._injectDebugger();
location.reload(true);
});
},
_injectDebugger: function _injectDebugger() {
chrome.devtools.inspectedWindow.eval(loadEmberDebug());
this.onResourceAdded();
},
onResourceAdded: function onResourceAdded() /*callback*/{},
willReload: function willReload() {
this._injectDebugger();
},
/**
* Redirect to the correct inspector version.
*
* @method onVersionMismatch
* @param {String} goToVersion
*/
onVersionMismatch: function onVersionMismatch(goToVersion) {
window.location.href = '../panes-' + goToVersion.replace(/\./g, '-') + '/index.html';
},
/**
We handle the reload here so we can inject
scripts as soon as possible into the new page.
*/
reloadTab: function reloadTab() {
chrome.devtools.inspectedWindow.reload({
injectedScript: loadEmberDebug()
});
},
canOpenResource: false,
sendIframes: function sendIframes(urls) {
urls.forEach(function (url) {
chrome.devtools.inspectedWindow.eval(loadEmberDebug(), { frameURL: url });
});
}
});
function loadEmberDebug() {
var minimumVersion = config['default'].emberVersionsSupported[0].replace(/\./g, '-');
var xhr = undefined;
if (!emberDebug) {
xhr = new XMLHttpRequest();
xhr.open("GET", chrome.runtime.getURL('/panes-' + minimumVersion + '/ember_debug.js'), false);
xhr.send();
emberDebug = xhr.responseText;
}
return emberDebug;
}
});
define('ember-inspector/adapters/websocket', ['exports', 'ember', 'ember-inspector/adapters/basic'], function (exports, Ember, BasicAdapter) {
'use strict';
var computed = Ember['default'].computed;
exports['default'] = BasicAdapter['default'].extend({
init: function init() {
this._super();
this._connect();
},
sendMessage: function sendMessage(options) {
options = options || {};
this.get('socket').emit('emberInspectorMessage', options);
},
socket: computed(function () {
return window.EMBER_INSPECTOR_CONFIG.remoteDebugSocket;
}),
_connect: function _connect() {
var _this = this;
this.get('socket').on('emberInspectorMessage', function (message) {
Ember['default'].run(function () {
_this._messageReceived(message);
});
});
},
_disconnect: function _disconnect() {
this.get('socket').removeAllListeners("emberInspectorMessage");
},
willDestroy: function willDestroy() {
this._disconnect();
}
});
});
define('ember-inspector/app', ['exports', 'ember', 'ember/resolver', 'ember/load-initializers', 'ember-inspector/config/environment', 'ember-inspector/port', 'ember-inspector/libs/promise-assembler', 'ember-inspector/helpers/ms-to-time'], function (exports, Ember, Resolver, loadInitializers, config, Port, PromiseAssembler, msToTime) {
'use strict';
Ember['default'].MODEL_FACTORY_INJECTIONS = true;
var version = '1.10.0';
var App = Ember['default'].Application.extend({
modulePrefix: config['default'].modulePrefix,
podModulePrefix: config['default'].podModulePrefix,
Resolver: Resolver['default']
});
config['default'].VERSION = version;
// Register Helpers
Ember['default'].Handlebars.helper('ms-to-time', msToTime['default']);
// Inject adapter
App.initializer({
name: "extension-init",
initialize: function initialize(container, app) {
// chrome is replaced by the build process.
app.adapter = 'chrome';
// register and inject adapter
var Adapter = undefined;
if (Ember['default'].typeOf(app.adapter) === 'string') {
Adapter = container.resolve('adapter:' + app.adapter);
} else {
Adapter = app.adapter;
}
container.register('adapter:main', Adapter);
container.typeInjection('port', 'adapter', 'adapter:main');
container.injection('route:application', 'adapter', 'adapter:main');
container.injection('route:deprecations', 'adapter', 'adapter:main');
container.injection('controller:deprecations', 'adapter', 'adapter:main');
// register config
container.register('config:main', config['default'], { instantiate: false });
container.typeInjection('route', 'config', 'config:main');
// inject port
container.register('port:main', app.Port || Port['default']);
container.typeInjection('controller', 'port', 'port:main');
container.typeInjection('route', 'port', 'port:main');
container.typeInjection('promise-assembler', 'port', 'port:main');
// register and inject promise assembler
container.register('promise-assembler:main', PromiseAssembler['default']);
container.injection('route:promiseTree', 'assembler', 'promise-assembler:main');
}
});
loadInitializers['default'](App, config['default'].modulePrefix);
exports['default'] = App;
});
define('ember-inspector/components/action-checkbox', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var Component = Ember['default'].Component;
exports['default'] = Component.extend({
tagName: 'input',
attributeBindings: ['type', 'checked'],
type: 'checkbox',
checked: false,
change: function change() {
this._updateElementValue();
},
_updateElementValue: function _updateElementValue() {
this.set('checked', this.$().prop('checked'));
this.sendAction('on-update', this.get('checked'));
}
});
});
define('ember-inspector/components/clear-button', ['exports', 'ember-inspector/components/icon-button'], function (exports, IconButton) {
'use strict';
exports['default'] = IconButton['default'].extend({
title: 'Clear'
});
});
define('ember-inspector/components/date-property-field', ['exports', 'ember', 'ember-inspector/components/pikaday-input'], function (exports, Ember, DatePicker) {
'use strict';
var on = Ember['default'].on;
var once = Ember['default'].run.once;
var KEY_EVENTS = {
enter: 13,
escape: 27
};
exports['default'] = DatePicker['default'].extend({
attributeBindings: ['label:data-label'],
openDatePicker: on('didInsertElement', function () {
once(this.$(), 'click');
}),
keyUp: function keyUp(e) {
if (e.keyCode === KEY_EVENTS.enter) {
this.insertNewline();
} else if (e.keyCode === KEY_EVENTS.escape) {
this.cancel();
}
},
insertNewline: function insertNewline() {
this.sendAction('save-property');
this.sendAction('finished-editing');
},
cancel: function cancel() {
this.sendAction('finished-editing');
}
});
});
define('ember-inspector/components/drag-handle', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var computed = Ember['default'].computed;
var SafeString = Ember['default'].Handlebars.SafeString;
exports['default'] = Ember['default'].Component.extend({
classNames: ['drag-handle'],
classNameBindings: ['isLeft:drag-handle--left', 'isRight:drag-handle--right', 'class'],
attributeBindings: ['style'],
position: 0,
side: '',
isRight: Ember['default'].computed.equal('side', 'right'),
isLeft: Ember['default'].computed.equal('side', 'left'),
minWidth: 60,
startDragging: function startDragging() {
var _this = this;
var $container = this.$().parent();
var $containerOffsetLeft = $container.offset().left;
var $containerOffsetRight = $containerOffsetLeft + $container.width();
var namespace = 'drag-' + this.get('elementId');
this.sendAction('action', true);
Ember['default'].$('body').on('mousemove.' + namespace, function (e) {
var position = _this.get('isLeft') ? e.pageX - $containerOffsetLeft : $containerOffsetRight - e.pageX;
if (position >= _this.get('minWidth')) {
_this.set('position', position);
}
}).on('mouseup.' + namespace + ' mouseleave.' + namespace, function () {
_this.stopDragging();
});
},
stopDragging: function stopDragging() {
this.sendAction('action', false);
Ember['default'].$('body').off('.drag-' + this.get('elementId'));
},
willDestroyElement: function willDestroyElement() {
this._super();
this.stopDragging();
},
mouseDown: function mouseDown() {
this.startDragging();
return false;
},
style: computed('side', 'position', function () {
if (this.get('side')) {
return new SafeString(this.get('side') + ': ' + this.get('position') + 'px;');
}
return '';
})
});
});
define('ember-inspector/components/draggable-column', ['exports', 'ember'], function (exports, Ember) {
'use strict';
// DraggableColumn
// ===============
// A wrapper for a resizable-column and a drag-handle component
var Component = Ember['default'].Component;
var computed = Ember['default'].computed;
exports['default'] = Component.extend({
tagName: '', // Prevent wrapping in a div
side: 'left',
minWidth: 60,
setIsDragging: 'setIsDragging',
classes: computed('classNames.[]', function () {
return this.get('classNames').join(' ');
}),
actions: {
setIsDragging: function setIsDragging(isDragging) {
this.sendAction('setIsDragging', isDragging);
}
}
});
});
define('ember-inspector/components/icon-button', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var Component = Ember['default'].Component;
exports['default'] = Component.extend({
attributeBindings: ['dataLabel:data-label', 'title'],
tagName: 'button',
title: null,
click: function click() {
this.sendAction();
}
});
});
define('ember-inspector/components/pikaday-input', ['exports', 'ember', 'ember-pikaday/components/pikaday-input'], function (exports, Ember, PikadayInputComponent) {
'use strict';
exports['default'] = PikadayInputComponent['default'];
});
define('ember-inspector/components/property-field', ['exports', 'ember'], function (exports, Ember) {
'use strict';
exports['default'] = Ember['default'].TextField.extend({
attributeBindings: ['label:data-label'],
didInsertElement: function didInsertElement() {
this._super();
this.$().select();
},
insertNewline: function insertNewline() {
this.sendAction('save-property');
this.sendAction('finished-editing');
},
cancel: function cancel() {
this.sendAction('finished-editing');
},
focusOut: function focusOut() {
this.sendAction('finished-editing');
}
});
});
define('ember-inspector/components/record-item', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var Component = Ember['default'].Component;
var computed = Ember['default'].computed;
var SafeString = Ember['default'].Handlebars.SafeString;
var isEmpty = Ember['default'].isEmpty;
var COLOR_MAP = {
red: '#ff2717',
blue: '#174fff',
green: '#006400'
};
exports['default'] = Component.extend({
modelTypeColumns: null,
classNames: ['list-tree__item', 'row', 'row_highlight'],
attributeBindings: ['label:data-label'],
label: 'record-row',
// TODO: Color record based on `color` property.
style: computed('model.color', function () {
var colorName = this.get('model.color');
if (!isEmpty(colorName)) {
var color = COLOR_MAP[colorName];
if (color) {
return new SafeString('color: ' + color + ';');
}
}
return '';
}),
columns: computed('modelTypeColumns.@each', 'model.columnValues', function () {
var _this = this;
var columns = this.get('modelTypeColumns') || [];
return columns.map(function (col) {
return { name: col.name, value: _this.get('model.columnValues.' + col.name) };
});
}),
click: function click() {
this.sendAction('inspect', this.get('model'));
return false;
}
});
});
define('ember-inspector/components/reload-button', ['exports', 'ember-inspector/components/icon-button'], function (exports, IconButton) {
'use strict';
exports['default'] = IconButton['default'].extend({
title: 'Reload'
});
});
define('ember-inspector/components/resizable-column', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var Component = Ember['default'].Component;
var computed = Ember['default'].computed;
var SafeString = Ember['default'].Handlebars.SafeString;
exports['default'] = Component.extend({
width: null,
attributeBindings: ['style'],
style: computed('width', function () {
return new SafeString('-webkit-flex: none; flex: none; width: ' + this.get('width') + 'px;');
}),
didInsertElement: function didInsertElement() {
if (!this.get('width')) {
this.set('width', this.$().width());
}
}
});
});
define('ember-inspector/components/route-item', ['exports', 'ember', 'ember-inspector/utils/check-current-route'], function (exports, Ember, checkCurrentRoute) {
'use strict';
var Component = Ember['default'].Component;
var computed = Ember['default'].computed;
var SafeString = Ember['default'].Handlebars.SafeString;
exports['default'] = Component.extend({
// passed as an attribute to the component
currentRoute: null,
classNames: ['list-tree__item', 'row'],
classNameBindings: ['isCurrent:row_highlight'],
attributeBindings: ['label:data-label'],
label: 'route-node',
labelStyle: computed('model.parentCount', function () {
return new SafeString('padding-left: ' + (+this.get('model.parentCount') * 20 + 5) + 'px;');
}),
isCurrent: computed('currentRoute', 'model.value.name', function () {
var currentRoute = this.get('currentRoute');
if (!currentRoute) {
return false;
}
return checkCurrentRoute['default'](currentRoute, this.get('model.value.name'));
})
});
});
define('ember-inspector/components/send-to-console', ['exports', 'ember'], function (exports, Ember) {
'use strict';
exports['default'] = Ember['default'].Component.extend({
tagName: 'button',
classNames: ['send-to-console'],
attributeBindings: ['dataLabel:data-label'],
dataLabel: 'send-to-console-btn',
action: 'sendValueToConsole',
click: function click() {
this.sendAction('action', this.get('param'));
}
});
});
define('ember-inspector/components/sidebar-toggle', ['exports', 'ember'], function (exports, Ember) {
'use strict';
exports['default'] = Ember['default'].Component.extend({
tagName: 'button',
side: 'right',
isExpanded: false,
isRight: Ember['default'].computed.equal('side', 'right'),
classNames: 'sidebar-toggle',
classNameBindings: 'isRight:sidebar-toggle--right:sidebar-toggle--left',
click: function click() {
this.sendAction();
}
});
});
define('ember-inspector/components/view-item', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var computed = Ember['default'].computed;
var Component = Ember['default'].Component;
var SafeString = Ember['default'].Handlebars.SafeString;
var not = computed.not;
var bool = computed.bool;
exports['default'] = Component.extend({
classNames: ['list-tree__item', 'row'],
classNameBindings: ['isCurrent:row_highlight'],
hasView: not('model.value.isVirtual'),
hasElement: not('model.value.isVirtual'),
hasModel: bool('model.value.model'),
// passed as an attribute
pinnedObjectId: null,
isCurrent: computed('pinnedObjectId', 'model.value.objectId', function () {
return this.get('pinnedObjectId') === this.get('model.value.objectId');
}),
hasController: bool('model.value.controller'),
modelInspectable: computed('hasModel', 'model.value.model.type', function () {
return this.get('hasModel') && this.get('model.value.model.type') === 'type-ember-object';
}),
labelStyle: computed('model.parentCount', function () {
return new SafeString('padding-left: ' + (+this.get('model.parentCount') * 20 + 5) + 'px;');
}),
actions: {
inspectView: function inspectView() {
if (this.get('hasView')) {
this.sendAction('inspect', this.get('model.value.objectId'));
}
},
inspectElement: function inspectElement(objectId) {
if (!objectId && this.get('hasElement')) {
objectId = this.get('model.value.objectId');
}
if (objectId) {
this.sendAction('inspectElement', objectId);
}
},
inspectModel: function inspectModel(objectId) {
if (this.get('modelInspectable')) {
this.sendAction('inspect', objectId);
}
}
}
});
});
define('ember-inspector/computed/custom-filter', ['exports', 'ember'], function (exports, Ember) {
'use strict';
exports['default'] = filterComputed;
function filterComputed() {
var dependentKeys = undefined,
callback = undefined;
if (arguments.length > 1) {
var slice = [].slice;
dependentKeys = slice.call(arguments, 0, -1);
callback = slice.call(arguments, -1)[0];
}
var options = {
initialize: function initialize(array, changeMeta, instanceMeta) {
instanceMeta.filteredArrayIndexes = new Ember['default'].SubArray();
},
addedItem: function addedItem(array, item, changeMeta, instanceMeta) {
var match = !!callback.call(this, item);
var filterIndex = instanceMeta.filteredArrayIndexes.addItem(changeMeta.index, match);
if (match) {
array.insertAt(filterIndex, item);
}
return array;
},
removedItem: function removedItem(array, item, changeMeta, instanceMeta) {
var filterIndex = instanceMeta.filteredArrayIndexes.removeItem(changeMeta.index);
if (filterIndex > -1) {
array.removeAt(filterIndex);
}
return array;
}
};
var args = dependentKeys;
args.push(options);
/*jshint validthis:true */
return Ember['default'].arrayComputed.apply(this, args);
}
});
define('ember-inspector/computed/debounce', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var run = Ember['default'].run;
var computed = Ember['default'].computed;
var debounce = run.debounce;
// Use this if you want a property to debounce
// another property with a certain delay.
// This means that every time this prop changes,
// the other prop will change to the same val after [delay]
exports['default'] = function (prop, delay, callback) {
var value = undefined;
var updateVal = function updateVal() {
this.set(prop, value);
if (callback) {
callback.call(this);
}
};
return computed(function (key, val) {
if (arguments.length > 1) {
value = val;
debounce(this, updateVal, delay);
return val;
}
});
}
});
define('ember-inspector/controllers/application', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var _Ember$computed = Ember['default'].computed;
var readOnly = _Ember$computed.readOnly;
var equal = _Ember$computed.equal;
exports['default'] = Ember['default'].Controller.extend({
needs: ['mixin-stack', 'mixin-details'],
emberApplication: false,
navWidth: 180,
inspectorWidth: 360,
mixinStack: readOnly('controllers.mixin-stack'),
mixinDetails: readOnly('controllers.mixin-details'),
isChrome: equal('port.adapter.name', 'chrome'),
deprecationCount: 0,
// Indicates that the extension window is focused,
active: true,
inspectorExpanded: false,
pushMixinDetails: function pushMixinDetails(name, property, objectId, details, errors) {
details = {
name: name,
property: property,
objectId: objectId,
mixins: details,
errors: errors
};
this.get('mixinStack').pushObject(details);
this.set('mixinDetails.model', details);
},
popMixinDetails: function popMixinDetails() {
var mixinStack = this.get('controllers.mixin-stack');
var item = mixinStack.popObject();
this.set('mixinDetails.model', mixinStack.get('lastObject'));
this.get('port').send('objectInspector:releaseObject', { objectId: item.objectId });
},
activateMixinDetails: function activateMixinDetails(name, objectId, details, errors) {
var _this = this;
this.get('mixinStack').forEach(function (item) {
_this.get('port').send('objectInspector:releaseObject', { objectId: item.objectId });
});
this.set('mixinStack.model', []);
this.pushMixinDetails(name, undefined, objectId, details, errors);
},
droppedObject: function droppedObject(objectId) {
var mixinStack = this.get('mixinStack.model');
var obj = mixinStack.findProperty('objectId', objectId);
if (obj) {
var index = mixinStack.indexOf(obj);
var objectsToRemove = [];
for (var i = index; i >= 0; i--) {
objectsToRemove.pushObject(mixinStack.objectAt(i));
}
objectsToRemove.forEach(function (item) {
mixinStack.removeObject(item);
});
}
if (mixinStack.get('length') > 0) {
this.set('mixinDetails.model', mixinStack.get('lastObject'));
} else {
this.set('mixinDetails.model', null);
}
}
});
});
define('ember-inspector/controllers/container-type', ['exports', 'ember', 'ember-inspector/computed/debounce', 'ember-inspector/utils/search-match'], function (exports, Ember, debounceComputed, searchMatch) {
'use strict';
var ArrayController = Ember['default'].ArrayController;
var computed = Ember['default'].computed;
var get = Ember['default'].get;
var filter = computed.filter;
exports['default'] = ArrayController.extend({
needs: ['application'],
sortProperties: ['name'],
searchVal: debounceComputed['default']('search', 300),
search: null,
arrangedContent: filter('model', function (item) {
return searchMatch['default'](get(item, 'name'), this.get('search'));
}).property('model.@each.name', 'search')
});
});
define('ember-inspector/controllers/container-types', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var Controller = Ember['default'].Controller;
var sort = Ember['default'].computed.sort;
exports['default'] = Controller.extend({
sortProperties: ['name'],
sorted: sort('model', 'sortProperties')
});
});
define('ember-inspector/controllers/deprecation-item', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var Controller = Ember['default'].Controller;
var computed = Ember['default'].computed;
var notEmpty = computed.notEmpty;
exports['default'] = Controller.extend({
isExpanded: true,
hasMap: notEmpty('model.hasSourceMap'),
expandedClass: computed('hasMap', 'isExpanded', function () {
if (this.get('isExpanded')) {
return 'row_arrow_expanded';
} else {
return 'row_arrow_collapsed';
}
}),
actions: {
toggleExpand: function toggleExpand() {
this.toggleProperty('isExpanded');
}
}
});
});
define('ember-inspector/controllers/deprecation-source', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var Controller = Ember['default'].Controller;
var computed = Ember['default'].computed;
var bool = computed.bool;
var readOnly = computed.readOnly;
var and = computed.and;
exports['default'] = Controller.extend({
known: bool('model.map.source'),
url: computed('model.map.source', 'model.map.line', 'known', function () {
var source = this.get('model.map.source');
if (this.get('known')) {
return source + ':' + this.get('model.map.line');
} else {
return 'Unkown source';
}
}),
adapter: readOnly('port.adapter'),
isClickable: and('known', 'adapter.canOpenResource')
});
});
define('ember-inspector/controllers/deprecations', ['exports', 'ember', 'ember-inspector/computed/debounce', 'ember-inspector/utils/search-match'], function (exports, Ember, debounceComputed, searchMatch) {
'use strict';
var Controller = Ember['default'].Controller;
var computed = Ember['default'].computed;
var get = Ember['default'].get;
var filter = computed.filter;
exports['default'] = Controller.extend({
needs: ['application'],
search: null,
searchVal: debounceComputed['default']('search', 300),
filtered: filter('model', function (item) {
return searchMatch['default'](get(item, 'message'), this.get('search'));
}).property('model.@each.message', 'search')
});
});
define('ember-inspector/controllers/iframes', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var ArrayController = Ember['default'].ArrayController;
var computed = Ember['default'].computed;
var run = Ember['default'].run;
var observer = Ember['default'].observer;
var alias = computed.alias;
var map = computed.map;
exports['default'] = ArrayController.extend({
model: map('port.detectedApplications', function (item) {
var name = item.split('__');
return {
name: name[1],
val: item
};
}),
selectedApp: alias('port.applicationId'),
selectedDidChange: observer('selectedApp', function () {
// Change iframe being debugged
var url = '/';
var applicationId = this.get('selectedApp');
var list = this.get('port').get('detectedApplications');
var app = this.container.lookup('application:main');
run(app, app.reset);
var router = app.__container__.lookup('router:main');
var port = app.__container__.lookup('port:main');
port.set('applicationId', applicationId);
port.set('detectedApplications', list);
// start
router.location.setURL(url);
run(app, app.handleURL, url);
})
});
});
define('ember-inspector/controllers/info', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var Controller = Ember['default'].Controller;
exports['default'] = Controller;
});
define('ember-inspector/controllers/mixin-detail', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var computed = Ember['default'].computed;
var oneWay = computed.oneWay;
exports['default'] = Ember['default'].ObjectController.extend({
needs: ['mixin-details'],
mixinDetails: oneWay('controllers.mixin-details').readOnly(),
objectId: oneWay('mixinDetails.model.objectId').readOnly(),
isExpanded: computed('model.expand', 'model.properties.length', function () {
return this.get('model.expand') && this.get('model.properties.length') > 0;
}),
actions: {
calculate: function calculate(property) {
var objectId = this.get('objectId');
var mixinIndex = this.get('mixinDetails.model.mixins').indexOf(this.get('model'));
this.get('port').send('objectInspector:calculate', {
objectId: objectId,
property: property.name,
mixinIndex: mixinIndex
});
},
sendToConsole: function sendToConsole(property) {
var objectId = this.get('objectId');
this.get('port').send('objectInspector:sendToConsole', {
objectId: objectId,
property: property.name
});
},
toggleExpanded: function toggleExpanded() {
this.toggleProperty('isExpanded');
},
digDeeper: function digDeeper(property) {
var objectId = this.get('objectId');
this.get('port').send('objectInspector:digDeeper', {
objectId: objectId,
property: property.name
});
},
saveProperty: function saveProperty(prop, val, type) {
var mixinIndex = this.get('mixinDetails.model.mixins').indexOf(this.get('model'));
this.get('port').send('objectInspector:saveProperty', {
objectId: this.get('objectId'),
property: prop,
value: val,
mixinIndex: mixinIndex,
dataType: type
});
}
}
});
});
define('ember-inspector/controllers/mixin-details', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var Controller = Ember['default'].Controller;
exports['default'] = Controller.extend({
actions: {
traceErrors: function traceErrors() {
this.get('port').send('objectInspector:traceErrors', {
objectId: this.get('model.objectId')
});
}
}
});
});
define('ember-inspector/controllers/mixin-property', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var computed = Ember['default'].computed;
var equal = computed.equal;
var alias = computed.alias;
exports['default'] = Ember['default'].ObjectController.extend({
isEdit: false,
// Bound to editing textbox
txtValue: null,
dateValue: null,
isCalculated: computed('value.type', function () {
return this.get('value.type') !== 'type-descriptor';
}),
isEmberObject: equal('value.type', 'type-ember-object'),
isComputedProperty: alias('value.computed'),
isFunction: equal('value.type', 'type-function'),
isArray: equal('value.type', 'type-array'),
isDate: equal('value.type', 'type-date'),
_parseTextValue: function _parseTextValue(value) {
var parsedValue = undefined;
try {
parsedValue = JSON.parse(value);
} catch (e) {
// if surrounded by quotes, remove quotes
var match = value.match(/^"(.*)"$/);
if (match && match.length > 1) {
parsedValue = match[1];
} else {
parsedValue = value;
}
}
return parsedValue;
},
actions: {
valueClick: function valueClick() {
if (this.get('isEmberObject') || this.get('isArray')) {
this.get('target').send('digDeeper', this.get('model'));
return;
}
if (this.get('isComputedProperty') && !this.get('isCalculated')) {
this.get('target').send('calculate', this.get('model'));
return;
}
if (this.get('isFunction') || this.get('overridden') || this.get('readOnly')) {
return;
}
var value = this.get('value.inspect');
var type = this.get('value.type');
if (type === 'type-string') {
value = '"' + value + '"';
}
if (!this.get('isDate')) {
this.set('txtValue', value);
} else {
this.set('dateValue', new Date(value));
}
this.set('isEdit', true);
},
saveProperty: function saveProperty() {
var realValue = undefined,
dataType = undefined;
if (!this.get('isDate')) {
realValue = this._parseTextValue(this.get('txtValue'));
} else {
realValue = this.get('dateValue').getTime();
dataType = 'date';
}
this.get('target').send('saveProperty', this.get('name'), realValue, dataType);
},
finishedEditing: function finishedEditing() {
this.set('isEdit', false);
}
}
});
});
define('ember-inspector/controllers/mixin-stack', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var computed = Ember['default'].computed;
exports['default'] = Ember['default'].ArrayController.extend({
needs: ['application'],
trail: computed('[]', function () {
var nested = this.slice(1);
if (nested.length === 0) {
return "";
}
return "." + nested.mapProperty('property').join(".");
}),
isNested: computed('[]', function () {
return this.get('length') > 1;
}),
actions: {
popStack: function popStack() {
if (this.get('isNested')) {
this.get('controllers.application').popMixinDetails();
}
},
sendObjectToConsole: function sendObjectToConsole(obj) {
var objectId = Ember['default'].get(obj, 'objectId');
this.get('port').send('objectInspector:sendToConsole', {
objectId: objectId
});
}
}
});
});
define('ember-inspector/controllers/model-type-item', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var computed = Ember['default'].computed;
var oneWay = computed.oneWay;
exports['default'] = Ember['default'].ObjectController.extend({
needs: ['model-types'],
modelTypes: oneWay('controllers.model-types').readOnly(),
selected: computed('modelTypes.selected', function () {
return this.get('model') === this.get('modelTypes.selected');
})
});
});
define('ember-inspector/controllers/model-types', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var Controller = Ember['default'].Controller;
var _Ember$computed = Ember['default'].computed;
var sort = _Ember$computed.sort;
var filter = _Ember$computed.filter;
var get = Ember['default'].get;
exports['default'] = Controller.extend({
navWidth: 180,
sortProperties: ['name'],
options: {
hideEmptyModelTypes: false
},
sorted: sort('filtered', 'sortProperties'),
filtered: filter('model', function (typeItem) {
var hideEmptyModels = get(this, 'options.hideEmptyModelTypes');
if (hideEmptyModels) {
return !!get(typeItem, 'count');
} else {
return true;
}
}).property('model', 'options.hideEmptyModelTypes')
});
});
define('ember-inspector/controllers/promise-item', ['exports', 'ember'], function (exports, Ember) {
'use strict';
var computed = Ember['default'].computed;
var SafeString = Ember['default'].Handlebars.SafeString;
var alias = computed.alias;
var notEmpty = computed.notEmpty;
var empty = computed.empty;
var gt = computed.gt;
var equal = computed.equal;
var COLOR_MAP = {
red: '#ff2717',
blue: '#174fff',
green: '#006400'
};
exports['default'] = Ember['default'].ObjectProxy.extend({
promiseTreeController: computed(function () {
return this.container.lookup('controller:promiseTree');
}),
filter: alias('promiseTreeController.filter'),
effectiveSearch: alias('promiseTreeController.effectiveSearch'),
model: alias('content'),
isError: equal('reason.type', 'type-error'),
style: computed('model.state', function () {
var color = '';
if (this.get('isFulfilled')) {
color = 'green';
} else if (this.get('isRejected')) {
color = 'red';
} else {
color = 'blue';
}
return new SafeString('background-color: ' + COLOR_MAP[color] + '; color: white;');
}),
nodeStyle: computed('state', 'filter', 'effectiveSearch', function () {
var relevant = undefined;
switch (this.get('filter')) {
case 'pending':
relevant = this.get('isPending');
break;
case 'rejected':
relevant = this.get('isRejected');
break;
case 'fulfilled':
relevant = this.get('isFulfilled');
break;
default:
relevant = true;
}
if (relevant && !Ember['default'].isEmpty(this.get('effectiveSearch'))) {
relevant = this.get('model').matchesExactly(this.get('effectiveSearch'));
}
if (!relevant) {
return new SafeString('opacity: 0.3;');
}
}),
labelStyle: computed('level', function () {
return new SafeString('padding-left: ' + (+this.get('level') * 20 + 5) + 'px;');
}),
expandedClass: computed('hasChildren', 'isExpanded', function () {
if (!this.get('hasChildren')) {
return;
}
if (this.get('isExpanded')) {
return 'row_arrow_expanded';
} else {
return 'row_arrow_collapsed';
}
}),
hasChildren: gt('children.length', 0),
isTopNode: empty('parent'),
settledValue: computed('value', function () {
if (this.get('isFulfilled')) {
return this.get('value');
} else if (this.get('isRejected')) {
return this.get('reason');
} else {
return '--';
}
}),
isValueInspectable: notEmpty('settledValue.objectId'),
hasValue: computed('settledValue', 'isSettled', function () {
return this.get('isSettled') && this.get('settledValue.type') !== 'type-undefined';
}),
label: computed('model.label', function () {
return this.get('model.label') || !!this.get('model.parent') && 'Then' || '<Unknown Promise>';
}),
state: computed('model.state', function () {
if (this.get('isFulfilled')) {
return 'Fulfilled';
} else if (this.get('isRejected')) {
return 'Rejected';
} else if (this.get('parent') && !this.get('parent.isSettled')) {
return 'Waiting for parent';
} else {
return 'Pending';
}
}),
timeToSettle: computed('createdAt', 'settledAt', 'parent.settledAt', function () {
if (!this.get('createdAt') || !this.get('settledAt')) {
return ' -- ';
}
var startedAt = this.get('parent.settledAt') || this.get('createdAt');
var remaining = this.get('settledAt').getTime() - startedAt.getTime();
return remaining;
})
});
});
define('ember-inspector/controllers/promise-tree', ['exports', 'ember', 'ember-inspector/computed/custom-filter'], function (exports, Ember, filterComputed) {
'use strict';
var computed = Ember['default'].computed;
var observer = Ember['default'].observer;
var equal = computed.equal;
var bool = computed.bool;
var and = computed.and;
var not = computed.not;
// Manual implementation of item controllers
function itemProxyComputed(dependentKey, itemProxy) {
var options = {
addedItem: function addedItem(array, item, changeMeta) {
var proxy = itemProxy.create({ content: item });
array.insertAt(changeMeta.index, proxy);
return array;
},
removedItem: function removedItem(array, item, changeMeta) {
var proxy = array.objectAt(changeMeta.index);
array.removeAt(changeMeta.index, 1);
proxy.destroy();
return array;
}
};
return Ember['default'].arrayComputed(dependentKey, options);
}
exports['default'] = Ember['default'].ArrayController.extend({
needs: ['application'],
queryParams: ['filter'],
createdAfter: null,
// below used to show the "refresh" message
isEmpty: equal('model.length', 0),
wasCleared: bool('createdAfter'),
neverCleared: not('wasCleared'),
shouldRefresh: and('isEmpty', 'neverCleared'),
// Keep track of promise stack traces.
// It is opt-in due to performance reasons.
instrumentWithStack: false,
init: function init() {
this._super.apply(this, arguments);
// List-view does not support item controllers
this.reopen({
items: itemProxyComputed('filtered', this.get('promiseItemController'))
});
},
promiseItemController: computed(function () {
return this.container.lookupFactory('controller:promise-item');
}),
/* jscs:disable validateIndentation */
// TODO: This filter can be further optimized
filtered: filterComputed['default']('model.@each.createdAt', 'model.@each.fulfilledBranch', 'model.@each.rejectedBranch', 'model.@each.pendingBranch', 'model.@each.isVisible', function (item) {
// exclude cleared promises
if (this.get('createdAfter') && item.get('createdAt') < this.get('createdAfter')) {
return false;
}
if (!item.get('isVisible')) {
return false;
}
// Exclude non-filter complying promises
// If at least one of their children passes the filter,
// then they pass
var include = true;
if (this.get('filter') === 'pending') {
include = item.get('pendingBranch');
} else if (this.get('filter') === 'rejected') {
include = item.get('rejectedBranch');
} else if (this.get('filter') === 'fulfilled') {
include = item.get('fulfilledBranch');
}
if (!include) {
return false;
}
// Search filter
// If they or at least one of their children
// match the search, then include them
var search = this.get('effectiveSearch');
if (!E