1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
8 * Waits for the "Press Enter" message.
10 * @param {AppWindow} appWindow App window.
11 * @return {Promise} Promise to be fulfilled when the element appears.
13 function waitForPressEnterMessage(appWindow) {
14 return waitForElement(appWindow, '.prompt-wrapper .prompt').
15 then(function(element) {
17 'Press Enter when done', element.innerText.trim());
22 * Prepares the photo editor.
24 * @param {string} testVolumeName Test volume name passed to the addEntries
25 * function. Either 'drive' or 'local'.
26 * @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
27 * @return {Promise} Promise to be fulfilled with on success.
29 function setupPhotoEditor(testVolumeName, volumeType) {
31 var launchedPromise = launchWithTestEntries(
35 return launchedPromise.then(function(args) {
36 var appWindow = args.appWindow;
38 // Show the slide image.
39 var slideImagePromise = waitForSlideImage(
40 appWindow.contentWindow.document,
43 'My Desktop Background');
45 // Lauch the photo editor.
46 var photoEditorPromise = slideImagePromise.then(function() {
47 return waitAndClickElement(
48 appWindow, 'button.edit');
51 return photoEditorPromise.then(function() {
58 * Tests to rotate an image.
60 * @param {string} testVolumeName Test volume name passed to the addEntries
61 * function. Either 'drive' or 'local'.
62 * @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
63 * @return {Promise} Promise to be fulfilled with on success.
65 function rotateImage(testVolumeName, volumeType) {
66 var launchedPromise = setupPhotoEditor(testVolumeName, volumeType);
67 return launchedPromise.then(function(args) {
68 var appWindow = args.appWindow;
69 return waitAndClickElement(
70 appWindow, '.gallery:not([locked]) button.rotate_right').
72 return waitForSlideImage(
73 appWindow.contentWindow.document,
76 'My Desktop Background');
79 return waitAndClickElement(
80 appWindow, '.gallery:not([locked]) button.rotate_left');
83 return waitForSlideImage(
84 appWindow.contentWindow.document,
87 'My Desktop Background');
93 * Tests to crop an image.
95 * @param {string} testVolumeName Test volume name passed to the addEntries
96 * function. Either 'drive' or 'local'.
97 * @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
98 * @return {Promise} Promise to be fulfilled with on success.
100 function cropImage(testVolumeName, volumeType) {
101 var launchedPromise = setupPhotoEditor(testVolumeName, volumeType);
102 return launchedPromise.then(function(args) {
103 var appWindow = args.appWindow;
104 return waitAndClickElement(appWindow, '.gallery:not([locked]) button.crop').
107 waitForPressEnterMessage(appWindow),
108 waitForElement(appWindow, '.crop-overlay')
112 chrome.test.assertTrue(sendKeyDown(appWindow, 'body', 'Enter'));
116 waitForElementLost(appWindow, '.prompt-wrapper .prompt'),
117 waitForElementLost(appWindow, '.crop-overlay')
121 return waitForSlideImage(
122 appWindow.contentWindow.document,
125 'My Desktop Background');
131 * Obtains metadata from an entry.
133 * @param {Entry} entry Entry.
134 * @return {Promise} Promise to be fulfilled with the result metadata.
136 function getMetadata(entry) {
137 return new Promise(entry.getMetadata.bind(entry));
141 * Tests to exposure an image.
143 * @param {string} testVolumeName Test volume name passed to the addEntries
144 * function. Either 'drive' or 'local'.
145 * @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
146 * @return {Promise} Promise to be fulfilled with on success.
148 function exposureImage(testVolumeName, volumeType) {
149 var launchedPromise = setupPhotoEditor(testVolumeName, volumeType);
150 return launchedPromise.then(function(args) {
151 var appWindow = args.appWindow;
152 var entry = args.entries[0];
153 var buttonQuery = '.gallery:not([locked]) button.exposure';
155 // Click the exposure button.
156 return waitAndClickElement(appWindow, buttonQuery).then(function() {
157 // Wait until the edit controls appear.
159 waitForPressEnterMessage(appWindow),
160 waitForElement(appWindow, 'input.range[name="brightness"]'),
161 waitForElement(appWindow, 'input.range[name="contrast"]'),
163 }).then(function(results) {
165 var brightnessRange = results[1];
166 brightnessRange.value = 20;
167 chrome.test.assertTrue(
168 brightnessRange.dispatchEvent(new Event('change')));
171 var contrastRange = results[2];
172 contrastRange.value = -20;
173 chrome.test.assertTrue(
174 contrastRange.dispatchEvent(new Event('change')));
176 return getMetadata(entry).then(function(firstMetadata) {
177 // Push the Enter key.
178 chrome.test.assertTrue(sendKeyDown(appWindow, 'body', 'Enter'));
180 // Wait until the image is updated.
181 return repeatUntil(function() {
182 return getMetadata(entry).then(function(secondMetadata) {
183 if (firstMetadata.modificationTime !=
184 secondMetadata.modificationTime) {
188 '%s is not updated. ' +
189 'First last modified: %s, Second last modified: %s.',
191 firstMetadata.modificationTime.toString(),
192 secondMetadata.modificationTime.toString());
202 * The rotateImage test for Downloads.
203 * @return {Promise} Promise to be fulfilled with on success.
205 function rotateImageOnDownloads() {
206 return rotateImage('local', VolumeManagerCommon.VolumeType.DOWNLOADS);
210 * The rotateImage test for Google Drive.
211 * @return {Promise} Promise to be fulfilled with on success.
213 function rotateImageOnDrive() {
214 return rotateImage('drive', VolumeManagerCommon.VolumeType.DRIVE);
218 * The cropImage test for Downloads.
219 * @return {Promise} Promise to be fulfilled with on success.
221 function cropImageOnDownloads() {
222 return cropImage('local', VolumeManagerCommon.VolumeType.DOWNLOADS);
226 * The cropImage test for Google Drive.
227 * @return {Promise} Promise to be fulfilled with on success.
229 function cropImageOnDrive() {
230 return cropImage('drive', VolumeManagerCommon.VolumeType.DRIVE);
234 * The exposureImage test for Downloads.
235 * @return {Promise} Promise to be fulfilled with on success.
237 function exposureImageOnDownloads() {
238 return exposureImage('local', VolumeManagerCommon.VolumeType.DOWNLOADS);
242 * The exposureImage test for Google Drive.
243 * @return {Promise} Promise to be fulfilled with on success.
245 function exposureImageOnDrive() {
246 return exposureImage('drive', VolumeManagerCommon.VolumeType.DRIVE);