1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
/* 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 { Actor } = require("resource://devtools/shared/protocol.js");
const {
privatePropertiesIteratorSpec,
} = require("resource://devtools/shared/specs/private-properties-iterator.js");
const DevToolsUtils = require("resource://devtools/shared/DevToolsUtils.js");
/**
* Creates an actor to iterate over an object's private properties.
*
* @param objectActor ObjectActor
* The object actor.
*/
class PrivatePropertiesIteratorActor extends Actor {
constructor(objectActor, conn) {
super(conn, privatePropertiesIteratorSpec);
let privateProperties = [];
if (DevToolsUtils.isSafeDebuggerObject(objectActor.obj)) {
try {
privateProperties = objectActor.obj.getOwnPrivateProperties();
} catch (err) {
// The above can throw when the debuggee does not subsume the object's
// compartment, or for some WrappedNatives like Cu.Sandbox.
}
}
this.iterator = {
size: privateProperties.length,
propertyDescription(index) {
// private properties are represented as Symbols on platform
const symbol = privateProperties[index];
return {
name: symbol.description,
descriptor: objectActor._propertyDescriptor(symbol),
};
},
};
}
form() {
return {
type: this.typeName,
actor: this.actorID,
count: this.iterator.size,
};
}
slice({ start, count }) {
const privateProperties = [];
for (let i = start, m = start + count; i < m; i++) {
privateProperties.push(this.iterator.propertyDescription(i));
}
return {
privateProperties,
};
}
all() {
return this.slice({ start: 0, count: this.iterator.size });
}
}
exports.PrivatePropertiesIteratorActor = PrivatePropertiesIteratorActor;
|