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 observeWindowError(window);
32 var launchedPromise = launchWithTestEntries(
36 return launchedPromise.then(function(args) {
37 var appWindow = args.appWindow;
38 observeWindowError(appWindow.contentWindow);
40 // Show the slide image.
41 var slideImagePromise = waitForSlideImage(
42 appWindow.contentWindow.document,
45 'My Desktop Background');
47 // Lauch the photo editor.
48 var photoEditorPromise = slideImagePromise.then(function() {
49 return waitAndClickElement(
50 appWindow, 'button.edit');
53 return photoEditorPromise.then(function() {
60 * Tests to rotate an image.
62 * @param {string} testVolumeName Test volume name passed to the addEntries
63 * function. Either 'drive' or 'local'.
64 * @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
65 * @return {Promise} Promise to be fulfilled with on success.
67 function rotateImage(testVolumeName, volumeType) {
68 var launchedPromise = setupPhotoEditor(testVolumeName, volumeType);
69 return launchedPromise.then(function(args) {
70 var appWindow = args.appWindow;
71 return waitAndClickElement(
72 appWindow, '.gallery:not([locked]) button.rotate_right').
74 return waitForSlideImage(
75 appWindow.contentWindow.document,
78 'My Desktop Background');
81 return waitAndClickElement(
82 appWindow, '.gallery:not([locked]) button.rotate_left');
85 return waitForSlideImage(
86 appWindow.contentWindow.document,
89 'My Desktop Background');
95 * Tests to crop an image and undoes it.
97 * @param {string} testVolumeName Test volume name passed to the addEntries
98 * function. Either 'drive' or 'local'.
99 * @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
100 * @return {Promise} Promise to be fulfilled with on success.
102 function cropImage(testVolumeName, volumeType) {
103 var launchedPromise = setupPhotoEditor(testVolumeName, volumeType);
104 return launchedPromise.then(function(args) {
105 var appWindow = args.appWindow;
106 return waitAndClickElement(appWindow, '.gallery:not([locked]) button.crop').
109 waitForPressEnterMessage(appWindow),
110 waitForElement(appWindow, '.crop-overlay')
114 chrome.test.assertTrue(sendKeyDown(appWindow, 'body', 'Enter'));
118 waitForElementLost(appWindow, '.prompt-wrapper .prompt'),
119 waitForElementLost(appWindow, '.crop-overlay')
123 return waitForSlideImage(
124 appWindow.contentWindow.document,
127 'My Desktop Background');
130 return waitAndClickElement(
131 appWindow, '.gallery:not([locked]) button.undo');
134 return waitForSlideImage(
135 appWindow.contentWindow.document,
138 'My Desktop Background');
144 * Obtains metadata from an entry.
146 * @param {Entry} entry Entry.
147 * @return {Promise} Promise to be fulfilled with the result metadata.
149 function getMetadata(entry) {
150 return new Promise(entry.getMetadata.bind(entry));
154 * Tests to exposure an image.
156 * @param {string} testVolumeName Test volume name passed to the addEntries
157 * function. Either 'drive' or 'local'.
158 * @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
159 * @return {Promise} Promise to be fulfilled with on success.
161 function exposureImage(testVolumeName, volumeType) {
162 var launchedPromise = setupPhotoEditor(testVolumeName, volumeType);
163 return launchedPromise.then(function(args) {
164 var appWindow = args.appWindow;
165 var entry = args.entries[0];
166 var buttonQuery = '.gallery:not([locked]) button.exposure';
168 // Click the exposure button.
169 return waitAndClickElement(appWindow, buttonQuery).then(function() {
170 // Wait until the edit controls appear.
172 waitForPressEnterMessage(appWindow),
173 waitForElement(appWindow, 'input.range[name="brightness"]'),
174 waitForElement(appWindow, 'input.range[name="contrast"]'),
176 }).then(function(results) {
178 var brightnessRange = results[1];
179 brightnessRange.value = 20;
180 chrome.test.assertTrue(
181 brightnessRange.dispatchEvent(new Event('change')));
184 var contrastRange = results[2];
185 contrastRange.value = -20;
186 chrome.test.assertTrue(
187 contrastRange.dispatchEvent(new Event('change')));
189 return getMetadata(entry).then(function(firstMetadata) {
190 // Push the Enter key.
191 chrome.test.assertTrue(sendKeyDown(appWindow, 'body', 'Enter'));
193 // Wait until the image is updated.
194 return repeatUntil(function() {
195 return getMetadata(entry).then(function(secondMetadata) {
196 if (firstMetadata.modificationTime !=
197 secondMetadata.modificationTime) {
201 '%s is not updated. ' +
202 'First last modified: %s, Second last modified: %s.',
204 firstMetadata.modificationTime.toString(),
205 secondMetadata.modificationTime.toString());
215 * The rotateImage test for Downloads.
216 * @return {Promise} Promise to be fulfilled with on success.
218 function rotateImageOnDownloads() {
219 return rotateImage('local', VolumeManagerCommon.VolumeType.DOWNLOADS);
223 * The rotateImage test for Google Drive.
224 * @return {Promise} Promise to be fulfilled with on success.
226 function rotateImageOnDrive() {
227 return rotateImage('drive', VolumeManagerCommon.VolumeType.DRIVE);
231 * The cropImage test for Downloads.
232 * @return {Promise} Promise to be fulfilled with on success.
234 function cropImageOnDownloads() {
235 return cropImage('local', VolumeManagerCommon.VolumeType.DOWNLOADS);
239 * The cropImage test for Google Drive.
240 * @return {Promise} Promise to be fulfilled with on success.
242 function cropImageOnDrive() {
243 return cropImage('drive', VolumeManagerCommon.VolumeType.DRIVE);
247 * The exposureImage test for Downloads.
248 * @return {Promise} Promise to be fulfilled with on success.
250 function exposureImageOnDownloads() {
251 return exposureImage('local', VolumeManagerCommon.VolumeType.DOWNLOADS);
255 * The exposureImage test for Google Drive.
256 * @return {Promise} Promise to be fulfilled with on success.
258 function exposureImageOnDrive() {
259 return exposureImage('drive', VolumeManagerCommon.VolumeType.DRIVE);