poltergeist 1.8.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 80b33a1ca12aebf206487179bd97bde02aaf2934
4
- data.tar.gz: 4b1545c216c97fd54b9673516e5a7d854daf86d9
3
+ metadata.gz: ba9a64217db44bbe9dcbe55e34cac615640688df
4
+ data.tar.gz: 7bd5f0ae85f2565e1b6c07f4030644f59eccbb1f
5
5
  SHA512:
6
- metadata.gz: 27e4dbb8868f7dfc18daaec1beae92d7afef23c61d4b720fa4a1f9f6352a1d0eb8909053a0a5c920103507ef1a135965061a3874b74c649554823004cc655459
7
- data.tar.gz: cb0ed5f12f3cddd189277ee37802fc45b2fc9f157a41812882d14da9de21a135d699a4ffd6d6441919206305b60ee650766e514db2e6fc83d49953cbd27c33f5
6
+ metadata.gz: 93141f4f1e6438da75f912f4174f5f7f987d9fcff0dbaab0fa7eff384a6501067b6fcbf06eb06f9589e71457a8ee563ab84ff11d0ff9b83828fbd8e531b9eb00
7
+ data.tar.gz: 54b08a29b4707dfdb8c3a7ff2a7c16194ca100e87cfc89d1e5f11f17f7f151121260cfdf10584949100f66de17ff57b5ed574273268580e75ca7729533a484f9
data/README.md CHANGED
@@ -9,7 +9,7 @@ provided by [PhantomJS](http://phantomjs.org/).
9
9
  **If you're viewing this at https://github.com/teampoltergeist/poltergeist,
10
10
  you're reading the documentation for the master branch.
11
11
  [View documentation for the latest release
12
- (1.8.0).](https://github.com/teampoltergeist/poltergeist/tree/v1.8.0)**
12
+ (1.8.1).](https://github.com/teampoltergeist/poltergeist/tree/v1.8.1)**
13
13
 
14
14
  ## Getting help ##
15
15
 
@@ -250,7 +250,8 @@ module Capybara::Poltergeist
250
250
  command('network_traffic').values.map do |event|
251
251
  NetworkTraffic::Request.new(
252
252
  event['request'],
253
- event['responseParts'].map { |response| NetworkTraffic::Response.new(response) }
253
+ event['responseParts'].map { |response| NetworkTraffic::Response.new(response) },
254
+ event['error'] ? NetworkTraffic::Error.new(event['error']) : nil
254
255
  )
255
256
  end
256
257
  end
@@ -107,13 +107,13 @@ class PoltergeistAgent.Node
107
107
 
108
108
  isObsolete: ->
109
109
  obsolete = (element) =>
110
- if element.parentNode?
111
- if element.parentNode == document
112
- false
110
+ if (parent = element.parentNode)?
111
+ if parent == document
112
+ return false
113
113
  else
114
- obsolete element.parentNode
114
+ obsolete parent
115
115
  else
116
- true
116
+ return true
117
117
  obsolete @element
118
118
 
119
119
  changed: ->
@@ -256,9 +256,7 @@ class PoltergeistAgent.Node
256
256
  tagName: ->
257
257
  @element.tagName
258
258
 
259
- isVisible: (element) ->
260
- element ||= @element
261
-
259
+ isVisible: (element = @element) ->
262
260
  while (element)
263
261
  style = window.getComputedStyle(element)
264
262
  return false if style.display == 'none' or
@@ -312,7 +310,8 @@ class PoltergeistAgent.Node
312
310
  offset
313
311
 
314
312
  position: ->
315
- rect = @element.getClientRects()[0]
313
+ # Elements inside an SVG return underfined for getClientRects???
314
+ rect = @element.getClientRects()[0] || @element.getBoundingClientRect()
316
315
  throw new PoltergeistAgent.ObsoleteNode unless rect
317
316
  frameOffset = this.frameOffset()
318
317
 
@@ -54,6 +54,8 @@ class Poltergeist.Browser
54
54
  page.handle = "#{@_counter++}"
55
55
  @pages.push(page)
56
56
 
57
+ return
58
+
57
59
  getPageByHandle: (handle) ->
58
60
  @pages.filter((p) -> !p.closed && p.handle == handle)[0]
59
61
 
@@ -68,6 +70,7 @@ class Poltergeist.Browser
68
70
 
69
71
  setModalMessage: (msg) ->
70
72
  @processed_modal_messages.push(msg)
73
+ return
71
74
 
72
75
  add_extension: (extension) ->
73
76
  @currentPage.injectExtension extension
@@ -106,6 +109,7 @@ class Poltergeist.Browser
106
109
  command.sendError(new Poltergeist.StatusFailError(url))
107
110
  else
108
111
  command.sendResponse(status: @currentPage.status)
112
+ return
109
113
 
110
114
  current_url: ->
111
115
  @current_command.sendResponse @currentPage.currentUrl()
@@ -268,7 +272,6 @@ class Poltergeist.Browser
268
272
  mouse_event: (page_id, id, name) ->
269
273
  # Get the node before changing state, in case there is an exception
270
274
  node = this.node(page_id, id)
271
-
272
275
  # If the event triggers onNavigationRequested, we will transition to the 'loading'
273
276
  # state and wait for onLoadFinished before sending a response.
274
277
  @currentPage.state = 'mouse_event'
@@ -186,11 +186,12 @@ PoltergeistAgent.Node = (function() {
186
186
  var obsolete;
187
187
  obsolete = (function(_this) {
188
188
  return function(element) {
189
- if (element.parentNode != null) {
190
- if (element.parentNode === document) {
189
+ var parent;
190
+ if ((parent = element.parentNode) != null) {
191
+ if (parent === document) {
191
192
  return false;
192
193
  } else {
193
- return obsolete(element.parentNode);
194
+ return obsolete(parent);
194
195
  }
195
196
  } else {
196
197
  return true;
@@ -381,7 +382,9 @@ PoltergeistAgent.Node = (function() {
381
382
 
382
383
  Node.prototype.isVisible = function(element) {
383
384
  var style;
384
- element || (element = this.element);
385
+ if (element == null) {
386
+ element = this.element;
387
+ }
385
388
  while (element) {
386
389
  style = window.getComputedStyle(element);
387
390
  if (style.display === 'none' || style.visibility === 'hidden' || parseFloat(style.opacity) === 0) {
@@ -449,7 +452,7 @@ PoltergeistAgent.Node = (function() {
449
452
 
450
453
  Node.prototype.position = function() {
451
454
  var frameOffset, pos, rect;
452
- rect = this.element.getClientRects()[0];
455
+ rect = this.element.getClientRects()[0] || this.element.getBoundingClientRect();
453
456
  if (!rect) {
454
457
  throw new PoltergeistAgent.ObsoleteNode;
455
458
  }
@@ -63,7 +63,7 @@ Poltergeist.Browser = (function() {
63
63
  return response;
64
64
  };
65
65
  })(this);
66
- return this.page.onPageCreated = (function(_this) {
66
+ this.page.onPageCreated = (function(_this) {
67
67
  return function(newPage) {
68
68
  var page;
69
69
  page = new Poltergeist.WebPage(newPage);
@@ -92,7 +92,7 @@ Poltergeist.Browser = (function() {
92
92
  };
93
93
 
94
94
  Browser.prototype.setModalMessage = function(msg) {
95
- return this.processed_modal_messages.push(msg);
95
+ this.processed_modal_messages.push(msg);
96
96
  };
97
97
 
98
98
  Browser.prototype.add_extension = function(extension) {
@@ -123,7 +123,7 @@ Poltergeist.Browser = (function() {
123
123
  });
124
124
  } else {
125
125
  command = this.current_command;
126
- return this.currentPage.waitState('default', (function(_this) {
126
+ this.currentPage.waitState('default', (function(_this) {
127
127
  return function() {
128
128
  if (_this.currentPage.statusCode === null && _this.currentPage.status === 'fail') {
129
129
  return command.sendError(new Poltergeist.StatusFailError(url));
@@ -50,8 +50,10 @@ Poltergeist = (function() {
50
50
  Poltergeist.prototype.send = function(data) {
51
51
  if (this.running) {
52
52
  this.connection.send(data);
53
- return this.running = false;
53
+ this.running = false;
54
+ return true;
54
55
  }
56
+ return false;
55
57
  };
56
58
 
57
59
  return Poltergeist;
@@ -4,7 +4,7 @@ var slice = [].slice,
4
4
  Poltergeist.WebPage = (function() {
5
5
  var command, delegate, fn1, fn2, i, j, len, len1, ref, ref1;
6
6
 
7
- WebPage.CALLBACKS = ['onConsoleMessage', 'onLoadFinished', 'onInitialized', 'onLoadStarted', 'onResourceRequested', 'onResourceReceived', 'onError', 'onNavigationRequested', 'onUrlChanged', 'onPageCreated', 'onClosing'];
7
+ WebPage.CALLBACKS = ['onConsoleMessage', 'onError', 'onLoadFinished', 'onInitialized', 'onLoadStarted', 'onResourceRequested', 'onResourceReceived', 'onResourceError', 'onNavigationRequested', 'onUrlChanged', 'onPageCreated', 'onClosing'];
8
8
 
9
9
  WebPage.DELEGATES = ['open', 'sendEvent', 'uploadFile', 'release', 'render', 'renderBase64', 'goBack', 'goForward'];
10
10
 
@@ -103,10 +103,11 @@ Poltergeist.WebPage = (function() {
103
103
  return stackString += " in " + frame["function"];
104
104
  }
105
105
  });
106
- return this.errors.push({
106
+ this.errors.push({
107
107
  message: message,
108
108
  stack: stackString
109
109
  });
110
+ return true;
110
111
  };
111
112
 
112
113
  WebPage.prototype.onResourceRequestedNative = function(request, net) {
@@ -118,18 +119,20 @@ Poltergeist.WebPage = (function() {
118
119
  if (ref2 = request.url, indexOf.call(this._blockedUrls, ref2) < 0) {
119
120
  this._blockedUrls.push(request.url);
120
121
  }
121
- return net.abort();
122
+ net.abort();
122
123
  } else {
123
124
  this.lastRequestId = request.id;
124
125
  if (this.normalizeURL(request.url) === this.redirectURL) {
125
126
  this.redirectURL = null;
126
127
  this.requestId = request.id;
127
128
  }
128
- return this._networkTraffic[request.id] = {
129
+ this._networkTraffic[request.id] = {
129
130
  request: request,
130
- responseParts: []
131
+ responseParts: [],
132
+ error: null
131
133
  };
132
134
  }
135
+ return true;
133
136
  };
134
137
 
135
138
  WebPage.prototype.onResourceReceivedNative = function(response) {
@@ -139,28 +142,37 @@ Poltergeist.WebPage = (function() {
139
142
  }
140
143
  if (this.requestId === response.id) {
141
144
  if (response.redirectURL) {
142
- return this.redirectURL = this.normalizeURL(response.redirectURL);
145
+ this.redirectURL = this.normalizeURL(response.redirectURL);
143
146
  } else {
144
147
  this.statusCode = response.status;
145
- return this._responseHeaders = response.headers;
148
+ this._responseHeaders = response.headers;
146
149
  }
147
150
  }
151
+ return true;
152
+ };
153
+
154
+ WebPage.prototype.onResourceErrorNative = function(errorResponse) {
155
+ var ref2;
156
+ if ((ref2 = this._networkTraffic[errorResponse.id]) != null) {
157
+ ref2.error = errorResponse;
158
+ }
159
+ return true;
148
160
  };
149
161
 
150
162
  WebPage.prototype.injectAgent = function() {
151
- var extension, k, len2, ref2, results;
163
+ var extension, k, len2, ref2;
152
164
  if (this["native"]().evaluate(function() {
153
165
  return typeof __poltergeist;
154
166
  }) === "undefined") {
155
167
  this["native"]().injectJs(phantom.libraryPath + "/agent.js");
156
168
  ref2 = WebPage.EXTENSIONS;
157
- results = [];
158
169
  for (k = 0, len2 = ref2.length; k < len2; k++) {
159
170
  extension = ref2[k];
160
- results.push(this["native"]().injectJs(extension));
171
+ this["native"]().injectJs(extension);
161
172
  }
162
- return results;
173
+ return true;
163
174
  }
175
+ return false;
164
176
  };
165
177
 
166
178
  WebPage.prototype.injectExtension = function(file) {
@@ -215,7 +227,8 @@ Poltergeist.WebPage = (function() {
215
227
 
216
228
  WebPage.prototype.setHttpAuth = function(user, password) {
217
229
  this["native"]().settings.userName = user;
218
- return this["native"]().settings.password = password;
230
+ this["native"]().settings.password = password;
231
+ return true;
219
232
  };
220
233
 
221
234
  WebPage.prototype.networkTraffic = function() {
@@ -223,7 +236,8 @@ Poltergeist.WebPage = (function() {
223
236
  };
224
237
 
225
238
  WebPage.prototype.clearNetworkTraffic = function() {
226
- return this._networkTraffic = {};
239
+ this._networkTraffic = {};
240
+ return true;
227
241
  };
228
242
 
229
243
  WebPage.prototype.blockedUrls = function() {
@@ -231,7 +245,8 @@ Poltergeist.WebPage = (function() {
231
245
  };
232
246
 
233
247
  WebPage.prototype.clearBlockedUrls = function() {
234
- return this._blockedUrls = [];
248
+ this._blockedUrls = [];
249
+ return true;
235
250
  };
236
251
 
237
252
  WebPage.prototype.content = function() {
@@ -252,7 +267,8 @@ Poltergeist.WebPage = (function() {
252
267
  };
253
268
 
254
269
  WebPage.prototype.clearErrors = function() {
255
- return this.errors = [];
270
+ this.errors = [];
271
+ return true;
256
272
  };
257
273
 
258
274
  WebPage.prototype.responseHeaders = function() {
@@ -323,13 +339,12 @@ Poltergeist.WebPage = (function() {
323
339
  };
324
340
 
325
341
  WebPage.prototype.addTempHeader = function(header) {
326
- var name, results, value;
327
- results = [];
342
+ var name, value;
328
343
  for (name in header) {
329
344
  value = header[name];
330
- results.push(this._tempHeaders[name] = value);
345
+ this._tempHeaders[name] = value;
331
346
  }
332
- return results;
347
+ return this._tempHeaders;
333
348
  };
334
349
 
335
350
  WebPage.prototype.removeTempHeaders = function() {
@@ -455,7 +470,7 @@ Poltergeist.WebPage = (function() {
455
470
  WebPage.prototype.bindCallback = function(name) {
456
471
  var that;
457
472
  that = this;
458
- return this["native"]()[name] = function() {
473
+ this["native"]()[name] = function() {
459
474
  var result;
460
475
  if (that[name + 'Native'] != null) {
461
476
  result = that[name + 'Native'].apply(that, arguments);
@@ -464,6 +479,7 @@ Poltergeist.WebPage = (function() {
464
479
  return that[name].apply(that, arguments);
465
480
  }
466
481
  };
482
+ return true;
467
483
  };
468
484
 
469
485
  WebPage.prototype.runCommand = function(name, args) {
@@ -38,6 +38,8 @@ class Poltergeist
38
38
  if @running
39
39
  @connection.send(data)
40
40
  @running = false
41
+ return true
42
+ return false
41
43
 
42
44
  # This is necessary because the remote debugger will wrap the
43
45
  # script in a function, causing the Poltergeist variable to
@@ -31,11 +31,8 @@ class Poltergeist.Node
31
31
 
32
32
  mouseEvent: (name) ->
33
33
  this.scrollIntoView()
34
-
35
34
  pos = this.mouseEventPosition()
36
-
37
35
  test = this.mouseEventTest(pos.x, pos.y)
38
-
39
36
  if test.status == 'success'
40
37
  if name == 'rightclick'
41
38
  @page.mouseEvent('click', pos.x, pos.y, 'right')
@@ -1,7 +1,7 @@
1
1
  class Poltergeist.WebPage
2
- @CALLBACKS = ['onConsoleMessage',
2
+ @CALLBACKS = ['onConsoleMessage','onError',
3
3
  'onLoadFinished', 'onInitialized', 'onLoadStarted',
4
- 'onResourceRequested', 'onResourceReceived', 'onError',
4
+ 'onResourceRequested', 'onResourceReceived', 'onResourceError',
5
5
  'onNavigationRequested', 'onUrlChanged', 'onPageCreated',
6
6
  'onClosing']
7
7
 
@@ -75,6 +75,7 @@ class Poltergeist.WebPage
75
75
  stackString += " in #{frame.function}" if frame.function && frame.function != ''
76
76
 
77
77
  @errors.push(message: message, stack: stackString)
78
+ return true
78
79
 
79
80
  onResourceRequestedNative: (request, net) ->
80
81
  abort = @urlBlacklist.some (blacklisted_url) ->
@@ -93,7 +94,9 @@ class Poltergeist.WebPage
93
94
  @_networkTraffic[request.id] = {
94
95
  request: request,
95
96
  responseParts: []
97
+ error: null
96
98
  }
99
+ return true
97
100
 
98
101
  onResourceReceivedNative: (response) ->
99
102
  @_networkTraffic[response.id]?.responseParts.push(response)
@@ -104,12 +107,19 @@ class Poltergeist.WebPage
104
107
  else
105
108
  @statusCode = response.status
106
109
  @_responseHeaders = response.headers
110
+ return true
111
+
112
+ onResourceErrorNative: (errorResponse) ->
113
+ @_networkTraffic[errorResponse.id]?.error = errorResponse
114
+ return true
107
115
 
108
116
  injectAgent: ->
109
117
  if this.native().evaluate(-> typeof __poltergeist) == "undefined"
110
118
  this.native().injectJs "#{phantom.libraryPath}/agent.js"
111
119
  for extension in WebPage.EXTENSIONS
112
120
  this.native().injectJs extension
121
+ return true
122
+ return false
113
123
 
114
124
  injectExtension: (file) ->
115
125
  WebPage.EXTENSIONS.push file
@@ -145,18 +155,21 @@ class Poltergeist.WebPage
145
155
  setHttpAuth: (user, password) ->
146
156
  this.native().settings.userName = user
147
157
  this.native().settings.password = password
158
+ return true
148
159
 
149
160
  networkTraffic: ->
150
161
  @_networkTraffic
151
162
 
152
163
  clearNetworkTraffic: ->
153
164
  @_networkTraffic = {}
165
+ return true
154
166
 
155
167
  blockedUrls: ->
156
168
  @_blockedUrls
157
169
 
158
170
  clearBlockedUrls: ->
159
171
  @_blockedUrls = []
172
+ return true
160
173
 
161
174
  content: ->
162
175
  this.native().frameContent
@@ -171,6 +184,7 @@ class Poltergeist.WebPage
171
184
 
172
185
  clearErrors: ->
173
186
  @errors = []
187
+ return true
174
188
 
175
189
  responseHeaders: ->
176
190
  headers = {}
@@ -210,8 +224,9 @@ class Poltergeist.WebPage
210
224
 
211
225
  elementBounds: (selector) ->
212
226
  this.native().evaluate(
213
- (selector) -> document.querySelector(selector).getBoundingClientRect(),
214
- selector
227
+ (selector) ->
228
+ document.querySelector(selector).getBoundingClientRect()
229
+ , selector
215
230
  )
216
231
 
217
232
  setUserAgent: (userAgent) ->
@@ -226,6 +241,7 @@ class Poltergeist.WebPage
226
241
  addTempHeader: (header) ->
227
242
  for name, value of header
228
243
  @_tempHeaders[name] = value
244
+ @_tempHeaders
229
245
 
230
246
  removeTempHeaders: ->
231
247
  allHeaders = this.getCustomHeaders()
@@ -236,7 +252,7 @@ class Poltergeist.WebPage
236
252
  pushFrame: (name) ->
237
253
  if this.native().switchToFrame(name)
238
254
  @frames.push(name)
239
- true
255
+ return true
240
256
  else
241
257
  frame_no = this.native().evaluate(
242
258
  (frame_name) ->
@@ -245,9 +261,9 @@ class Poltergeist.WebPage
245
261
  , name)
246
262
  if frame_no? and this.native().switchToFrame(frame_no)
247
263
  @frames.push(name)
248
- true
264
+ return true
249
265
  else
250
- false
266
+ return false
251
267
 
252
268
  popFrame: ->
253
269
  @frames.pop()
@@ -320,6 +336,7 @@ class Poltergeist.WebPage
320
336
 
321
337
  if result != false && that[name]? # For externally set callbacks
322
338
  that[name].apply(that, arguments)
339
+ return true
323
340
 
324
341
  # Any error raised here or inside the evaluate will get reported to
325
342
  # phantom.onError. If result is null, that means there was an error
@@ -29,14 +29,15 @@ module Capybara
29
29
  response['name']
30
30
  end
31
31
 
32
- def javascript_error
33
- JSErrorItem.new(*response['args'])
32
+ def error_parameters
33
+ response['args'].join("\n")
34
34
  end
35
35
 
36
36
  def message
37
37
  "There was an error inside the PhantomJS portion of Poltergeist. " \
38
- "This is probably a bug, so please report it. " \
39
- "\n\n#{javascript_error}"
38
+ "If this is the error returned, and not the cause of a more detailed error response, " \
39
+ "this is probably a bug, so please report it. " \
40
+ "\n\n#{name}: #{error_parameters}"
40
41
  end
41
42
  end
42
43
 
@@ -2,5 +2,6 @@ module Capybara::Poltergeist
2
2
  module NetworkTraffic
3
3
  require 'capybara/poltergeist/network_traffic/request'
4
4
  require 'capybara/poltergeist/network_traffic/response'
5
+ require 'capybara/poltergeist/network_traffic/error'
5
6
  end
6
7
  end
@@ -0,0 +1,19 @@
1
+ module Capybara::Poltergeist::NetworkTraffic
2
+ class Error
3
+ def initialize(data)
4
+ @data = data
5
+ end
6
+
7
+ def url
8
+ @data['url']
9
+ end
10
+
11
+ def code
12
+ @data['errorCode']
13
+ end
14
+
15
+ def description
16
+ @data['errorString']
17
+ end
18
+ end
19
+ end
@@ -1,10 +1,11 @@
1
1
  module Capybara::Poltergeist::NetworkTraffic
2
2
  class Request
3
- attr_reader :response_parts
3
+ attr_reader :response_parts, :error
4
4
 
5
- def initialize(data, response_parts = [])
5
+ def initialize(data, response_parts = [], error = nil)
6
6
  @data = data
7
7
  @response_parts = response_parts
8
+ @error = error
8
9
  end
9
10
 
10
11
  def url
@@ -1,5 +1,5 @@
1
1
  module Capybara
2
2
  module Poltergeist
3
- VERSION = "1.8.0"
3
+ VERSION = "1.8.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: poltergeist
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 1.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Leighton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-13 00:00:00.000000000 Z
11
+ date: 2015-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capybara
@@ -86,14 +86,28 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 3.3.0
89
+ version: 3.4.0
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 3.3.0
96
+ version: 3.4.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec-core
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "!="
102
+ - !ruby/object:Gem::Version
103
+ version: 3.4.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "!="
109
+ - !ruby/object:Gem::Version
110
+ version: 3.4.0
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: sinatra
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -212,6 +226,7 @@ files:
212
226
  - lib/capybara/poltergeist/inspector.rb
213
227
  - lib/capybara/poltergeist/json.rb
214
228
  - lib/capybara/poltergeist/network_traffic.rb
229
+ - lib/capybara/poltergeist/network_traffic/error.rb
215
230
  - lib/capybara/poltergeist/network_traffic/request.rb
216
231
  - lib/capybara/poltergeist/network_traffic/response.rb
217
232
  - lib/capybara/poltergeist/node.rb