summaryrefslogtreecommitdiffstats
path: root/devtools/client/dom/content/grip-provider.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/dom/content/grip-provider.js')
-rw-r--r--devtools/client/dom/content/grip-provider.js102
1 files changed, 102 insertions, 0 deletions
diff --git a/devtools/client/dom/content/grip-provider.js b/devtools/client/dom/content/grip-provider.js
new file mode 100644
index 0000000000..18b3308869
--- /dev/null
+++ b/devtools/client/dom/content/grip-provider.js
@@ -0,0 +1,102 @@
+/* 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;