| description("Tests whether SVG event bubbling works across shadow trees."); |
| |
| if (window.testRunner) { |
| testRunner.waitUntilDone(); |
| testRunner.dumpAsText(); |
| } |
| |
| var svgNS = "http://www.w3.org/2000/svg"; |
| var xhtmlNS = "http://www.w3.org/1999/xhtml"; |
| var expected = new Array(4); |
| var tests = 4; |
| var counter = 0; |
| var eventCounter = 0; |
| |
| function log(message) { |
| var logDiv = document.getElementById("console"); |
| var newDiv = document.createElementNS(xhtmlNS, "div"); |
| newDiv.appendChild(document.createTextNode(message)); |
| logDiv.appendChild(newDiv); |
| } |
| |
| function eventHandler(evt, label) { |
| var targetId = evt.target.id; |
| var curTargetId = evt.currentTarget.id; |
| |
| var phaseString = ""; |
| switch (evt.eventPhase) { |
| case 1: phaseString = "CAPTURING"; break; |
| case 2: phaseString = "AT_TARGET"; break; |
| case 3: phaseString = "BUBBLING"; break; |
| } |
| |
| msg = '[EventHandler ' + label + '] type: ' + evt.type + ' phase: ' + phaseString + |
| ' target: ' + evt.target + ' (id: ' + targetId + ')' + |
| ' currentTarget: ' + evt.currentTarget + ' (id: ' + curTargetId + ')'; |
| |
| shouldBeEqualToString("msg", expected[eventCounter]); |
| ++eventCounter; |
| |
| if (label == counter) |
| setTimeout(label == tests ? finishTest : nextTest, 0); |
| } |
| |
| function finishTest() |
| { |
| document.getElementById("rectParent").setAttribute("fill", "green"); |
| debug('<br /><span class="pass">TEST COMPLETE</span>'); |
| |
| if (window.testRunner) |
| testRunner.notifyDone(); |
| } |
| |
| function nextTest() |
| { |
| eventCounter = 0; |
| ++counter; |
| |
| switch (counter) { |
| case 1: |
| rect.onclick = function(evt) { eventHandler(evt, 1); }; |
| expected[0] = "[EventHandler 1] type: click phase: AT_TARGET target: [object SVGUseElement] (id: use) currentTarget: [object SVGUseElement] (id: use)"; |
| testListeners(); |
| break; |
| case 2: |
| rectContainer.addEventListener("click", function(evt) { eventHandler(evt, 2) }, false); |
| expected[1] = "[EventHandler 2] type: click phase: AT_TARGET target: [object SVGUseElement] (id: use) currentTarget: [object SVGUseElement] (id: use)"; |
| testListeners(); |
| break; |
| case 3: |
| use.setAttribute("onclick", "eventHandler(evt, 3)"); |
| expected[2] = "[EventHandler 3] type: click phase: AT_TARGET target: [object SVGUseElement] (id: use) currentTarget: [object SVGUseElement] (id: use)"; |
| testListeners(); |
| break; |
| case 4: |
| useContainer.onclick = function(evt) { eventHandler(evt, 4) }; |
| expected[3] = "[EventHandler 4] type: click phase: BUBBLING target: [object SVGUseElement] (id: use) currentTarget: [object SVGGElement] (id: useParent)"; |
| testListeners(); |
| break; |
| } |
| } |
| |
| function testListeners() |
| { |
| if (window.eventSender) { |
| eventSender.mouseMoveTo(50, 50); |
| eventSender.mouseDown(); |
| eventSender.mouseUp(); |
| } |
| } |
| |
| // Create root element |
| var svg = document.createElementNS(svgNS, "svg"); |
| svg.id = "rootSVG"; |
| svg.setAttribute("width", 100); |
| svg.setAttribute("height", 100); |
| document.body.insertBefore(svg, document.body.firstChild); |
| |
| // Create defs section |
| var defs = document.createElementNS(svgNS, "defs"); |
| svg.appendChild(defs); |
| |
| var rectContainer = document.createElementNS(svgNS, "g"); |
| rectContainer.id = "rectParent"; |
| defs.appendChild(rectContainer); |
| |
| var rect = document.createElementNS(svgNS, "rect"); |
| rect.id = "rect"; |
| rect.style.fill = "blue"; |
| rect.width.baseVal.value = 100; |
| rect.height.baseVal.value = 100; |
| rectContainer.appendChild(rect); |
| |
| // Create content section |
| var useContainer = document.createElementNS(svgNS, "g"); |
| useContainer.id = "useParent"; |
| svg.appendChild(useContainer); |
| |
| var use = document.createElementNS(svgNS, "use"); |
| use.id = "use"; |
| use.href.baseVal = "#rectParent"; |
| useContainer.appendChild(use); |
| |
| nextTest(); |