forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			180 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* Any copyright is dedicated to the Public Domain.
 | |
|  * http://creativecommons.org/publicdomain/zero/1.0/ */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| const { UIState } = ChromeUtils.importESModule(
 | |
|   "resource://services-sync/UIState.sys.mjs"
 | |
| );
 | |
| 
 | |
| // This obj will be used in both tests
 | |
| // First test makes sure accepting the preferences matches these values
 | |
| // Second test makes sure the cancel dialog STILL matches these values
 | |
| const syncPrefs = {
 | |
|   "services.sync.engine.addons": false,
 | |
|   "services.sync.engine.bookmarks": true,
 | |
|   "services.sync.engine.history": true,
 | |
|   "services.sync.engine.tabs": false,
 | |
|   "services.sync.engine.prefs": false,
 | |
|   "services.sync.engine.passwords": false,
 | |
|   "services.sync.engine.addresses": false,
 | |
|   "services.sync.engine.creditcards": false,
 | |
| };
 | |
| 
 | |
| add_setup(async () => {
 | |
|   UIState._internal.notifyStateUpdated = () => {};
 | |
|   const origNotifyStateUpdated = UIState._internal.notifyStateUpdated;
 | |
|   const origGet = UIState.get;
 | |
|   UIState.get = () => {
 | |
|     return { status: UIState.STATUS_SIGNED_IN, email: "foo@bar.com" };
 | |
|   };
 | |
| 
 | |
|   registerCleanupFunction(() => {
 | |
|     UIState._internal.notifyStateUpdated = origNotifyStateUpdated;
 | |
|     UIState.get = origGet;
 | |
|   });
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * We don't actually enable sync here, but we just check that the preferences are correct
 | |
|  * when the callback gets hit (accepting/cancelling the dialog)
 | |
|  * See https://bugzilla.mozilla.org/show_bug.cgi?id=1584132.
 | |
|  */
 | |
| 
 | |
| add_task(async function testDialogAccept() {
 | |
|   await SpecialPowers.pushPrefEnv({
 | |
|     set: [["identity.fxaccounts.enabled", true]],
 | |
|   });
 | |
| 
 | |
|   await openPreferencesViaOpenPreferencesAPI("paneGeneral", {
 | |
|     leaveOpen: true,
 | |
|   });
 | |
| 
 | |
|   // This will check if the callback was actually called during the test
 | |
|   let callbackCalled = false;
 | |
| 
 | |
|   // Enabling all the sync UI is painful in tests, so we just open the dialog manually
 | |
|   let syncWindow = await openAndLoadSubDialog(
 | |
|     "chrome://browser/content/preferences/dialogs/syncChooseWhatToSync.xhtml",
 | |
|     null,
 | |
|     {},
 | |
|     () => {
 | |
|       for (const [prefKey, prefValue] of Object.entries(syncPrefs)) {
 | |
|         Assert.equal(
 | |
|           Services.prefs.getBoolPref(prefKey),
 | |
|           prefValue,
 | |
|           `${prefValue} is expected value`
 | |
|         );
 | |
|       }
 | |
|       callbackCalled = true;
 | |
|     }
 | |
|   );
 | |
| 
 | |
|   Assert.ok(syncWindow, "Choose what to sync window opened");
 | |
|   let syncChooseDialog = syncWindow.document.getElementById(
 | |
|     "syncChooseOptions"
 | |
|   );
 | |
|   let syncCheckboxes = syncChooseDialog.querySelectorAll(
 | |
|     "checkbox[preference]"
 | |
|   );
 | |
| 
 | |
|   // Adjust the checkbox values to the expectedValues in the list
 | |
|   [...syncCheckboxes].forEach(checkbox => {
 | |
|     if (syncPrefs[checkbox.getAttribute("preference")] !== checkbox.checked) {
 | |
|       checkbox.click();
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   syncChooseDialog.acceptDialog();
 | |
|   BrowserTestUtils.removeTab(gBrowser.selectedTab);
 | |
|   Assert.ok(callbackCalled, "Accept callback was called");
 | |
| });
 | |
| 
 | |
| add_task(async function testDialogCancel() {
 | |
|   const cancelSyncPrefs = {
 | |
|     "services.sync.engine.addons": true,
 | |
|     "services.sync.engine.bookmarks": false,
 | |
|     "services.sync.engine.history": true,
 | |
|     "services.sync.engine.tabs": true,
 | |
|     "services.sync.engine.prefs": false,
 | |
|     "services.sync.engine.passwords": true,
 | |
|     "services.sync.engine.addresses": true,
 | |
|     "services.sync.engine.creditcards": false,
 | |
|   };
 | |
| 
 | |
|   await SpecialPowers.pushPrefEnv({
 | |
|     set: [["identity.fxaccounts.enabled", true]],
 | |
|   });
 | |
| 
 | |
|   await openPreferencesViaOpenPreferencesAPI("paneGeneral", {
 | |
|     leaveOpen: true,
 | |
|   });
 | |
| 
 | |
|   // This will check if the callback was actually called during the test
 | |
|   let callbackCalled = false;
 | |
| 
 | |
|   // Enabling all the sync UI is painful in tests, so we just open the dialog manually
 | |
|   let syncWindow = await openAndLoadSubDialog(
 | |
|     "chrome://browser/content/preferences/dialogs/syncChooseWhatToSync.xhtml",
 | |
|     null,
 | |
|     {},
 | |
|     () => {
 | |
|       // We want to test against our previously accepted values in the last test
 | |
|       for (const [prefKey, prefValue] of Object.entries(syncPrefs)) {
 | |
|         Assert.equal(
 | |
|           Services.prefs.getBoolPref(prefKey),
 | |
|           prefValue,
 | |
|           `${prefValue} is expected value`
 | |
|         );
 | |
|       }
 | |
|       callbackCalled = true;
 | |
|     }
 | |
|   );
 | |
| 
 | |
|   ok(syncWindow, "Choose what to sync window opened");
 | |
|   let syncChooseDialog = syncWindow.document.getElementById(
 | |
|     "syncChooseOptions"
 | |
|   );
 | |
|   let syncCheckboxes = syncChooseDialog.querySelectorAll(
 | |
|     "checkbox[preference]"
 | |
|   );
 | |
| 
 | |
|   // This time we're adjusting to the cancel list
 | |
|   [...syncCheckboxes].forEach(checkbox => {
 | |
|     if (
 | |
|       cancelSyncPrefs[checkbox.getAttribute("preference")] !== checkbox.checked
 | |
|     ) {
 | |
|       checkbox.click();
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   syncChooseDialog.cancelDialog();
 | |
|   BrowserTestUtils.removeTab(gBrowser.selectedTab);
 | |
|   Assert.ok(callbackCalled, "Cancel callback was called");
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * Tests that this subdialog can be opened via
 | |
|  * about:preferences?action=choose-what-to-sync#sync
 | |
|  */
 | |
| add_task(async function testDialogLaunchFromURI() {
 | |
|   await SpecialPowers.pushPrefEnv({
 | |
|     set: [["identity.fxaccounts.enabled", true]],
 | |
|   });
 | |
| 
 | |
|   let dialogEventPromise = BrowserTestUtils.waitForEvent(
 | |
|     window,
 | |
|     "dialogopen",
 | |
|     true
 | |
|   );
 | |
|   await BrowserTestUtils.withNewTab(
 | |
|     "about:preferences?action=choose-what-to-sync#sync",
 | |
|     async browser => {
 | |
|       let dialogEvent = await dialogEventPromise;
 | |
|       Assert.equal(
 | |
|         dialogEvent.detail.dialog._frame.contentWindow.location,
 | |
|         "chrome://browser/content/preferences/dialogs/syncChooseWhatToSync.xhtml"
 | |
|       );
 | |
|     }
 | |
|   );
 | |
| });
 | 
