diff --git a/dlls/mshtml/tests/events.html b/dlls/mshtml/tests/events.html
index 4172e300b18..f20fd3b1825 100644
--- a/dlls/mshtml/tests/events.html
+++ b/dlls/mshtml/tests/events.html
@@ -190,6 +190,92 @@ function test_event_target() {
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() {
+ 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 an other attached listener will not ve 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() {
@@ -215,6 +301,9 @@ window.onload = function() {
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);
}