blob: ebda68b95f8860282a84fff04e0ae36128222522 [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.
/**
* @fileoverview Tests local NTP custom backgrounds.
*/
/**
* Local NTP's object for test and setup functions.
*/
test.customize = {};
/**
* Sets up the page for each individual test.
*/
test.customize.setUp = function() {
setUpPage('local-ntp-template');
};
// ******************************* SIMPLE TESTS *******************************
// These are run by runSimpleTests above.
// Functions from test_utils.js are automatically imported.
/**
* Tests that the edit custom background button is visible if both the flag is
* enabled and no custom theme is being used.
*/
test.customize.testShowEditCustomBackground = function() {
initLocalNTP(/*isGooglePage=*/true);
assertTrue(elementIsVisible($('edit-bg')));
};
/**
* Tests that clicking on the gear icon opens the background option dialog.
*/
test.customize.testClickGearIcon = function() {
initLocalNTP(/*isGooglePage=*/true);
$('edit-bg').click();
assertTrue(elementIsVisible($('edit-bg-dialog')));
};
/**
* Test that clicking on the "Chrome backgrounds" option results in a correct
* selection dialog.
*/
test.customize.testClickChromeBackgrounds = function() {
initLocalNTP(/*isGooglePage=*/true);
$('edit-bg').click();
setupFakeAsyncCollectionLoad();
$('edit-bg-default-wallpapers').click();
checkCollectionDialog();
};
/**
* Test that clicking the cancel button on the collection selection dialog
* closes the dialog.
*/
test.customize.testCollectionDialogCancel = function() {
initLocalNTP(/*isGooglePage=*/true);
$('edit-bg').click();
setupFakeAsyncCollectionLoad();
$('edit-bg-default-wallpapers').click();
$('bg-sel-footer-cancel').click();
assertFalse(elementIsVisible($('bg-sel-menu')));
};
/**
* Test that clicking the done button on the collection selection dialog does
* nothing.
*/
test.customize.testCollectionDialogDone = function() {
initLocalNTP(/*isGooglePage=*/true);
$('edit-bg').click();
setupFakeAsyncCollectionLoad();
$('edit-bg-default-wallpapers').click();
$('bg-sel-footer-done').click();
checkCollectionDialog();
};
/**
* Test that clicking on a collection tile opens and loads the image selection
* dialog.
*/
test.customize.testCollectionDialogTileClick = function() {
initLocalNTP(/*isGooglePage=*/true);
$('edit-bg').click();
setupFakeAsyncCollectionLoad();
$('edit-bg-default-wallpapers').click();
setupFakeAsyncImageLoad('coll_tile_0');
var event = new Event('click', {'target': $('coll_tile_0')});
$('coll_tile_0').click(event);
checkImageDialog();
};
/**
* Test that clicking cancel on the image selection dialog closes the dialog.
*/
test.customize.testImageDialogCancel = function() {
initLocalNTP(/*isGooglePage=*/true);
$('edit-bg').click();
setupFakeAsyncCollectionLoad();
$('edit-bg-default-wallpapers').click();
setupFakeAsyncImageLoad('coll_tile_0');
var event = new Event('click', {'target': $('coll_tile_0')});
$('coll_tile_0').click(event);
$('bg-sel-footer-cancel').click();
assertFalse(elementIsVisible($('bg-sel-menu')));
};
/**
* Test that clicking the back button on the image selection dialog results in
* the collection selection dialog being displayed.
*/
test.customize.testImageDialogBack = function() {
initLocalNTP(/*isGooglePage=*/true);
$('edit-bg').click();
setupFakeAsyncCollectionLoad();
$('edit-bg-default-wallpapers').click();
setupFakeAsyncImageLoad('coll_tile_0');
var event = new Event('click', {'target': $('coll_tile_0')});
$('coll_tile_0').click(event);
$('bg-sel-back').click();
checkCollectionDialog();
};
/**
* Test that clicking on an image tile applies the selected styling.
*/
test.customize.testImageTileClick = function() {
initLocalNTP(/*isGooglePage=*/true);
$('edit-bg').click();
setupFakeAsyncCollectionLoad();
$('edit-bg-default-wallpapers').click();
setupFakeAsyncImageLoad('coll_tile_0');
var event = new Event('click', {'target': $('coll_tile_0')});
$('coll_tile_0').click(event);
$('img_tile_0').click();
assertTrue($('img_tile_0').classList.contains('bg-selected'));
};
/**
* Test that clicking done with no image selected does nothing.
*/
test.customize.testImageDoneClickNoneSelected = function() {
initLocalNTP(/*isGooglePage=*/true);
$('edit-bg').click();
setupFakeAsyncCollectionLoad();
$('edit-bg-default-wallpapers').click();
setupFakeAsyncImageLoad('coll_tile_0');
var event = new Event('click', {'target': $('coll_tile_0')});
$('coll_tile_0').click(event);
$('bg-sel-footer-done').click();
checkImageDialog();
};
/**
* Test that clicking done with an image selected closes the dialog.
*/
test.customize.testImageDoneClick = function() {
initLocalNTP(/*isGooglePage=*/true);
$('edit-bg').click();
setupFakeAsyncCollectionLoad();
$('edit-bg-default-wallpapers').click();
setupFakeAsyncImageLoad('coll_tile_0');
var event = new Event('click', {'target': $('coll_tile_0')});
$('coll_tile_0').click(event);
$('img_tile_0').click();
$('bg-sel-footer-done').click();
assertFalse(elementIsVisible($('bg-sel-menu')));
};
/**
* Test that no custom background option will be shown when offline.
*/
test.customize.testHideCustomBackgroundOffline = function() {
initLocalNTP(/*isGooglePage=*/true);
let event = new Event('offline', {});
window.dispatchEvent(event);
$('edit-bg').click();
assertFalse(elementIsVisible($('edit-bg-default-wallpapers-text')));
};
/**
* Test that clicking collection when offline will trigger an error
* notification.
*/
test.customize.testClickCollectionOfflineShowErrorMsg = function() {
initLocalNTP(/*isGooglePage=*/true);
$('edit-bg').click();
setupFakeAsyncCollectionLoad();
$('edit-bg-default-wallpapers').click();
setupFakeAsyncImageLoadOffline('coll_tile_0');
let event = new Event('click', {'target': $('coll_tile_0')});
$('coll_tile_0').click(event);
assertTrue(elementIsVisible($('error-notice')));
};
// TODO(crbug.com/857256): add tests for:
// * Image upload flow.
// * Online/offline.
// ******************************* HELPERS *******************************
/**
* Fake the loading of the Chrome Backgrounds collections so it happens
* synchronously.
*/
setupFakeAsyncCollectionLoad = function() {
// Override the collection loading script.
customize.loadChromeBackgrounds = function() {
var collScript = document.createElement('script');
collScript.id = 'ntp-collection-loader';
document.body.appendChild(collScript);
coll = [
{
collectionId: 'collection1',
collectionName: 'Collection 1',
previewImageUrl: 'chrome-search://local-ntp/background.jpg'
},
{
collectionId: 'collection2',
collectionName: 'Collection 2',
previewImageUrl: 'chrome-search://local-ntp/background.jpg'
},
{
collectionId: 'collection3',
collectionName: 'Collection 3',
previewImageUrl: 'chrome-search://local-ntp/background.jpg'
}
];
collErrors = {};
};
// Append a call to onload to the end of the click handler.
var oldBackgroundsFunc = $('edit-bg-default-wallpapers').onclick;
$('edit-bg-default-wallpapers').onclick = function() {
oldBackgroundsFunc();
$('ntp-collection-loader').onload();
}
};
/**
* Fake the loading of the a collection's images so it happens synchronously.
*/
setupFakeAsyncImageLoad = function(tile_id) {
// Append the creation of the image data and a call to onload to the
// end of the click handler.
var oldImageLoader = $(tile_id).onclick;
$(tile_id).onclick = function(event) {
oldImageLoader(event);
collImg = [
{
attributionActionUrl: 'https://www.google.com',
attributions: ['test1', 'attribution1'],
collectionId: 'collection1',
imageUrl: 'chrome-search://local-ntp/background1.jpg',
thumbnailImageUrl: 'chrome-search://local-ntp/background_thumbnail.jpg1'
},
{
attributionActionUrl: 'https://www.google.com',
attributions: ['test2', 'attribution2'],
collectionId: 'collection1',
imageUrl: 'chrome-search://local-ntp/background2.jpg',
thumbnailImageUrl: 'chrome-search://local-ntp/background_thumbnail.jpg2'
},
{
attributionActionUrl: 'https://www.google.com',
attributions: ['test3', 'attribution3'],
collectionId: 'collection1',
imageUrl: 'chrome-search://local-ntp/background3.jpg',
thumbnailImageUrl: 'chrome-search://local-ntp/background_thumbnail.jpg3'
},
{
attributionActionUrl: 'https://www.google.com',
attributions: ['test4', 'attribution4'],
collectionId: 'collection1',
imageUrl: 'chrome-search://local-ntp/background4.jpg',
thumbnailImageUrl: 'chrome-search://local-ntp/background_thumbnail.jpg4'
},
{
attributionActionUrl: 'https://www.google.com',
attributions: ['test5', 'attribution5'],
collectionId: 'collection1',
imageUrl: 'chrome-search://local-ntp/background5.jpg',
thumbnailImageUrl: 'chrome-search://local-ntp/background_thumbnail.jpg5'
}
];
collImgErrors = {};
$('ntp-images-loader').onload();
}
};
/**
* Fake loading a collection's images with a network error to simulate offline
* status.
*/
setupFakeAsyncImageLoadOffline = function(tile_id) {
// Override the image tile's onclick function.
let oldImageLoader = $(tile_id).onclick;
$(tile_id).onclick = function(event) {
oldImageLoader(event);
collImg = [];
collImgErrors = {net_error: true, net_error_no: -106};
$('ntp-images-loader').onload();
}
};
/**
* Check that the collection selection dialog contains the correct elements.
*/
checkCollectionDialog = function() {
assertTrue(elementIsVisible($('bg-sel-menu')));
assertTrue($('bg-sel-menu').classList.contains('is-col-sel'));
assertTrue(
$('bg-sel-menu').getElementsByClassName('bg-sel-tile').length ==
coll.length);
assertTrue(
$('bg-sel-menu').getElementsByClassName('bg-sel-tile-title').length ==
coll.length);
assertFalse(elementIsVisible($('bg-sel-back')));
assertTrue(elementIsVisible($('bg-sel-footer-cancel')));
assertTrue(elementIsVisible($('bg-sel-footer-done')));
};
/**
* Check that the image selection dialog contains the correct elements.
*/
checkImageDialog = function() {
assertTrue(elementIsVisible($('bg-sel-menu')));
assertTrue($('bg-sel-menu').classList.contains('is-img-sel'));
assertTrue(
$('bg-sel-menu').getElementsByClassName('bg-sel-tile').length ==
collImg.length);
assertTrue(elementIsVisible($('bg-sel-back')));
assertTrue(elementIsVisible($('bg-sel-footer-cancel')));
assertTrue(elementIsVisible($('bg-sel-footer-done')));
};