Files
UXP-Fixed/devtools/client/dom/content/grip-provider.js
T
2018-02-02 04:16:08 -05:00

98 lines
2.5 KiB
JavaScript

/* -*- 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";
const { fetchProperties } = require("./actions/grips");
const { Property } = require("./reducers/grips");
// Implementation
function GripProvider(grips, dispatch) {
this.grips = grips;
this.dispatch = dispatch;
}
/**
* This object provides data for the tree displayed in the tooltip
* content.
*/
GripProvider.prototype = {
/**
* Fetches properties from the backend. These properties might be
* displayed as child objects in e.g. a tree UI widget.
*/
getChildren: function (object) {
let grip = object;
if (object instanceof Property) {
grip = this.getValue(object);
}
if (!grip || !grip.actor) {
return [];
}
let props = this.grips.get(grip.actor);
if (!props) {
// Fetch missing data from the backend. Returning a promise
// from data provider causes the tree to show a spinner.
return this.dispatch(fetchProperties(grip));
}
return props;
},
hasChildren: function (object) {
if (object instanceof Property) {
let value = this.getValue(object);
if (!value) {
return false;
}
let hasChildren = value.ownPropertyLength > 0;
if (value.preview) {
hasChildren = hasChildren || value.preview.ownPropertiesLength > 0;
}
if (value.preview) {
let preview = value.preview;
let k = preview.kind;
let objectsWithProps = ["DOMNode", "ObjectWithURL"];
hasChildren = hasChildren || (objectsWithProps.indexOf(k) != -1);
hasChildren = hasChildren || (k == "ArrayLike" && preview.length > 0);
}
return (value.type == "object" && hasChildren);
}
return null;
},
getValue: function (object) {
if (object instanceof Property) {
let value = object.value;
return (typeof value.value != "undefined") ? value.value :
value.getterValue;
}
return object;
},
getLabel: function (object) {
return (object instanceof Property) ? object.name : null;
},
getKey: function (object) {
return (object instanceof Property) ? object.key : null;
},
getType: function (object) {
return object.class ? object.class : "";
},
};
// Exports from this module
exports.GripProvider = GripProvider;