summaryrefslogtreecommitdiffstats
path: root/devtools/server/actors/object/symbol-iterator.js
blob: e0b05f9cd1fb09bc12914052452a4f9cb9d60ebf (plain)
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
/* 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 { symbolIteratorSpec } = require("resource://devtools/shared/specs/symbol-iterator.js");

const DevToolsUtils = require("resource://devtools/shared/DevToolsUtils.js");

/**
 * Creates an actor to iterate over an object's symbols.
 *
 * @param objectActor ObjectActor
 *        The object actor.
 */
class SymbolIteratorActor extends Actor {
  constructor(objectActor, conn) {
    super(conn, symbolIteratorSpec);

    let symbols = [];
    if (DevToolsUtils.isSafeDebuggerObject(objectActor.obj)) {
      try {
        symbols = objectActor.obj.getOwnPropertySymbols();
      } 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: symbols.length,
      symbolDescription(index) {
        const symbol = symbols[index];
        return {
          name: symbol.toString(),
          descriptor: objectActor._propertyDescriptor(symbol),
        };
      },
    };
  }

  form() {
    return {
      type: this.typeName,
      actor: this.actorID,
      count: this.iterator.size,
    };
  }

  slice({ start, count }) {
    const ownSymbols = [];
    for (let i = start, m = start + count; i < m; i++) {
      ownSymbols.push(this.iterator.symbolDescription(i));
    }
    return {
      ownSymbols,
    };
  }

  all() {
    return this.slice({ start: 0, count: this.iterator.size });
  }
}

exports.SymbolIteratorActor = SymbolIteratorActor;