blob: 864c1bcc90a4dc77e47fa68c97e509117c5a5b28 [file] [log] [blame]
// Copyright 2017 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.
/**
* @fileoverview Tests for MD History which are run as interactive ui tests.
* Should be used for tests which care about focus.
*/
var ROOT_PATH = '../../../../../';
GEN_INCLUDE(
[ROOT_PATH + 'chrome/test/data/webui/polymer_interactive_ui_test.js']);
function MaterialHistoryFocusTest() {}
MaterialHistoryFocusTest.prototype = {
__proto__: PolymerInteractiveUITest.prototype,
browsePreload: 'chrome://history',
extraLibraries: PolymerTest.getLibraries(ROOT_PATH).concat([
'test_util.js',
]),
setUp: function() {
PolymerTest.prototype.setUp.call(this);
suiteSetup(function() {
// Wait for the top-level app element to be upgraded.
return waitForAppUpgrade()
.then(() => md_history.ensureLazyLoaded())
.then(() => {
$('history-app').queryState_.queryingDisabled = true;
});
});
},
};
TEST_F('MaterialHistoryFocusTest', 'All', function() {
suite('<history-toolbar>', function() {
var app;
var toolbar;
var TEST_HISTORY_RESULTS =
[createHistoryEntry('2016-03-15', 'https://google.com')];
setup(function() {
window.resultsRendered = false;
app = replaceApp();
toolbar = app.$['toolbar'];
});
test('search bar is focused on load in wide mode', function() {
toolbar.$['main-toolbar'].narrow = false;
historyResult(createHistoryInfo(), []);
return PolymerTest.flushTasks().then(() => {
// Ensure the search bar is focused on load.
assertTrue(
app.$.toolbar.$['main-toolbar']
.getSearchField()
.isSearchFocused());
});
});
test('search bar is not focused on load in narrow mode', function() {
toolbar.$['main-toolbar'].narrow = true;
historyResult(createHistoryInfo(), []);
return PolymerTest.flushTasks().then(() => {
// Ensure the search bar is focused on load.
assertFalse(
$('history-app')
.$.toolbar.$['main-toolbar']
.getSearchField()
.isSearchFocused());
});
});
test('shortcuts to open search field', function() {
var field = toolbar.$['main-toolbar'].getSearchField();
field.blur();
assertFalse(field.showingSearch);
MockInteractions.pressAndReleaseKeyOn(
document.body, 191, '', '/');
assertTrue(field.showingSearch);
assertEquals(field.$.searchInput, field.root.activeElement);
MockInteractions.pressAndReleaseKeyOn(
field.$.searchInput, 27, '', 'Escape');
assertFalse(field.showingSearch, 'Pressing escape closes field.');
assertNotEquals(field.$.searchInput, field.root.activeElement);
var modifier = 'ctrl';
if (cr.isMac)
modifier = 'meta';
MockInteractions.pressAndReleaseKeyOn(
document.body, 70, modifier, 'f');
assertTrue(field.showingSearch);
assertEquals(field.$.searchInput, field.root.activeElement);
});
});
suite('<history-list>', function() {
var app;
var element;
var TEST_HISTORY_RESULTS;
suiteSetup(function() {
TEST_HISTORY_RESULTS = [
createHistoryEntry('2016-03-15', 'https://www.google.com'),
createHistoryEntry('2016-03-14 10:00', 'https://www.example.com'),
createHistoryEntry('2016-03-14 9:00', 'https://www.google.com'),
createHistoryEntry('2016-03-13', 'https://en.wikipedia.org')
];
TEST_HISTORY_RESULTS[2].starred = true;
});
setup(function() {
app = replaceApp();
element = app.$.history;
});
test('list focus and keyboard nav', function(done) {
app.historyResult(createHistoryInfo(), TEST_HISTORY_RESULTS);
PolymerTest.flushTasks().then(function() {
var items = polymerSelectAll(element, 'history-item');
var focused = items[2].$.checkbox;
focused.focus();
// Wait for next render to ensure that focus handlers have been
// registered (see HistoryItemElement.attached).
Polymer.RenderStatus.afterNextRender(this, function() {
MockInteractions.pressAndReleaseKeyOn(
focused, 39, [], 'ArrowRight');
focused = items[2].$.title;
assertEquals(focused, element.lastFocused_);
assertTrue(items[2].row_.isActive());
assertFalse(items[3].row_.isActive());
MockInteractions.pressAndReleaseKeyOn(focused, 40, [], 'ArrowDown');
focused = items[3].$.title;
assertEquals(focused, element.lastFocused_);
assertFalse(items[2].row_.isActive());
assertTrue(items[3].row_.isActive());
MockInteractions.pressAndReleaseKeyOn(
focused, 39, [], 'ArrowRight');
focused = items[3].$['menu-button'];
assertEquals(focused, element.lastFocused_);
assertFalse(items[2].row_.isActive());
assertTrue(items[3].row_.isActive());
MockInteractions.pressAndReleaseKeyOn(focused, 38, [], 'ArrowUp');
focused = items[2].$['menu-button'];
assertEquals(focused, element.lastFocused_);
assertTrue(items[2].row_.isActive());
assertFalse(items[3].row_.isActive());
MockInteractions.pressAndReleaseKeyOn(focused, 37, [], 'ArrowLeft');
focused = items[2].$$('#bookmark-star');
assertEquals(focused, element.lastFocused_);
assertTrue(items[2].row_.isActive());
assertFalse(items[3].row_.isActive());
MockInteractions.pressAndReleaseKeyOn(focused, 40, [], 'ArrowDown');
focused = items[3].$.title;
assertEquals(focused, element.lastFocused_);
assertFalse(items[2].row_.isActive());
assertTrue(items[3].row_.isActive());
done();
});
});
});
});
suite('<history-synced-device-manager>', function() {
var element;
setup(function() {
element = document.createElement('history-synced-device-manager');
element.signInState = true;
element.searchTerm = '';
replaceBody(element);
});
test('focus and keyboard nav', function() {
var sessionList = [
createSession('Nexus 5', [createWindow([
'http://www.example.com', 'http://www.google.com'
])]),
createSession('Pixel C', [createWindow(['http://www.badssl.com'])]),
createSession('Potato', [createWindow(['http://www.wikipedia.org'])]),
];
element.sessionList = sessionList;
var lastFocused;
var cards;
var focused;
var onFocusHandler = element.focusGrid_.onFocus;
element.focusGrid_.onFocus = function(row, e) {
onFocusHandler.call(element.focusGrid_, row, e);
lastFocused = e.currentTarget;
};
return PolymerTest.flushTasks().then(function() {
cards = polymerSelectAll(element, 'history-synced-device-card');
focused = cards[0].$['menu-button'];
focused.focus();
// Go to the collapse button.
MockInteractions.pressAndReleaseKeyOn(focused, 39, [], 'ArrowRight');
focused = cards[0].$['collapse-button'];
assertEquals(focused, lastFocused);
// Go to the first url.
MockInteractions.pressAndReleaseKeyOn(focused, 40, [], 'ArrowDown');
focused = polymerSelectAll(cards[0], '.website-title')[0];
assertEquals(focused, lastFocused);
// Collapse the first card.
MockInteractions.pressAndReleaseKeyOn(focused, 38, [], 'ArrowUp');
focused = cards[0].$['collapse-button'];
assertEquals(focused, lastFocused);
MockInteractions.tap(focused);
}).then(function() {
// Pressing down goes to the next card.
MockInteractions.pressAndReleaseKeyOn(focused, 40, [], 'ArrowDown');
focused = cards[1].$['collapse-button'];
assertEquals(focused, lastFocused);
// Expand the first card.
MockInteractions.pressAndReleaseKeyOn(focused, 38, [], 'ArrowUp');
focused = cards[0].$['collapse-button'];
assertEquals(focused, lastFocused);
MockInteractions.tap(focused);
}).then(function() {
// First card's urls are focusable again.
MockInteractions.pressAndReleaseKeyOn(focused, 40, [], 'ArrowDown');
focused = polymerSelectAll(cards[0], '.website-title')[0];
assertEquals(focused, lastFocused);
// Remove the second URL from the first card.
sessionList[0].windows[0].tabs.splice(1, 1);
element.sessionList = sessionList.slice();
return PolymerTest.flushTasks();
}).then(function() {
cards = polymerSelectAll(element, 'history-synced-device-card');
// Go to the next card's menu buttons.
MockInteractions.pressAndReleaseKeyOn(focused, 40, [], 'ArrowDown');
focused = cards[1].$['collapse-button'];
assertEquals(focused, lastFocused);
MockInteractions.pressAndReleaseKeyOn(focused, 38, [], 'ArrowUp');
focused = polymerSelectAll(cards[0], '.website-title')[0];
assertEquals(focused, lastFocused);
// Remove the second card.
sessionList.splice(1, 1);
element.sessionList = sessionList.slice();
return PolymerTest.flushTasks();
}).then(function() {
cards = polymerSelectAll(element, 'history-synced-device-card');
// Pressing down goes to the next card.
MockInteractions.pressAndReleaseKeyOn(focused, 40, [], 'ArrowDown');
focused = cards[1].$['collapse-button'];
assertEquals(focused, lastFocused);
});
});
});
mocha.run();
});