forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			178 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* Any copyright is dedicated to the Public Domain.
 | 
						|
 * http://creativecommons.org/publicdomain/zero/1.0/ */
 | 
						|
 | 
						|
"use strict";
 | 
						|
 | 
						|
const { UIState } = ChromeUtils.import("resource://services-sync/UIState.jsm");
 | 
						|
 | 
						|
// 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"
 | 
						|
      );
 | 
						|
    }
 | 
						|
  );
 | 
						|
});
 |