// Force activating pixel tests - this variable is used in resources/js-test.js, when calling setDumpAsText().
window.enablePixelTesting = true;

var svgNS = "http://www.w3.org/2000/svg";
var xlinkNS = "http://www.w3.org/1999/xlink";
var xhtmlNS = "http://www.w3.org/1999/xhtml";

var rootSVGElement;
var iframeElement;

if (window.testRunner) {
    var s = document.createElement('style');
    s.innerHTML += "h1, pre, div#console, p { opacity: 0 }";
    s.innerHTML += "body { overflow: hidden }";
    document.head.appendChild(s);
}

function afterTest() {
    finishJSTest();
}

function createSVGElement(name) {
    return document.createElementNS(svgNS, "svg:" + name);
}

function shouldHaveBBox(element, width, height)
{
    shouldBe(element + ".getBBox().width", width);
    shouldBe(element + ".getBBox().height", height);
}

function createSVGTestCase() {
    window.jsTestIsAsync = true;
    if (window.testRunner)
        testRunner.waitUntilDone();

    rootSVGElement = createSVGElement("svg");
    rootSVGElement.setAttribute("width", "300");
    rootSVGElement.setAttribute("height", "300");

    var bodyElement = document.documentElement.lastChild;
    bodyElement.insertBefore(rootSVGElement, document.getElementById("description"));
}

function embedSVGTestCase(uri) {
    window.jsTestIsAsync = true;
    if (window.testRunner)
        testRunner.waitUntilDone();

    iframeElement = document.createElement("iframe");
    iframeElement.setAttribute("style", "width: 300px; height: 300px;");
    iframeElement.setAttribute("src", uri);
    iframeElement.setAttribute("onload", "iframeLoaded()");

    var bodyElement = document.documentElement.lastChild;
    bodyElement.insertBefore(iframeElement, document.getElementById("description"));
}

function iframeLoaded() {
    rootSVGElement = iframeElement.getSVGDocument().rootElement;
}

function clickAt(x, y) {
    // Translation due to <h1> above us
    var clientRect = rootSVGElement.getBoundingClientRect();
    x = x + clientRect.left;
    y = y + clientRect.top;

    if (window.eventSender) {
        eventSender.mouseMoveTo(x, y);
        eventSender.mouseDown();
        eventSender.mouseUp();
    }
}
