blob: 9725b23fb94950d82779bd2759b8803ce64f744b [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} */
var TestNames = {
DevicePage: 'device page',
Display: 'display',
Keyboard: 'keyboard',
Pointers: 'pointers',
Power: 'power',
Stylus: 'stylus',
};
/**
* @constructor
* @implements {settings.DevicePageBrowserProxy}
*/
function TestDevicePageBrowserProxy() {
this.keyboardShortcutsOverlayShown_ = 0;
this.updatePowerStatusCalled_ = 0;
this.onNoteTakingAppsUpdated_ = null;
this.requestNoteTakingApps_ = 0;
this.setPreferredNoteTakingApp_ = '';
}
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 */
handleLinkEvent: function(e) {
settings.DevicePageBrowserProxyImpl.prototype.handleLinkEvent.call(
this, e);
// Prevent opening the link, which can block the test.
e.preventDefault();
},
/** override */
initializeKeyboard: function() {},
/** override */
showKeyboardShortcutsOverlay: function() {
this.keyboardShortcutsOverlayShown_++;
},
/** @override */
updatePowerStatus: function() {
this.updatePowerStatusCalled_++;
},
/** @override */
setPowerSource: function(powerSourceId) {
this.powerSourceId_ = powerSourceId;
},
/** @override */
setNoteTakingAppsUpdatedCallback: function(callback) {
this.onNoteTakingAppsUpdated_ = callback;
},
/** @override */
requestNoteTakingApps: function() {
this.requestNoteTakingApps_++;
},
/** @override */
setPreferredNoteTakingApp: function(appId) {
this.setPreferredNoteTakingApp_ = appId;
},
};
function getFakePrefs() {
return {
settings: {
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,
},
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} */
var devicePage;
/** @type {!FakeSystemDisplay|undefined} */
var 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.Route.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.
var 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) {
return new Promise(function(resolve, reject) {
var row = assert(devicePage.$$('#main #' + subpage + 'Row'));
devicePage.$.pages.addEventListener('neon-animation-finish', resolve);
MockInteractions.tap(row);
}).then(function() {
assertEquals(expectedRoute, settings.getCurrentRoute());
var page = devicePage.$$('settings-' + subpage);
return assert(page);
});
};
/**
* @param {!HTMLElement} pointersPage
* @param {Boolean} expected
*/
function expectNaturalScrollValue(pointersPage, expected) {
var naturalScrollOff =
pointersPage.$$('paper-radio-button[name="false"]');
var naturalScrollOn =
pointersPage.$$('paper-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() {
var pointersPage;
setup(function() {
return showAndGetDeviceSubpage(
'pointers', settings.Route.POINTERS).then(function(page) {
pointersPage = page;
});
});
test('subpage responds to pointer attach/detach', function() {
assertEquals(settings.Route.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.Route.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);
// Wait for the transition back to the main page.
return new Promise(function(resolve, reject) {
devicePage.$.pages.addEventListener('neon-animation-finish', resolve);
cr.webUIListenerCallback('has-mouse-changed', false);
}).then(function() {
assertEquals(settings.Route.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.Route.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.Route.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);
var slider = assert(pointersPage.$$('#mouse cr-slider'));
expectEquals(4, slider.value);
MockInteractions.pressAndReleaseKeyOn(slider.$.slider, 37 /* left */);
expectEquals(3, devicePage.prefs.settings.mouse.sensitivity2.value);
pointersPage.set('prefs.settings.mouse.sensitivity2.value', 5);
expectEquals(5, slider.value);
});
test('touchpad', function() {
expectLT(0, pointersPage.$.touchpad.offsetHeight);
expectTrue(pointersPage.$$('#touchpad #enableTapToClick').checked);
expectFalse(pointersPage.$$('#touchpad #enableTapDragging').checked);
var slider = assert(pointersPage.$$('#touchpad cr-slider'));
expectEquals(3, slider.value);
MockInteractions.pressAndReleaseKeyOn(
slider.$.slider, 39 /* right */);
expectEquals(4, devicePage.prefs.settings.touchpad.sensitivity2.value);
pointersPage.set('prefs.settings.touchpad.sensitivity2.value', 2);
expectEquals(2, slider.value);
});
test('link doesn\'t activate control', function(done) {
expectNaturalScrollValue(pointersPage, false);
// Tapping the link shouldn't enable the radio button.
var naturalScrollOn =
pointersPage.$$('paper-radio-button[name="true"]');
var a = naturalScrollOn.querySelector('a');
MockInteractions.tap(a);
expectNaturalScrollValue(pointersPage, false);
MockInteractions.tap(naturalScrollOn);
expectNaturalScrollValue(pointersPage, true);
devicePage.set('prefs.settings.touchpad.natural_scroll.value', false);
expectNaturalScrollValue(pointersPage, false);
// Enter on the link shouldn't enable the radio button either.
MockInteractions.pressEnter(a);
// Annoyingly, we have to schedule an async event with a timeout
// greater than or equal to the timeout used by IronButtonState (1).
// https://github.com/PolymerElements/iron-behaviors/issues/54
Polymer.Base.async(function() {
expectNaturalScrollValue(pointersPage, false);
MockInteractions.pressEnter(naturalScrollOn);
Polymer.Base.async(function() {
expectNaturalScrollValue(pointersPage, true);
done();
}, 1);
}, 1);
});
});
test(assert(TestNames.Keyboard), function() {
// Open the keyboard subpage.
return showAndGetDeviceSubpage(
'keyboard', settings.Route.KEYBOARD).then(function(keyboardPage) {
// Initially, the optional keys are hidden.
expectFalse(!!keyboardPage.$$('#capsLockKey'));
expectFalse(!!keyboardPage.$$('#diamondKey'));
// Pretend the diamond key is available.
var showCapsLock = false;
var showDiamondKey = true;
cr.webUIListenerCallback(
'show-keys-changed', showCapsLock, showDiamondKey);
Polymer.dom.flush();
expectFalse(!!keyboardPage.$$('#capsLockKey'));
expectTrue(!!keyboardPage.$$('#diamondKey'));
// Pretend a Caps Lock key is now available.
showCapsLock = true;
cr.webUIListenerCallback(
'show-keys-changed', showCapsLock, showDiamondKey);
Polymer.dom.flush();
expectTrue(!!keyboardPage.$$('#capsLockKey'));
expectTrue(!!keyboardPage.$$('#diamondKey'));
var collapse = keyboardPage.$$('iron-collapse');
assertTrue(!!collapse);
expectTrue(collapse.opened);
expectEquals(500, keyboardPage.$.delaySlider.value);
expectEquals(500, keyboardPage.$.repeatRateSlider.value);
// Test interaction with the cr-slider's underlying paper-slider.
MockInteractions.pressAndReleaseKeyOn(
keyboardPage.$.delaySlider.$.slider, 37 /* left */);
MockInteractions.pressAndReleaseKeyOn(
keyboardPage.$.repeatRateSlider.$.slider, 39 /* right */);
expectEquals(1000,
devicePage.prefs.settings.language.xkb_auto_repeat_delay_r2.value);
expectEquals(
300,
devicePage.prefs.settings.language.xkb_auto_repeat_interval_r2.value
);
// Test sliders change when prefs change.
devicePage.set(
'prefs.settings.language.xkb_auto_repeat_delay_r2.value', 1500);
expectEquals(1500, keyboardPage.$.delaySlider.value);
devicePage.set(
'prefs.settings.language.xkb_auto_repeat_interval_r2.value',
2000);
expectEquals(2000, keyboardPage.$.repeatRateSlider.value);
// Test sliders round to nearest value when prefs change.
devicePage.set(
'prefs.settings.language.xkb_auto_repeat_delay_r2.value', 600);
expectEquals(500, keyboardPage.$.delaySlider.value);
devicePage.set(
'prefs.settings.language.xkb_auto_repeat_interval_r2.value', 45);
expectEquals(50, keyboardPage.$.repeatRateSlider.value);
devicePage.set(
'prefs.settings.language.xkb_auto_repeat_enabled_r2.value',
false);
expectFalse(collapse.opened);
// Test keyboard shortcut overlay button.
MockInteractions.tap(keyboardPage.$$('#keyboardOverlay'));
expectEquals(
1,
settings.DevicePageBrowserProxyImpl.getInstance()
.keyboardShortcutsOverlayShown_);
});
});
test(assert(TestNames.Display), function() {
var addDisplay = function(n) {
var display = {
id: 'fakeDisplayId' + n,
name: 'fakeDisplayName' + n,
mirroring: '',
isPrimary: n == 1,
rotation: 0,
modes: [],
bounds: {
left: 0,
top: 0,
width: 1920,
height: 1080,
},
};
fakeSystemDisplay.addDisplayForTest(display);
};
var displayPage;
return Promise.all([
// Get the display sub-page.
showAndGetDeviceSubpage(
'display', settings.Route.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_(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_(displayPage.displays));
expectFalse(displayPage.isMirrored_(displayPage.displays));
// Select the second display and make it primary. Also change the
// orientation of the second display.
var displayLayout = displayPage.$$('#displayLayout');
assertTrue(!!displayLayout);
var displayDiv = displayLayout.$$('#_fakeDisplayId2');
assertTrue(!!displayDiv);
MockInteractions.tap(displayDiv);
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_();
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_(displayPage.displays));
expectTrue(displayPage.isMirrored_(displayPage.displays));
});
});
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) {
var sourcesCopy = sources.map(function(source) {
return Object.assign({}, source);
});
cr.webUIListenerCallback('power-sources-changed',
sourcesCopy, powerSourceId, isLowPowerCharger);
}
suite('no power settings', function() {
test('power row hidden', function() {
assertEquals(null, devicePage.$$('#powerRow'));
assertEquals(0,
settings.DevicePageBrowserProxyImpl.getInstance()
.updatePowerStatusCalled_);
});
});
suite('power settings', function() {
var powerPage;
var powerSourceRow;
var powerSourceWrapper;
var powerSourceSelect;
suiteSetup(function() {
// Always show power settings.
loadTimeData.overrideValues({
enablePowerSettings: true,
});
});
setup(function() {
return showAndGetDeviceSubpage('power', settings.Route.POWER)
.then(function(page) {
powerPage = page;
powerSourceRow = assert(powerPage.$$('#powerSourceRow'));
powerSourceWrapper =
assert(powerSourceRow.querySelector('.md-select-wrapper'));
powerSourceSelect = assert(powerPage.$$('#powerSource'));
assertEquals(
1,
settings.DevicePageBrowserProxyImpl.getInstance()
.updatePowerStatusCalled_);
});
});
test('power sources', function() {
var batteryStatus = {
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 dropdown is hidden.
assertTrue(powerSourceWrapper.hidden);
// Attach a dual-role USB device.
var powerSource = {
id: '2',
type: settings.PowerDeviceType.DUAL_ROLE_USB,
description: 'USB-C device',
};
setPowerSources([powerSource], '', false);
Polymer.dom.flush();
// "Battery" should be selected.
assertFalse(powerSourceWrapper.hidden);
assertEquals('', powerSourceSelect.value);
// Select the power source.
setPowerSources([powerSource], powerSource.id, true);
Polymer.dom.flush();
assertFalse(powerSourceWrapper.hidden);
assertEquals(powerSource.id, powerSourceSelect.value);
// Send another power source; the first should still be selected.
var otherPowerSource = Object.assign({}, powerSource);
otherPowerSource.id = '3';
setPowerSources(
[otherPowerSource, powerSource], powerSource.id, true);
Polymer.dom.flush();
assertFalse(powerSourceWrapper.hidden);
assertEquals(powerSource.id, powerSourceSelect.value);
});
test('choose power source', function() {
var batteryStatus = {
charging: false,
calculating: false,
percent: 50,
statusText: '5 hours left',
};
cr.webUIListenerCallback(
'battery-status-changed', Object.assign({}, batteryStatus));
// Attach a dual-role USB device.
var powerSource = {
id: '3',
type: settings.PowerDeviceType.DUAL_ROLE_USB,
description: 'USB-C device',
};
setPowerSources([powerSource], '', false);
Polymer.dom.flush();
// Select the device.
powerSourceSelect.value = powerSourceSelect.children[1].value;
powerSourceSelect.dispatchEvent(new CustomEvent('change'));
Polymer.dom.flush();
expectEquals(
powerSource.id,
settings.DevicePageBrowserProxyImpl.getInstance().powerSourceId_);
});
});
});
suite(assert(TestNames.Stylus), function() {
var stylusPage;
var appSelector;
var browserProxy;
var noAppsDiv;
var waitingDiv;
var selectAppDiv;
suiteSetup(function() {
// Always show stylus settings.
loadTimeData.overrideValues({
stylusAllowed: true,
});
});
setup(function() {
return showAndGetDeviceSubpage('stylus', settings.Route.STYLUS).then(
function(page) {
stylusPage = page;
browserProxy = settings.DevicePageBrowserProxyImpl.getInstance();
appSelector = assert(page.$$('#menu'));
noAppsDiv = assert(page.$$('#no-apps'));
waitingDiv = assert(page.$$('#waiting'));
selectAppDiv = assert(page.$$('#select-app'));
assertEquals(1, browserProxy.requestNoteTakingApps_);
assertEquals('', browserProxy.setPreferredNoteTakingApp_);
assert(browserProxy.onNoteTakingAppsUpdated_);
});
});
// Helper function to allocate a note app entry.
function entry(name, value, preferred) {
return {
name: name,
value: value,
preferred: preferred
};
}
test('initial app choice selector value', function() {
// Selector chooses the first value in list if there is no preferred
// value set.
browserProxy.onNoteTakingAppsUpdated_(
[entry('n1', 'v1', false), entry('n2', 'v2', false)], false);
Polymer.dom.flush();
assertEquals('v1', appSelector.value);
// Selector chooses the preferred value if set.
browserProxy.onNoteTakingAppsUpdated_(
[entry('n1', 'v1', false), entry('n2', 'v2', true)], false);
Polymer.dom.flush();
assertEquals('v2', appSelector.value);
});
test('change preferred app', function() {
// Load app list.
browserProxy.onNoteTakingAppsUpdated_(
[entry('n1', 'v1', false), entry('n2', 'v2', true)], false);
Polymer.dom.flush();
assertEquals('', browserProxy.setPreferredNoteTakingApp_);
// Update select element to new value, verify browser proxy is called.
appSelector.value = 'v1';
stylusPage.onSelectedAppChanged_();
assertEquals('v1', browserProxy.setPreferredNoteTakingApp_);
});
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.onNoteTakingAppsUpdated_([], false);
Polymer.dom.flush();
assertEquals('', browserProxy.setPreferredNoteTakingApp_);
browserProxy.onNoteTakingAppsUpdated_([], true);
Polymer.dom.flush();
assertEquals('', browserProxy.setPreferredNoteTakingApp_);
browserProxy.onNoteTakingAppsUpdated_([entry('n', 'v', false)], true);
Polymer.dom.flush();
assertEquals('', browserProxy.setPreferredNoteTakingApp_);
browserProxy.onNoteTakingAppsUpdated_([entry('n', 'v', false)], false);
Polymer.dom.flush();
assertEquals('', browserProxy.setPreferredNoteTakingApp_);
browserProxy.onNoteTakingAppsUpdated_(
[entry('n1', 'v1', false), entry('n2', 'v2', true)], false);
Polymer.dom.flush();
assertEquals('', browserProxy.setPreferredNoteTakingApp_);
});
test('app-visibility', function() {
// No apps available.
browserProxy.onNoteTakingAppsUpdated_([], false);
assert(!noAppsDiv.hidden);
assert(waitingDiv.hidden);
assert(selectAppDiv.hidden);
// Waiting for apps to finish loading.
browserProxy.onNoteTakingAppsUpdated_([], true);
assert(noAppsDiv.hidden);
assert(!waitingDiv.hidden);
assert(selectAppDiv.hidden);
browserProxy.onNoteTakingAppsUpdated_([entry('n', 'v', false)], true);
assert(noAppsDiv.hidden);
assert(!waitingDiv.hidden);
assert(selectAppDiv.hidden);
// Apps loaded, show selector.
browserProxy.onNoteTakingAppsUpdated_([entry('n', 'v', false)], false);
assert(noAppsDiv.hidden);
assert(waitingDiv.hidden);
assert(!selectAppDiv.hidden);
});
});
});
return {
TestNames: TestNames
};
});