1<!DOCTYPE HTML>
2<html>
3<script src='test.js'></script>
4<script src='execute_async_script.js'></script>
5<script>
6
7function resetAsyncScriptInfo() {
8  delete document[ASYNC_INFO_KEY];
9}
10
11function testScriptThrows() {
12  resetAsyncScriptInfo();
13  var info = getAsyncScriptInfo();
14
15  executeAsyncScript('f(123);', [], true);
16  assertEquals(StatusCode.JAVASCRIPT_ERROR, info.result.status);
17  executeAsyncScript('f(123);', [], false);
18  assertEquals(StatusCode.UNKNOWN_ERROR, info.result.status);
19}
20
21function testUserScriptWithArgs() {
22  resetAsyncScriptInfo();
23
24  var injectedArgs = null;
25  function captureArguments(args) {
26    injectedArgs = args;
27  }
28  // Pass function captureArguments as the first argument. It is used to capture
29  // the injected arguments to the following script.
30  var script =
31      'var args = arguments; args[0](args); args[args.length - 1](args[1]);';
32  var script_args = [captureArguments, 1];
33  executeAsyncScript(script, script_args, true);
34
35  assertEquals(3, injectedArgs.length);
36  assertEquals(captureArguments, injectedArgs[0]);
37  assertEquals(1, injectedArgs[1]);
38
39  var info = getAsyncScriptInfo();
40  assertEquals(0, info.result.status);
41  assertEquals(1, info.result.value);
42  assertEquals(2, info.id);
43}
44
45function testNonUserScript() {
46  resetAsyncScriptInfo();
47  var info = getAsyncScriptInfo();
48
49  executeAsyncScript('arguments[1](arguments[0])', [33], false);
50  assertEquals(0, info.result.status);
51  assertEquals(33, info.result.value);
52
53  executeAsyncScript('arguments[2](new Error("ERR"))', [33], false);
54  assertEquals(StatusCode.UNKNOWN_ERROR, info.result.status);
55  assertEquals(0, info.result.value.indexOf('ERR'));
56
57  executeAsyncScript('var e = new Error("ERR"); e.code = 111; arguments[1](e)',
58                     [], false);
59  assertEquals(111, info.result.status);
60  assertEquals(0, info.result.value.indexOf('ERR'));
61}
62
63function testNoResultBeforeTimeout() {
64  resetAsyncScriptInfo();
65  var info = getAsyncScriptInfo();
66
67  executeAsyncScript(
68      'var a = arguments; window.setTimeout(function() {a[0](33)}, 0);',
69      [], true, 0);
70
71  assert(!info.result);
72}
73
74function testZeroTimeout(runner) {
75  resetAsyncScriptInfo();
76  var info = getAsyncScriptInfo();
77
78  executeAsyncScript(
79      'var a = arguments; window.setTimeout(function() {a[0](33)}, 0);',
80      [], true, 0);
81
82  window.setTimeout(function() {
83    assertEquals(0, info.result.status);
84    assertEquals(33, info.result.value);
85    runner.continueTesting();
86  }, 0);
87  runner.waitForAsync();
88}
89
90function testUserScriptTimesOut(runner) {
91  resetAsyncScriptInfo();
92  var info = getAsyncScriptInfo();
93
94  executeAsyncScript('', [], true, 500);
95
96  window.setTimeout(function() {
97    assertEquals(StatusCode.SCRIPT_TIMEOUT, info.result.status);
98    assert(info.result.value.indexOf('0.5') != -1);
99    runner.continueTesting();
100  }, 500);
101
102  runner.waitForAsync();
103}
104
105function testNonUserScriptTimesOut(runner) {
106  resetAsyncScriptInfo();
107  var info = getAsyncScriptInfo();
108
109  executeAsyncScript('', [], false, 500);
110
111  window.setTimeout(function() {
112    assertEquals(StatusCode.UNKNOWN_ERROR, info.result.status);
113    assert(info.result.value.indexOf('0.5') != -1);
114    runner.continueTesting();
115  }, 500);
116
117  runner.waitForAsync();
118}
119
120function testFirstScriptFinishAfterSecondScriptExecute() {
121  resetAsyncScriptInfo();
122
123  executeAsyncScript(
124      'var f = arguments[0]; setTimeout(function(){ f(1); }, 100000);', []);
125  var info = getAsyncScriptInfo();
126  assert(!info.hasOwnProperty('result'));
127  assertEquals(1, info.id);
128
129  executeAsyncScript('var fn = arguments[0]; fn(2);', []);
130  assertEquals(0, info.result.status);
131  assertEquals(2, info.result.value);
132  assertEquals(3, info.id);
133}
134
135</script>
136<body>
137</body>
138</html>
139