Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / ui / file_manager / integration_tests / gallery / photo_editor.js
blob344ca9351aa2d47ee0e39da63543bd942d31f0e8
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.
5 'use strict';
7 /**
8  * Prepares the photo editor.
9  *
10  * @param {string} testVolumeName Test volume name passed to the addEntries
11  *     function. Either 'drive' or 'local'.
12  * @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
13  * @return {Promise} Promise to be fulfilled with on success.
14  */
15 function setupPhotoEditor(testVolumeName, volumeType) {
16   // Lauch the gallery.
17   var launchedPromise = launch(
18       testVolumeName,
19       volumeType,
20       [ENTRIES.desktop]);
21   return launchedPromise.then(function(args) {
22     var appId = args.appId;
24     // Show the slide image.
25     var slideImagePromise = gallery.waitForSlideImage(
26         appId,
27         800,
28         600,
29         'My Desktop Background');
31     // Lauch the photo editor.
32     var photoEditorPromise = slideImagePromise.then(function() {
33       return gallery.waitAndClickElement(appId, 'button.edit');
34     });
36     return photoEditorPromise.then(function() {
37       return args;
38     });
39   });
42 /**
43  * Tests to rotate an image.
44  *
45  * @param {string} testVolumeName Test volume name passed to the addEntries
46  *     function. Either 'drive' or 'local'.
47  * @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
48  * @return {Promise} Promise to be fulfilled with on success.
49  */
50 function rotateImage(testVolumeName, volumeType) {
51   var launchedPromise = setupPhotoEditor(testVolumeName, volumeType);
52   return launchedPromise.then(function(args) {
53     var appId = args.appId;
54     return gallery.waitAndClickElement(
55         appId, '.gallery:not([locked]) button.rotate_right').then(function() {
56           return gallery.waitForSlideImage(
57               appId,
58               600,
59               800,
60               'My Desktop Background');
61         }).
62         then(function() {
63           return gallery.waitAndClickElement(
64               appId, '.gallery:not([locked]) button.rotate_left');
65         }).
66         then(function() {
67           return gallery.waitForSlideImage(
68               appId,
69               800,
70               600,
71               'My Desktop Background');
72         });
73   });
76 /**
77  * Tests to crop an image and undoes it.
78  *
79  * @param {string} testVolumeName Test volume name passed to the addEntries
80  *     function. Either 'drive' or 'local'.
81  * @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
82  * @return {Promise} Promise to be fulfilled with on success.
83  */
84 function cropImage(testVolumeName, volumeType) {
85   var launchedPromise = setupPhotoEditor(testVolumeName, volumeType);
86   return launchedPromise.then(function(args) {
87     var appId = args.appId;
88     return gallery.waitAndClickElement(appId,
89                                        '.gallery:not([locked]) button.crop').
90         then(function() {
91           return Promise.all([
92             gallery.waitForElement(appId, '.crop-overlay')
93           ]);
94         }).
95         then(function() {
96           return gallery.fakeKeyDown(appId, 'body', 'Enter', false);
97         }).
98         then(function(ret) {
99           chrome.test.assertTrue(ret);
100           return Promise.all([
101             gallery.waitForElementLost(appId, '.crop-overlay')
102           ]);
103         }).
104         then(function() {
105           return gallery.waitForSlideImage(
106               appId,
107               532,
108               398,
109               'My Desktop Background');
110         }).
111         then(function() {
112           return gallery.waitAndClickElement(
113               appId, '.gallery:not([locked]) button.undo');
114         }).
115         then(function() {
116            return gallery.waitForSlideImage(
117               appId,
118               800,
119               600,
120               'My Desktop Background');
121         });
122   });
126  * Tests to exposure an image.
128  * @param {string} testVolumeName Test volume name passed to the addEntries
129  *     function. Either 'drive' or 'local'.
130  * @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
131  * @return {Promise} Promise to be fulfilled with on success.
132  */
133 function exposureImage(testVolumeName, volumeType) {
134   var launchedPromise = setupPhotoEditor(testVolumeName, volumeType);
135   return launchedPromise.then(function(args) {
136     var appId = args.appId;
137     var url = args.urls[0];
138     var buttonQuery = '.gallery:not([locked]) button.exposure';
140     var origMetadata = null;
142     // Click the exposure button.
143     return gallery.waitAndClickElement(appId, buttonQuery).then(function() {
144       // Wait until the edit controls appear.
145       return Promise.all([
146         gallery.waitForElement(appId, '.brightness > paper-slider'),
147         gallery.waitForElement(appId, '.contrast > paper-slider'),
148       ]);
149     }).then(function() {
150       return gallery.callRemoteTestUtil(
151           'changeValue', appId, ['.brightness > paper-slider', 20]);
152     }).then(function() {
153       return gallery.callRemoteTestUtil(
154           'changeValue', appId, ['.contrast > paper-slider', -20]);
155     }).then(function() {
156       return gallery.callRemoteTestUtil('getMetadata', null, [url]);
157     }).then(function(metadata) {
158       origMetadata = metadata;
160       // Push the Enter key.
161       return gallery.fakeKeyDown(appId, 'body', 'Enter', false);
162     }).then(function() {
163       // Wait until the image is updated.
164       return repeatUntil(function() {
165         return gallery.callRemoteTestUtil('getMetadata', null, [url])
166         .then(function(metadata) {
167           if (origMetadata.modificationTime != metadata.modificationTime) {
168             return true;
169           } else {
170             return pending(
171                 '%s is not updated. ' +
172                     'First last modified: %s, Second last modified: %s.',
173                 url,
174                 origMetadata.modificationTime,
175                 metadata.modificationTime);
176           }
177         });
178       });
179     });
180   });
184  * Tests whether overwrite original checkbox is enabled or disabled properly.
186  * @param {string} testVolumeName Test volume name passed to the addEntries
187  *     function. Either 'drive' or 'local'.
188  * @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
189  * @return {Promise} Promise to be fulfilled with on success.
190  */
191 function enableDisableOverwriteOriginalCheckbox(testVolumeName, volumeType) {
192   var appId;
193   var launchedPromise = setupPhotoEditor(testVolumeName, volumeType);
194   return launchedPromise.then(function(result) {
195     appId = result.appId;
197     // Confirm overwrite original checkbox is enabled and checked.
198     return gallery.waitForElement(appId,
199         '.overwrite-original[checked]:not([disabled])');
200   }).then(function() {
201     // Uncheck overwrite original.
202     return gallery.waitAndClickElement(appId, '.overwrite-original');
203   }).then(function() {
204     // Rotate image.
205     return gallery.waitAndClickElement(appId, '.rotate_right');
206   }).then(function() {
207     // Confirm that edited image has been saved.
208     return gallery.waitForAFile(volumeType,
209         'My Desktop Background - Edited.png');
210   }).then(function() {
211     // Confirm overwrite original checkbox is disabled and not checked.
212     return gallery.waitForElement(appId,
213         '.overwrite-original[disabled]:not([checked])');
214   }).then(function() {
215     // Go back to the slide mode.
216     return gallery.waitAndClickElement(appId, 'button.edit');
217   }).then(function() {
218     // Confirm current image is My Desktop Background - Edited.png.
219     return gallery.waitForSlideImage(appId, 600, 800,
220         'My Desktop Background - Edited');
221   }).then(function() {
222     // Move to My Desktop Background.png. Switching to other image is required
223     // to end edit session of the edited image.
224     return gallery.waitAndClickElement(appId, '.arrow.right');
225   }).then(function() {
226     // Confirm current image has changed to another image.
227     return gallery.waitForSlideImage(appId, 800, 600, 'My Desktop Background');
228   }).then(function() {
229     // Back to the edited image.
230     return gallery.waitAndClickElement(appId, '.arrow.left');
231   }).then(function() {
232     // Confirm current image is switched to My Desktop Background - Edited.png.
233     return gallery.waitForSlideImage(appId, 600, 800,
234         'My Desktop Background - Edited');
235   }).then(function() {
236     // Click edit button again.
237     return gallery.waitAndClickElement(appId, 'button.edit');
238   }).then(function() {
239     // Confirm overwrite original checkbox is enabled and not checked.
240     return gallery.waitForElement(appId,
241         '.overwrite-original:not([checked]):not([disabled])');
242   });
246  * The rotateImage test for Downloads.
247  * @return {Promise} Promise to be fulfilled with on success.
248  */
249 testcase.rotateImageOnDownloads = function() {
250   return rotateImage('local', 'downloads');
254  * The rotateImage test for Google Drive.
255  * @return {Promise} Promise to be fulfilled with on success.
256  */
257 testcase.rotateImageOnDrive = function() {
258   return rotateImage('drive', 'drive');
262  * The cropImage test for Downloads.
263  * @return {Promise} Promise to be fulfilled with on success.
264  */
265 testcase.cropImageOnDownloads = function() {
266   return cropImage('local', 'downloads');
270  * The cropImage test for Google Drive.
271  * @return {Promise} Promise to be fulfilled with on success.
272  */
273 testcase.cropImageOnDrive = function() {
274   return cropImage('drive', 'drive');
278  * The exposureImage test for Downloads.
279  * @return {Promise} Promise to be fulfilled with on success.
280  */
281 testcase.exposureImageOnDownloads = function() {
282   return exposureImage('local', 'downloads');
286  * The exposureImage test for Google Drive.
287  * @return {Promise} Promise to be fulfilled with on success.
288  */
289 testcase.exposureImageOnDrive = function() {
290   return exposureImage('drive', 'drive');
294  * The enableDisableOverwriteOriginalCheckbox test for Downloads.
295  * @return {Promise} Promise to be fulfilled with on success.
296  */
297 testcase.enableDisableOverwriteOriginalCheckboxOnDownloads = function() {
298   return enableDisableOverwriteOriginalCheckbox('local', 'downloads');
302  * The enableDisableOverwriteOriginalCheckbox test for Drive.
303  * @return {Promise} Promise to be fulfilled with on success.
304  */
305 testcase.enableDisableOverwriteOriginalCheckboxOnDrive = function() {
306   return enableDisableOverwriteOriginalCheckbox('drive', 'drive');