blob: 94240e73fb7e472fa4ff67f50a6fce31346f53dd [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
cr.define('device_page_tests', function() {
/** @enum {string} */
const TestNames = {
DevicePage: 'device page',
Display: 'display',
Keyboard: 'keyboard',
Pointers: 'pointers',
Power: 'power',
Stylus: 'stylus',
};
/**
* @constructor
* @implements {settings.DevicePageBrowserProxy}
*/
function TestDevicePageBrowserProxy() {
this.keyboardShortcutViewerShown_ = 0;
this.updatePowerStatusCalled_ = 0;
this.requestPowerManagementSettingsCalled_ = 0;
this.requestNoteTakingApps_ = 0;
this.onNoteTakingAppsUpdated_ = null;
this.androidAppsReceived_ = false;
this.noteTakingApps_ = [];
this.setPreferredAppCount_ = 0;
this.setAppOnLockScreenCount_ = 0;
}
TestDevicePageBrowserProxy.prototype = {
/** override */
initializePointers: function() {
// Enable mouse and touchpad.
cr.webUIListenerCallback('has-mouse-changed', true);
cr.webUIListenerCallback('has-touchpad-changed', true);
},
/** override */
initializeStylus: function() {
// Enable stylus.
cr.webUIListenerCallback('has-stylus-changed', true);
},
/** override */
initializeKeyboard: function() {},
/** override */
showKeyboardShortcutViewer: function() {
this.keyboardShortcutViewerShown_++;
},
/** @override */
updatePowerStatus: function() {
this.updatePowerStatusCalled_++;
},
/** @override */
setPowerSource: function(powerSourceId) {
this.powerSourceId_ = powerSourceId;
},
/** @override */
requestPowerManagementSettings: function() {
this.requestPowerManagementSettingsCalled_++;
},
/** @override */
setIdleBehavior: function(behavior) {
this.idleBehavior_ = behavior;
},
/** @override */
setLidClosedBehavior: function(behavior) {
this.lidClosedBehavior_ = behavior;
},
/** @override */
setNoteTakingAppsUpdatedCallback: function(callback) {
this.onNoteTakingAppsUpdated_ = callback;
},
/** @override */
requestNoteTakingApps: function() {
this.requestNoteTakingApps_++;
},
/** @override */
setPreferredNoteTakingApp: function(appId) {
++this.setPreferredAppCount_;
let changed = false;
this.noteTakingApps_.forEach(function(app) {
changed = changed || app.preferred != (app.value == appId);
app.preferred = app.value == appId;
});
if (changed)
this.scheduleLockScreenAppsUpdated_();
},
/** @override */
setPreferredNoteTakingAppEnabledOnLockScreen: function(enabled) {
++this.setAppOnLockScreenCount_;
this.noteTakingApps_.forEach(function(app) {
if (enabled) {
if (app.preferred) {
assertEquals(
settings.NoteAppLockScreenSupport.SUPPORTED,
app.lockScreenSupport);
}
if (app.lockScreenSupport ==
settings.NoteAppLockScreenSupport.SUPPORTED) {
app.lockScreenSupport = settings.NoteAppLockScreenSupport.ENABLED;
}
} else {
if (app.preferred) {
assertEquals(
settings.NoteAppLockScreenSupport.ENABLED,
app.lockScreenSupport);
}
if (app.lockScreenSupport ==
settings.NoteAppLockScreenSupport.ENABLED) {
app.lockScreenSupport = settings.NoteAppLockScreenSupport.SUPPORTED;
}
}
});
this.scheduleLockScreenAppsUpdated_();
},
// Test interface:
/**
* Sets whether the app list contains Android apps.
* @param {boolean} Whether the list of Android note-taking apps was
* received.
*/
setAndroidAppsReceived: function(received) {
this.androidAppsReceived_ = received;
this.scheduleLockScreenAppsUpdated_();
},
/**
* @return {string} App id of the app currently selected as preferred.
*/
getPreferredNoteTakingAppId: function() {
const app = this.noteTakingApps_.find(function(existing) {
return existing.preferred;
});
return app ? app.value : '';
},
/**
* @return {settings.NoteAppLockScreenSupport | undefined} The lock screen
* support state of the app currently selected as preferred.
*/
getPreferredAppLockScreenState: function() {
const app = this.noteTakingApps_.find(function(existing) {
return existing.preferred;
});
return app ? app.lockScreenSupport : undefined;
},
/**
* Sets the current list of known note taking apps.
* @param {Array<!settings.NoteAppInfo>} The list of apps to set.
*/
setNoteTakingApps: function(apps) {
this.noteTakingApps_ = apps;
this.scheduleLockScreenAppsUpdated_();
},
/**
* Adds an app to the list of known note-taking apps.
* @param {!settings.NoteAppInfo}
*/
addNoteTakingApp: function(app) {
assert(!this.noteTakingApps_.find(function(existing) {
return existing.value === app.value;
}));
this.noteTakingApps_.push(app);
this.scheduleLockScreenAppsUpdated_();
},
/**
* Invokes the registered note taking apps update callback.
* @private
*/
scheduleLockScreenAppsUpdated_: function() {
this.onNoteTakingAppsUpdated_(
this.noteTakingApps_.map(function(app) {
return Object.assign({}, app);
}),
!this.androidAppsReceived_);
}
};
function getFakePrefs() {
return {
ash: {
night_light: {
enabled: {
key: 'ash.night_light.enabled',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: false,
},
color_temperature: {
key: 'ash.night_light.color_temperature',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 0,
},
schedule_type: {
key: 'ash.night_light.schedule_type',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 0,
},
custom_start_time: {
key: 'ash.night_light.custom_start_time',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 0,
},
custom_end_time: {
key: 'ash.night_light.custom_end_time',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 0,
},
},
},
settings: {
// TODO(afakhry): Write tests to validate the Night Light slider
// behavior with 24-hour setting.
clock: {
use_24hour_clock: {
key: 'settings.clock.use_24hour_clock',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: false,
},
},
enable_stylus_tools: {
key: 'settings.enable_stylus_tools',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: false,
},
launch_palette_on_eject_event: {
key: 'settings.launch_palette_on_eject_event',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: false,
},
restore_last_lock_screen_note: {
key: 'settings.restore_last_lock_screen_note',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: true,
},
touchpad: {
enable_tap_to_click: {
key: 'settings.touchpad.enable_tap_to_click',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: true,
},
enable_tap_dragging: {
key: 'settings.touchpad.enable_tap_dragging',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: false,
},
natural_scroll: {
key: 'settings.touchpad.natural_scroll',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: false,
},
sensitivity2: {
key: 'settings.touchpad.sensitivity2',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 3,
},
},
mouse: {
primary_right: {
key: 'settings.mouse.primary_right',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: false,
},
reverse_scroll: {
key: 'settings.mouse.reverse_scroll',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: false,
},
sensitivity2: {
key: 'settings.mouse.sensitivity2',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 4,
},
},
language: {
xkb_remap_search_key_to: {
key: 'settings.language.xkb_remap_search_key_to',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 0,
},
xkb_remap_control_key_to: {
key: 'settings.language.xkb_remap_control_key_to',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 1,
},
xkb_remap_alt_key_to: {
key: 'settings.language.xkb_remap_alt_key_to',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 2,
},
remap_caps_lock_key_to: {
key: 'settings.language.remap_caps_lock_key_to',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 4,
},
remap_diamond_key_to: {
key: 'settings.language.remap_diamond_key_to',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 3,
},
remap_escape_key_to: {
key: 'settings.language.remap_escape_key_to',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 5,
},
remap_backspace_key_to: {
key: 'settings.language.remap_backspace_key_to',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 6,
},
send_function_keys: {
key: 'settings.language.send_function_keys',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: false,
},
xkb_auto_repeat_enabled_r2: {
key: 'prefs.settings.language.xkb_auto_repeat_enabled_r2',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: true,
},
xkb_auto_repeat_delay_r2: {
key: 'settings.language.xkb_auto_repeat_delay_r2',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 500,
},
xkb_auto_repeat_interval_r2: {
key: 'settings.language.xkb_auto_repeat_interval_r2',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 500,
},
}
}
};
}
suite('SettingsDevicePage', function() {
/** @type {!SettingsDevicePage|undefined} */
let devicePage;
/** @type {!FakeSystemDisplay|undefined} */
let fakeSystemDisplay;
suiteSetup(function() {
// Disable animations so sub-pages open within one event loop.
testing.Test.disableAnimationsAndTransitions();
});
setup(function(done) {
fakeSystemDisplay = new settings.FakeSystemDisplay();
settings.display.systemDisplayApi = fakeSystemDisplay;
PolymerTest.clearBody();
settings.navigateTo(settings.routes.BASIC);
devicePage = document.createElement('settings-device-page');
devicePage.prefs = getFakePrefs();
settings.DevicePageBrowserProxyImpl.instance_ =
new TestDevicePageBrowserProxy();
// settings-animated-pages expects a parent with data-page set.
const basicPage = document.createElement('div');
basicPage.dataset.page = 'basic';
basicPage.appendChild(devicePage);
document.body.appendChild(basicPage);
// Allow the light DOM to be distributed to settings-animated-pages.
setTimeout(done);
});
/** @return {!Promise<!HTMLElement>} */
function showAndGetDeviceSubpage(subpage, expectedRoute) {
const row = assert(devicePage.$$(`#main #${subpage}Row`));
row.click();
assertEquals(expectedRoute, settings.getCurrentRoute());
const page = devicePage.$$('settings-' + subpage);
assert(page);
return Promise.resolve(page);
}
/**
* @param {settings.IdleBehavior} idleBehavior
* @param {boolean} idleControlled
* @param {settings.LidClosedBehavior} lidClosedBehavior
* @param {boolean} lidClosedControlled
* @param {boolean} hasLid
*/
function sendPowerManagementSettings(
idleBehavior, idleControlled, lidClosedBehavior, lidClosedControlled,
hasLid) {
cr.webUIListenerCallback('power-management-settings-changed', {
idleBehavior: idleBehavior,
idleControlled: idleControlled,
lidClosedBehavior: lidClosedBehavior,
lidClosedControlled: lidClosedControlled,
hasLid: hasLid,
});
Polymer.dom.flush();
}
/**
* @param {!HTMLElement} select
* @param {!value} string
*/
function selectValue(select, value) {
select.value = value;
select.dispatchEvent(new CustomEvent('change'));
Polymer.dom.flush();
}
/**
* @param {!HTMLElement} pointersPage
* @param {boolean} expected
*/
function expectNaturalScrollValue(pointersPage, expected) {
const naturalScrollOff = pointersPage.$$('cr-radio-button[name="false"]');
const naturalScrollOn = pointersPage.$$('cr-radio-button[name="true"]');
assertTrue(!!naturalScrollOff);
assertTrue(!!naturalScrollOn);
expectEquals(!expected, naturalScrollOff.checked);
expectEquals(expected, naturalScrollOn.checked);
expectEquals(
expected, devicePage.prefs.settings.touchpad.natural_scroll.value);
}
test(assert(TestNames.DevicePage), function() {
expectLT(0, devicePage.$$('#pointersRow').offsetHeight);
expectLT(0, devicePage.$$('#keyboardRow').offsetHeight);
expectLT(0, devicePage.$$('#displayRow').offsetHeight);
cr.webUIListenerCallback('has-mouse-changed', false);
expectLT(0, devicePage.$$('#pointersRow').offsetHeight);
cr.webUIListenerCallback('has-touchpad-changed', false);
expectEquals(0, devicePage.$$('#pointersRow').offsetHeight);
cr.webUIListenerCallback('has-mouse-changed', true);
expectLT(0, devicePage.$$('#pointersRow').offsetHeight);
});
suite(assert(TestNames.Pointers), function() {
let pointersPage;
setup(function() {
return showAndGetDeviceSubpage('pointers', settings.routes.POINTERS)
.then(function(page) {
pointersPage = page;
});
});
test('subpage responds to pointer attach/detach', function() {
assertEquals(settings.routes.POINTERS, settings.getCurrentRoute());
assertLT(0, pointersPage.$$('#mouse').offsetHeight);
assertLT(0, pointersPage.$$('#touchpad').offsetHeight);
assertLT(0, pointersPage.$$('#mouse h2').offsetHeight);
assertLT(0, pointersPage.$$('#touchpad h2').offsetHeight);
cr.webUIListenerCallback('has-touchpad-changed', false);
assertEquals(settings.routes.POINTERS, settings.getCurrentRoute());
assertLT(0, pointersPage.$$('#mouse').offsetHeight);
assertEquals(0, pointersPage.$$('#touchpad').offsetHeight);
assertEquals(0, pointersPage.$$('#mouse h2').offsetHeight);
assertEquals(0, pointersPage.$$('#touchpad h2').offsetHeight);
cr.webUIListenerCallback('has-mouse-changed', false);
assertEquals(settings.routes.DEVICE, settings.getCurrentRoute());
assertEquals(0, devicePage.$$('#main #pointersRow').offsetHeight);
cr.webUIListenerCallback('has-touchpad-changed', true);
assertLT(0, devicePage.$$('#main #pointersRow').offsetHeight);
return showAndGetDeviceSubpage('pointers', settings.routes.POINTERS)
.then(function(page) {
assertEquals(0, pointersPage.$$('#mouse').offsetHeight);
assertLT(0, pointersPage.$$('#touchpad').offsetHeight);
assertEquals(0, pointersPage.$$('#mouse h2').offsetHeight);
assertEquals(0, pointersPage.$$('#touchpad h2').offsetHeight);
cr.webUIListenerCallback('has-mouse-changed', true);
assertEquals(
settings.routes.POINTERS, settings.getCurrentRoute());
assertLT(0, pointersPage.$$('#mouse').offsetHeight);
assertLT(0, pointersPage.$$('#touchpad').offsetHeight);
assertLT(0, pointersPage.$$('#mouse h2').offsetHeight);
assertLT(0, pointersPage.$$('#touchpad h2').offsetHeight);
});
});
test('mouse', function() {
expectLT(0, pointersPage.$$('#mouse').offsetHeight);
expectFalse(pointersPage.$$('#mouse settings-toggle-button').checked);
const slider = assert(pointersPage.$$('#mouse settings-slider'));
expectEquals(4, slider.pref.value);
MockInteractions.pressAndReleaseKeyOn(
slider.$$('cr-slider'), 37, [], 'ArrowLeft');
expectEquals(3, devicePage.prefs.settings.mouse.sensitivity2.value);
pointersPage.set('prefs.settings.mouse.sensitivity2.value', 5);
expectEquals(5, slider.pref.value);
});
test('touchpad', function() {
expectLT(0, pointersPage.$$('#touchpad').offsetHeight);
expectTrue(pointersPage.$$('#touchpad #enableTapToClick').checked);
expectFalse(pointersPage.$$('#touchpad #enableTapDragging').checked);
const slider = assert(pointersPage.$$('#touchpad settings-slider'));
expectEquals(3, slider.pref.value);
MockInteractions.pressAndReleaseKeyOn(
slider.$$('cr-slider'), 39 /* right */, [], 'ArrowRight');
expectEquals(4, devicePage.prefs.settings.touchpad.sensitivity2.value);
pointersPage.set('prefs.settings.touchpad.sensitivity2.value', 2);
expectEquals(2, slider.pref.value);
});
test('link doesn\'t activate control', function() {
expectNaturalScrollValue(pointersPage, false);
// Tapping the link shouldn't enable the radio button.
const naturalScrollOff =
pointersPage.$$('cr-radio-button[name="false"]');
const naturalScrollOn = pointersPage.$$('cr-radio-button[name="true"]');
const a = naturalScrollOn.querySelector('a');
// Prevent actually opening a link, which would block test.
a.removeAttribute('href');
a.click();
expectNaturalScrollValue(pointersPage, false);
naturalScrollOn.click();
expectNaturalScrollValue(pointersPage, true);
devicePage.set('prefs.settings.touchpad.natural_scroll.value', false);
expectNaturalScrollValue(pointersPage, false);
/**
* MockInteraction's pressEnter does not sufficiently set all key-event
* properties.
* @param {!HTMLElement} element
* @param {string} keyCode
* @param {string} keyName
*/
function triggerKeyEvents(element, keyCode, keyName) {
['keydown', 'keypress', 'keyup'].forEach(event => {
MockInteractions.keyEventOn(
element, event, keyCode, undefined, keyName);
});
}
// Enter on the link shouldn't enable the radio button either.
triggerKeyEvents(a, 'Enter', 'Enter');
PolymerTest.flushTasks();
expectNaturalScrollValue(pointersPage, false);
pointersPage.$$('settings-radio-group').selected = '';
const falseRadio = pointersPage.$$('cr-radio-button[name="false"]');
assertTrue(!!falseRadio);
assertFalse(falseRadio.checked);
triggerKeyEvents(naturalScrollOff, 'Space', ' ');
PolymerTest.flushTasks();
expectNaturalScrollValue(pointersPage, false);
});
});
test(assert(TestNames.Keyboard), function() {
const name = k => `prefs.settings.language.${k}.value`;
const get = k => devicePage.get(name(k));
const set = (k, v) => devicePage.set(name(k), v);
let keyboardPage;
let collapse;
// Open the keyboard subpage.
return showAndGetDeviceSubpage('keyboard', settings.routes.KEYBOARD)
.then(function(page) {
keyboardPage = page;
// Initially, the optional keys are hidden.
expectFalse(!!keyboardPage.$$('#capsLockKey'));
expectFalse(!!keyboardPage.$$('#diamondKey'));
// Pretend the diamond key is available, and no internal keyboard.
let keyboardParams = {
'showCapsLock': false,
'showDiamondKey': true,
'showExternalMetaKey': false,
'showAppleCommandKey': false,
'hasInternalKeyboard': false,
};
cr.webUIListenerCallback('show-keys-changed', keyboardParams);
Polymer.dom.flush();
expectFalse(!!keyboardPage.$$('#internalSearchKey'));
expectFalse(!!keyboardPage.$$('#capsLockKey'));
expectTrue(!!keyboardPage.$$('#diamondKey'));
expectFalse(!!keyboardPage.$$('#externalMetaKey'));
expectFalse(!!keyboardPage.$$('#externalCommandKey'));
// Pretend a Caps Lock key is now available.
keyboardParams['showCapsLock'] = true;
cr.webUIListenerCallback('show-keys-changed', keyboardParams);
Polymer.dom.flush();
expectFalse(!!keyboardPage.$$('#internalSearchKey'));
expectTrue(!!keyboardPage.$$('#capsLockKey'));
expectTrue(!!keyboardPage.$$('#diamondKey'));
expectFalse(!!keyboardPage.$$('#externalMetaKey'));
expectFalse(!!keyboardPage.$$('#externalCommandKey'));
// Add a non-Apple external keyboard.
keyboardParams['showExternalMetaKey'] = true;
cr.webUIListenerCallback('show-keys-changed', keyboardParams);
Polymer.dom.flush();
expectFalse(!!keyboardPage.$$('#internalSearchKey'));
expectTrue(!!keyboardPage.$$('#capsLockKey'));
expectTrue(!!keyboardPage.$$('#diamondKey'));
expectTrue(!!keyboardPage.$$('#externalMetaKey'));
expectFalse(!!keyboardPage.$$('#externalCommandKey'));
// Add an Apple keyboard.
keyboardParams['showAppleCommandKey'] = true;
cr.webUIListenerCallback('show-keys-changed', keyboardParams);
Polymer.dom.flush();
expectFalse(!!keyboardPage.$$('#internalSearchKey'));
expectTrue(!!keyboardPage.$$('#capsLockKey'));
expectTrue(!!keyboardPage.$$('#diamondKey'));
expectTrue(!!keyboardPage.$$('#externalMetaKey'));
expectTrue(!!keyboardPage.$$('#externalCommandKey'));
// Add an internal keyboard.
keyboardParams['hasInternalKeyboard'] = true;
cr.webUIListenerCallback('show-keys-changed', keyboardParams);
Polymer.dom.flush();
expectTrue(!!keyboardPage.$$('#internalSearchKey'));
expectTrue(!!keyboardPage.$$('#capsLockKey'));
expectTrue(!!keyboardPage.$$('#diamondKey'));
expectTrue(!!keyboardPage.$$('#externalMetaKey'));
expectTrue(!!keyboardPage.$$('#externalCommandKey'));
collapse = keyboardPage.$$('iron-collapse');
assertTrue(!!collapse);
expectTrue(collapse.opened);
expectEquals(500, keyboardPage.$$('#delaySlider').pref.value);
expectEquals(500, keyboardPage.$$('#repeatRateSlider').pref.value);
// Test interaction with the settings-slider's underlying cr-slider.
MockInteractions.pressAndReleaseKeyOn(
keyboardPage.$$('#delaySlider').$$('cr-slider'), 37 /* left */,
[], 'ArrowLeft');
MockInteractions.pressAndReleaseKeyOn(
keyboardPage.$$('#repeatRateSlider').$$('cr-slider'), 39, [],
'ArrowRight');
expectEquals(1000, get('xkb_auto_repeat_delay_r2'));
expectEquals(300, get('xkb_auto_repeat_interval_r2'));
// Test sliders change when prefs change.
set('xkb_auto_repeat_delay_r2', 1500);
expectEquals(1500, keyboardPage.$$('#delaySlider').pref.value);
set('xkb_auto_repeat_interval_r2', 2000);
expectEquals(2000, keyboardPage.$$('#repeatRateSlider').pref.value);
// Test sliders round to nearest value when prefs change.
set('xkb_auto_repeat_delay_r2', 600);
return PolymerTest.flushTasks();
})
.then(() => {
expectEquals(500, keyboardPage.$$('#delaySlider').pref.value);
set('xkb_auto_repeat_interval_r2', 45);
return PolymerTest.flushTasks();
})
.then(() => {
expectEquals(50, keyboardPage.$$('#repeatRateSlider').pref.value);
set('xkb_auto_repeat_enabled_r2', false);
expectFalse(collapse.opened);
// Test keyboard shortcut viewer button.
keyboardPage.$$('#keyboardShortcutViewer').click();
expectEquals(
1,
settings.DevicePageBrowserProxyImpl.getInstance()
.keyboardShortcutViewerShown_);
});
});
test(assert(TestNames.Display), function() {
const addDisplay = function(n) {
const display = {
id: 'fakeDisplayId' + n,
name: 'fakeDisplayName' + n,
mirroring: '',
isPrimary: n == 1,
rotation: 0,
modes: [],
bounds: {
left: 0,
top: 0,
width: 1920,
height: 1080,
},
availableDisplayZoomFactors: [1, 1.25, 1.5, 2],
};
fakeSystemDisplay.addDisplayForTest(display);
};
let displayPage;
return Promise
.all([
// Get the display sub-page.
showAndGetDeviceSubpage('display', settings.routes.DISPLAY)
.then(function(page) {
displayPage = page;
}),
// Wait for the initial call to getInfo.
fakeSystemDisplay.getInfoCalled.promise,
])
.then(function() {
// Add a display.
addDisplay(1);
fakeSystemDisplay.onDisplayChanged.callListeners();
return Promise.all([
fakeSystemDisplay.getInfoCalled.promise,
fakeSystemDisplay.getLayoutCalled.promise,
]);
})
.then(function() {
// There should be a single display which should be primary and
// selected. Mirroring should be disabled.
expectEquals(1, displayPage.displays.length);
expectEquals(
displayPage.displays[0].id, displayPage.selectedDisplay.id);
expectEquals(
displayPage.displays[0].id, displayPage.primaryDisplayId);
expectFalse(displayPage.showMirror_(false, displayPage.displays));
expectFalse(displayPage.isMirrored_(displayPage.displays));
// Add a second display.
addDisplay(2);
fakeSystemDisplay.onDisplayChanged.callListeners();
return Promise.all([
fakeSystemDisplay.getInfoCalled.promise,
fakeSystemDisplay.getLayoutCalled.promise,
new Promise(function(resolve, reject) {
setTimeout(resolve);
})
]);
})
.then(function() {
// There should be two displays, the first should be primary and
// selected. Mirroring should be enabled but set to false.
expectEquals(2, displayPage.displays.length);
expectEquals(
displayPage.displays[0].id, displayPage.selectedDisplay.id);
expectEquals(
displayPage.displays[0].id, displayPage.primaryDisplayId);
expectTrue(displayPage.showMirror_(false, displayPage.displays));
expectFalse(displayPage.isMirrored_(displayPage.displays));
// Select the second display and make it primary. Also change the
// orientation of the second display.
const displayLayout = displayPage.$$('#displayLayout');
assertTrue(!!displayLayout);
const displayDiv = displayLayout.$$('#_fakeDisplayId2');
assertTrue(!!displayDiv);
displayDiv.click();
expectEquals(
displayPage.displays[1].id, displayPage.selectedDisplay.id);
displayPage.updatePrimaryDisplay_({target: {value: '0'}});
displayPage.onOrientationChange_({target: {value: '90'}});
fakeSystemDisplay.onDisplayChanged.callListeners();
return Promise.all([
fakeSystemDisplay.getInfoCalled.promise,
fakeSystemDisplay.getLayoutCalled.promise,
new Promise(function(resolve, reject) {
setTimeout(resolve);
})
]);
})
.then(function() {
// Confirm that the second display is selected, primary, and
// rotated.
expectEquals(2, displayPage.displays.length);
expectEquals(
displayPage.displays[1].id, displayPage.selectedDisplay.id);
expectTrue(displayPage.displays[1].isPrimary);
expectEquals(
displayPage.displays[1].id, displayPage.primaryDisplayId);
expectEquals(90, displayPage.displays[1].rotation);
// Mirror the displays.
displayPage.onMirroredTap_({target: {blur: function() {}}});
fakeSystemDisplay.onDisplayChanged.callListeners();
return Promise.all([
fakeSystemDisplay.getInfoCalled.promise,
fakeSystemDisplay.getLayoutCalled.promise,
new Promise(function(resolve, reject) {
setTimeout(resolve);
})
]);
})
.then(function() {
// Confirm that there is now only one display and that it is primary
// and mirroring is enabled.
expectEquals(1, displayPage.displays.length);
expectEquals(
displayPage.displays[0].id, displayPage.selectedDisplay.id);
expectTrue(displayPage.displays[0].isPrimary);
expectTrue(displayPage.showMirror_(false, displayPage.displays));
expectTrue(displayPage.isMirrored_(displayPage.displays));
// Ensure that the zoom value remains unchanged while draggging.
function pointerEvent(eventType, ratio) {
const crSlider = displayPage.$.displaySizeSlider.$.slider;
const rect = crSlider.$.barContainer.getBoundingClientRect();
crSlider.dispatchEvent(new PointerEvent(eventType, {
buttons: 1,
pointerId: 1,
clientX: rect.left + (ratio * rect.width),
}));
}
expectEquals(1, displayPage.selectedZoomPref_.value);
pointerEvent('pointerdown', .6);
expectEquals(1, displayPage.selectedZoomPref_.value);
pointerEvent('pointermove', .3);
expectEquals(1, displayPage.selectedZoomPref_.value);
pointerEvent('pointerup', 0);
expectEquals(1.25, displayPage.selectedZoomPref_.value);
});
});
suite(assert(TestNames.Power), function() {
/**
* Sets power sources using a deep copy of |sources|.
* @param {Array<settings.PowerSource>} sources
* @param {string} powerSourceId
* @param {bool} isLowPowerCharger
*/
function setPowerSources(sources, powerSourceId, isLowPowerCharger) {
const sourcesCopy = sources.map(function(source) {
return Object.assign({}, source);
});
cr.webUIListenerCallback(
'power-sources-changed', sourcesCopy, powerSourceId,
isLowPowerCharger);
}
suite('no power settings', function() {
suiteSetup(function() {
// Never show power settings.
loadTimeData.overrideValues({
enablePowerSettings: false,
});
});
test('power row hidden', function() {
assertEquals(null, devicePage.$$('#powerRow'));
assertEquals(
0,
settings.DevicePageBrowserProxyImpl.getInstance()
.updatePowerStatusCalled_);
});
});
suite('power settings', function() {
let powerPage;
let powerSourceRow;
let powerSourceSelect;
let idleSelect;
let lidClosedToggle;
suiteSetup(function() {
// Always show power settings.
loadTimeData.overrideValues({
enablePowerSettings: true,
});
});
setup(function() {
return showAndGetDeviceSubpage('power', settings.routes.POWER)
.then(function(page) {
powerPage = page;
powerSourceRow = assert(powerPage.$$('#powerSourceRow'));
powerSourceSelect = assert(powerPage.$$('#powerSource'));
assertEquals(
1,
settings.DevicePageBrowserProxyImpl.getInstance()
.updatePowerStatusCalled_);
idleSelect = assert(powerPage.$$('#idleSelect'));
lidClosedToggle = assert(powerPage.$$('#lidClosedToggle'));
assertEquals(
1,
settings.DevicePageBrowserProxyImpl.getInstance()
.requestPowerManagementSettingsCalled_);
sendPowerManagementSettings(
settings.IdleBehavior.DISPLAY_OFF_SLEEP,
false /* idleControlled */,
settings.LidClosedBehavior.SUSPEND,
false /* lidClosedControlled */, true /* hasLid */);
});
});
test('no battery', function() {
const batteryStatus = {
present: false,
charging: false,
calculating: false,
percent: -1,
statusText: '',
};
cr.webUIListenerCallback(
'battery-status-changed', Object.assign({}, batteryStatus));
Polymer.dom.flush();
// Power source row is hidden since there's no battery.
assertTrue(powerSourceRow.hidden);
});
test('power sources', function() {
const batteryStatus = {
present: true,
charging: false,
calculating: false,
percent: 50,
statusText: '5 hours left',
};
cr.webUIListenerCallback(
'battery-status-changed', Object.assign({}, batteryStatus));
setPowerSources([], '', false);
Polymer.dom.flush();
// Power sources row is visible but dropdown is hidden.
assertFalse(powerSourceRow.hidden);
assertTrue(powerSourceSelect.hidden);
// Attach a dual-role USB device.
const powerSource = {
id: '2',
is_dedicated_charger: false,
description: 'USB-C device',
};
setPowerSources([powerSource], '', false);
Polymer.dom.flush();
// "Battery" should be selected.
assertFalse(powerSourceSelect.hidden);
assertEquals('', powerSourceSelect.value);
// Select the power source.
setPowerSources([powerSource], powerSource.id, true);
Polymer.dom.flush();
assertFalse(powerSourceSelect.hidden);
assertEquals(powerSource.id, powerSourceSelect.value);
// Send another power source; the first should still be selected.
const otherPowerSource = Object.assign({}, powerSource);
otherPowerSource.id = '3';
setPowerSources(
[otherPowerSource, powerSource], powerSource.id, true);
Polymer.dom.flush();
assertFalse(powerSourceSelect.hidden);
assertEquals(powerSource.id, powerSourceSelect.value);
});
test('choose power source', function() {
const batteryStatus = {
present: true,
charging: false,
calculating: false,
percent: 50,
statusText: '5 hours left',
};
cr.webUIListenerCallback(
'battery-status-changed', Object.assign({}, batteryStatus));
// Attach a dual-role USB device.
const powerSource = {
id: '3',
is_dedicated_charger: false,
description: 'USB-C device',
};
setPowerSources([powerSource], '', false);
Polymer.dom.flush();
// Select the device.
selectValue(powerSourceSelect, powerSourceSelect.children[1].value);
expectEquals(
powerSource.id,
settings.DevicePageBrowserProxyImpl.getInstance().powerSourceId_);
});
test('set idle behavior', function() {
selectValue(idleSelect, settings.IdleBehavior.DISPLAY_ON);
expectEquals(
settings.IdleBehavior.DISPLAY_ON,
settings.DevicePageBrowserProxyImpl.getInstance().idleBehavior_);
selectValue(idleSelect, settings.IdleBehavior.DISPLAY_OFF);
expectEquals(
settings.IdleBehavior.DISPLAY_OFF,
settings.DevicePageBrowserProxyImpl.getInstance().idleBehavior_);
});
test('set lid behavior', function() {
const sendLid = function(lidBehavior) {
sendPowerManagementSettings(
settings.IdleBehavior.DISPLAY_OFF, false /* idleControlled */,
lidBehavior, false /* lidClosedControlled */,
true /* hasLid */);
};
sendLid(settings.LidClosedBehavior.SUSPEND);
assertTrue(lidClosedToggle.checked);
lidClosedToggle.$$('#control').click();
expectEquals(
settings.LidClosedBehavior.DO_NOTHING,
settings.DevicePageBrowserProxyImpl.getInstance()
.lidClosedBehavior_);
sendLid(settings.LidClosedBehavior.DO_NOTHING);
expectFalse(lidClosedToggle.checked);
lidClosedToggle.$$('#control').click();
expectEquals(
settings.LidClosedBehavior.SUSPEND,
settings.DevicePageBrowserProxyImpl.getInstance()
.lidClosedBehavior_);
sendLid(settings.LidClosedBehavior.SUSPEND);
expectTrue(lidClosedToggle.checked);
});
test('display idle and lid behavior', function() {
return new Promise(function(resolve) {
sendPowerManagementSettings(
settings.IdleBehavior.DISPLAY_ON,
false /* idleControlled */,
settings.LidClosedBehavior.DO_NOTHING,
false /* lidClosedControlled */, true /* hasLid */);
powerPage.async(resolve);
})
.then(function() {
expectEquals(
settings.IdleBehavior.DISPLAY_ON.toString(),
idleSelect.value);
expectFalse(idleSelect.disabled);
expectEquals(null, powerPage.$$('#idleControlledIndicator'));
expectEquals(
loadTimeData.getString('powerLidSleepLabel'),
lidClosedToggle.label);
expectFalse(lidClosedToggle.checked);
expectFalse(lidClosedToggle.isPrefEnforced());
})
.then(function() {
sendPowerManagementSettings(
settings.IdleBehavior.DISPLAY_OFF,
false /* idleControlled */,
settings.LidClosedBehavior.SUSPEND,
false /* lidClosedControlled */, true /* hasLid */);
return new Promise(function(resolve) {
powerPage.async(resolve);
});
})
.then(function() {
expectEquals(
settings.IdleBehavior.DISPLAY_OFF.toString(),
idleSelect.value);
expectFalse(idleSelect.disabled);
expectEquals(null, powerPage.$$('#idleControlledIndicator'));
expectEquals(
loadTimeData.getString('powerLidSleepLabel'),
lidClosedToggle.label);
expectTrue(lidClosedToggle.checked);
expectFalse(lidClosedToggle.isPrefEnforced());
});
});
test('display controlled idle and lid behavior', function() {
// When settings are controlled, the controls should be disabled and
// the indicators should be shown.
return new Promise(function(resolve) {
sendPowerManagementSettings(
settings.IdleBehavior.OTHER, true /* idleControlled */,
settings.LidClosedBehavior.SHUT_DOWN,
true /* lidClosedControlled */, true /* hasLid */);
powerPage.async(resolve);
})
.then(function() {
expectEquals(
settings.IdleBehavior.OTHER.toString(), idleSelect.value);
expectTrue(idleSelect.disabled);
expectNotEquals(null, powerPage.$$('#idleControlledIndicator'));
expectEquals(
loadTimeData.getString('powerLidShutDownLabel'),
lidClosedToggle.label);
expectTrue(lidClosedToggle.checked);
expectTrue(lidClosedToggle.isPrefEnforced());
})
.then(function() {
sendPowerManagementSettings(
settings.IdleBehavior.DISPLAY_OFF,
true /* idleControlled */,
settings.LidClosedBehavior.STOP_SESSION,
true /* lidClosedControlled */, true /* hasLid */);
return new Promise(function(resolve) {
powerPage.async(resolve);
});
})
.then(function() {
expectEquals(
settings.IdleBehavior.DISPLAY_OFF.toString(),
idleSelect.value);
expectTrue(idleSelect.disabled);
expectNotEquals(null, powerPage.$$('#idleControlledIndicator'));
expectEquals(
loadTimeData.getString('powerLidSignOutLabel'),
lidClosedToggle.label);
expectTrue(lidClosedToggle.checked);
expectTrue(lidClosedToggle.isPrefEnforced());
});
});
test('hide lid behavior when lid not present', function() {
return new Promise(function(resolve) {
expectFalse(powerPage.$$('#lidClosedToggle').hidden);
sendPowerManagementSettings(
settings.IdleBehavior.DISPLAY_OFF_SLEEP,
false /* idleControlled */,
settings.LidClosedBehavior.SUSPEND,
false /* lidClosedControlled */, false /* hasLid */);
powerPage.async(resolve);
})
.then(function() {
expectTrue(powerPage.$$('#lidClosedToggle').hidden);
});
});
});
});
suite(assert(TestNames.Stylus), function() {
let stylusPage;
let appSelector;
let browserProxy;
let noAppsDiv;
let waitingDiv;
// Shorthand for settings.NoteAppLockScreenSupport.
let LockScreenSupport;
suiteSetup(function() {
// Always show stylus settings.
loadTimeData.overrideValues({
hasInternalStylus: true,
});
});
setup(function() {
return showAndGetDeviceSubpage('stylus', settings.routes.STYLUS)
.then(function(page) {
stylusPage = page;
browserProxy = settings.DevicePageBrowserProxyImpl.getInstance();
appSelector = assert(page.$$('#selectApp'));
noAppsDiv = assert(page.$$('#no-apps'));
waitingDiv = assert(page.$$('#waiting'));
LockScreenSupport = settings.NoteAppLockScreenSupport;
assertEquals(1, browserProxy.requestNoteTakingApps_);
assert(browserProxy.onNoteTakingAppsUpdated_);
});
});
// Helper function to allocate a note app entry.
function entry(name, value, preferred, lockScreenSupport) {
return {
name: name,
value: value,
preferred: preferred,
lockScreenSupport: lockScreenSupport
};
}
/** @return {?Element} */
function noteTakingAppLockScreenSettings() {
return stylusPage.$$('#note-taking-app-lock-screen-settings');
}
/** @return {?Element} */
function enableAppOnLockScreenToggle() {
return stylusPage.$$('#enable-app-on-lock-screen-toggle');
}
/** @return {?Element} */
function enableAppOnLockScreenPolicyIndicator() {
return stylusPage.$$('#enable-app-on-lock-screen-policy-indicator');
}
/** @return {?Element} */
function enableAppOnLockScreenToggleLabel() {
return stylusPage.$$('#lock-screen-toggle-label');
}
/** @return {?Element} */
function keepLastNoteOnLockScreenToggle() {
return stylusPage.$$('#keep-last-note-on-lock-screen-toggle');
}
/**
* @param {?Element} element
* @return {boolean}
*/
function isVisible(element) {
return !!element && element.offsetWidth > 0 && element.offsetHeight > 0;
}
test('stylus tools prefs', function() {
// Both stylus tools prefs are intially false.
assertFalse(devicePage.prefs.settings.enable_stylus_tools.value);
assertFalse(
devicePage.prefs.settings.launch_palette_on_eject_event.value);
// Since both prefs are intially false, the launch palette on eject pref
// toggle is disabled.
expectTrue(isVisible(stylusPage.$$('#enableStylusToolsToggle')));
expectTrue(
isVisible(stylusPage.$$('#launchPaletteOnEjectEventToggle')));
expectTrue(stylusPage.$$('#launchPaletteOnEjectEventToggle').disabled);
expectFalse(devicePage.prefs.settings.enable_stylus_tools.value);
expectFalse(
devicePage.prefs.settings.launch_palette_on_eject_event.value);
// Tapping the enable stylus tools pref causes the launch palette on
// eject pref toggle to not be disabled anymore.
stylusPage.$$('#enableStylusToolsToggle').click();
expectTrue(devicePage.prefs.settings.enable_stylus_tools.value);
expectFalse(stylusPage.$$('#launchPaletteOnEjectEventToggle').disabled);
stylusPage.$$('#launchPaletteOnEjectEventToggle').click();
expectTrue(
devicePage.prefs.settings.launch_palette_on_eject_event.value);
});
test('choose first app if no preferred ones', function() {
// Selector chooses the first value in list if there is no preferred
// value set.
browserProxy.setNoteTakingApps([
entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
entry('n2', 'v2', false, LockScreenSupport.NOT_SUPPORTED)
]);
Polymer.dom.flush();
assertEquals('v1', appSelector.value);
});
test('choose prefered app if exists', function() {
// Selector chooses the preferred value if set.
browserProxy.setNoteTakingApps([
entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
entry('n2', 'v2', true, LockScreenSupport.NOT_SUPPORTED)
]);
Polymer.dom.flush();
assertEquals('v2', appSelector.value);
});
test('change preferred app', function() {
// Load app list.
browserProxy.setNoteTakingApps([
entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
entry('n2', 'v2', true, LockScreenSupport.NOT_SUPPORTED)
]);
Polymer.dom.flush();
assertEquals(0, browserProxy.setPreferredAppCount_);
assertEquals('v2', browserProxy.getPreferredNoteTakingAppId());
// Update select element to new value, verify browser proxy is called.
appSelector.value = 'v1';
stylusPage.onSelectedAppChanged_();
assertEquals(1, browserProxy.setPreferredAppCount_);
assertEquals('v1', browserProxy.getPreferredNoteTakingAppId());
});
test('preferred app does not change without interaction', function() {
// Pass various types of data to page, verify the preferred note-app
// does not change.
browserProxy.setNoteTakingApps([]);
Polymer.dom.flush();
assertEquals('', browserProxy.getPreferredNoteTakingAppId());
browserProxy.onNoteTakingAppsUpdated_([], true);
Polymer.dom.flush();
assertEquals('', browserProxy.getPreferredNoteTakingAppId());
browserProxy.addNoteTakingApp(
entry('n', 'v', false, LockScreenSupport.NOT_SUPPORTED));
Polymer.dom.flush();
assertEquals('', browserProxy.getPreferredNoteTakingAppId());
browserProxy.setNoteTakingApps([
entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
entry('n2', 'v2', true, LockScreenSupport.NOT_SUPPORTED)
]);
Polymer.dom.flush();
assertEquals(0, browserProxy.setPreferredAppCount_);
assertEquals('v2', browserProxy.getPreferredNoteTakingAppId());
});
test('app-visibility', function() {
// No apps available.
browserProxy.setNoteTakingApps([]);
assert(noAppsDiv.hidden);
assert(!waitingDiv.hidden);
assert(appSelector.hidden);
// Waiting for apps to finish loading.
browserProxy.setAndroidAppsReceived(true);
assert(!noAppsDiv.hidden);
assert(waitingDiv.hidden);
assert(appSelector.hidden);
// Apps loaded, show selector.
browserProxy.addNoteTakingApp(
entry('n', 'v', false, LockScreenSupport.NOT_SUPPORTED));
assert(noAppsDiv.hidden);
assert(waitingDiv.hidden);
assert(!appSelector.hidden);
// Waiting for Android apps again.
browserProxy.setAndroidAppsReceived(false);
assert(noAppsDiv.hidden);
assert(!waitingDiv.hidden);
assert(appSelector.hidden);
browserProxy.setAndroidAppsReceived(true);
assert(noAppsDiv.hidden);
assert(waitingDiv.hidden);
assert(!appSelector.hidden);
});
test('enabled-on-lock-screen', function() {
expectFalse(isVisible(noteTakingAppLockScreenSettings()));
expectFalse(isVisible(enableAppOnLockScreenToggle()));
expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
return new Promise(function(resolve) {
// No apps available.
browserProxy.setNoteTakingApps([]);
stylusPage.async(resolve);
})
.then(function() {
Polymer.dom.flush();
expectFalse(isVisible(noteTakingAppLockScreenSettings()));
expectFalse(isVisible(enableAppOnLockScreenToggle()));
expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
// Single app which does not support lock screen note taking.
browserProxy.addNoteTakingApp(
entry('n1', 'v1', true, LockScreenSupport.NOT_SUPPORTED));
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
expectFalse(isVisible(noteTakingAppLockScreenSettings()));
expectFalse(isVisible(enableAppOnLockScreenToggle()));
expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
// Add an app with lock screen support, but do not select it yet.
browserProxy.addNoteTakingApp(
entry('n2', 'v2', false, LockScreenSupport.SUPPORTED));
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
expectFalse(isVisible(noteTakingAppLockScreenSettings()));
expectFalse(isVisible(enableAppOnLockScreenToggle()));
expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
// Select the app with lock screen app support.
appSelector.value = 'v2';
stylusPage.onSelectedAppChanged_();
assertEquals(1, browserProxy.setPreferredAppCount_);
assertEquals('v2', browserProxy.getPreferredNoteTakingAppId());
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
expectTrue(isVisible(noteTakingAppLockScreenSettings()));
expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
assert(isVisible(enableAppOnLockScreenToggle()));
expectFalse(enableAppOnLockScreenToggle().checked);
// Preferred app updated to be enabled on lock screen.
browserProxy.setNoteTakingApps([
entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
entry('n2', 'v2', true, LockScreenSupport.ENABLED)
]);
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
expectTrue(isVisible(noteTakingAppLockScreenSettings()));
expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
assert(isVisible(enableAppOnLockScreenToggle()));
expectTrue(enableAppOnLockScreenToggle().checked);
// Select the app that does not support lock screen again.
appSelector.value = 'v1';
stylusPage.onSelectedAppChanged_();
assertEquals(2, browserProxy.setPreferredAppCount_);
assertEquals('v1', browserProxy.getPreferredNoteTakingAppId());
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
expectFalse(isVisible(noteTakingAppLockScreenSettings()));
expectFalse(isVisible(enableAppOnLockScreenToggle()));
expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
});
});
test('initial-app-lock-screen-enabled', function() {
return new Promise(function(resolve) {
browserProxy.setNoteTakingApps(
[entry('n1', 'v1', true, LockScreenSupport.SUPPORTED)]);
stylusPage.async(resolve);
})
.then(function() {
Polymer.dom.flush();
expectTrue(isVisible(noteTakingAppLockScreenSettings()));
assert(isVisible(enableAppOnLockScreenToggle()));
expectFalse(enableAppOnLockScreenToggle().checked);
expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
browserProxy.setNoteTakingApps(
[entry('n1', 'v1', true, LockScreenSupport.ENABLED)]);
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
expectTrue(isVisible(noteTakingAppLockScreenSettings()));
assert(isVisible(enableAppOnLockScreenToggle()));
expectTrue(enableAppOnLockScreenToggle().checked);
expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
browserProxy.setNoteTakingApps(
[entry('n1', 'v1', true, LockScreenSupport.SUPPORTED)]);
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
expectTrue(isVisible(noteTakingAppLockScreenSettings()));
assert(isVisible(enableAppOnLockScreenToggle()));
expectFalse(enableAppOnLockScreenToggle().checked);
expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
browserProxy.setNoteTakingApps([]);
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
expectFalse(isVisible(enableAppOnLockScreenToggle()));
});
});
test('tap-on-enable-note-taking-on-lock-screen', function() {
return new Promise(function(resolve) {
browserProxy.setNoteTakingApps(
[entry('n1', 'v1', true, LockScreenSupport.SUPPORTED)]);
stylusPage.async(resolve);
})
.then(function() {
Polymer.dom.flush();
assert(isVisible(enableAppOnLockScreenToggle()));
expectFalse(enableAppOnLockScreenToggle().checked);
expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
enableAppOnLockScreenToggle().click();
assertEquals(1, browserProxy.setAppOnLockScreenCount_);
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
expectTrue(enableAppOnLockScreenToggle().checked);
expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
expectEquals(
LockScreenSupport.ENABLED,
browserProxy.getPreferredAppLockScreenState());
enableAppOnLockScreenToggle().click();
assertEquals(2, browserProxy.setAppOnLockScreenCount_);
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
expectFalse(enableAppOnLockScreenToggle().checked);
expectEquals(
LockScreenSupport.SUPPORTED,
browserProxy.getPreferredAppLockScreenState());
});
});
test('tap-on-enable-note-taking-on-lock-screen-label', function() {
return new Promise(function(resolve) {
browserProxy.setNoteTakingApps(
[entry('n1', 'v1', true, LockScreenSupport.SUPPORTED)]);
stylusPage.async(resolve);
})
.then(function() {
Polymer.dom.flush();
assert(isVisible(enableAppOnLockScreenToggle()));
expectFalse(enableAppOnLockScreenToggle().checked);
enableAppOnLockScreenToggleLabel().click();
assertEquals(1, browserProxy.setAppOnLockScreenCount_);
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
expectTrue(enableAppOnLockScreenToggle().checked);
expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
expectEquals(
LockScreenSupport.ENABLED,
browserProxy.getPreferredAppLockScreenState());
enableAppOnLockScreenToggleLabel().click();
assertEquals(2, browserProxy.setAppOnLockScreenCount_);
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
expectFalse(enableAppOnLockScreenToggle().checked);
expectEquals(
LockScreenSupport.SUPPORTED,
browserProxy.getPreferredAppLockScreenState());
});
});
test('lock-screen-apps-disabled-by-policy', function() {
expectFalse(isVisible(enableAppOnLockScreenToggle()));
expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
return new Promise(function(resolve) {
// Add an app with lock screen support.
browserProxy.addNoteTakingApp(entry(
'n2', 'v2', true,
LockScreenSupport.NOT_ALLOWED_BY_POLICY));
stylusPage.async(resolve);
})
.then(function() {
Polymer.dom.flush();
expectTrue(isVisible(noteTakingAppLockScreenSettings()));
assert(isVisible(enableAppOnLockScreenToggle()));
expectFalse(enableAppOnLockScreenToggle().checked);
expectTrue(isVisible(enableAppOnLockScreenPolicyIndicator()));
// The toggle should be disabled, so enabling app on lock screen
// should not be attempted.
enableAppOnLockScreenToggle().click();
assertEquals(0, browserProxy.setAppOnLockScreenCount_);
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
// Tap on label should not work either.
enableAppOnLockScreenToggleLabel().click();
assertEquals(0, browserProxy.setAppOnLockScreenCount_);
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
expectTrue(isVisible(noteTakingAppLockScreenSettings()));
assert(isVisible(enableAppOnLockScreenToggle()));
expectFalse(enableAppOnLockScreenToggle().checked);
expectTrue(isVisible(enableAppOnLockScreenPolicyIndicator()));
expectEquals(
LockScreenSupport.NOT_ALLOWED_BY_POLICY,
browserProxy.getPreferredAppLockScreenState());
});
});
test('keep-last-note-on-lock-screen', function() {
return new Promise(function(resolve) {
browserProxy.setNoteTakingApps([
entry('n1', 'v1', true, LockScreenSupport.NOT_SUPPORTED),
entry('n2', 'v2', false, LockScreenSupport.SUPPORTED)
]);
stylusPage.async(resolve);
})
.then(function() {
Polymer.dom.flush();
expectFalse(isVisible(noteTakingAppLockScreenSettings()));
expectFalse(isVisible(keepLastNoteOnLockScreenToggle()));
browserProxy.setNoteTakingApps([
entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
entry('n2', 'v2', true, LockScreenSupport.SUPPORTED)
]);
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
expectTrue(isVisible(noteTakingAppLockScreenSettings()));
expectFalse(isVisible(keepLastNoteOnLockScreenToggle()));
browserProxy.setNoteTakingApps([
entry('n2', 'v2', true, LockScreenSupport.ENABLED),
]);
return new Promise(function(resolve) {
stylusPage.async(resolve);
});
})
.then(function() {
Polymer.dom.flush();
expectTrue(isVisible(noteTakingAppLockScreenSettings()));
assert(isVisible(keepLastNoteOnLockScreenToggle()));
expectTrue(keepLastNoteOnLockScreenToggle().checked);
// Clicking the toggle updates the pref value.
keepLastNoteOnLockScreenToggle().$$('#control').click();
expectFalse(keepLastNoteOnLockScreenToggle().checked);
expectFalse(devicePage.prefs.settings
.restore_last_lock_screen_note.value);
// Changing the pref value updates the toggle.
devicePage.set(
'prefs.settings.restore_last_lock_screen_note.value', true);
expectTrue(keepLastNoteOnLockScreenToggle().checked);
});
});
});
});
return {TestNames: TestNames};
});