2
0
Эх сурвалжийг харах

kill countHandlers, use ListenerCounter

Adam Shaw 8 жил өмнө
parent
commit
3d07c17e8c

+ 15 - 20
tests/automated/legacy/destroy.js

@@ -1,4 +1,4 @@
-import { countHandlers } from '../lib/dom-misc'
+import ListenerCounter from '../lib/ListenerCounter'
 
 describe('destroy', function() {
 
@@ -46,49 +46,44 @@ describe('destroy', function() {
   describeOptions('defaultView', {
     'when in basicWeek view': 'basicWeek',
     'when in agendaWeek view': 'agendaWeek',
-    'when in agendaDay view': 'agendaDay', // always fails on third one for some reason :(
     'when in listWeek view': 'listWeek',
     'when in month view': 'month'
   }, function(viewName) {
     it('leaves no handlers attached to DOM', function() {
       var $el = $('<div>').appendTo('body')
-      var origDocCnt = countHandlers(document)
-      var origElCnt = countHandlers($el)
+      var elHandlerCounter = new ListenerCounter($el[0])
+      var docHandlerCounter = new ListenerCounter(document)
+
+      elHandlerCounter.startWatching()
+      docHandlerCounter.startWatching()
 
       initCalendar({}, $el)
       currentCalendar.destroy()
 
       if (viewName !== 'agendaDay') { // hack for skipping 3rd one
-        expect(countHandlers(document)).toBe(origDocCnt)
-        expect(countHandlers($el)).toBe(origElCnt)
+        expect(elHandlerCounter.stopWatching()).toBe(0)
+        expect(docHandlerCounter.stopWatching()).toBe(0)
       }
 
       $el.remove()
     })
 
     // Issue 2432
-    it('preserves existing window handlers when handleWindowResize is off', function(done) {
+    it('preserves existing window handlers when handleWindowResize is off', function() {
       var resizeHandler = function() {}
-      var handlerCnt0 = countHandlers(window)
-      var handlerCnt1
-      var handlerCnt2
+      var windowListenerCounter = new ListenerCounter(window)
+      windowListenerCounter.startWatching()
 
-      $(window).on('resize', resizeHandler)
-      handlerCnt1 = countHandlers(window)
-      expect(handlerCnt1).toBe(handlerCnt0 + 1)
+      window.addEventListener('resize', resizeHandler)
+      expect(windowListenerCounter.computeDelta()).toBe(1)
 
       initCalendar({
         handleWindowResize: false
       })
-
       currentCalendar.destroy()
 
-      setTimeout(function() { // might not have detached handlers synchronously
-        handlerCnt2 = countHandlers(window)
-        expect(handlerCnt2).toBe(handlerCnt1)
-        done()
-      }, 100)
-
+      expect(windowListenerCounter.stopWatching()).toBe(1)
+      window.removeEventListener('resize', resizeHandler)
     })
   })
 

+ 4 - 6
tests/automated/legacy/external-dnd.js

@@ -1,4 +1,4 @@
-import { countHandlers } from '../lib/dom-misc'
+import ListenerCounter from '../lib/ListenerCounter'
 
 describe('external drag and drop', function() {
 
@@ -331,19 +331,17 @@ describe('external drag and drop', function() {
 
       // Issue 2433
       it('should not have drag handlers cleared when other calendar navigates', function() {
-
         init()
         var el1 = $('#cal')
 
         $('#cal').after('<div id="cal2"/>')
         var el2 = $('#cal2').fullCalendar(options)
 
-        var beforeCnt = countHandlers(document)
-        var afterCnt
+        var docListenerCounter = new ListenerCounter(document)
+        docListenerCounter.startWatching()
 
         el1.fullCalendar('next')
-        afterCnt = countHandlers(document)
-        expect(beforeCnt).toBe(afterCnt)
+        expect(docListenerCounter.stopWatching()).toBe(0)
 
         el1.remove()
         el2.remove()

+ 59 - 0
tests/automated/lib/ListenerCounter.js

@@ -0,0 +1,59 @@
+
+export default class ListenerCounter {
+
+  constructor(el) {
+    this.delta = 0
+    this.el = el
+  }
+
+  startWatching() {
+    let t = this
+    let el = t.el
+    let origAddEventListened = el.addEventListener
+    let origRemoveEventListener = el.removeEventListener
+
+    el.addEventListener = function() {
+      t.delta++
+      return origAddEventListened.apply(el, arguments)
+    }
+
+    el.removeEventListener = function(name) {
+      if (name !== 'load') { // ignore when jQuery detaches the load event from the window
+        t.delta--
+      }
+      return origRemoveEventListener.apply(el, arguments)
+    }
+
+    this.jQueryStartCount = countJqueryListeners(el)
+  }
+
+  stopWatching() {
+    delete this.el.addEventListener
+    delete this.el.removeEventListener
+
+    return this.computeDelta()
+  }
+
+  computeDelta() {
+    return this.delta // + (countJqueryListeners(this.el) - this.jQueryStartCount)
+  }
+
+}
+
+
+function countJqueryListeners(el) {
+  return 0
+  var hash = getJqueryHandlerHash(el)
+  var cnt = 0
+
+  $.each(hash, function(name, handlers) {
+    cnt += handlers.length
+  })
+
+  return cnt
+}
+
+
+function getJqueryHandlerHash(el) {
+  return $._data($(el)[0], 'events') || {}
+}

+ 0 - 17
tests/automated/lib/dom-misc.js

@@ -34,23 +34,6 @@ export function getStockScrollbarWidths(dir) {
 }
 
 
-export function countHandlers(el) {
-  var hash = getHandlerHash(el)
-  var cnt = 0
-
-  $.each(hash, function(name, handlers) {
-    cnt += handlers.length
-  })
-
-  return cnt
-}
-
-
-function getHandlerHash(el) {
-  return $._data($(el)[0], 'events') || {}
-}
-
-
 export function isElWithinRtl(el) {
   return el.closest('.fc').hasClass('fc-rtl')
 }