summaryrefslogtreecommitdiffstats
path: root/devtools/client/webconsole/test/browser/browser_console_content_object.js
blob: fce1e1a324ae935033b96ff4706a182c2c796a37 (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
85
/* 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/. */

// Test that console API calls in the content page appear in the browser console.

"use strict";

const TEST_URI = `data:text/html,<!DOCTYPE html><meta charset=utf8>console API calls<script>
  console.log({ contentObject: "YAY!", deep: ["yes!"] });
</script>`;

add_task(async function () {
  // Show the content messages
  await pushPref("devtools.browsertoolbox.scope", "everything");

  await addTab(TEST_URI);

  info("Open the Browser Console");
  let hud = await BrowserConsoleManager.toggleBrowserConsole();

  info("Wait until the content object is displayed");
  let objectMessage = await waitFor(() =>
    findConsoleAPIMessage(
      hud,
      `Object { contentObject: "YAY!", deep: (1) […] }`
    )
  );
  ok(true, "Content object is displayed in the Browser Console");

  await testExpandObject(objectMessage);

  info("Restart the Browser Console");
  await safeCloseBrowserConsole();
  hud = await BrowserConsoleManager.toggleBrowserConsole();

  info("Wait until the content object is displayed");
  objectMessage = await waitFor(() =>
    findConsoleAPIMessage(
      hud,
      `Object { contentObject: "YAY!", deep: (1) […] }`
    )
  );
  ok(true, "Content object is displayed in the Browser Console after restart");

  await testExpandObject(objectMessage);
});

async function testExpandObject(objectMessage) {
  info("Check that the logged content object can be expanded");
  const oi = objectMessage.querySelector(".tree");

  ok(oi, "There's an object inspector component for the content object");

  oi.querySelector(".arrow").click();
  // The object inspector now looks like:
  // ▼ Object { contentObject: "YAY!", deep: (1) […] }
  // |  contentObject: "YAY!"
  // |  ▶︎ deep: Array [ "yes!" ]
  // |  ▶︎ <prototype>
  await waitFor(() => oi.querySelectorAll(".node").length === 4);
  ok(true, "The ObjectInspector was expanded");
  const [root, contentObjectProp, deepProp, prototypeProp] = [
    ...oi.querySelectorAll(".node"),
  ];

  ok(
    root.textContent.includes('Object { contentObject: "YAY!", deep: (1) […] }')
  );
  ok(contentObjectProp.textContent.includes(`contentObject: "YAY!"`));
  ok(deepProp.textContent.includes(`deep: Array [ "yes!" ]`));
  ok(prototypeProp.textContent.includes(`<prototype>`));

  // The object inspector now looks like:
  // ▼ Object { contentObject: "YAY!", deep: (1) […] }
  // |  contentObject: "YAY!"
  // |  ▼︎ deep: (1) […]
  // |  |  0: "yes!"
  // |  |  length: 1
  // |  |  ▶︎ <prototype>
  // |  ▶︎ <prototype>
  deepProp.querySelector(".arrow").click();
  await waitFor(() => oi.querySelectorAll(".node").length === 7);
  ok(true, "The nested array was expanded");
}