poltergeist 1.7.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ class Poltergeist.Cmd
2
+ constructor: (@owner, @id, @name, @args)->
3
+
4
+ sendResponse: (response) ->
5
+ errors = @browser.currentPage.errors
6
+ @browser.currentPage.clearErrors()
7
+
8
+ if errors.length > 0 && @browser.js_errors
9
+ @sendError(new Poltergeist.JavascriptError(errors))
10
+ else
11
+ @owner.sendResponse(@id, response)
12
+
13
+ sendError: (errors) ->
14
+ @owner.sendError(@id, errors)
15
+
16
+ run: (@browser) ->
17
+ @browser.runCommand(this)
@@ -1,19 +1,24 @@
1
1
  var PoltergeistAgent;
2
2
 
3
3
  PoltergeistAgent = (function() {
4
+ PoltergeistAgent.JSON || (PoltergeistAgent.JSON = {
5
+ parse: JSON.parse,
6
+ stringify: JSON.stringify
7
+ });
8
+
4
9
  function PoltergeistAgent() {
5
10
  this.elements = [];
6
11
  this.nodes = {};
7
12
  }
8
13
 
9
14
  PoltergeistAgent.prototype.externalCall = function(name, args) {
10
- var error;
15
+ var error, error1;
11
16
  try {
12
17
  return {
13
18
  value: this[name].apply(this, args)
14
19
  };
15
- } catch (_error) {
16
- error = _error;
20
+ } catch (error1) {
21
+ error = error1;
17
22
  return {
18
23
  error: {
19
24
  message: error.toString(),
@@ -24,17 +29,17 @@ PoltergeistAgent = (function() {
24
29
  };
25
30
 
26
31
  PoltergeistAgent.stringify = function(object) {
27
- var error;
32
+ var error, error1;
28
33
  try {
29
- return JSON.stringify(object, function(key, value) {
34
+ return PoltergeistAgent.JSON.stringify(object, function(key, value) {
30
35
  if (Array.isArray(this[key])) {
31
36
  return this[key];
32
37
  } else {
33
38
  return value;
34
39
  }
35
40
  });
36
- } catch (_error) {
37
- error = _error;
41
+ } catch (error1) {
42
+ error = error1;
38
43
  if (error instanceof TypeError) {
39
44
  return '"(cyclic structure)"';
40
45
  } else {
@@ -48,7 +53,7 @@ PoltergeistAgent = (function() {
48
53
  };
49
54
 
50
55
  PoltergeistAgent.prototype.find = function(method, selector, within) {
51
- var el, error, i, results, xpath, _i, _len, _results;
56
+ var el, error, error1, i, j, len, results, results1, xpath;
52
57
  if (within == null) {
53
58
  within = document;
54
59
  }
@@ -56,24 +61,24 @@ PoltergeistAgent = (function() {
56
61
  if (method === "xpath") {
57
62
  xpath = document.evaluate(selector, within, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
58
63
  results = (function() {
59
- var _i, _ref, _results;
60
- _results = [];
61
- for (i = _i = 0, _ref = xpath.snapshotLength; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
62
- _results.push(xpath.snapshotItem(i));
64
+ var j, ref, results1;
65
+ results1 = [];
66
+ for (i = j = 0, ref = xpath.snapshotLength; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
67
+ results1.push(xpath.snapshotItem(i));
63
68
  }
64
- return _results;
69
+ return results1;
65
70
  })();
66
71
  } else {
67
72
  results = within.querySelectorAll(selector);
68
73
  }
69
- _results = [];
70
- for (_i = 0, _len = results.length; _i < _len; _i++) {
71
- el = results[_i];
72
- _results.push(this.register(el));
74
+ results1 = [];
75
+ for (j = 0, len = results.length; j < len; j++) {
76
+ el = results[j];
77
+ results1.push(this.register(el));
73
78
  }
74
- return _results;
75
- } catch (_error) {
76
- error = _error;
79
+ return results1;
80
+ } catch (error1) {
81
+ error = error1;
77
82
  if (error.code === DOMException.SYNTAX_ERR || error.code === 51) {
78
83
  throw new PoltergeistAgent.InvalidSelector;
79
84
  } else {
@@ -95,8 +100,8 @@ PoltergeistAgent = (function() {
95
100
  };
96
101
 
97
102
  PoltergeistAgent.prototype.get = function(id) {
98
- var _base;
99
- return (_base = this.nodes)[id] || (_base[id] = new PoltergeistAgent.Node(this, this.elements[id]));
103
+ var base;
104
+ return (base = this.nodes)[id] || (base[id] = new PoltergeistAgent.Node(this, this.elements[id]));
100
105
  };
101
106
 
102
107
  PoltergeistAgent.prototype.nodeCall = function(id, name, args) {
@@ -153,9 +158,9 @@ PoltergeistAgent.Node = (function() {
153
158
  FORM: ['submit']
154
159
  };
155
160
 
156
- function Node(agent, element) {
161
+ function Node(agent, element1) {
157
162
  this.agent = agent;
158
- this.element = element;
163
+ this.element = element1;
159
164
  }
160
165
 
161
166
  Node.prototype.parentId = function() {
@@ -178,19 +183,20 @@ PoltergeistAgent.Node = (function() {
178
183
  };
179
184
 
180
185
  Node.prototype.isObsolete = function() {
181
- var obsolete,
182
- _this = this;
183
- obsolete = function(element) {
184
- if (element.parentNode != null) {
185
- if (element.parentNode === document) {
186
- return false;
186
+ var obsolete;
187
+ obsolete = (function(_this) {
188
+ return function(element) {
189
+ if (element.parentNode != null) {
190
+ if (element.parentNode === document) {
191
+ return false;
192
+ } else {
193
+ return obsolete(element.parentNode);
194
+ }
187
195
  } else {
188
- return obsolete(element.parentNode);
196
+ return true;
189
197
  }
190
- } else {
191
- return true;
192
- }
193
- };
198
+ };
199
+ })(this);
194
200
  return obsolete(this.element);
195
201
  };
196
202
 
@@ -200,6 +206,10 @@ PoltergeistAgent.Node = (function() {
200
206
  event.initEvent('change', true, false);
201
207
  if (this.element.nodeName === 'OPTION') {
202
208
  element = this.element.parentNode;
209
+ if (element.nodeName === 'OPTGROUP') {
210
+ element = element.parentNode;
211
+ }
212
+ element;
203
213
  } else {
204
214
  element = this.element;
205
215
  }
@@ -265,12 +275,16 @@ PoltergeistAgent.Node = (function() {
265
275
  return window.getSelection().deleteFromDocument();
266
276
  };
267
277
 
278
+ Node.prototype.getProperty = function(name) {
279
+ return this.element[name];
280
+ };
281
+
268
282
  Node.prototype.getAttributes = function() {
269
- var attr, attrs, i, _i, _len, _ref;
283
+ var attr, attrs, j, len, ref;
270
284
  attrs = {};
271
- _ref = this.element.attributes;
272
- for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
273
- attr = _ref[i];
285
+ ref = this.element.attributes;
286
+ for (j = 0, len = ref.length; j < len; j++) {
287
+ attr = ref[j];
274
288
  attrs[attr.name] = attr.value.replace("\n", "\\n");
275
289
  }
276
290
  return attrs;
@@ -285,41 +299,44 @@ PoltergeistAgent.Node = (function() {
285
299
  };
286
300
 
287
301
  Node.prototype.scrollIntoView = function() {
288
- return this.element.scrollIntoViewIfNeeded();
302
+ this.element.scrollIntoViewIfNeeded();
303
+ if (!this.isInViewport()) {
304
+ return this.element.scrollIntoView();
305
+ }
289
306
  };
290
307
 
291
308
  Node.prototype.value = function() {
292
- var option, _i, _len, _ref, _results;
309
+ var j, len, option, ref, results1;
293
310
  if (this.element.tagName === 'SELECT' && this.element.multiple) {
294
- _ref = this.element.children;
295
- _results = [];
296
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
297
- option = _ref[_i];
311
+ ref = this.element.children;
312
+ results1 = [];
313
+ for (j = 0, len = ref.length; j < len; j++) {
314
+ option = ref[j];
298
315
  if (option.selected) {
299
- _results.push(option.value);
316
+ results1.push(option.value);
300
317
  }
301
318
  }
302
- return _results;
319
+ return results1;
303
320
  } else {
304
321
  return this.element.value;
305
322
  }
306
323
  };
307
324
 
308
325
  Node.prototype.set = function(value) {
309
- var char, keyCode, _i, _len;
326
+ var char, j, keyCode, len;
310
327
  if (this.element.readOnly) {
311
328
  return;
312
329
  }
313
330
  if (this.element.maxLength >= 0) {
314
331
  value = value.substr(0, this.element.maxLength);
315
332
  }
316
- this.element.value = '';
317
333
  this.trigger('focus');
334
+ this.element.value = '';
318
335
  if (this.element.type === 'number') {
319
336
  this.element.value = value;
320
337
  } else {
321
- for (_i = 0, _len = value.length; _i < _len; _i++) {
322
- char = value[_i];
338
+ for (j = 0, len = value.length; j < len; j++) {
339
+ char = value[j];
323
340
  keyCode = this.characterToKeyCode(char);
324
341
  this.keyupdowned('keydown', keyCode);
325
342
  this.element.value += char;
@@ -363,16 +380,22 @@ PoltergeistAgent.Node = (function() {
363
380
  };
364
381
 
365
382
  Node.prototype.isVisible = function(element) {
366
- if (!element) {
367
- element = this.element;
368
- }
369
- if (window.getComputedStyle(element).display === 'none') {
370
- return false;
371
- } else if (element.parentElement) {
372
- return this.isVisible(element.parentElement);
373
- } else {
374
- return true;
383
+ var style;
384
+ element || (element = this.element);
385
+ while (element) {
386
+ style = window.getComputedStyle(element);
387
+ if (style.display === 'none' || style.visibility === 'hidden' || parseFloat(style.opacity) === 0) {
388
+ return false;
389
+ }
390
+ element = element.parentElement;
375
391
  }
392
+ return true;
393
+ };
394
+
395
+ Node.prototype.isInViewport = function() {
396
+ var rect;
397
+ rect = this.element.getBoundingClientRect();
398
+ return rect.top >= 0 && rect.left >= 0 && rect.bottom <= window.innerHeight && rect.right <= window.innerWidth;
376
399
  };
377
400
 
378
401
  Node.prototype.isDisabled = function() {
@@ -380,16 +403,17 @@ PoltergeistAgent.Node = (function() {
380
403
  };
381
404
 
382
405
  Node.prototype.path = function() {
383
- var elements, selectors,
384
- _this = this;
385
- elements = this.parentIds().reverse().map(function(id) {
386
- return _this.agent.get(id);
387
- });
406
+ var elements, selectors;
407
+ elements = this.parentIds().reverse().map((function(_this) {
408
+ return function(id) {
409
+ return _this.agent.get(id);
410
+ };
411
+ })(this));
388
412
  elements.push(this);
389
413
  selectors = elements.map(function(el) {
390
414
  var prev_siblings;
391
415
  prev_siblings = el.find('xpath', "./preceding-sibling::" + (el.tagName()));
392
- return "" + (el.tagName()) + "[" + (prev_siblings.length + 1) + "]";
416
+ return (el.tagName()) + "[" + (prev_siblings.length + 1) + "]";
393
417
  });
394
418
  return "//" + selectors.join('/');
395
419
  };
@@ -488,16 +512,18 @@ PoltergeistAgent.Node = (function() {
488
512
  };
489
513
 
490
514
  Node.prototype.getSelector = function(el) {
491
- var className, selector, _i, _len, _ref;
515
+ var className, classes, j, len, ref, ref1, selector;
492
516
  selector = el.tagName !== 'HTML' ? this.getSelector(el.parentNode) + ' ' : '';
493
517
  selector += el.tagName.toLowerCase();
494
518
  if (el.id) {
495
519
  selector += "#" + el.id;
496
520
  }
497
- _ref = el.classList;
498
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
499
- className = _ref[_i];
500
- selector += "." + className;
521
+ classes = el.classList || ((ref = el.getAttribute('class')) != null ? (ref1 = ref.trim()) != null ? ref1.split(/\s+/) : void 0 : void 0) || [];
522
+ for (j = 0, len = classes.length; j < len; j++) {
523
+ className = classes[j];
524
+ if (className !== '') {
525
+ selector += "." + className;
526
+ }
501
527
  }
502
528
  return selector;
503
529
  };
@@ -1,8 +1,7 @@
1
- var __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
1
+ var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
2
2
 
3
3
  Poltergeist.Browser = (function() {
4
- function Browser(owner, width, height) {
5
- this.owner = owner;
4
+ function Browser(width, height) {
6
5
  this.width = width || 1024;
7
6
  this.height = height || 768;
8
7
  this.pages = [];
@@ -16,9 +15,8 @@ Poltergeist.Browser = (function() {
16
15
  }
17
16
 
18
17
  Browser.prototype.resetPage = function() {
19
- var _ref,
20
- _this = this;
21
- _ref = [0, []], this._counter = _ref[0], this.pages = _ref[1];
18
+ var ref;
19
+ ref = [0, []], this._counter = ref[0], this.pages = ref[1];
22
20
  if (this.page != null) {
23
21
  if (!this.page.closed) {
24
22
  if (this.page.currentUrl() !== 'about:blank') {
@@ -38,33 +36,41 @@ Poltergeist.Browser = (function() {
38
36
  this.processed_modal_messages = [];
39
37
  this.confirm_processes = [];
40
38
  this.prompt_responses = [];
41
- this.page["native"]().onAlert = function(msg) {
42
- _this.setModalMessage(msg);
43
- };
44
- this.page["native"]().onConfirm = function(msg) {
45
- var process;
46
- process = _this.confirm_processes.pop();
47
- if (process === void 0) {
48
- process = true;
49
- }
50
- _this.setModalMessage(msg);
51
- return process;
52
- };
53
- this.page["native"]().onPrompt = function(msg, defaultVal) {
54
- var response;
55
- response = _this.prompt_responses.pop();
56
- if (response === void 0 || response === false) {
57
- response = defaultVal;
58
- }
59
- _this.setModalMessage(msg);
60
- return response;
61
- };
62
- return this.page.onPageCreated = function(newPage) {
63
- var page;
64
- page = new Poltergeist.WebPage(newPage);
65
- page.handle = "" + (_this._counter++);
66
- return _this.pages.push(page);
67
- };
39
+ this.page["native"]().onAlert = (function(_this) {
40
+ return function(msg) {
41
+ _this.setModalMessage(msg);
42
+ };
43
+ })(this);
44
+ this.page["native"]().onConfirm = (function(_this) {
45
+ return function(msg) {
46
+ var process;
47
+ process = _this.confirm_processes.pop();
48
+ if (process === void 0) {
49
+ process = true;
50
+ }
51
+ _this.setModalMessage(msg);
52
+ return process;
53
+ };
54
+ })(this);
55
+ this.page["native"]().onPrompt = (function(_this) {
56
+ return function(msg, defaultVal) {
57
+ var response;
58
+ response = _this.prompt_responses.pop();
59
+ if (response === void 0 || response === false) {
60
+ response = defaultVal;
61
+ }
62
+ _this.setModalMessage(msg);
63
+ return response;
64
+ };
65
+ })(this);
66
+ return this.page.onPageCreated = (function(_this) {
67
+ return function(newPage) {
68
+ var page;
69
+ page = new Poltergeist.WebPage(newPage);
70
+ page.handle = "" + (_this._counter++);
71
+ return _this.pages.push(page);
72
+ };
73
+ })(this);
68
74
  };
69
75
 
70
76
  Browser.prototype.getPageByHandle = function(handle) {
@@ -73,9 +79,10 @@ Poltergeist.Browser = (function() {
73
79
  })[0];
74
80
  };
75
81
 
76
- Browser.prototype.runCommand = function(name, args) {
82
+ Browser.prototype.runCommand = function(command) {
83
+ this.current_command = command;
77
84
  this.currentPage.state = 'default';
78
- return this[name].apply(this, args);
85
+ return this[command.name].apply(this, command.args);
79
86
  };
80
87
 
81
88
  Browser.prototype.debug = function(message) {
@@ -88,20 +95,9 @@ Poltergeist.Browser = (function() {
88
95
  return this.processed_modal_messages.push(msg);
89
96
  };
90
97
 
91
- Browser.prototype.sendResponse = function(response) {
92
- var errors;
93
- errors = this.currentPage.errors;
94
- this.currentPage.clearErrors();
95
- if (errors.length > 0 && this.js_errors) {
96
- return this.owner.sendError(new Poltergeist.JavascriptError(errors));
97
- } else {
98
- return this.owner.sendResponse(response);
99
- }
100
- };
101
-
102
98
  Browser.prototype.add_extension = function(extension) {
103
99
  this.currentPage.injectExtension(extension);
104
- return this.sendResponse('success');
100
+ return this.current_command.sendResponse('success');
105
101
  };
106
102
 
107
103
  Browser.prototype.node = function(page_id, id) {
@@ -113,8 +109,7 @@ Poltergeist.Browser = (function() {
113
109
  };
114
110
 
115
111
  Browser.prototype.visit = function(url) {
116
- var prevUrl,
117
- _this = this;
112
+ var command, prevUrl;
118
113
  this.currentPage.state = 'loading';
119
114
  this.processed_modal_messages = [];
120
115
  this.confirm_processes = [];
@@ -123,84 +118,91 @@ Poltergeist.Browser = (function() {
123
118
  this.currentPage.open(url);
124
119
  if (/#/.test(url) && prevUrl.split('#')[0] === url.split('#')[0]) {
125
120
  this.currentPage.state = 'default';
126
- return this.sendResponse({
121
+ return this.current_command.sendResponse({
127
122
  status: 'success'
128
123
  });
129
124
  } else {
130
- return this.currentPage.waitState('default', function() {
131
- if (_this.currentPage.statusCode === null && _this.currentPage.status === 'fail') {
132
- return _this.owner.sendError(new Poltergeist.StatusFailError);
133
- } else {
134
- return _this.sendResponse({
135
- status: _this.currentPage.status
136
- });
137
- }
138
- });
125
+ command = this.current_command;
126
+ return this.currentPage.waitState('default', (function(_this) {
127
+ return function() {
128
+ if (_this.currentPage.statusCode === null && _this.currentPage.status === 'fail') {
129
+ return command.sendError(new Poltergeist.StatusFailError(url));
130
+ } else {
131
+ return command.sendResponse({
132
+ status: _this.currentPage.status
133
+ });
134
+ }
135
+ };
136
+ })(this));
139
137
  }
140
138
  };
141
139
 
142
140
  Browser.prototype.current_url = function() {
143
- return this.sendResponse(this.currentPage.currentUrl());
141
+ return this.current_command.sendResponse(this.currentPage.currentUrl());
144
142
  };
145
143
 
146
144
  Browser.prototype.status_code = function() {
147
- return this.sendResponse(this.currentPage.statusCode);
145
+ return this.current_command.sendResponse(this.currentPage.statusCode);
148
146
  };
149
147
 
150
148
  Browser.prototype.body = function() {
151
- return this.sendResponse(this.currentPage.content());
149
+ return this.current_command.sendResponse(this.currentPage.content());
152
150
  };
153
151
 
154
152
  Browser.prototype.source = function() {
155
- return this.sendResponse(this.currentPage.source);
153
+ return this.current_command.sendResponse(this.currentPage.source);
156
154
  };
157
155
 
158
156
  Browser.prototype.title = function() {
159
- return this.sendResponse(this.currentPage.title());
157
+ return this.current_command.sendResponse(this.currentPage.title());
160
158
  };
161
159
 
162
160
  Browser.prototype.find = function(method, selector) {
163
- return this.sendResponse({
161
+ return this.current_command.sendResponse({
164
162
  page_id: this.currentPage.id,
165
163
  ids: this.currentPage.find(method, selector)
166
164
  });
167
165
  };
168
166
 
169
167
  Browser.prototype.find_within = function(page_id, id, method, selector) {
170
- return this.sendResponse(this.node(page_id, id).find(method, selector));
168
+ return this.current_command.sendResponse(this.node(page_id, id).find(method, selector));
171
169
  };
172
170
 
173
171
  Browser.prototype.all_text = function(page_id, id) {
174
- return this.sendResponse(this.node(page_id, id).allText());
172
+ return this.current_command.sendResponse(this.node(page_id, id).allText());
175
173
  };
176
174
 
177
175
  Browser.prototype.visible_text = function(page_id, id) {
178
- return this.sendResponse(this.node(page_id, id).visibleText());
176
+ return this.current_command.sendResponse(this.node(page_id, id).visibleText());
179
177
  };
180
178
 
181
179
  Browser.prototype.delete_text = function(page_id, id) {
182
- return this.sendResponse(this.node(page_id, id).deleteText());
180
+ return this.current_command.sendResponse(this.node(page_id, id).deleteText());
181
+ };
182
+
183
+ Browser.prototype.property = function(page_id, id, name) {
184
+ return this.current_command.sendResponse(this.node(page_id, id).getProperty(name));
183
185
  };
184
186
 
185
187
  Browser.prototype.attribute = function(page_id, id, name) {
186
- return this.sendResponse(this.node(page_id, id).getAttribute(name));
188
+ return this.current_command.sendResponse(this.node(page_id, id).getAttribute(name));
187
189
  };
188
190
 
189
191
  Browser.prototype.attributes = function(page_id, id, name) {
190
- return this.sendResponse(this.node(page_id, id).getAttributes());
192
+ return this.current_command.sendResponse(this.node(page_id, id).getAttributes());
191
193
  };
192
194
 
193
195
  Browser.prototype.parents = function(page_id, id) {
194
- return this.sendResponse(this.node(page_id, id).parentIds());
196
+ return this.current_command.sendResponse(this.node(page_id, id).parentIds());
195
197
  };
196
198
 
197
199
  Browser.prototype.value = function(page_id, id) {
198
- return this.sendResponse(this.node(page_id, id).value());
200
+ return this.current_command.sendResponse(this.node(page_id, id).value());
199
201
  };
200
202
 
201
203
  Browser.prototype.set = function(page_id, id, value) {
202
204
  this.node(page_id, id).set(value);
203
- return this.sendResponse(true);
205
+ return this.current_command.sendResponse(true);
204
206
  };
205
207
 
206
208
  Browser.prototype.select_file = function(page_id, id, value) {
@@ -209,72 +211,91 @@ Poltergeist.Browser = (function() {
209
211
  this.currentPage.beforeUpload(node.id);
210
212
  this.currentPage.uploadFile('[_poltergeist_selected]', value);
211
213
  this.currentPage.afterUpload(node.id);
212
- return this.sendResponse(true);
214
+ if (phantom.version.major === 2) {
215
+ return this.click(page_id, id);
216
+ } else {
217
+ return this.current_command.sendResponse(true);
218
+ }
213
219
  };
214
220
 
215
221
  Browser.prototype.select = function(page_id, id, value) {
216
- return this.sendResponse(this.node(page_id, id).select(value));
222
+ return this.current_command.sendResponse(this.node(page_id, id).select(value));
217
223
  };
218
224
 
219
225
  Browser.prototype.tag_name = function(page_id, id) {
220
- return this.sendResponse(this.node(page_id, id).tagName());
226
+ return this.current_command.sendResponse(this.node(page_id, id).tagName());
221
227
  };
222
228
 
223
229
  Browser.prototype.visible = function(page_id, id) {
224
- return this.sendResponse(this.node(page_id, id).isVisible());
230
+ return this.current_command.sendResponse(this.node(page_id, id).isVisible());
225
231
  };
226
232
 
227
233
  Browser.prototype.disabled = function(page_id, id) {
228
- return this.sendResponse(this.node(page_id, id).isDisabled());
234
+ return this.current_command.sendResponse(this.node(page_id, id).isDisabled());
229
235
  };
230
236
 
231
237
  Browser.prototype.path = function(page_id, id) {
232
- return this.sendResponse(this.node(page_id, id).path());
238
+ return this.current_command.sendResponse(this.node(page_id, id).path());
233
239
  };
234
240
 
235
241
  Browser.prototype.evaluate = function(script) {
236
- return this.sendResponse(this.currentPage.evaluate("function() { return " + script + " }"));
242
+ return this.current_command.sendResponse(this.currentPage.evaluate("function() { return " + script + " }"));
237
243
  };
238
244
 
239
245
  Browser.prototype.execute = function(script) {
240
246
  this.currentPage.execute("function() { " + script + " }");
241
- return this.sendResponse(true);
247
+ return this.current_command.sendResponse(true);
242
248
  };
243
249
 
244
250
  Browser.prototype.frameUrl = function(frame_name) {
245
251
  return this.currentPage.frameUrl(frame_name);
246
252
  };
247
253
 
248
- Browser.prototype.push_frame = function(name, timeout) {
249
- var _ref,
250
- _this = this;
251
- if (timeout == null) {
252
- timeout = new Date().getTime() + 2000;
254
+ Browser.prototype.pushFrame = function(command, name, timeout) {
255
+ var frame, ref;
256
+ if (Array.isArray(name)) {
257
+ frame = this.node.apply(this, name);
258
+ name = frame.getAttribute('name') || frame.getAttribute('id');
259
+ if (!name) {
260
+ frame.setAttribute('name', "_random_name_" + (new Date().getTime()));
261
+ name = frame.getAttribute('name');
262
+ }
253
263
  }
254
- if (_ref = this.frameUrl(name), __indexOf.call(this.currentPage.blockedUrls(), _ref) >= 0) {
255
- return this.sendResponse(true);
264
+ if (ref = this.frameUrl(name), indexOf.call(this.currentPage.blockedUrls(), ref) >= 0) {
265
+ return command.sendResponse(true);
256
266
  } else if (this.currentPage.pushFrame(name)) {
257
267
  if (this.currentPage.currentUrl() === 'about:blank') {
258
268
  this.currentPage.state = 'awaiting_frame_load';
259
- return this.currentPage.waitState('default', function() {
260
- return _this.sendResponse(true);
261
- });
269
+ return this.currentPage.waitState('default', (function(_this) {
270
+ return function() {
271
+ return command.sendResponse(true);
272
+ };
273
+ })(this));
262
274
  } else {
263
- return this.sendResponse(true);
275
+ return command.sendResponse(true);
264
276
  }
265
277
  } else {
266
278
  if (new Date().getTime() < timeout) {
267
- return setTimeout((function() {
268
- return _this.push_frame(name, timeout);
269
- }), 50);
279
+ return setTimeout(((function(_this) {
280
+ return function() {
281
+ return _this.pushFrame(command, name, timeout);
282
+ };
283
+ })(this)), 50);
270
284
  } else {
271
- return this.owner.sendError(new Poltergeist.FrameNotFound(name));
285
+ return command.sendError(new Poltergeist.FrameNotFound(name));
272
286
  }
273
287
  }
274
288
  };
275
289
 
290
+ Browser.prototype.push_frame = function(name, timeout) {
291
+ if (timeout == null) {
292
+ timeout = (new Date().getTime()) + 2000;
293
+ }
294
+ return this.pushFrame(this.current_command, name, timeout);
295
+ };
296
+
276
297
  Browser.prototype.pop_frame = function() {
277
- return this.sendResponse(this.currentPage.popFrame());
298
+ return this.current_command.sendResponse(this.currentPage.popFrame());
278
299
  };
279
300
 
280
301
  Browser.prototype.window_handles = function() {
@@ -284,7 +305,7 @@ Poltergeist.Browser = (function() {
284
305
  }).map(function(p) {
285
306
  return p.handle;
286
307
  });
287
- return this.sendResponse(handles);
308
+ return this.current_command.sendResponse(handles);
288
309
  };
289
310
 
290
311
  Browser.prototype.window_handle = function(name) {
@@ -295,21 +316,23 @@ Poltergeist.Browser = (function() {
295
316
  handle = name ? (page = this.pages.filter(function(p) {
296
317
  return !p.closed && p.windowName() === name;
297
318
  })[0], page ? page.handle : null) : this.currentPage.handle;
298
- return this.sendResponse(handle);
319
+ return this.current_command.sendResponse(handle);
299
320
  };
300
321
 
301
322
  Browser.prototype.switch_to_window = function(handle) {
302
- var page,
303
- _this = this;
323
+ var command, page;
324
+ command = this.current_command;
304
325
  page = this.getPageByHandle(handle);
305
326
  if (page) {
306
327
  if (page !== this.currentPage) {
307
- return page.waitState('default', function() {
308
- _this.currentPage = page;
309
- return _this.sendResponse(true);
310
- });
328
+ return page.waitState('default', (function(_this) {
329
+ return function() {
330
+ _this.currentPage = page;
331
+ return command.sendResponse(true);
332
+ };
333
+ })(this));
311
334
  } else {
312
- return this.sendResponse(true);
335
+ return command.sendResponse(true);
313
336
  }
314
337
  } else {
315
338
  throw new Poltergeist.NoSuchWindowError;
@@ -318,7 +341,7 @@ Poltergeist.Browser = (function() {
318
341
 
319
342
  Browser.prototype.open_new_window = function() {
320
343
  this.execute('window.open()');
321
- return this.sendResponse(true);
344
+ return this.current_command.sendResponse(true);
322
345
  };
323
346
 
324
347
  Browser.prototype.close_window = function(handle) {
@@ -326,32 +349,34 @@ Poltergeist.Browser = (function() {
326
349
  page = this.getPageByHandle(handle);
327
350
  if (page) {
328
351
  page.release();
329
- return this.sendResponse(true);
352
+ return this.current_command.sendResponse(true);
330
353
  } else {
331
- return this.sendResponse(false);
354
+ return this.current_command.sendResponse(false);
332
355
  }
333
356
  };
334
357
 
335
358
  Browser.prototype.mouse_event = function(page_id, id, name) {
336
- var node,
337
- _this = this;
359
+ var command, node;
338
360
  node = this.node(page_id, id);
339
361
  this.currentPage.state = 'mouse_event';
340
362
  this.last_mouse_event = node.mouseEvent(name);
341
- return setTimeout(function() {
342
- if (_this.currentPage.state === 'mouse_event') {
343
- _this.currentPage.state = 'default';
344
- return _this.sendResponse({
345
- position: _this.last_mouse_event
346
- });
347
- } else {
348
- return _this.currentPage.waitState('default', function() {
349
- return _this.sendResponse({
363
+ command = this.current_command;
364
+ return setTimeout((function(_this) {
365
+ return function() {
366
+ if (_this.currentPage.state === 'mouse_event') {
367
+ _this.currentPage.state = 'default';
368
+ return command.sendResponse({
350
369
  position: _this.last_mouse_event
351
370
  });
352
- });
353
- }
354
- }, 5);
371
+ } else {
372
+ return _this.currentPage.waitState('default', function() {
373
+ return command.sendResponse({
374
+ position: _this.last_mouse_event
375
+ });
376
+ });
377
+ }
378
+ };
379
+ })(this), 5);
355
380
  };
356
381
 
357
382
  Browser.prototype.click = function(page_id, id) {
@@ -372,7 +397,7 @@ Poltergeist.Browser = (function() {
372
397
 
373
398
  Browser.prototype.click_coordinates = function(x, y) {
374
399
  this.currentPage.sendEvent('click', x, y);
375
- return this.sendResponse({
400
+ return this.current_command.sendResponse({
376
401
  click: {
377
402
  x: x,
378
403
  y: y
@@ -382,26 +407,26 @@ Poltergeist.Browser = (function() {
382
407
 
383
408
  Browser.prototype.drag = function(page_id, id, other_id) {
384
409
  this.node(page_id, id).dragTo(this.node(page_id, other_id));
385
- return this.sendResponse(true);
410
+ return this.current_command.sendResponse(true);
386
411
  };
387
412
 
388
413
  Browser.prototype.drag_by = function(page_id, id, x, y) {
389
414
  this.node(page_id, id).dragBy(x, y);
390
- return this.sendResponse(true);
415
+ return this.current_command.sendResponse(true);
391
416
  };
392
417
 
393
418
  Browser.prototype.trigger = function(page_id, id, event) {
394
419
  this.node(page_id, id).trigger(event);
395
- return this.sendResponse(event);
420
+ return this.current_command.sendResponse(event);
396
421
  };
397
422
 
398
423
  Browser.prototype.equals = function(page_id, id, other_id) {
399
- return this.sendResponse(this.node(page_id, id).isEqual(this.node(page_id, other_id)));
424
+ return this.current_command.sendResponse(this.node(page_id, id).isEqual(this.node(page_id, other_id)));
400
425
  };
401
426
 
402
427
  Browser.prototype.reset = function() {
403
428
  this.resetPage();
404
- return this.sendResponse(true);
429
+ return this.current_command.sendResponse(true);
405
430
  };
406
431
 
407
432
  Browser.prototype.scroll_to = function(left, top) {
@@ -409,35 +434,35 @@ Poltergeist.Browser = (function() {
409
434
  left: left,
410
435
  top: top
411
436
  });
412
- return this.sendResponse(true);
437
+ return this.current_command.sendResponse(true);
413
438
  };
414
439
 
415
440
  Browser.prototype.send_keys = function(page_id, id, keys) {
416
- var key, modifier_code, modifier_key, modifier_keys, sequence, target, _i, _j, _k, _len, _len1, _len2;
441
+ var i, j, k, key, len, len1, len2, modifier_code, modifier_key, modifier_keys, sequence, target;
417
442
  target = this.node(page_id, id);
418
443
  if (!target.containsSelection()) {
419
444
  target.mouseEvent('click');
420
445
  }
421
- for (_i = 0, _len = keys.length; _i < _len; _i++) {
422
- sequence = keys[_i];
446
+ for (i = 0, len = keys.length; i < len; i++) {
447
+ sequence = keys[i];
423
448
  key = sequence.key != null ? this.currentPage.keyCode(sequence.key) : sequence;
424
449
  if (sequence.modifier != null) {
425
450
  modifier_keys = this.currentPage.keyModifierKeys(sequence.modifier);
426
451
  modifier_code = this.currentPage.keyModifierCode(sequence.modifier);
427
- for (_j = 0, _len1 = modifier_keys.length; _j < _len1; _j++) {
428
- modifier_key = modifier_keys[_j];
452
+ for (j = 0, len1 = modifier_keys.length; j < len1; j++) {
453
+ modifier_key = modifier_keys[j];
429
454
  this.currentPage.sendEvent('keydown', modifier_key);
430
455
  }
431
456
  this.currentPage.sendEvent('keypress', key, null, null, modifier_code);
432
- for (_k = 0, _len2 = modifier_keys.length; _k < _len2; _k++) {
433
- modifier_key = modifier_keys[_k];
457
+ for (k = 0, len2 = modifier_keys.length; k < len2; k++) {
458
+ modifier_key = modifier_keys[k];
434
459
  this.currentPage.sendEvent('keyup', modifier_key);
435
460
  }
436
461
  } else {
437
462
  this.currentPage.sendEvent('keypress', key);
438
463
  }
439
464
  }
440
- return this.sendResponse(true);
465
+ return this.current_command.sendResponse(true);
441
466
  };
442
467
 
443
468
  Browser.prototype.render_base64 = function(format, full, selector) {
@@ -447,7 +472,7 @@ Poltergeist.Browser = (function() {
447
472
  }
448
473
  this.set_clip_rect(full, selector);
449
474
  encoded_image = this.currentPage.renderBase64(format);
450
- return this.sendResponse(encoded_image);
475
+ return this.current_command.sendResponse(encoded_image);
451
476
  };
452
477
 
453
478
  Browser.prototype.render = function(path, full, selector) {
@@ -465,13 +490,13 @@ Poltergeist.Browser = (function() {
465
490
  left: dimensions.left,
466
491
  top: dimensions.top
467
492
  });
468
- return this.sendResponse(true);
493
+ return this.current_command.sendResponse(true);
469
494
  };
470
495
 
471
496
  Browser.prototype.set_clip_rect = function(full, selector) {
472
- var dimensions, document, rect, viewport, _ref;
497
+ var dimensions, document, rect, ref, viewport;
473
498
  dimensions = this.currentPage.validatedDimensions();
474
- _ref = [dimensions.document, dimensions.viewport], document = _ref[0], viewport = _ref[1];
499
+ ref = [dimensions.document, dimensions.viewport], document = ref[0], viewport = ref[1];
475
500
  rect = full ? {
476
501
  left: 0,
477
502
  top: 0,
@@ -489,12 +514,12 @@ Poltergeist.Browser = (function() {
489
514
 
490
515
  Browser.prototype.set_paper_size = function(size) {
491
516
  this.currentPage.setPaperSize(size);
492
- return this.sendResponse(true);
517
+ return this.current_command.sendResponse(true);
493
518
  };
494
519
 
495
520
  Browser.prototype.set_zoom_factor = function(zoom_factor) {
496
521
  this.currentPage.setZoomFactor(zoom_factor);
497
- return this.sendResponse(true);
522
+ return this.current_command.sendResponse(true);
498
523
  };
499
524
 
500
525
  Browser.prototype.resize = function(width, height) {
@@ -502,20 +527,20 @@ Poltergeist.Browser = (function() {
502
527
  width: width,
503
528
  height: height
504
529
  });
505
- return this.sendResponse(true);
530
+ return this.current_command.sendResponse(true);
506
531
  };
507
532
 
508
533
  Browser.prototype.network_traffic = function() {
509
- return this.sendResponse(this.currentPage.networkTraffic());
534
+ return this.current_command.sendResponse(this.currentPage.networkTraffic());
510
535
  };
511
536
 
512
537
  Browser.prototype.clear_network_traffic = function() {
513
538
  this.currentPage.clearNetworkTraffic();
514
- return this.sendResponse(true);
539
+ return this.current_command.sendResponse(true);
515
540
  };
516
541
 
517
542
  Browser.prototype.get_headers = function() {
518
- return this.sendResponse(this.currentPage.getCustomHeaders());
543
+ return this.current_command.sendResponse(this.currentPage.getCustomHeaders());
519
544
  };
520
545
 
521
546
  Browser.prototype.set_headers = function(headers) {
@@ -523,7 +548,7 @@ Poltergeist.Browser = (function() {
523
548
  this.currentPage.setUserAgent(headers['User-Agent']);
524
549
  }
525
550
  this.currentPage.setCustomHeaders(headers);
526
- return this.sendResponse(true);
551
+ return this.current_command.sendResponse(true);
527
552
  };
528
553
 
529
554
  Browser.prototype.add_headers = function(headers) {
@@ -544,46 +569,46 @@ Poltergeist.Browser = (function() {
544
569
  };
545
570
 
546
571
  Browser.prototype.response_headers = function() {
547
- return this.sendResponse(this.currentPage.responseHeaders());
572
+ return this.current_command.sendResponse(this.currentPage.responseHeaders());
548
573
  };
549
574
 
550
575
  Browser.prototype.cookies = function() {
551
- return this.sendResponse(this.currentPage.cookies());
576
+ return this.current_command.sendResponse(this.currentPage.cookies());
552
577
  };
553
578
 
554
579
  Browser.prototype.set_cookie = function(cookie) {
555
580
  phantom.addCookie(cookie);
556
- return this.sendResponse(true);
581
+ return this.current_command.sendResponse(true);
557
582
  };
558
583
 
559
584
  Browser.prototype.remove_cookie = function(name) {
560
585
  this.currentPage.deleteCookie(name);
561
- return this.sendResponse(true);
586
+ return this.current_command.sendResponse(true);
562
587
  };
563
588
 
564
589
  Browser.prototype.clear_cookies = function() {
565
590
  phantom.clearCookies();
566
- return this.sendResponse(true);
591
+ return this.current_command.sendResponse(true);
567
592
  };
568
593
 
569
594
  Browser.prototype.cookies_enabled = function(flag) {
570
595
  phantom.cookiesEnabled = flag;
571
- return this.sendResponse(true);
596
+ return this.current_command.sendResponse(true);
572
597
  };
573
598
 
574
599
  Browser.prototype.set_http_auth = function(user, password) {
575
600
  this.currentPage.setHttpAuth(user, password);
576
- return this.sendResponse(true);
601
+ return this.current_command.sendResponse(true);
577
602
  };
578
603
 
579
604
  Browser.prototype.set_js_errors = function(value) {
580
605
  this.js_errors = value;
581
- return this.sendResponse(true);
606
+ return this.current_command.sendResponse(true);
582
607
  };
583
608
 
584
609
  Browser.prototype.set_debug = function(value) {
585
610
  this._debug = value;
586
- return this.sendResponse(true);
611
+ return this.current_command.sendResponse(true);
587
612
  };
588
613
 
589
614
  Browser.prototype.exit = function() {
@@ -597,48 +622,54 @@ Poltergeist.Browser = (function() {
597
622
  };
598
623
 
599
624
  Browser.prototype.go_back = function() {
600
- var _this = this;
625
+ var command;
626
+ command = this.current_command;
601
627
  if (this.currentPage.canGoBack) {
602
628
  this.currentPage.state = 'loading';
603
629
  this.currentPage.goBack();
604
- return this.currentPage.waitState('default', function() {
605
- return _this.sendResponse(true);
606
- });
630
+ return this.currentPage.waitState('default', (function(_this) {
631
+ return function() {
632
+ return command.sendResponse(true);
633
+ };
634
+ })(this));
607
635
  } else {
608
- return this.sendResponse(false);
636
+ return command.sendResponse(false);
609
637
  }
610
638
  };
611
639
 
612
640
  Browser.prototype.go_forward = function() {
613
- var _this = this;
641
+ var command;
642
+ command = this.current_command;
614
643
  if (this.currentPage.canGoForward) {
615
644
  this.currentPage.state = 'loading';
616
645
  this.currentPage.goForward();
617
- return this.currentPage.waitState('default', function() {
618
- return _this.sendResponse(true);
619
- });
646
+ return this.currentPage.waitState('default', (function(_this) {
647
+ return function() {
648
+ return command.sendResponse(true);
649
+ };
650
+ })(this));
620
651
  } else {
621
- return this.sendResponse(false);
652
+ return command.sendResponse(false);
622
653
  }
623
654
  };
624
655
 
625
656
  Browser.prototype.set_url_blacklist = function() {
626
657
  this.currentPage.urlBlacklist = Array.prototype.slice.call(arguments);
627
- return this.sendResponse(true);
658
+ return this.current_command.sendResponse(true);
628
659
  };
629
660
 
630
661
  Browser.prototype.set_confirm_process = function(process) {
631
662
  this.confirm_processes.push(process);
632
- return this.sendResponse(true);
663
+ return this.current_command.sendResponse(true);
633
664
  };
634
665
 
635
666
  Browser.prototype.set_prompt_response = function(response) {
636
667
  this.prompt_responses.push(response);
637
- return this.sendResponse(true);
668
+ return this.current_command.sendResponse(true);
638
669
  };
639
670
 
640
671
  Browser.prototype.modal_message = function() {
641
- return this.sendResponse(this.processed_modal_messages.shift());
672
+ return this.current_command.sendResponse(this.processed_modal_messages.shift());
642
673
  };
643
674
 
644
675
  return Browser;