(scene)
| 61 | |
| 62 | const touchEventCapturedTargets = {}; |
| 63 | function delegateEvents(scene) { |
| 64 | const events = ['mousedown', 'mouseup', 'mousemove', 'mousewheel', 'wheel', |
| 65 | 'touchstart', 'touchend', 'touchmove', 'touchcancel', |
| 66 | 'click', 'dblclick', 'longpress', 'tap', 'contextmenu']; |
| 67 | |
| 68 | const container = scene.container; |
| 69 | |
| 70 | container.addEventListener('mouseleave', (event) => { |
| 71 | const enteredTargets = scene[_enteredTargets]; |
| 72 | if(enteredTargets.size) { |
| 73 | const leaveEvent = new Event('mouseleave'); |
| 74 | leaveEvent.setOriginalEvent(event); |
| 75 | [...enteredTargets].forEach((target) => { |
| 76 | target.dispatchEvent(leaveEvent); |
| 77 | }); |
| 78 | scene[_enteredTargets].clear(); |
| 79 | } |
| 80 | }, {passive: true}); |
| 81 | |
| 82 | events.forEach((eventType) => { |
| 83 | container.addEventListener(eventType, (event) => { |
| 84 | const {left, top, displayRatio} = scene.options; |
| 85 | const layers = scene.orderedChildren; |
| 86 | const pointerEvents = createPointerEvents(event, {offsetLeft: left, offsetTop: top, displayRatio}); |
| 87 | pointerEvents.forEach((evt) => { |
| 88 | // evt.scene = scene; |
| 89 | const id = evt.identifier; |
| 90 | if(evt.type === 'touchmove' || evt.type === 'touchend') { |
| 91 | const capturedTarget = touchEventCapturedTargets[id]; |
| 92 | if(capturedTarget) capturedTarget.dispatchEvent(evt); |
| 93 | if(evt.type === 'touchend') delete touchEventCapturedTargets[id]; |
| 94 | } else { |
| 95 | for(let i = layers.length - 1; i >= 0; i--) { |
| 96 | const layer = layers[i]; |
| 97 | if(layer.options.handleEvent !== false) { |
| 98 | const ret = layer.dispatchPointerEvent(evt); |
| 99 | if(ret && evt.target !== layer) break; |
| 100 | else evt.cancelBubble = false; // prepare passing to next layer |
| 101 | } |
| 102 | } |
| 103 | if(evt.target === layers[0]) { |
| 104 | // trigger event on top layer |
| 105 | for(let i = layers.length - 1; i >= 0; i--) { |
| 106 | const layer = layers[i]; |
| 107 | if(layer.options.handleEvent !== false) { |
| 108 | evt.target = layer; |
| 109 | break; |
| 110 | } |
| 111 | } |
| 112 | } |
| 113 | } |
| 114 | const target = evt.target; |
| 115 | if(evt.type === 'touchstart') { |
| 116 | touchEventCapturedTargets[id] = evt.target; // set captured event target |
| 117 | } |
| 118 | if(evt.type === 'mousemove') { |
| 119 | const enteredTargets = scene[_enteredTargets]; |
| 120 | let enterSet; |
no test coverage detected