<html> <head> <script src="winetest.js" type="text/javascript"></script> </head> <head> <script> var testevent_divid2_called = false, testevent_document_called = false, cnt=0; function ondataavailable_test() { var evobj, div, b = false; div = document.getElementById("divid"); function ondataavailableHandler() { b = true; ok(window.event === evobj, "window.event != evobj"); ok(evobj.srcElement === div, "evobj.srcElement = " + evobj.srcElement); ok(evobj.fromElement === null, "evobj.srcElement = " + evobj.fromElement); ok(evobj.toElement === null, "evobj.srcElement = " + evobj.toElement); ok(evobj.type === "dataavailable", "evobj.type = " + evobj.type); } function ondataavailableDocHandler() { b = true; ok(window.event === evobj, "window.event != evobj"); ok(evobj.srcElement === null, "evobj.srcElement = " + evobj.srcElement); ok(evobj.fromElement === null, "evobj.srcElement = " + evobj.fromElement); ok(evobj.toElement === null, "evobj.srcElement = " + evobj.toElement); ok(evobj.type === "dataavailable", "evobj.type = " + evobj.type); } div.attachEvent("ondataavailable", ondataavailableHandler); evobj = document.createEventObject(); ok(evobj.srcElement === null, "evobj.srcElement = " + evobj.srcElement); ok(evobj.fromElement === null, "evobj.srcElement = " + evobj.fromElement); ok(evobj.toElement === null, "evobj.srcElement = " + evobj.toElement); ok(evobj.type === "", "evobj.type = " + evobj.type); div.fireEvent("ondataavailable", evobj); ok(b, "ondataavailable handler not called?"); ok(evobj.srcElement === div, "evobj.srcElement = " + evobj.srcElement); ok(evobj.type === "dataavailable", "evobj.type = " + evobj.type); div.detachEvent("ondataavailable", ondataavailableHandler); b = false; div.fireEvent("ondataavailable", evobj); ok(!b, "ondataavailable handler called?"); ok(evobj.srcElement === div, "evobj.srcElement = " + evobj.srcElement); ok(evobj.type === "dataavailable", "evobj.type = " + evobj.type); document.attachEvent("ondataavailable", ondataavailableDocHandler); evobj = document.createEventObject(); document.fireEvent("ondataavailable", evobj); ok(b, "ondataavailable handler not called?"); ok(evobj.srcElement === null, "evobj.srcElement = " + evobj.srcElement); ok(evobj.type === "dataavailable", "evobj.type = " + evobj.type); } function test_scriptfor() { var div = document.getElementById("divid2"); ok("onclick" in div, "testevent not in div"); ok(typeof(div.onclick) === "function", "typeof(div.onclick) = " + typeof(div.onclick)); ok(testevent_divid2_called === false, "testevent_divid2_called = " + testevent_divid2_called); ok(typeof(document.onclick) === "function", "typeof(document.onclick) = " + typeof(document.onclick)); ok(testevent_document_called === false, "testevent_document_called = " + testevent_document_called); div.click(); ok(testevent_divid2_called === true, "testevent_divid2_called = " + testevent_divid2_called); ok(testevent_document_called === true, "testevent_document_called = " + testevent_document_called); ok(!("ontest" in div), "testevent in div"); ok(typeof(div.ontest) === "undefined", "typeof(div.ontest) = " + typeof(div.ontest)); } function test_handler_this() { document.body.innerHTML = '<div id="d1"><div id="d2"></div></div>'; var div1 = document.getElementById("d1"); var div2 = document.getElementById("d2"); var calls = new Array(); function createHandler(name, node) { return function() { ok(this === node, "this !== node"); calls.push(name); } } function registerHandler(name, target) { var b = target.attachEvent("onclick", function(event_arg) { ok(this === window, "this !== window"); calls.push(name+"*"); with(todo_wine) ok(event_arg != window.event, "event_arg == window.event"); }); ok(b, "attachEvent failed"); } registerHandler("div1", div1); registerHandler("div2", div2); registerHandler("body", document.body); div1.onclick = createHandler("div1", div1); div2.onclick = createHandler("div2", div2); document.body.onclick = createHandler("body", document.body); div2.click(); ok(calls == "div2,div2*,div1,div1*,body,body*", "calls = " + calls); } function test_insert_script() { var e = document.createElement("script"); extern_cnt = 0; e.src = "externscr.js"; var readystatechange_log = ""; e.onreadystatechange = function() { ok(window.event.srcElement === e, "srcElement != e"); readystatechange_log += "," + e.readyState; ok(extern_cnt === 1, "extern_cnt = " + extern_cnt); if(e.readyState === "complete") { ok(readystatechange_log === "append,complete", "readystatechange_log = " + readystatechange_log); reportSuccess(); } } document.body.appendChild(e); ok(extern_cnt === 1, "extern_cnt = " + extern_cnt); readystatechange_log = "append"; } var string_handler_called = false; function test_string_event_handler() { var e = document.createElement("div"); var event_str = "string_handler_called = true;"; document.body.appendChild(e); e.onclick = event_str; ok(e.onclick === event_str, "e.onclick = " + e.onclick); e.click(); ok(string_handler_called === false, "string handler called"); e.setAttribute("onclick", event_str); ok(e.onclick === event_str, "e.onclick = " + e.onclick); e.click(); ok(string_handler_called === false, "string handler called"); } function test_body_events() { var f = function() {}, g = function() {}; document.body.onload = f; ok(document.body.onload === f, "body.onload != f"); ok(window.onload === f, "window.onload != f"); document.body.onfocus = f; ok(document.body.onfocus === f, "body.onfocus != f"); ok(window.onfocus === f, "window.onfocus != f"); window.onfocus = g; ok(document.body.onfocus === g, "body.onfocus != g"); ok(window.onfocus === g, "window.onfocus != g"); var onclick_called = false; var onclick_handler = function() { onclick_called = true; }; document.body.attachEvent("onclick", onclick_handler); window.detachEvent("onclick", onclick_handler); document.body.click(); ok(onclick_called, "onclick handler not invoked"); } function test_event_target() { var div = document.createElement("div"); document.body.appendChild(div); var last_event_arg; div.attachEvent("onclick", function(event_arg) { ok(event_arg.srcElement === div, "srcElement != div"); last_event_arg = event_arg; }); div.click(); with(todo_wine) ok(last_event_arg.srcElement === null, "srcElement != null"); document.body.removeChild(div); } function test_attach_event() { var calls; var div = document.createElement("div"); document.body.appendChild(div); function listener() { calls += "listener,"; } function listener2() { calls += "listener2,"; } /* if the same listener is added twice, it will be called twice */ div.attachEvent("onclick", listener); div.attachEvent("onclick", listener2); div.attachEvent("onclick", listener); calls = ""; div.click(); ok(calls === "listener,listener2,listener,", "calls = " + calls); /* remove listener once, it will be called once */ div.detachEvent("onclick", listener); calls = ""; div.click(); ok(calls === "listener2,listener,", "calls = " + calls); div.detachEvent("onclick", listener); div.detachEvent("onclick", listener2); calls = ""; div.click(); ok(calls === "", "calls = " + calls); document.body.removeChild(div); } function test_listener_order() { if(!("documentMode" in document)) { win_skip("Skipping test_listener_order on too old IE"); return; } var div = document.createElement("div"); document.body.appendChild(div); var calls; function record_call(msg) { return function() { calls += msg + "," }; } div.attachEvent("onclick", record_call("click1")); div.onclick = record_call("onclick"); div.attachEvent("onclick", record_call("click2")); div.attachEvent("onclick", record_call("click3")); calls = ""; div.click(); ok(calls === "onclick,click3,click2,click1,", "calls = " + calls); document.body.removeChild(div); } function test_attach_in_attach() { var calls; var div = document.createElement("div"); document.body.appendChild(div); /* listener attached inside onevent handler will be invoked in this propagation */ div.onclick = function () { calls += "div.onclick,"; div.attachEvent("onclick", function() { calls += "div.click,"; /* listener attached inside another attached listener will not be invoked */ div.attachEvent("onclick", function () { ok(false, "unexpected call"); }); }); } calls = ""; div.click(); ok(calls === "div.onclick,div.click,", "calls = " + calls); document.body.removeChild(div); } window.onload = function() { try { ok(inlscr_complete_called, "onreadystatechange not fired"); ok(extern_res_script_rs === "eval,complete1," || extern_res_script_rs == "loaded0,eval,complete1,", "extern_res_script_rs = " + extern_res_script_rs + " expected (loaded0)?,eval,complete1,"); ok(extern_http_script_rs === "loading,loaded,complete," || extern_http_script_rs === "complete,", "extern_http_script_rs = " + extern_http_script_rs + " expected loading,loaded,complete, or complete,"); ok(cnt == 1, "cnt=" + cnt + " exception during loading?"); ok(this === window, "this !== window"); ok(typeof(window.onload) === "function", "typeof(window.onload) = " + typeof(window.onload)); ok(document.body.onload === window.onload, "document.body.onload !== window.onload"); ok(img_onload_called, "img.onload not called before window.onload"); test_scriptfor(); ondataavailable_test(); test_handler_this(); test_insert_script(); test_string_event_handler(); test_body_events(); test_event_target(); test_attach_event(); test_listener_order(); test_attach_in_attach(); }catch(e) { ok(false, "Got an exception: " + e.message); } } </script> <script> var img = document.createElement("img"); img.src = "http://test.winehq.org/tests/winehq_snapshot/index_files/winehq_logo_glass.png"; var img_onload_called = false; img.onload = function() { trace("img.onload"); img_onload_called = true; } img.onerror = function() { trace("img.onerror"); img_onload_called = true; } </script> </head> <body> <div id="divid"></div> <div id="divid2"></div> <script event="onclick" for="divid2"> testevent_divid2_called = true; </script> <script event="onclick" for="document"> testevent_document_called = true; </script> <script event="ontest" for="divid2"> ok(false, "unexpected ontest"); </script> <script> (function() { var div = document.getElementById("divid2"); ok(div.onclick === null, "div.onclick = null"); cnt++; })(); </script> <script> var inlscr_complete_called = false, extern_res_script_rs = "", extern_http_script_rs = ""; var extern_cnt = 0; function expect_inlscr_complete() { var elem = document.getElementById("inlscr"); ok(elem.readyState === "complete" || broken(elem.readyState === "loading"), "expect_inlscr_complete: elem.readyState = " + elem.readyState); if(elem.readyState === "complete") inlscr_complete_called = true; } function extern_res_script_readystatechange() { var elem = document.getElementById("extscr"); if(elem.readyState != "loading") extern_res_script_rs += elem.readyState + extern_cnt + ","; else trace("Got loading readyState from external res script."); } function http_script_readystatechange() { var elem = document.getElementById("httpscr"); extern_http_script_rs += elem.readyState + ","; } function on_externscr() { var elem = document.getElementById("extscr"); ok(elem.readyState === "interactive" || broken(elem.readyState === "loading"), "on_externscr: elem.readyState = " + elem.readyState); extern_res_script_rs += "eval,"; } </script> <script id="inlscr" onreadystatechange="expect_inlscr_complete();"> (function() { ok(inlscr_complete_called === false || broken(inlscr_complete_called), "onreadystatechange fired too early"); var elem = document.getElementById("inlscr"); ok(elem.readyState === "interactive", "inlscr: elem.readyState = " + elem.readyState); })(); </script> <script id="extscr" onreadystatechange="extern_res_script_readystatechange()" src="externscr.js"></script> <script id="httpscr" onreadystatechange="http_script_readystatechange()" src="https://test.winehq.org/tests/empty.js?123456"></script> <script> document.body.appendChild(img); </script> </body> </html>