/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; define(function(require, exports, module) { // Dependencies const React = require("devtools/client/shared/vendor/react"); const { createFactories } = require("./rep-utils"); const { Rep } = createFactories(require("./rep")); const { ObjectBox } = createFactories(require("./object-box")); const { Caption } = createFactories(require("./caption")); // Shortcuts const DOM = React.DOM; /** * Renders an array. The array is enclosed by left and right bracket * and the max number of rendered items depends on the current mode. */ var ArrayRep = React.createClass({ displayName: "ArrayRep", render: function() { var mode = this.props.mode || "short"; var object = this.props.object; var hasTwisty = this.hasSpecialProperties(object); var items; if (mode == "tiny") { items = DOM.span({className: "length"}, object.length); } else { var max = (mode == "short") ? 3 : 300; items = this.arrayIterator(object, max); } return ( ObjectBox({className: "array", onClick: this.onToggleProperties}, DOM.a({className: "objectLink", onclick: this.onClickBracket}, DOM.span({className: "arrayLeftBracket", role: "presentation"}, "[") ), items, DOM.a({className: "objectLink", onclick: this.onClickBracket}, DOM.span({className: "arrayRightBracket", role: "presentation"}, "]") ), DOM.span({className: "arrayProperties", role: "group"}) ) ) }, getTitle: function(object, context) { return "[" + object.length + "]"; }, arrayIterator: function(array, max) { var items = []; for (var i=0; i max + 1) { items.pop(); items.push(Caption({ key: "more", object: Locale.$STR("jsonViewer.reps.more"), })); } return items; }, /** * Returns true if the passed object is an array with additional (custom) * properties, otherwise returns false. Custom properties should be * displayed in extra expandable section. * * Example array with a custom property. * let arr = [0, 1]; * arr.myProp = "Hello"; * * @param {Array} array The array object. */ hasSpecialProperties: function(array) { function isInteger(x) { var y = parseInt(x, 10); if (isNaN(y)) { return false; } return x === y.toString(); } var n = 0; var props = Object.getOwnPropertyNames(array); for (var i=0; i