summaryrefslogtreecommitdiffstats
path: root/remote/shared/messagehandler/test/browser/resources/modules/root/rootOnly.sys.mjs
blob: 0931a7ee8e675d421b4e495342a1a47a8f92ad56 (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
/* 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/. */

import { ContextDescriptorType } from "chrome://remote/content/shared/messagehandler/MessageHandler.sys.mjs";
import { Module } from "chrome://remote/content/shared/messagehandler/Module.sys.mjs";

class RootOnlyModule extends Module {
  #sessionDataReceived;
  #subscribedEvents;

  constructor(messageHandler) {
    super(messageHandler);

    this.#sessionDataReceived = [];
    this.#subscribedEvents = new Set();
  }

  destroy() {}

  /**
   * Commands
   */

  getSessionDataReceived() {
    return this.#sessionDataReceived;
  }

  testCommand(params = {}) {
    return params;
  }

  _applySessionData(params) {
    const added = [];
    const removed = [];

    const filteredSessionData = params.sessionData.filter(item =>
      this.messageHandler.matchesContext(item.contextDescriptor)
    );
    for (const event of this.#subscribedEvents.values()) {
      const hasSessionItem = filteredSessionData.some(
        item => item.value === event
      );
      // If there are no session items for this context, we should unsubscribe from the event.
      if (!hasSessionItem) {
        this.#subscribedEvents.delete(event);
        removed.push(event);
      }
    }

    // Subscribe to all events, which have an item in SessionData
    for (const { value } of filteredSessionData) {
      if (!this.#subscribedEvents.has(value)) {
        this.#subscribedEvents.add(value);
        added.push(value);
      }
    }

    this.#sessionDataReceived.push({
      category: params.category,
      added,
      removed,
      contextDescriptor: {
        type: ContextDescriptorType.All,
      },
    });
  }
}

export const rootOnly = RootOnlyModule;