| import EventEmitter from 'eventemitter3'; | 
| import logger from './logger'; | 
|   | 
| let debug = logger('quill:events'); | 
|   | 
| const EVENTS = ['selectionchange', 'mousedown', 'mouseup', 'click']; | 
|   | 
| EVENTS.forEach(function(eventName) { | 
|   document.addEventListener(eventName, (...args) => { | 
|     [].slice.call(document.querySelectorAll('.ql-container')).forEach((node) => { | 
|       // TODO use WeakMap | 
|       if (node.__quill && node.__quill.emitter) { | 
|         node.__quill.emitter.handleDOM(...args); | 
|       } | 
|     }); | 
|   }); | 
| }); | 
|   | 
|   | 
| class Emitter extends EventEmitter { | 
|   constructor() { | 
|     super(); | 
|     this.listeners = {}; | 
|     this.on('error', debug.error); | 
|   } | 
|   | 
|   emit() { | 
|     debug.log.apply(debug, arguments); | 
|     super.emit.apply(this, arguments); | 
|   } | 
|   | 
|   handleDOM(event, ...args) { | 
|     (this.listeners[event.type] || []).forEach(function({ node, handler }) { | 
|       if (event.target === node || node.contains(event.target)) { | 
|         handler(event, ...args); | 
|       } | 
|     }); | 
|   } | 
|   | 
|   listenDOM(eventName, node, handler) { | 
|     if (!this.listeners[eventName]) { | 
|       this.listeners[eventName] = []; | 
|     } | 
|     this.listeners[eventName].push({ node, handler }) | 
|   } | 
| } | 
|   | 
| Emitter.events = { | 
|   EDITOR_CHANGE        : 'editor-change', | 
|   SCROLL_BEFORE_UPDATE : 'scroll-before-update', | 
|   SCROLL_OPTIMIZE      : 'scroll-optimize', | 
|   SCROLL_UPDATE        : 'scroll-update', | 
|   SELECTION_CHANGE     : 'selection-change', | 
|   TEXT_CHANGE          : 'text-change' | 
| }; | 
| Emitter.sources = { | 
|   API    : 'api', | 
|   SILENT : 'silent', | 
|   USER   : 'user' | 
| }; | 
|   | 
|   | 
| export default Emitter; |