102 lines
2.5 KiB
JavaScript
102 lines
2.5 KiB
JavaScript
/* 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;
|