96 lines
2.6 KiB
JavaScript
96 lines
2.6 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"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);
|
|
}
|