blob: 8a7f24c3ac8737ec78cfce0f43261ccf4ae4f916 [file] [log] [blame]
// Copyright 2018 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('key_event_test', function() {
/** @enum {string} */
const TestNames = {
EnterTriggersPrint: 'enter triggers print',
NumpadEnterTriggersPrint: 'numpad enter triggers print',
EnterOnInputTriggersPrint: 'enter on input triggers print',
EnterOnDropdownDoesNotPrint: 'enter on dropdown does not print',
EnterOnButtonDoesNotPrint: 'enter on button does not print',
EnterOnCheckboxDoesNotPrint: 'enter on checkbox does not print',
EscapeClosesDialogOnMacOnly: 'escape closes dialog on mac only',
CmdPeriodClosesDialogOnMacOnly: 'cmd period closes dialog on mac only',
CtrlShiftPOpensSystemDialog: 'ctrl shift p opens system dialog',
};
const suiteName = 'KeyEventTest';
suite(suiteName, function() {
/** @type {?PrintPreviewAppElement} */
let page = null;
/** @type {?PrintPreviewNativeLayer} */
let nativeLayer = null;
/** @override */
setup(function() {
const initialSettings =
print_preview_test_utils.getDefaultInitialSettings();
nativeLayer = new print_preview.NativeLayerStub();
nativeLayer.setInitialSettings(initialSettings);
// Use advanced settings so that we can test with the paper-button.
nativeLayer.setLocalDestinationCapabilities(
print_preview_test_utils.getCddTemplateWithAdvancedSettings(
1, initialSettings.printerName));
nativeLayer.setPageCount(3);
print_preview.NativeLayer.setInstance(nativeLayer);
const pluginProxy = new print_preview.PDFPluginStub();
print_preview_new.PluginProxy.setInstance(pluginProxy);
PolymerTest.clearBody();
page = document.createElement('print-preview-app');
document.body.appendChild(page);
const previewArea = page.$.previewArea;
pluginProxy.setLoadCallback(previewArea.onPluginLoad_.bind(previewArea));
// Wait for initialization to complete.
return Promise
.all([
nativeLayer.whenCalled('getInitialSettings'),
nativeLayer.whenCalled('getPrinterCapabilities')
])
.then(function() {
Polymer.dom.flush();
});
});
// Tests that the enter key triggers a call to print.
test(assert(TestNames.EnterTriggersPrint), function() {
const whenPrintCalled = nativeLayer.whenCalled('print');
MockInteractions.keyEventOn(page, 'keydown', 'Enter', [], 'Enter');
return whenPrintCalled;
});
// Tests that the numpad enter key triggers a call to print.
test(assert(TestNames.NumpadEnterTriggersPrint), function() {
const whenPrintCalled = nativeLayer.whenCalled('print');
MockInteractions.keyEventOn(page, 'keydown', 'NumpadEnter', [], 'Enter');
return whenPrintCalled;
});
// Tests that the enter key triggers a call to print if an input is the
// source of the event.
test(assert(TestNames.EnterOnInputTriggersPrint), function() {
const whenPrintCalled = nativeLayer.whenCalled('print');
MockInteractions.keyEventOn(
page.$$('print-preview-copies-settings')
.$$('print-preview-number-settings-section')
.$$('cr-input')
.inputElement,
'keydown', 'Enter', [], 'Enter');
return whenPrintCalled;
});
// Tests that the enter key does not trigger a call to print if the event
// comes from a dropdown.
test(assert(TestNames.EnterOnDropdownDoesNotPrint), function() {
const whenKeyEventFired = test_util.eventToPromise('keydown', page);
MockInteractions.keyEventOn(
page.$$('print-preview-layout-settings').$$('.md-select'), 'keydown',
'Enter', [], 'Enter');
return whenKeyEventFired.then(
() => assertEquals(0, nativeLayer.getCallCount('print')));
});
// Tests that the enter key does not trigger a call to print if the event
// comes from a button.
test(assert(TestNames.EnterOnButtonDoesNotPrint), function() {
const moreSettingsElement = page.$$('print-preview-more-settings');
moreSettingsElement.$.label.click();
const whenKeyEventFired = test_util.eventToPromise('keydown', page);
MockInteractions.keyEventOn(
page.$$('print-preview-advanced-options-settings').$$('paper-button'),
'keydown', 'Enter', [], 'Enter');
return whenKeyEventFired.then(
() => assertEquals(0, nativeLayer.getCallCount('print')));
});
// Tests that the enter key does not trigger a call to print if the event
// comes from a checkbox.
test(assert(TestNames.EnterOnCheckboxDoesNotPrint), function() {
const moreSettingsElement = page.$$('print-preview-more-settings');
moreSettingsElement.$.label.click();
const whenKeyEventFired = test_util.eventToPromise('keydown', page);
MockInteractions.keyEventOn(
page.$$('print-preview-other-options-settings').$$('cr-checkbox'),
'keydown', 'Enter', [], 'Enter');
return whenKeyEventFired.then(
() => assertEquals(0, nativeLayer.getCallCount('print')));
});
// Tests that escape closes the dialog only on Mac.
test(assert(TestNames.EscapeClosesDialogOnMacOnly), function() {
const promise = cr.isMac ?
nativeLayer.whenCalled('dialogClose') :
test_util.eventToPromise('keydown', page).then(() => {
assertEquals(0, nativeLayer.getCallCount('dialogClose'));
});
MockInteractions.keyEventOn(page, 'keydown', 'Escape', [], 'Escape');
return promise;
});
// Tests that Cmd + Period closes the dialog only on Mac
test(assert(TestNames.CmdPeriodClosesDialogOnMacOnly), function() {
const promise = cr.isMac ?
nativeLayer.whenCalled('dialogClose') :
test_util.eventToPromise('keydown', page).then(() => {
assertEquals(0, nativeLayer.getCallCount('dialogClose'));
});
MockInteractions.keyEventOn(
page, 'keydown', 'Period', ['meta'], 'Period');
return promise;
});
// Tests that Ctrl+Shift+P opens the system dialog.
test(assert(TestNames.CtrlShiftPOpensSystemDialog), function() {
let promise = null;
if (cr.isChromeOS) {
// Chrome OS doesn't have a system dialog. Just make sure the key event
// does not trigger a crash.
promise = Promise.resolve();
} else if (cr.isWindows) {
promise = nativeLayer.whenCalled('print').then((printTicket) => {
assertTrue(JSON.parse(printTicket).showSystemDialog);
});
} else {
promise = nativeLayer.whenCalled('showSystemDialog');
}
const modifiers = cr.isMac ? ['meta', 'alt'] : ['ctrl', 'shift'];
MockInteractions.keyEventOn(page, 'keydown', 'KeyP', modifiers, 'KeyP');
return promise;
});
});
return {
suiteName: suiteName,
TestNames: TestNames,
};
});