Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
"use strict";
// Toggling the toolbox three time can take more than 45s on slow test machine
requestLongerTimeout(2);
// Test toggling the toolbox quickly and see if there is any race breaking it.
const URL = "data:text/html;charset=utf-8,Toggling devtools quickly";
const {
gDevToolsBrowser,
} = require("resource://devtools/client/framework/devtools-browser.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");
await addTab(URL);
let ready = 0,
destroy = 0,
destroyed = 0;
const onReady = () => {
ready++;
};
const onDestroy = () => {
destroy++;
};
const onDestroyed = () => {
destroyed++;
};
gDevTools.on("toolbox-ready", onReady);
gDevTools.on("toolbox-destroy", onDestroy);
gDevTools.on("toolbox-destroyed", onDestroyed);
// The current implementation won't toggle the toolbox many times,
// instead it will ignore toggles that happens while the toolbox is still
// creating or still destroying.
info("Toggle the toolbox many times in a row");
toggle();
toggle();
toggle();
toggle();
toggle();
await wait(500);
await waitFor(() => ready == 1);
is(
ready,
1,
"No matter how many times we called toggle, it will only open the toolbox once"
);
is(
destroy,
0,
"All subsequent, synchronous call to toggle will be ignored and the toolbox won't be destroyed"
);
is(destroyed, 0);
info("Retoggle the toolbox many times in a row");
toggle();
toggle();
toggle();
toggle();
toggle();
await wait(500);
await waitFor(() => destroyed == 1);
is(destroyed, 1, "Similarly, the toolbox will be closed");
is(destroy, 1);
is(
ready,
1,
"and no other toolbox will be opened. The subsequent toggle will be ignored."
);
gDevTools.off("toolbox-ready", onReady);
gDevTools.off("toolbox-destroy", onDestroy);
gDevTools.off("toolbox-destroyed", onDestroyed);
await wait(1000);
gBrowser.removeCurrentTab();
});
function toggle() {
// When enabling the input event prioritization, we'll reserve some time to
// process input events in each frame. In that case, the synthesized input
// events may delay the normal events. Replace synthesized key events by
// toggleToolboxCommand to prevent the synthesized input events jam the
// content process and cause the test timeout.
gDevToolsBrowser.toggleToolboxCommand(window.gBrowser);
}