capybara-lockstep 2.0.3 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bc0373be228e0d19b35174656617d256a469fb1f652728eaa031b91a9370aa38
4
- data.tar.gz: 45a3b441340e1cf477564f47af7961799ac0cf37e533a42393c89a08744f1657
3
+ metadata.gz: 514789431b5b017176575acd43c1a5b6558040f31cf7cb4ac119cf10e756dbee
4
+ data.tar.gz: 2945ac3b32b7f83a7bc2bd14848f67950c12e5063033d8dbe2063788dfe8c024
5
5
  SHA512:
6
- metadata.gz: b3c3f17a3a6b1e32b43ee86106294b9351bc312234070f4308e93dce8dfeae4198831f04c50e20ca37fc533ecbf1f77b51fe11e24c1336f2866018380052e07a
7
- data.tar.gz: 64b39c510daba699db4c0204caa5004e8d367c3e6208a9b2d0a7912925e4dd7c5223e3caf516633310c7f41dbf524af0520715c5051c1d0ead3f8494a0bb0a75
6
+ metadata.gz: b2dac0508c3caaa13fd28fe285c9c3b7d2b796dfba6c2bf788578ffee90135b6504a2e9b731d8bf4496806723d26c28bf5ccb536e5de21c2b5661b354a9e2de1
7
+ data.tar.gz: 4e80b685b588dfded10cb0783cbe62aceb00517199ef5527ce76fb76a234c96eb913ec0e7d08df2e22a7dd5a2b2d475bed0d4318add6ddee9fd27403afc2e0fe
data/CHANGELOG.md CHANGED
@@ -3,9 +3,17 @@ All notable changes to this project will be documented in this file.
3
3
  This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
4
4
 
5
5
 
6
+ # 2.1.0
7
+
8
+ - We now synchronize for an additional [JavaScript task](https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/) after `history.pushState()`, `history.replaceState()`, `history.forward()`, `history.back()` and `history.go()`.
9
+ - We now synchronize for an additional JavaScript task after `popstate` and `hashchange` events.
10
+ - We now synchronize for an additional JavaScript task when the window is resized.
11
+ - You can now disable automatic synchronization for the duration of a block: `Capybara::Lockstep.with_mode(:manual) { ... }`.
12
+
13
+
6
14
  # 2.0.3
7
15
 
8
- - Fix a bug where we wouldn't wait for an additional JavaScript task after a tracked event or async job.
16
+ - Fix a bug where we wouldn't wait for an additional [JavaScript task](https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/) after a tracked event or async job.
9
17
  - Fix a bug where the `Capybara::Lockstep.wait_tasks` configuration would be ignored.
10
18
  - Fix a bug where the `capybara_lockstep_js` helper (for use without Rails) would not include the current configuration.
11
19
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- capybara-lockstep (2.0.3)
4
+ capybara-lockstep (2.1.0)
5
5
  activesupport (>= 4.2)
6
6
  capybara (>= 3.0)
7
7
  ruby2_keywords
data/README.md CHANGED
@@ -349,7 +349,23 @@ ensure
349
349
  end
