blob: b9358951565430117107b9d00d20517e39efa738 [file] [log] [blame]
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();