michael@0: /** michael@0: * Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ michael@0: */ michael@0: const fakeEventType = "foo"; michael@0: michael@0: function testEventTarget(event) { michael@0: if (event.target !== self) { michael@0: throw new Error("Event has a bad target!"); michael@0: } michael@0: if (event.currentTarget) { michael@0: throw new Error("Event has a bad currentTarget!"); michael@0: } michael@0: postMessage(event.data); michael@0: } michael@0: michael@0: addEventListener(fakeEventType, function(event) { michael@0: throw new Error("Trusted event listener received untrusted event!"); michael@0: }, false, false); michael@0: michael@0: addEventListener(fakeEventType, function(event) { michael@0: if (event.target !== self || event.currentTarget !== self) { michael@0: throw new Error("Fake event has bad target!"); michael@0: } michael@0: if (event.isTrusted) { michael@0: throw new Error("Event should be untrusted!"); michael@0: } michael@0: event.stopImmediatePropagation(); michael@0: postMessage(event.data); michael@0: }, false, true); michael@0: michael@0: addEventListener(fakeEventType, function(event) { michael@0: throw new Error("This shouldn't get called because of stopImmediatePropagation."); michael@0: }, false, true); michael@0: michael@0: var count = 0; michael@0: onmessage = function(event) { michael@0: if (event.target !== self || event.currentTarget !== self) { michael@0: throw new Error("Event has bad target!"); michael@0: } michael@0: michael@0: if (!count++) { michael@0: var exception; michael@0: try { michael@0: self.dispatchEvent(event); michael@0: } michael@0: catch(e) { michael@0: exception = e; michael@0: } michael@0: michael@0: if (!exception) { michael@0: throw new Error("Recursive dispatch didn't fail!"); michael@0: } michael@0: michael@0: event = new MessageEvent(fakeEventType, { bubbles: event.bubbles, michael@0: cancelable: event.cancelable, michael@0: data: event.data, michael@0: origin: "*", michael@0: source: null michael@0: }); michael@0: self.dispatchEvent(event); michael@0: michael@0: return; michael@0: } michael@0: michael@0: setTimeout(testEventTarget, 0, event); michael@0: };