@@ -26,6 +26,13 @@ add_task(async function() {
2626 await testOptionsShortcut ( ) ;
2727 await testOptions ( ) ;
2828 await testToggleTools ( ) ;
29+
30+ // Test that registered WebExtensions becomes entries in the
31+ // options panel and toggling their checkbox toggle the related
32+ // preference.
33+ await registerNewWebExtensions ( ) ;
34+ await testToggleWebExtensions ( ) ;
35+
2936 await cleanup ( ) ;
3037} ) ;
3138
@@ -47,6 +54,22 @@ function registerNewTool() {
4754 "The tool is registered" ) ;
4855}
4956
57+ // Register a fake WebExtension to check that it is
58+ // listed in the toolbox options.
59+ function registerNewWebExtensions ( ) {
60+ // Register some fake extensions and init the related preferences
61+ // (similarly to ext-devtools.js).
62+ for ( let i = 0 ; i < 2 ; i ++ ) {
63+ const extPref = `devtools.webextensions.fakeExtId${ i } .enabled` ;
64+ Services . prefs . setBoolPref ( extPref , true ) ;
65+
66+ toolbox . registerWebExtension ( `fakeUUID${ i } ` , {
67+ name : `Fake WebExtension ${ i } ` ,
68+ pref : extPref ,
69+ } ) ;
70+ }
71+ }
72+
5073function registerNewPerToolboxTool ( ) {
5174 let toolDefinition = {
5275 id : "test-pertoolbox-tool" ,
@@ -104,8 +127,7 @@ async function testOptionsShortcut() {
104127async function testOptions ( ) {
105128 let tool = toolbox . getPanel ( "options" ) ;
106129 panelWin = tool . panelWin ;
107- let prefNodes = tool . panelDoc . querySelectorAll (
108- "input[type=checkbox][data-pref]" ) ;
130+ let prefNodes = tool . panelDoc . querySelectorAll ( "input[type=checkbox][data-pref]" ) ;
109131
110132 // Store modified pref names so that they can be cleared on error.
111133 for ( let node of tool . panelDoc . querySelectorAll ( "[data-pref]" ) ) {
@@ -191,6 +213,132 @@ async function testMouseClick(node, prefValue) {
191213 observer . destroy ( ) ;
192214}
193215
216+ async function testToggleWebExtensions ( ) {
217+ const disabledExtensions = new Set ( ) ;
218+ let toggleableWebExtensions = toolbox . listWebExtensions ( ) ;
219+
220+ function toggleWebExtension ( node ) {
221+ node . scrollIntoView ( ) ;
222+ EventUtils . synthesizeMouseAtCenter ( node , { } , panelWin ) ;
223+ }
224+
225+ function assertExpectedDisabledExtensions ( ) {
226+ for ( let ext of toggleableWebExtensions ) {
227+ if ( disabledExtensions . has ( ext ) ) {
228+ ok ( ! toolbox . isWebExtensionEnabled ( ext . uuid ) ,
229+ `The WebExtension "${ ext . name } " should be disabled` ) ;
230+ } else {
231+ ok ( toolbox . isWebExtensionEnabled ( ext . uuid ) ,
232+ `The WebExtension "${ ext . name } " should be enabled` ) ;
233+ }
234+ }
235+ }
236+
237+ function assertAllExtensionsDisabled ( ) {
238+ const enabledUUIDs = toggleableWebExtensions
239+ . filter ( ext => toolbox . isWebExtensionEnabled ( ext . uuid ) )
240+ . map ( ext => ext . uuid ) ;
241+
242+ Assert . deepEqual ( enabledUUIDs , [ ] ,
243+ "All the registered WebExtensions should be disabled" ) ;
244+ }
245+
246+ function assertAllExtensionsEnabled ( ) {
247+ const disabledUUIDs = toolbox . listWebExtensions ( )
248+ . filter ( ext => ! toolbox . isWebExtensionEnabled ( ext . uuid ) )
249+ . map ( ext => ext . uuid ) ;
250+
251+ Assert . deepEqual ( disabledUUIDs , [ ] ,
252+ "All the registered WebExtensions should be enabled" ) ;
253+ }
254+
255+ function getWebExtensionNodes ( ) {
256+ let toolNodes = panelWin . document . querySelectorAll (
257+ "#default-tools-box input[type=checkbox]:not([data-unsupported])," +
258+ "#additional-tools-box input[type=checkbox]:not([data-unsupported])" ) ;
259+
260+ return [ ...toolNodes ] . filter ( node => {
261+ return toggleableWebExtensions . some (
262+ ( { uuid} ) => node . getAttribute ( "id" ) === `webext-${ uuid } `
263+ ) ;
264+ } ) ;
265+ }
266+
267+ let webExtensionNodes = getWebExtensionNodes ( ) ;
268+
269+ is ( webExtensionNodes . length , toggleableWebExtensions . length ,
270+ "There should be a toggle checkbox for every WebExtension registered" ) ;
271+
272+ for ( let ext of toggleableWebExtensions ) {
273+ ok ( toolbox . isWebExtensionEnabled ( ext . uuid ) ,
274+ `The WebExtension "${ ext . name } " is initially enabled` ) ;
275+ }
276+
277+ // Store modified pref names so that they can be cleared on error.
278+ for ( let ext of toggleableWebExtensions ) {
279+ modifiedPrefs . push ( ext . pref ) ;
280+ }
281+
282+ // Turn each registered WebExtension to disabled.
283+ for ( let node of webExtensionNodes ) {
284+ toggleWebExtension ( node ) ;
285+
286+ const toggledExt = toggleableWebExtensions . find ( ext => {
287+ return node . id == `webext-${ ext . uuid } ` ;
288+ } ) ;
289+ ok ( toggledExt , "Found a WebExtension for the checkbox element" ) ;
290+ disabledExtensions . add ( toggledExt ) ;
291+
292+ assertExpectedDisabledExtensions ( ) ;
293+ }
294+
295+ assertAllExtensionsDisabled ( ) ;
296+
297+ // Turn each registered WebExtension to enabled.
298+ for ( let node of webExtensionNodes ) {
299+ toggleWebExtension ( node ) ;
300+
301+ const toggledExt = toggleableWebExtensions . find ( ext => {
302+ return node . id == `webext-${ ext . uuid } ` ;
303+ } ) ;
304+ ok ( toggledExt , "Found a WebExtension for the checkbox element" ) ;
305+ disabledExtensions . delete ( toggledExt ) ;
306+
307+ assertExpectedDisabledExtensions ( ) ;
308+ }
309+
310+ assertAllExtensionsEnabled ( ) ;
311+
312+ // Unregister the WebExtensions one by one, and check that only the expected
313+ // ones have been unregistered, and the remaining onea are still listed.
314+ for ( let ext of toggleableWebExtensions ) {
315+ ok ( toolbox . listWebExtensions ( ) . length > 0 ,
316+ "There should still be extensions registered" ) ;
317+ toolbox . unregisterWebExtension ( ext . uuid ) ;
318+
319+ const registeredUUIDs = toolbox . listWebExtensions ( ) . map ( item => item . uuid ) ;
320+ ok ( ! registeredUUIDs . includes ( ext . uuid ) ,
321+ `the WebExtension "${ ext . name } " should have been unregistered` ) ;
322+
323+ webExtensionNodes = getWebExtensionNodes ( ) ;
324+
325+ const checkboxEl = webExtensionNodes . find ( el => el . id === `webext-${ ext . uuid } ` ) ;
326+ is ( checkboxEl , undefined ,
327+ "The unregistered WebExtension checkbox should have been removed" ) ;
328+
329+ is ( registeredUUIDs . length , webExtensionNodes . length ,
330+ "There should be the expected number of WebExtensions checkboxes" ) ;
331+ }
332+
333+ is ( toolbox . listWebExtensions ( ) . length , 0 ,
334+ "All WebExtensions have been unregistered" ) ;
335+
336+ webExtensionNodes = getWebExtensionNodes ( ) ;
337+
338+ is ( webExtensionNodes . length , 0 ,
339+ "There should not be any checkbox for the unregistered WebExtensions" ) ;
340+ }
341+
194342async function testToggleTools ( ) {
195343 let toolNodes = panelWin . document . querySelectorAll (
196344 "#default-tools-box input[type=checkbox]:not([data-unsupported])," +
@@ -207,7 +355,7 @@ async function testToggleTools() {
207355 for ( let node of toolNodes ) {
208356 let id = node . getAttribute ( "id" ) ;
209357 ok ( toggleableTools . some ( tool => tool . id === id ) ,
210- "There should be a toggle checkbox for: " + id ) ;
358+ "There should be a toggle checkbox for: " + id ) ;
211359 }
212360
213361 // Store modified pref names so that they can be cleared on error.
@@ -220,6 +368,7 @@ async function testToggleTools() {
220368 for ( let node of toolNodes ) {
221369 await toggleTool ( node ) ;
222370 }
371+
223372 // Toggle again to reset tool enablement state
224373 for ( let node of toolNodes ) {
225374 await toggleTool ( node ) ;
0 commit comments