|
1 /* |
|
2 * Copyright 2012, Mozilla Foundation and contributors |
|
3 * |
|
4 * Licensed under the Apache License, Version 2.0 (the "License"); |
|
5 * you may not use this file except in compliance with the License. |
|
6 * You may obtain a copy of the License at |
|
7 * |
|
8 * http://www.apache.org/licenses/LICENSE-2.0 |
|
9 * |
|
10 * Unless required by applicable law or agreed to in writing, software |
|
11 * distributed under the License is distributed on an "AS IS" BASIS, |
|
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
13 * See the License for the specific language governing permissions and |
|
14 * limitations under the License. |
|
15 */ |
|
16 |
|
17 'use strict'; |
|
18 // <INJECTED SOURCE:START> |
|
19 |
|
20 // THIS FILE IS GENERATED FROM SOURCE IN THE GCLI PROJECT |
|
21 // DO NOT EDIT IT DIRECTLY |
|
22 |
|
23 var exports = {}; |
|
24 |
|
25 var TEST_URI = "data:text/html;charset=utf-8,<p id='gcli-input'>gcli-testJs.js</p>"; |
|
26 |
|
27 function test() { |
|
28 return Task.spawn(function() { |
|
29 let options = yield helpers.openTab(TEST_URI); |
|
30 yield helpers.openToolbar(options); |
|
31 gcli.addItems(mockCommands.items); |
|
32 |
|
33 yield helpers.runTests(options, exports); |
|
34 |
|
35 gcli.removeItems(mockCommands.items); |
|
36 yield helpers.closeToolbar(options); |
|
37 yield helpers.closeTab(options); |
|
38 }).then(finish, helpers.handleError); |
|
39 } |
|
40 |
|
41 // <INJECTED SOURCE:END> |
|
42 |
|
43 // var assert = require('../testharness/assert'); |
|
44 // var helpers = require('./helpers'); |
|
45 var javascript = require('gcli/types/javascript'); |
|
46 |
|
47 var tempWindow; |
|
48 |
|
49 exports.setup = function(options) { |
|
50 if (options.isNoDom) { |
|
51 return; |
|
52 } |
|
53 |
|
54 tempWindow = javascript.getGlobalObject(); |
|
55 Object.defineProperty(options.window, 'donteval', { |
|
56 get: function() { |
|
57 assert.ok(false, 'donteval should not be used'); |
|
58 return { cant: '', touch: '', 'this': '' }; |
|
59 }, |
|
60 enumerable: true, |
|
61 configurable : true |
|
62 }); |
|
63 javascript.setGlobalObject(options.window); |
|
64 }; |
|
65 |
|
66 exports.shutdown = function(options) { |
|
67 if (options.isNoDom) { |
|
68 return; |
|
69 } |
|
70 |
|
71 javascript.setGlobalObject(tempWindow); |
|
72 tempWindow = undefined; |
|
73 delete options.window.donteval; |
|
74 }; |
|
75 |
|
76 function jsTestAllowed(options) { |
|
77 return options.isRemote || options.isNoDom || |
|
78 options.requisition.canon.getCommand('{') == null; |
|
79 } |
|
80 |
|
81 exports.testBasic = function(options) { |
|
82 return helpers.audit(options, [ |
|
83 { |
|
84 skipRemainingIf: jsTestAllowed, |
|
85 setup: '{', |
|
86 check: { |
|
87 input: '{', |
|
88 hints: '', |
|
89 markup: 'V', |
|
90 cursor: 1, |
|
91 current: 'javascript', |
|
92 status: 'ERROR', |
|
93 predictions: [ ], |
|
94 unassigned: [ ], |
|
95 args: { |
|
96 command: { name: '{' }, |
|
97 javascript: { |
|
98 value: undefined, |
|
99 arg: '{', |
|
100 status: 'INCOMPLETE' |
|
101 } |
|
102 } |
|
103 } |
|
104 }, |
|
105 { |
|
106 setup: '{ ', |
|
107 check: { |
|
108 input: '{ ', |
|
109 hints: '', |
|
110 markup: 'VV', |
|
111 cursor: 2, |
|
112 current: 'javascript', |
|
113 status: 'ERROR', |
|
114 predictions: [ ], |
|
115 unassigned: [ ], |
|
116 args: { |
|
117 command: { name: '{' }, |
|
118 javascript: { |
|
119 value: undefined, |
|
120 arg: '{ ', |
|
121 status: 'INCOMPLETE' |
|
122 } |
|
123 } |
|
124 } |
|
125 }, |
|
126 { |
|
127 setup: '{ w', |
|
128 check: { |
|
129 input: '{ w', |
|
130 hints: 'indow', |
|
131 markup: 'VVI', |
|
132 cursor: 3, |
|
133 current: 'javascript', |
|
134 status: 'ERROR', |
|
135 predictionsContains: [ 'window' ], |
|
136 unassigned: [ ], |
|
137 args: { |
|
138 command: { name: '{' }, |
|
139 javascript: { |
|
140 value: 'w', |
|
141 arg: '{ w', |
|
142 status: 'INCOMPLETE' |
|
143 } |
|
144 } |
|
145 } |
|
146 }, |
|
147 { |
|
148 setup: '{ windo', |
|
149 check: { |
|
150 input: '{ windo', |
|
151 hints: 'w', |
|
152 markup: 'VVIIIII', |
|
153 cursor: 7, |
|
154 current: 'javascript', |
|
155 status: 'ERROR', |
|
156 predictions: [ 'window' ], |
|
157 unassigned: [ ], |
|
158 args: { |
|
159 command: { name: '{' }, |
|
160 javascript: { |
|
161 value: 'windo', |
|
162 arg: '{ windo', |
|
163 status: 'INCOMPLETE' |
|
164 } |
|
165 } |
|
166 } |
|
167 }, |
|
168 { |
|
169 setup: '{ window', |
|
170 check: { |
|
171 input: '{ window', |
|
172 hints: '', |
|
173 markup: 'VVVVVVVV', |
|
174 cursor: 8, |
|
175 current: 'javascript', |
|
176 status: 'VALID', |
|
177 predictions: [ ], |
|
178 unassigned: [ ], |
|
179 args: { |
|
180 command: { name: '{' }, |
|
181 javascript: { |
|
182 value: 'window', |
|
183 arg: '{ window', |
|
184 status: 'VALID', |
|
185 message: '' |
|
186 } |
|
187 } |
|
188 } |
|
189 }, |
|
190 { |
|
191 setup: '{ window.do', |
|
192 check: { |
|
193 input: '{ window.do', |
|
194 hints: 'cument', |
|
195 markup: 'VVIIIIIIIII', |
|
196 cursor: 11, |
|
197 current: 'javascript', |
|
198 status: 'ERROR', |
|
199 predictionsContains: [ 'window.document' ], |
|
200 unassigned: [ ], |
|
201 args: { |
|
202 command: { name: '{' }, |
|
203 javascript: { |
|
204 value: 'window.do', |
|
205 arg: '{ window.do', |
|
206 status: 'INCOMPLETE' |
|
207 } |
|
208 } |
|
209 } |
|
210 }, |
|
211 { |
|
212 setup: '{ window.document.title', |
|
213 check: { |
|
214 input: '{ window.document.title', |
|
215 hints: '', |
|
216 markup: 'VVVVVVVVVVVVVVVVVVVVVVV', |
|
217 cursor: 23, |
|
218 current: 'javascript', |
|
219 status: 'VALID', |
|
220 predictions: [ ], |
|
221 unassigned: [ ], |
|
222 args: { |
|
223 command: { name: '{' }, |
|
224 javascript: { |
|
225 value: 'window.document.title', |
|
226 arg: '{ window.document.title', |
|
227 status: 'VALID', |
|
228 message: '' |
|
229 } |
|
230 } |
|
231 } |
|
232 } |
|
233 ]); |
|
234 }; |
|
235 |
|
236 exports.testDocument = function(options) { |
|
237 return helpers.audit(options, [ |
|
238 { |
|
239 skipRemainingIf: jsTestAllowed, |
|
240 setup: '{ docu', |
|
241 check: { |
|
242 input: '{ docu', |
|
243 hints: 'ment', |
|
244 markup: 'VVIIII', |
|
245 cursor: 6, |
|
246 current: 'javascript', |
|
247 status: 'ERROR', |
|
248 predictions: [ 'document' ], |
|
249 unassigned: [ ], |
|
250 args: { |
|
251 command: { name: '{' }, |
|
252 javascript: { |
|
253 value: 'docu', |
|
254 arg: '{ docu', |
|
255 status: 'INCOMPLETE' |
|
256 } |
|
257 } |
|
258 } |
|
259 }, |
|
260 { |
|
261 setup: '{ docu<TAB>', |
|
262 check: { |
|
263 input: '{ document', |
|
264 hints: '', |
|
265 markup: 'VVVVVVVVVV', |
|
266 cursor: 10, |
|
267 current: 'javascript', |
|
268 status: 'VALID', |
|
269 predictions: [ ], |
|
270 unassigned: [ ], |
|
271 args: { |
|
272 command: { name: '{' }, |
|
273 javascript: { |
|
274 value: 'document', |
|
275 arg: '{ document', |
|
276 status: 'VALID', |
|
277 message: '' |
|
278 } |
|
279 } |
|
280 } |
|
281 }, |
|
282 { |
|
283 setup: '{ document.titl', |
|
284 check: { |
|
285 input: '{ document.titl', |
|
286 hints: 'e', |
|
287 markup: 'VVIIIIIIIIIIIII', |
|
288 cursor: 15, |
|
289 current: 'javascript', |
|
290 status: 'ERROR', |
|
291 predictions: [ 'document.title' ], |
|
292 unassigned: [ ], |
|
293 args: { |
|
294 command: { name: '{' }, |
|
295 javascript: { |
|
296 value: 'document.titl', |
|
297 arg: '{ document.titl', |
|
298 status: 'INCOMPLETE' |
|
299 } |
|
300 } |
|
301 } |
|
302 }, |
|
303 { |
|
304 setup: '{ document.titl<TAB>', |
|
305 check: { |
|
306 input: '{ document.title ', |
|
307 hints: '', |
|
308 markup: 'VVVVVVVVVVVVVVVVV', |
|
309 cursor: 17, |
|
310 current: 'javascript', |
|
311 status: 'VALID', |
|
312 predictions: [ ], |
|
313 unassigned: [ ], |
|
314 args: { |
|
315 command: { name: '{' }, |
|
316 javascript: { |
|
317 value: 'document.title', |
|
318 arg: '{ document.title ', |
|
319 status: 'VALID', |
|
320 message: '' |
|
321 } |
|
322 } |
|
323 } |
|
324 }, |
|
325 { |
|
326 setup: '{ document.title', |
|
327 check: { |
|
328 input: '{ document.title', |
|
329 hints: '', |
|
330 markup: 'VVVVVVVVVVVVVVVV', |
|
331 cursor: 16, |
|
332 current: 'javascript', |
|
333 status: 'VALID', |
|
334 predictions: [ ], |
|
335 unassigned: [ ], |
|
336 args: { |
|
337 command: { name: '{' }, |
|
338 javascript: { |
|
339 value: 'document.title', |
|
340 arg: '{ document.title', |
|
341 status: 'VALID', |
|
342 message: '' |
|
343 } |
|
344 } |
|
345 } |
|
346 } |
|
347 ]); |
|
348 }; |
|
349 |
|
350 exports.testDonteval = function(options) { |
|
351 if (!options.isNoDom) { |
|
352 // nodom causes an eval here, maybe that's node/v8? |
|
353 assert.ok('donteval' in options.window, 'donteval exists'); |
|
354 } |
|
355 |
|
356 return helpers.audit(options, [ |
|
357 { |
|
358 skipRemainingIf: jsTestAllowed, |
|
359 setup: '{ don', |
|
360 check: { |
|
361 input: '{ don', |
|
362 hints: 'teval', |
|
363 markup: 'VVIII', |
|
364 cursor: 5, |
|
365 current: 'javascript', |
|
366 status: 'ERROR', |
|
367 predictions: [ 'donteval' ], |
|
368 unassigned: [ ], |
|
369 args: { |
|
370 command: { name: '{' }, |
|
371 javascript: { |
|
372 value: 'don', |
|
373 arg: '{ don', |
|
374 status: 'INCOMPLETE' |
|
375 } |
|
376 } |
|
377 } |
|
378 }, |
|
379 { |
|
380 setup: '{ donteval', |
|
381 check: { |
|
382 input: '{ donteval', |
|
383 hints: '', |
|
384 markup: 'VVVVVVVVVV', |
|
385 cursor: 10, |
|
386 current: 'javascript', |
|
387 status: 'VALID', |
|
388 predictions: [ ], |
|
389 unassigned: [ ], |
|
390 args: { |
|
391 command: { name: '{' }, |
|
392 javascript: { |
|
393 value: 'donteval', |
|
394 arg: '{ donteval', |
|
395 status: 'VALID', |
|
396 message: '' |
|
397 } |
|
398 } |
|
399 } |
|
400 }, |
|
401 /* |
|
402 // This is a controversial test - technically we can tell that it's an error |
|
403 // because 'donteval.' is a syntax error, however donteval is unsafe so we |
|
404 // are playing safe by bailing out early. It's enough of a corner case that |
|
405 // I don't think it warrants fixing |
|
406 { |
|
407 setup: '{ donteval.', |
|
408 check: { |
|
409 input: '{ donteval.', |
|
410 hints: '', |
|
411 markup: 'VVVVVVVVVVV', |
|
412 cursor: 11, |
|
413 current: 'javascript', |
|
414 status: 'VALID', |
|
415 predictions: [ ], |
|
416 unassigned: [ ], |
|
417 args: { |
|
418 command: { name: '{' }, |
|
419 javascript: { |
|
420 value: 'donteval.', |
|
421 arg: '{ donteval.', |
|
422 status: 'VALID', |
|
423 message: '' |
|
424 } |
|
425 } |
|
426 } |
|
427 }, |
|
428 */ |
|
429 { |
|
430 setup: '{ donteval.cant', |
|
431 check: { |
|
432 input: '{ donteval.cant', |
|
433 hints: '', |
|
434 markup: 'VVVVVVVVVVVVVVV', |
|
435 cursor: 15, |
|
436 current: 'javascript', |
|
437 status: 'VALID', |
|
438 predictions: [ ], |
|
439 unassigned: [ ], |
|
440 args: { |
|
441 command: { name: '{' }, |
|
442 javascript: { |
|
443 value: 'donteval.cant', |
|
444 arg: '{ donteval.cant', |
|
445 status: 'VALID', |
|
446 message: '' |
|
447 } |
|
448 } |
|
449 } |
|
450 }, |
|
451 { |
|
452 setup: '{ donteval.xxx', |
|
453 check: { |
|
454 input: '{ donteval.xxx', |
|
455 hints: '', |
|
456 markup: 'VVVVVVVVVVVVVV', |
|
457 cursor: 14, |
|
458 current: 'javascript', |
|
459 status: 'VALID', |
|
460 predictions: [ ], |
|
461 unassigned: [ ], |
|
462 args: { |
|
463 command: { name: '{' }, |
|
464 javascript: { |
|
465 value: 'donteval.xxx', |
|
466 arg: '{ donteval.xxx', |
|
467 status: 'VALID', |
|
468 message: '' |
|
469 } |
|
470 } |
|
471 } |
|
472 } |
|
473 ]); |
|
474 }; |
|
475 |
|
476 exports.testExec = function(options) { |
|
477 return helpers.audit(options, [ |
|
478 { |
|
479 skipRemainingIf: jsTestAllowed, |
|
480 setup: '{ 1+1', |
|
481 check: { |
|
482 input: '{ 1+1', |
|
483 hints: '', |
|
484 markup: 'VVVVV', |
|
485 cursor: 5, |
|
486 current: 'javascript', |
|
487 status: 'VALID', |
|
488 options: [ ], |
|
489 message: '', |
|
490 predictions: [ ], |
|
491 unassigned: [ ], |
|
492 args: { |
|
493 javascript: { |
|
494 value: '1+1', |
|
495 arg: '{ 1+1', |
|
496 status: 'VALID', |
|
497 message: '' |
|
498 } |
|
499 } |
|
500 }, |
|
501 exec: { |
|
502 output: '2', |
|
503 type: 'number', |
|
504 error: false |
|
505 } |
|
506 }, |
|
507 { |
|
508 setup: '{ 1+1 }', |
|
509 check: { |
|
510 input: '{ 1+1 }', |
|
511 hints: '', |
|
512 markup: 'VVVVVVV', |
|
513 cursor: 7, |
|
514 current: 'javascript', |
|
515 status: 'VALID', |
|
516 options: [ ], |
|
517 message: '', |
|
518 predictions: [ ], |
|
519 unassigned: [ ], |
|
520 args: { |
|
521 javascript: { |
|
522 value: '1+1', |
|
523 arg: '{ 1+1 }', |
|
524 status: 'VALID', |
|
525 message: '' |
|
526 } |
|
527 } |
|
528 }, |
|
529 exec: { |
|
530 output: '2', |
|
531 type: 'number', |
|
532 error: false |
|
533 } |
|
534 }, |
|
535 { |
|
536 setup: '{ "hello"', |
|
537 check: { |
|
538 input: '{ "hello"', |
|
539 hints: '', |
|
540 markup: 'VVVVVVVVV', |
|
541 cursor: 9, |
|
542 current: 'javascript', |
|
543 status: 'VALID', |
|
544 options: [ ], |
|
545 message: '', |
|
546 predictions: [ ], |
|
547 unassigned: [ ], |
|
548 args: { |
|
549 javascript: { |
|
550 value: '"hello"', |
|
551 arg: '{ "hello"', |
|
552 status: 'VALID', |
|
553 message: '' |
|
554 } |
|
555 } |
|
556 }, |
|
557 exec: { |
|
558 output: 'hello', |
|
559 type: 'string', |
|
560 error: false |
|
561 } |
|
562 }, |
|
563 { |
|
564 setup: '{ "hello" + 1', |
|
565 check: { |
|
566 input: '{ "hello" + 1', |
|
567 hints: '', |
|
568 markup: 'VVVVVVVVVVVVV', |
|
569 cursor: 13, |
|
570 current: 'javascript', |
|
571 status: 'VALID', |
|
572 options: [ ], |
|
573 message: '', |
|
574 predictions: [ ], |
|
575 unassigned: [ ], |
|
576 args: { |
|
577 javascript: { |
|
578 value: '"hello" + 1', |
|
579 arg: '{ "hello" + 1', |
|
580 status: 'VALID', |
|
581 message: '' |
|
582 } |
|
583 } |
|
584 }, |
|
585 exec: { |
|
586 output: 'hello1', |
|
587 type: 'string', |
|
588 error: false |
|
589 } |
|
590 } |
|
591 ]); |
|
592 }; |