350
350
  ```
351
351
 
352
- In the `:manual` mode you may still force synchronization by calling `Capybara::Lockstep.synchronize` manually.
352
+ You can also disable automatic synchronization for the duration of a block:
353
+
354
+ ```ruby
355
+ Capybara::Lockstep.with_mode(:manual) do
356
+ do_unsynchronized_work
357
+ end
358
+ ```
359
+
360
+ In the `:manual` mode you may still force synchronization by calling `Capybara::Lockstep.synchronize` manually:
361
+
362
+ ```ruby
363
+ Capybara::Lockstep.with_mode(:manual) do
364
+ do_some_work
365
+ Capybara::Lockstep.synchronize
366
+ do_other_work
367
+ end
368
+ ```
353
369
 
354
370
  To completely disable synchronization, even when `Capybara::Lockstep.synchronize` is called:
355
371
 
@@ -360,6 +376,8 @@ Capybara::Lockstep.synchronize # will not synchronize
360
376
 
361
377
 
362
378
 
379
+
380
+
363
381
  ## Handling legacy promises
364
382
 
365
383
  Legacy promise implementations (like jQuery's `$.Deferred` and AngularJS' `$q`) work using [tasks instead of microtasks](https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/). Their AJAX implementations (like `$.ajax()` and `$http`) use task-based promises to signal that a request is done.
@@ -58,7 +58,7 @@ module Capybara
58
58
  self.mode = temporary_mode
59
59
  block.call
60
60
  ensure
61
- self.mode = temporary_mode
61
+ self.mode = old_mode
62
62
  end
63
63
 
64
64
  def enabled=(enabled)
@@ -4,14 +4,14 @@ window.CapybaraLockstep = (function() {
4
4
  let jobCount
5
5
  let idleCallbacks
6
6
  let finishedWorkTags
7
- let waitTasks
7
+ let defaultWaitTasks
8
8
  reset()
9
9
 
10
10
  function reset() {
11
11
  jobCount = 0
12
12
  idleCallbacks = []
13
13
  finishedWorkTags = []
14
- waitTasks = 1
14
+ defaultWaitTasks = 1
15
15
  debug = false
16
16
  }
17
17
 
@@ -57,8 +57,9 @@ window.CapybaraLockstep = (function() {
57
57
  promise.then(taggedStopWork, taggedStopWork)
58
58
  }
59
59
 
60
- function stopWork(tag) {
61
- afterWaitTasks(stopWorkNow.bind(this, tag))
60
+ function stopWork(tag, waitAdditionalTasks = 0) {
61
+ let effectiveWaitTasks = defaultWaitTasks + waitAdditionalTasks
62
+ afterWaitTasks(stopWorkNow.bind(this, tag), effectiveWaitTasks)
62
63
  }
63
64
 
64
65
  function stopWorkNow(tag) {
@@ -92,6 +93,27 @@ window.CapybaraLockstep = (function() {
92
93
  }
93
94
  }
94
95
 
96
+ function trackHistory() {
97
+ // Wait an additional task because some browsers seem to require additional
98
+ // time before the URL changes.
99
+ trackEvent(document, 'popstate', 1)
100
+ trackEvent(document, 'hashchange', 1)
101
+
102
+ // API: https://developer.mozilla.org/en-US/docs/Web/API/History
103
+ for (let method of ['pushState', 'popState', 'forward', 'back', 'go']) {
104
+ let workTag = `history.${method}()`
105
+ let nativeImpl = history[method]
106
+ history[method] = function(...args) {
107
+ try {
108
+ startWork(workTag)
109
+ return nativeImpl.apply(history, args)
110
+ } finally {
111
+ stopWork(workTag, 1)
112
+ }
113
+ }
114
+ }
115
+ }
116
+
95
117
  function trackXHR() {
96
118
  let oldOpen = XMLHttpRequest.prototype.open
97
119
  let oldSend = XMLHttpRequest.prototype.send
@@ -135,7 +157,7 @@ window.CapybaraLockstep = (function() {
135
157
  // CapybaraLockstep.track() is called as the first script in the head.
136
158
  // jQuery will be loaded after us, so we wait until DOMContentReady.
137
159
  whenReady(function() {
138
- if (!window.jQuery || waitTasks > 0) {
160
+ if (!window.jQuery || defaultWaitTasks > 0) {
139
161
  return
140
162
  }
141
163
 
@@ -255,11 +277,11 @@ window.CapybaraLockstep = (function() {
255
277
  }
256
278
  }
257
279
 
258
- function afterWaitTasks(fn, tasksLeft = waitTasks) {
259
- if (tasksLeft > 0) {
280
+ function afterWaitTasks(fn, waitTasks = defaultWaitTasks) {
281
+ if (waitTasks > 0) {
260
282
  // Wait 1 task and recurse
261
283
  setTimeout(function() {
262
- afterWaitTasks(fn, tasksLeft - 1)
284
+ afterWaitTasks(fn, waitTasks - 1)
263
285
  })
264
286
  } else {
265
287
  fn()
@@ -282,14 +304,16 @@ window.CapybaraLockstep = (function() {
282
304
  })
283
305
  }
284
306
 
285
- function trackInteraction(eventType) {
286
- document.addEventListener(eventType, function() {
307
+ function trackEvent(eventTarget, eventType, waitAdditionalTasks = 0) {
308
+ eventTarget.addEventListener(eventType, function() {
287
309
  // Only litter the log with interaction events if we're actually going
288
310
  // to be busy for at least 1 task.
289
- if (waitTasks > 0) {
311
+ let effectiveWaitTasks = defaultWaitTasks + waitAdditionalTasks
312
+
313
+ if (effectiveWaitTasks > 0) {
290
314
  let tag = eventType
291
315
  startWork(tag)
292
- stopWork(tag)
316
+ stopWork(tag, waitAdditionalTasks)
293
317
  }
294
318
  })
295
319
  }
@@ -297,17 +321,19 @@ window.CapybaraLockstep = (function() {
297
321
  function track() {
298
322
  trackOldUnpoly()
299
323
  trackFetch()
324
+ trackHistory()
300
325
  trackXHR()
301
326
  trackRemoteElements()
302
327
  trackJQuery()
303
- trackInteraction('touchstart')
304
- trackInteraction('mousedown')
305
- trackInteraction('click')
306
- trackInteraction('keydown')
307
- trackInteraction('focusin')
308
- trackInteraction('focusout')
309
- trackInteraction('input')
310
- trackInteraction('change')
328
+ trackEvent(document, 'touchstart')
329
+ trackEvent(document, 'mousedown')
330
+ trackEvent(document, 'click')
331
+ trackEvent(document, 'keydown')
332
+ trackEvent(document, 'focusin')
333
+ trackEvent(document, 'focusout')
334
+ trackEvent(document, 'input')
335
+ trackEvent(document, 'change')
336
+ trackEvent(window, 'resize', 1)
311
337
  }
312
338
 
313
339
  function synchronize(callback) {
@@ -327,7 +353,7 @@ window.CapybaraLockstep = (function() {
327
353
  synchronize: synchronize,
328
354
  reset: reset,
329
355
  set debug(value) { debug = value },
330
- set waitTasks(value) { waitTasks = value }
356
+ set waitTasks(value) { defaultWaitTasks = value }
331
357
  }
332
358
  })()
333
359
 
@@ -1,5 +1,5 @@
1
1
  module Capybara
2
2
  module Lockstep
3
- VERSION = "2.0.3"
3
+ VERSION = "2.1.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara-lockstep
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henning Koch
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-08 00:00:00.000000000 Z
11
+ date: 2024-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capybara