chromium/chrome/test/data/extensions/api_test/preference/lacros_secondary_profile/test.js

// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Preferences API test for extension controlled prefs where the main profile
// controls the underlying feature in ash, but secondary profile can still set
// the preference in the browser instance.
// Run with lacros_chrome_browsertests \
//     --gtest_filter=ExtensionPreferenceLacrosBrowserTest.SecondaryProfilePrefs
// Based on the "standard" extension test.

// The collection of preferences to test, split into objects with a "root"
// (the root object they preferences are exposed on) and a dictionary of
// preference name -> default value.
var preferencesToTest = [{
  root: chrome.proxy,
  preferences: {
    settings: {mode: 'system'},
  }
}];

function expect(expected, message) {
  return chrome.test.callbackPass(function(value) {
    chrome.test.assertEq(expected, value, message);
  });
}

// Verifies that the preference has the expected default value.
function expectDefault(prefName, defaultValue) {
  return expect(
      {value: defaultValue, levelOfControl: 'controllable_by_this_extension'},
      '`' + prefName + '` is expected to be the default, which is ' +
          defaultValue);
}

// Verifies that the preference is properly controlled by the extension.
function expectControlled(prefName, newValue) {
  return expect(
      {
        value: newValue,
        levelOfControl: 'controlled_by_this_extension',
      },
      '`' + prefName + '` is expected to be controlled by this extension.');
}

// Tests getting the preference value (which should be uncontrolled and have the
// default value).
function prefGetter(prefName, defaultValue) {
  this[prefName].get({}, expectDefault(prefName, defaultValue));
}

// Tests setting the preference value. For boolean prefs, it sets the new value
// to the inverse of the default, so that it should be controlled by this
// extension.
function prefSetter(prefName, defaultValue) {
  let newValue;
  if (prefName == 'settings') {
    newValue = {mode: 'direct'};
  } else {
    newValue = !defaultValue;
  }
  this[prefName].set({value: newValue}, chrome.test.callbackPass(function() {
    this[prefName].get({}, expectControlled(prefName, newValue));
  }.bind(this)));
}

// Tests clearing the preference value (to the inverse of the default, so that
// it should be the default value again).
function prefClearer(prefName, defaultValue) {
  this[prefName].clear({}, chrome.test.callbackPass(function() {
    this[prefName].get({}, expectDefault(prefName, defaultValue));
  }.bind(this)));
}

chrome.test.sendMessage('ready', function(message) {
  if (message != 'run test')
    return;

  chrome.test.runTests([
    function getPreferences() {
      for (let preferenceSet of preferencesToTest) {
        for (let key in preferenceSet.preferences) {
          prefGetter.call(
              preferenceSet.root, key, preferenceSet.preferences[key]);
        }
      }
    },
    function setGlobals() {
      for (let preferenceSet of preferencesToTest) {
        for (let key in preferenceSet.preferences) {
          prefSetter.call(
              preferenceSet.root, key, preferenceSet.preferences[key]);
        }
      }
    }
  ]);
});