| var counter = 0; |
| var tests = 8; |
| var expected = ""; |
| var logEvent = false; |
| var rectElement = document.getElementById("target"); |
| var useElement = document.getElementById("test"); |
| window.testIsAsync = true; |
| description("Test attaching event listeners on SVG use elements in different ways: "); |
| |
| function eventHandler(evt) |
| { |
| if (logEvent) { |
| if (expected == evt.type) |
| debug("Test " + counter + " / " + tests + " PASSED"); |
| else |
| debug("Test " + counter + " / " + tests + " FAILED (expected: '" + expected + "' actual: '" + evt.type + "')"); |
| } |
| |
| setTimeout(counter < tests ? driveTests : finishTest, 0); |
| } |
| |
| function finishTest() |
| { |
| successfullyParsed = true; |
| |
| rectElement.setAttribute("fill", "green"); |
| shouldBeTrue("successfullyParsed"); |
| debug('<br /><span class="pass">TEST COMPLETE</span>'); |
| |
| finishRepaintTest(); |
| } |
| |
| function recordMouseEvent(type) |
| { |
| expected = type; |
| logEvent = true; |
| |
| ++counter; |
| fireDelayedEvent(); |
| } |
| |
| function sendMouseEvent(type, increment) |
| { |
| expected = type; |
| logEvent = false; |
| fireDelayedEvent(); |
| } |
| |
| function fireDelayedEvent() |
| { |
| if (expected == "mouseover") |
| eventSender.mouseMoveTo(50, 50); |
| else if (expected == "mouseout") |
| eventSender.mouseMoveTo(115, 55); |
| else if (expected == "mouseup") { |
| eventSender.mouseMoveTo(50, 50); |
| eventSender.mouseDown(); |
| eventSender.mouseUp(); |
| } else if (expected == "mousedown") { |
| eventSender.mouseMoveTo(50, 50); |
| eventSender.mouseDown(); |
| eventSender.mouseUp(); |
| } |
| } |
| |
| function testOne() |
| { |
| // Install event listener on correspondingElement via setAttribute |
| shadowRoot.firstChild.setAttribute("onmouseover", "eventHandler(evt)"); |
| recordMouseEvent("mouseover"); |
| } |
| |
| function testTwo() |
| { |
| // Install event listener on correspondingElement via onmouseout JS magic |
| shadowRoot.firstChild.onmouseout = eventHandler; |
| recordMouseEvent("mouseout"); |
| } |
| |
| function testThree() |
| { |
| // Clean event listeners on different ways |
| shadowRoot.firstChild.removeAttribute("onmouseover"); |
| shadowRoot.firstChild.onmouseout = 0; |
| |
| // Verify they really got removed |
| sendMouseEvent("mouseover"); |
| sendMouseEvent("mouseout"); |
| |
| // Verify the original listener still works |
| recordMouseEvent("mousedown"); |
| } |
| |
| function testFour() |
| { |
| shadowRoot.firstChild.removeAttribute("onmousedown"); |
| |
| // Install event listener on the referenced element, without using the SVGElementInstance interface |
| rectElement.setAttribute("onmouseup", "eventHandler(evt)"); |
| recordMouseEvent("mouseup"); |
| } |
| |
| function testFive() |
| { |
| rectElement.onmouseout = eventHandler; |
| recordMouseEvent("mouseout"); |
| } |
| |
| function testSix() |
| { |
| shadowRoot.firstChild.onmouseout = null; |
| sendMouseEvent("mouseout"); |
| |
| shadowRoot.firstChild.removeAttribute('onmouseup'); |
| sendMouseEvent("mouseup"); |
| |
| shadowRoot.firstChild.onmouseup = eventHandler; |
| recordMouseEvent("mouseup"); |
| } |
| |
| function testSeven() |
| { |
| shadowRoot.firstChild.addEventListener("mouseout", eventHandler, false); |
| recordMouseEvent("mouseout"); |
| } |
| |
| function testEight() |
| { |
| shadowRoot.firstChild.addEventListener("mouseover", eventHandler, false); |
| recordMouseEvent("mouseover"); |
| } |
| |
| function testNine() |
| { |
| rectElement.addEventListener("mousedown", eventHandler, false); |
| recordMouseEvent("mousedown"); |
| } |
| |
| function driveTests() |
| { |
| switch (counter) { |
| case 0: |
| testOne(); |
| break; |
| case 1: |
| testTwo(); |
| break; |
| case 2: |
| testThree(); |
| break; |
| case 3: |
| testFour(); |
| break; |
| case 4: |
| testFive(); |
| break; |
| case 5: |
| testSix(); |
| break; |
| case 6: |
| testSeven(); |
| break; |
| case 7: |
| testEight(); |
| break; |
| } |
| } |
| |
| function repaintTest() { |
| if (window.eventSender) |
| driveTests(); |
| else |
| alert("This test must be run via DRT!"); |
| } |