tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

private-messages.test.js (7481B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 "use strict";
      6 
      7 const {
      8  getAllMessagesUiById,
      9  getAllCssMessagesMatchingElements,
     10  getAllNetworkMessagesUpdateById,
     11  getAllRepeatById,
     12  getCurrentGroup,
     13  getGroupsById,
     14  getMutableMessagesById,
     15  getVisibleMessages,
     16 } = require("resource://devtools/client/webconsole/selectors/messages.js");
     17 const {
     18  getFirstMessage,
     19  getLastMessage,
     20  getPrivatePacket,
     21  getWebConsoleUiMock,
     22  setupActions,
     23  setupStore,
     24 } = require("resource://devtools/client/webconsole/test/node/helpers.js");
     25 const {
     26  stubPackets,
     27 } = require("resource://devtools/client/webconsole/test/node/fixtures/stubs/index.js");
     28 const {
     29  CSS_MESSAGE_ADD_MATCHING_ELEMENTS,
     30 } = require("resource://devtools/client/webconsole/constants.js");
     31 
     32 const expect = require("expect");
     33 
     34 describe("private messages", () => {
     35  let actions;
     36  beforeAll(() => {
     37    actions = setupActions();
     38  });
     39 
     40  it("removes private messages on PRIVATE_MESSAGES_CLEAR action", () => {
     41    const { dispatch, getState } = setupStore();
     42 
     43    dispatch(
     44      actions.messagesAdd([
     45        getPrivatePacket("console.trace()"),
     46        stubPackets.get("console.log('mymap')"),
     47        getPrivatePacket("console.log(undefined)"),
     48        getPrivatePacket("GET request"),
     49      ])
     50    );
     51 
     52    let state = getState();
     53    const messages = getMutableMessagesById(state);
     54    expect(messages.size).toBe(4);
     55 
     56    dispatch(actions.privateMessagesClear());
     57 
     58    state = getState();
     59    expect(getMutableMessagesById(state).size).toBe(1);
     60    expect(getVisibleMessages(state).length).toBe(1);
     61  });
     62 
     63  it("cleans messagesUiById on PRIVATE_MESSAGES_CLEAR action", () => {
     64    const { dispatch, getState } = setupStore();
     65 
     66    dispatch(
     67      actions.messagesAdd([
     68        getPrivatePacket("console.trace()"),
     69        stubPackets.get("console.trace()"),
     70      ])
     71    );
     72 
     73    let state = getState();
     74    expect(getAllMessagesUiById(state).length).toBe(2);
     75 
     76    dispatch(actions.privateMessagesClear());
     77 
     78    state = getState();
     79    expect(getAllMessagesUiById(state).length).toBe(1);
     80  });
     81 
     82  it("cleans repeatsById on PRIVATE_MESSAGES_CLEAR action", () => {
     83    const { dispatch, getState } = setupStore();
     84 
     85    dispatch(
     86      actions.messagesAdd([
     87        getPrivatePacket("console.log(undefined)"),
     88        getPrivatePacket("console.log(undefined)"),
     89        stubPackets.get("console.log(undefined)"),
     90        stubPackets.get("console.log(undefined)"),
     91      ])
     92    );
     93 
     94    let state = getState();
     95    expect(getAllRepeatById(state)).toEqual({
     96      [getFirstMessage(state).id]: 2,
     97      [getLastMessage(state).id]: 2,
     98    });
     99 
    100    dispatch(actions.privateMessagesClear());
    101 
    102    state = getState();
    103    expect(Object.keys(getAllRepeatById(state)).length).toBe(1);
    104    expect(getAllRepeatById(state)).toEqual({
    105      [getFirstMessage(state).id]: 2,
    106    });
    107  });
    108 
    109  it("cleans cssMessagesMatchingElements on PRIVATE_MESSAGES_CLEAR action", () => {
    110    const { dispatch, getState } = setupStore();
    111 
    112    dispatch(
    113      actions.messagesAdd([
    114        getPrivatePacket(
    115          `Unknown property ‘such-unknown-property’.  Declaration dropped.`
    116        ),
    117        stubPackets.get(
    118          `Error in parsing value for ‘padding-top’.  Declaration dropped.`
    119        ),
    120      ])
    121    );
    122 
    123    const privateData = Symbol("privateData");
    124    const publicData = Symbol("publicData");
    125 
    126    dispatch({
    127      type: CSS_MESSAGE_ADD_MATCHING_ELEMENTS,
    128      id: getFirstMessage(getState()).id,
    129      elements: privateData,
    130    });
    131 
    132    dispatch({
    133      type: CSS_MESSAGE_ADD_MATCHING_ELEMENTS,
    134      id: getLastMessage(getState()).id,
    135      elements: publicData,
    136    });
    137 
    138    let state = getState();
    139    expect(getAllCssMessagesMatchingElements(state).size).toBe(2);
    140 
    141    dispatch(actions.privateMessagesClear());
    142 
    143    state = getState();
    144    expect(getAllCssMessagesMatchingElements(state).size).toBe(1);
    145    expect(
    146      getAllCssMessagesMatchingElements(state).get(
    147        getFirstMessage(getState()).id
    148      )
    149    ).toBe(publicData);
    150  });
    151 
    152  it("cleans group properties on PRIVATE_MESSAGES_CLEAR action", () => {
    153    const { dispatch, getState } = setupStore();
    154    dispatch(
    155      actions.messagesAdd([
    156        stubPackets.get("console.group()"),
    157        getPrivatePacket("console.group()"),
    158      ])
    159    );
    160 
    161    let state = getState();
    162    const publicMessageId = getFirstMessage(state).id;
    163    const privateMessageId = getLastMessage(state).id;
    164    expect(getCurrentGroup(state)).toBe(privateMessageId);
    165    expect(getGroupsById(state).size).toBe(2);
    166 
    167    dispatch(actions.privateMessagesClear());
    168 
    169    state = getState();
    170    expect(getGroupsById(state).size).toBe(1);
    171    expect(getGroupsById(state).has(publicMessageId)).toBe(true);
    172    expect(getCurrentGroup(state)).toBe(publicMessageId);
    173  });
    174 
    175  it("cleans networkMessagesUpdateById on PRIVATE_MESSAGES_CLEAR action", () => {
    176    const { dispatch, getState } = setupStore();
    177 
    178    const publicActor = "network/public";
    179    const privateActor = "network/private";
    180    const publicPacket = {
    181      ...stubPackets.get("GET request"),
    182      actor: publicActor,
    183    };
    184    const privatePacket = {
    185      ...getPrivatePacket("XHR GET request"),
    186      actor: privateActor,
    187    };
    188 
    189    // We need to reassign the timeStamp of the packet to guarantee the order.
    190    publicPacket.timeStamp = publicPacket.timeStamp + 1;
    191    privatePacket.timeStamp = privatePacket.timeStamp + 2;
    192 
    193    dispatch(actions.messagesAdd([publicPacket, privatePacket]));
    194 
    195    let networkUpdates = getAllNetworkMessagesUpdateById(getState());
    196    expect(Object.keys(networkUpdates)).toEqual([publicActor, privateActor]);
    197 
    198    dispatch(actions.privateMessagesClear());
    199 
    200    networkUpdates = getAllNetworkMessagesUpdateById(getState());
    201    expect(Object.keys(networkUpdates)).toEqual([publicActor]);
    202  });
    203 
    204  it("releases private backend actors on PRIVATE_MESSAGES_CLEAR action", () => {
    205    const releasedActors = [];
    206    const { dispatch, getState } = setupStore([], {
    207      webConsoleUI: getWebConsoleUiMock({
    208        commands: {
    209          client: {
    210            mainRoot: {},
    211          },
    212          objectCommand: {
    213            releaseObjects: async frontsToRelease => {
    214              for (const front of frontsToRelease) {
    215                releasedActors.push(front.actorID);
    216              }
    217            },
    218          },
    219        },
    220      }),
    221    });
    222    const mockFrontRelease = function () {
    223      releasedActors.push(this.actorID);
    224    };
    225 
    226    const publicPacket = stubPackets.get(
    227      "console.log('myarray', ['red', 'green', 'blue'])"
    228    );
    229    const privatePacket = getPrivatePacket("console.log('mymap')");
    230 
    231    publicPacket.arguments[1].release = mockFrontRelease;
    232    privatePacket.arguments[1].release = mockFrontRelease;
    233 
    234    // Add a log message.
    235    dispatch(actions.messagesAdd([publicPacket, privatePacket]));
    236 
    237    const firstMessage = getFirstMessage(getState());
    238    const firstMessageActor = firstMessage.parameters[1].actorID;
    239 
    240    const lastMessage = getLastMessage(getState());
    241    const lastMessageActor = lastMessage.parameters[1].actorID;
    242 
    243    // Kick-off the actor release.
    244    dispatch(actions.privateMessagesClear());
    245 
    246    expect(releasedActors.length).toBe(1);
    247    expect(releasedActors).toInclude(lastMessageActor);
    248    expect(releasedActors).toNotInclude(firstMessageActor);
    249  });
    250 });