summaryrefslogtreecommitdiffstats
path: root/devtools/client/framework/test/browser_toolbox_toggle.js
blob: c3848ae5ad33730097687efe943d4890599fbe20 (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
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

// Test toggling the toolbox with ACCEL+SHIFT+I / ACCEL+ALT+I and F12 in docked
// and detached (window) modes.

const URL = "data:text/html;charset=utf-8,Toggling devtools using shortcuts";

var { Toolbox } = require("resource://devtools/client/framework/toolbox.js");

add_task(async function () {
  // Make sure this test starts with the selectedTool pref cleared. Previous
  // tests select various tools, and that sets this pref.
  Services.prefs.clearUserPref("devtools.toolbox.selectedTool");

  // Test with ACCEL+SHIFT+I / ACCEL+ALT+I (MacOSX) ; modifiers should match :
  // - toolbox-key-toggle in devtools/client/framework/toolbox-window.xhtml
  // - key_devToolboxMenuItem in browser/base/content/browser.xhtml
  info("Test toggle using CTRL+SHIFT+I/CMD+ALT+I");
  await testToggle("I", {
    accelKey: true,
    shiftKey: !navigator.userAgent.match(/Mac/),
    altKey: navigator.userAgent.match(/Mac/),
  });

  // Test with F12 ; no modifiers
  info("Test toggle using F12");
  await testToggle("VK_F12", {});
});

async function testToggle(key, modifiers) {
  const tab = await addTab(URL + " ; key : '" + key + "'");
  await gDevTools.showToolboxForTab(tab);

  await testToggleDockedToolbox(tab, key, modifiers);
  await testToggleDetachedToolbox(tab, key, modifiers);

  await cleanup();
}

async function testToggleDockedToolbox(tab, key, modifiers) {
  const toolbox = gDevTools.getToolboxForTab(tab);

  isnot(
    toolbox.hostType,
    Toolbox.HostType.WINDOW,
    "Toolbox is docked in the main window"
  );

  info("verify docked toolbox is destroyed when using toggle key");
  const onToolboxDestroyed = gDevTools.once("toolbox-destroyed");
  EventUtils.synthesizeKey(key, modifiers);
  await onToolboxDestroyed;
  ok(true, "Docked toolbox is destroyed when using a toggle key");

  info("verify new toolbox is created when using toggle key");
  const onToolboxReady = gDevTools.once("toolbox-ready");
  EventUtils.synthesizeKey(key, modifiers);
  await onToolboxReady;
  ok(true, "Toolbox is created by using when toggle key");
}

async function testToggleDetachedToolbox(tab, key, modifiers) {
  const toolbox = gDevTools.getToolboxForTab(tab);

  info("change the toolbox hostType to WINDOW");

  await toolbox.switchHost(Toolbox.HostType.WINDOW);
  is(
    toolbox.hostType,
    Toolbox.HostType.WINDOW,
    "Toolbox opened on separate window"
  );

  info("Wait for focus on the toolbox window");
  await new Promise(res => waitForFocus(res, toolbox.win));

  info("Focus main window to put the toolbox window in the background");

  const onMainWindowFocus = once(window, "focus");
  window.focus();
  await onMainWindowFocus;
  ok(true, "Main window focused");

  info(
    "Verify windowed toolbox is focused instead of closed when using " +
      "toggle key from the main window"
  );
  const toolboxWindow = toolbox.topWindow;
  const onToolboxWindowFocus = once(toolboxWindow, "focus", true);
  EventUtils.synthesizeKey(key, modifiers);
  await onToolboxWindowFocus;
  ok(true, "Toolbox focused and not destroyed");

  info(
    "Verify windowed toolbox is destroyed when using toggle key from its " +
      "own window"
  );

  const onToolboxDestroyed = gDevTools.once("toolbox-destroyed");
  EventUtils.synthesizeKey(key, modifiers, toolboxWindow);
  await onToolboxDestroyed;
  ok(true, "Toolbox destroyed");
}

function cleanup() {
  Services.prefs.setCharPref("devtools.toolbox.host", Toolbox.HostType.BOTTOM);
  gBrowser.removeCurrentTab();
}