summaryrefslogtreecommitdiffstats
path: root/devtools/server/actors/utils/breakpoint-actor-map.js
blob: cce32b2833d29ac3eaf341f3c8b7a11a74c23864 (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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/* 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 {
  BreakpointActor,
} = require("resource://devtools/server/actors/breakpoint.js");

/**
 * A BreakpointActorMap is a map from locations to instances of BreakpointActor.
 */
class BreakpointActorMap {
  constructor(threadActor) {
    this._threadActor = threadActor;
    this._actors = {};
  }

  // Get the key in the _actors table for a given breakpoint location.
  // See also duplicate code in commands.js :(
  _locationKey(location) {
    const { sourceUrl, sourceId, line, column } = location;
    return `${sourceUrl}:${sourceId}:${line}:${column}`;
  }

  /**
   * Return all BreakpointActors in this BreakpointActorMap.
   */
  findActors() {
    return Object.values(this._actors);
  }

  listKeys() {
    return Object.keys(this._actors);
  }

  /**
   * Return the BreakpointActor at the given location in this
   * BreakpointActorMap.
   *
   * @param BreakpointLocation location
   *        The location for which the BreakpointActor should be returned.
   *
   * @returns BreakpointActor actor
   *          The BreakpointActor at the given location.
   */
  getOrCreateBreakpointActor(location) {
    const key = this._locationKey(location);
    if (!this._actors[key]) {
      this._actors[key] = new BreakpointActor(this._threadActor, location);
    }
    return this._actors[key];
  }

  get(location) {
    const key = this._locationKey(location);
    return this._actors[key];
  }

  /**
   * Delete the BreakpointActor from the given location in this
   * BreakpointActorMap.
   *
   * @param BreakpointLocation location
   *        The location from which the BreakpointActor should be deleted.
   */
  deleteActor(location) {
    const key = this._locationKey(location);
    delete this._actors[key];
  }

  /**
   * Unregister all currently active breakpoints.
   */
  removeAllBreakpoints() {
    for (const bpActor of Object.values(this._actors)) {
      bpActor.removeScripts();
    }
    this._actors = {};
  }
}

exports.BreakpointActorMap = BreakpointActorMap;