Source code

Revision control

Copy as Markdown

Other Tools

/* 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("resource://devtools/client/dom/content/actions/grips.js");
const {
Property,
} = require("resource://devtools/client/dom/content/reducers/grips.js");
// 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(object) {
let grip = object;
if (object instanceof Property) {
grip = this.getValue(object);
}
if (!grip || !grip.actorID) {
return [];
}
const props = this.grips.get(grip.actorID);
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(object) {
if (object instanceof Property) {
const value = this.getValue(object);
if (!value) {
return false;
}
const grip = value?.getGrip ? value.getGrip() : value;
let hasChildren = grip.ownPropertyLength > 0;
if (grip.preview) {
hasChildren = hasChildren || grip.preview.ownPropertiesLength > 0;
}
if (grip.preview) {
const preview = grip.preview;
const k = preview.kind;
const objectsWithProps = ["DOMNode", "ObjectWithURL"];
hasChildren = hasChildren || objectsWithProps.includes(k);
hasChildren = hasChildren || (k == "ArrayLike" && !!preview.length);
}
return grip.type == "object" && hasChildren;
}
return null;
},
getValue(object) {
if (object instanceof Property) {
const value = object.value;
return typeof value.value != "undefined"
? value.value
: value.getterValue;
}
return object;
},
getLabel(object) {
return object instanceof Property ? object.name : null;
},
getKey(object) {
return object instanceof Property ? object.key : null;
},
getType(object) {
const grip = object?.getGrip ? object.getGrip() : object;
return grip.class ? grip.class : "";
},
};
// Exports from this module
exports.GripProvider = GripProvider;