Roll src/third_party/WebKit 3529d49:06e8485 (svn 202554:202555)
[chromium-blink-merge.git] / remoting / webapp / browser_test / timeout_waiter.js
blobcb1a3a484399c6a94a46b301a61bd287a8f2f64a
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 /**
6  * @fileoverview
7  * Provide polling-based "wait for" functionality, and defines some useful
8  * predicates.
9  */
11 'use strict';
13 /** @suppress {duplicate} */
14 var browserTest = browserTest || {};
16 /** @enum {number} */
17 browserTest.Timeout = {
18   NONE: -1,
19   DEFAULT: 5000
22 /** @constructor */
23 browserTest.Predicate = function() {};
25 /** @return {boolean} */
26 browserTest.Predicate.prototype.evaluate = function() {};
28 /** @return {string} */
29 browserTest.Predicate.prototype.description = function() {};
31 /**
32  * @param {browserTest.Predicate} predicate
33  * @param {number=} opt_timeout Timeout in ms.
34  * @return {Promise}
35  */
36 browserTest.waitFor = function(predicate, opt_timeout) {
37   return new Promise(
38       /**
39        * @param {function(boolean):void} fulfill
40        * @param {function(Error):void} reject
41        */
42       function (fulfill, reject) {
43         if (opt_timeout === undefined) {
44           opt_timeout = browserTest.Timeout.DEFAULT;
45         }
47         var timeout = /** @type {number} */ (opt_timeout);
48         var end = Number(Date.now()) + timeout;
49         var testPredicate = function() {
50           if (predicate.evaluate()) {
51             console.log(predicate.description() + ' satisfied.');
52             fulfill(true);
53           } else if (Date.now() >= end) {
54             reject(new Error('Timed out (' + opt_timeout + 'ms) waiting for ' +
55                              predicate.description()));
56           } else {
57             console.log(predicate.description() + ' not yet satisfied.');
58             window.setTimeout(testPredicate, 500);
59           }
60         };
61         testPredicate();
62       });
65 /**
66  * @param {string} id
67  * @return {browserTest.Predicate}
68  */
69 browserTest.isVisible = function(id) {
70   var pred = new browserTest.Predicate();
71   pred.evaluate = function() {
72     /** @type {HTMLElement} */
73     var element = document.getElementById(id);
74     browserTest.expect(Boolean(element), 'No such element: ' + id);
75     return element.getBoundingClientRect().width !== 0;
76   };
77   pred.description = function() {
78     return 'isVisible(' + id + ')';
79   };
80   return pred;
83 /**
84  * @param {string} id
85  * @return {browserTest.Predicate}
86  */
87 browserTest.isEnabled = function(id) {
88   var pred = new browserTest.Predicate();
89   pred.evaluate = function() {
90     /** @type {Element} */
91     var element = document.getElementById(id);
92     browserTest.expect(Boolean(element), 'No such element: ' + id);
93     return !element.disabled;
94   };
95   pred.description = function() {
96     return 'isEnabled(' + id + ')';
97   };
98   return pred;