summaryrefslogtreecommitdiffstats
path: root/devtools/client/webconsole/test/browser/browser_jsterm_hide_when_devtools_chrome_enabled_false.js
blob: 6f872400a30d24c1c8a65cc34c157d90d9e5ceb7 (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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

/*
 * Hide Browser Console JS input field if devtools.chrome.enabled is false.
 *
 * when devtools.chrome.enabled then:
 *   - browser console jsterm should be enabled
 *   - browser console object inspector properties should be set.
 *   - webconsole jsterm should be enabled
 *   - webconsole object inspector properties should be set.
 *
 * when devtools.chrome.enabled === false then
 *   - browser console jsterm should be disabled
 *   - browser console object inspector properties should be set (we used to not
 *     set them but there is no reason not to do so as the input is disabled).
 *   - webconsole jsterm should be enabled
 *   - webconsole object inspector properties should be set.
 */

"use strict";

// Needed for slow platforms (See https://bugzilla.mozilla.org/show_bug.cgi?id=1506970)
requestLongerTimeout(2);

add_task(async function () {
  let browserConsole, webConsole, objInspector;

  // Setting editor mode for both webconsole and browser console as there are more
  // elements to check.
  await pushPref("devtools.webconsole.input.editor", true);
  await pushPref("devtools.browserconsole.input.editor", true);

  // Enable Multiprocess Browser Console
  await pushPref("devtools.browsertoolbox.scope", "everything");

  // Needed for the execute() function below
  await pushPref("security.allow_parent_unrestricted_js_loads", true);

  // We don't use `pushPref()` because we need to revert the same pref later
  // in the test.
  Services.prefs.setBoolPref("devtools.chrome.enabled", true);

  browserConsole = await BrowserConsoleManager.toggleBrowserConsole();
  objInspector = await logObject(browserConsole);
  testInputRelatedElementsAreVisibile(browserConsole);
  await testObjectInspectorPropertiesAreSet(objInspector);

  const browserTab = await addTab(
    "data:text/html;charset=utf8,<!DOCTYPE html>hello world"
  );
  webConsole = await openConsole(browserTab);
  objInspector = await logObject(webConsole);
  testInputRelatedElementsAreVisibile(webConsole);
  await testObjectInspectorPropertiesAreSet(objInspector);

  await closeConsole(browserTab);
  await safeCloseBrowserConsole();

  Services.prefs.setBoolPref("devtools.chrome.enabled", false);
  browserConsole = await BrowserConsoleManager.toggleBrowserConsole();
  objInspector = await logObject(browserConsole);
  testInputRelatedElementsAreNotVisibile(browserConsole);

  webConsole = await openConsole(browserTab);
  objInspector = await logObject(webConsole);
  testInputRelatedElementsAreVisibile(webConsole);
  await testObjectInspectorPropertiesAreSet(objInspector);

  info("Close webconsole and browser console");
  await closeConsole(browserTab);
  await safeCloseBrowserConsole();
});

async function logObject(hud) {
  const prop = "browser_console_hide_jsterm_test";
  const { node } = await executeAndWaitForResultMessage(
    hud,
    `new Object({ ${prop}: true })`,
    prop
  );
  return node.querySelector(".tree");
}

function getInputRelatedElements(hud) {
  const { document } = hud.ui.window;

  return {
    inputEl: document.querySelector(".jsterm-input-container"),
    eagerEvaluationEl: document.querySelector(".eager-evaluation-result"),
    editorResizerEl: document.querySelector(".editor-resizer"),
    editorToolbarEl: document.querySelector(".webconsole-editor-toolbar"),
    webConsoleAppEl: document.querySelector(".webconsole-app"),
  };
}

function testInputRelatedElementsAreVisibile(hud) {
  const {
    inputEl,
    eagerEvaluationEl,
    editorResizerEl,
    editorToolbarEl,
    webConsoleAppEl,
  } = getInputRelatedElements(hud);

  isnot(inputEl.style.display, "none", "input is visible");
  ok(eagerEvaluationEl, "eager evaluation result is in dom");
  ok(editorResizerEl, "editor resizer is in dom");
  ok(editorToolbarEl, "editor toolbar is in dom");
  ok(
    webConsoleAppEl.classList.contains("jsterm-editor") &&
      webConsoleAppEl.classList.contains("eager-evaluation"),
    "webconsole element has expected classes"
  );
}

function testInputRelatedElementsAreNotVisibile(hud) {
  const {
    inputEl,
    eagerEvaluationEl,
    editorResizerEl,
    editorToolbarEl,
    webConsoleAppEl,
  } = getInputRelatedElements(hud);

  is(inputEl, null, "input is not in dom");
  is(eagerEvaluationEl, null, "eager evaluation result is not in dom");
  is(editorResizerEl, null, "editor resizer is not in dom");
  is(editorToolbarEl, null, "editor toolbar is not in dom");
  is(
    webConsoleAppEl.classList.contains("jsterm-editor") &&
      webConsoleAppEl.classList.contains("eager-evaluation"),
    false,
    "webconsole element does not have eager evaluation nor editor classes"
  );
}

async function testObjectInspectorPropertiesAreSet(objInspector) {
  const onMutation = waitForNodeMutation(objInspector, {
    childList: true,
  });

  const arrow = objInspector.querySelector(".arrow");
  arrow.click();
  await onMutation;

  ok(
    arrow.classList.contains("expanded"),
    "The arrow of the root node of the tree is expanded after clicking on it"
  );

  const nameNode = objInspector.querySelector(
    ".node:not(.lessen) .object-label"
  );
  const container = nameNode.parentNode;
  const name = nameNode.textContent;
  const value = container.querySelector(".objectBox").textContent;

  is(name, "browser_console_hide_jsterm_test", "name is set correctly");
  is(value, "true", "value is set correctly");
}