444 lines
10 KiB
JavaScript
444 lines
10 KiB
JavaScript
var eventUtils = tinymce.dom.Event;
|
|
|
|
module("tinymce.dom.Event", {
|
|
setupModule: function() {
|
|
document.getElementById('view').innerHTML = (
|
|
'<div id="content" tabindex="0">' +
|
|
'<div id="inner" tabindex="0"></div>' +
|
|
'</div>'
|
|
);
|
|
},
|
|
|
|
teardown: function() {
|
|
eventUtils.clean(window);
|
|
}
|
|
});
|
|
|
|
test("unbind all", function() {
|
|
var result;
|
|
|
|
eventUtils.bind(window, 'click', function() {
|
|
result.click = true;
|
|
});
|
|
|
|
eventUtils.bind(window, 'keydown', function() {
|
|
result.keydown1 = true;
|
|
});
|
|
|
|
eventUtils.bind(window, 'keydown', function() {
|
|
result.keydown2 = true;
|
|
});
|
|
|
|
result = {};
|
|
eventUtils.fire(window, 'click');
|
|
eventUtils.fire(window, 'keydown');
|
|
deepEqual(result, {click: true, keydown1: true, keydown2: true});
|
|
|
|
eventUtils.unbind(window);
|
|
result = {};
|
|
eventUtils.fire(window, 'click');
|
|
eventUtils.fire(window, 'keydown');
|
|
deepEqual(result, {});
|
|
});
|
|
|
|
test("unbind event", function() {
|
|
var result;
|
|
|
|
eventUtils.bind(window, 'click', function() {
|
|
result.click = true;
|
|
});
|
|
|
|
eventUtils.bind(window, 'keydown', function() {
|
|
result.keydown1 = true;
|
|
});
|
|
|
|
eventUtils.bind(window, 'keydown', function() {
|
|
result.keydown2 = true;
|
|
});
|
|
|
|
result = {};
|
|
eventUtils.fire(window, 'click');
|
|
eventUtils.fire(window, 'keydown');
|
|
deepEqual(result, {click: true, keydown1: true, keydown2: true});
|
|
|
|
eventUtils.unbind(window, 'click');
|
|
result = {};
|
|
eventUtils.fire(window, 'click');
|
|
eventUtils.fire(window, 'keydown');
|
|
deepEqual(result, {keydown1: true, keydown2: true});
|
|
});
|
|
|
|
test("unbind event non existing", function() {
|
|
eventUtils.unbind(window, 'noevent');
|
|
ok(true, "No exception");
|
|
});
|
|
|
|
test("unbind callback", function() {
|
|
var result;
|
|
|
|
eventUtils.bind(window, 'click', function() {
|
|
result.click = true;
|
|
});
|
|
|
|
eventUtils.bind(window, 'keydown', function() {
|
|
result.keydown1 = true;
|
|
});
|
|
|
|
function callback2() {
|
|
result.keydown2 = true;
|
|
}
|
|
|
|
eventUtils.bind(window, 'keydown', callback2);
|
|
|
|
result = {};
|
|
eventUtils.fire(window, 'click');
|
|
eventUtils.fire(window, 'keydown');
|
|
deepEqual(result, {click: true, keydown1: true, keydown2: true});
|
|
|
|
eventUtils.unbind(window, 'keydown', callback2);
|
|
result = {};
|
|
eventUtils.fire(window, 'click');
|
|
eventUtils.fire(window, 'keydown');
|
|
deepEqual(result, {click: true, keydown1: true});
|
|
});
|
|
|
|
test("unbind multiple", function() {
|
|
var result;
|
|
|
|
eventUtils.bind(window, 'mouseup mousedown click', function(e) {
|
|
result[e.type] = true;
|
|
});
|
|
|
|
eventUtils.unbind(window, 'mouseup mousedown');
|
|
|
|
result = {};
|
|
eventUtils.fire(window, 'mouseup');
|
|
eventUtils.fire(window, 'mousedown');
|
|
eventUtils.fire(window, 'click');
|
|
deepEqual(result, {click: true});
|
|
});
|
|
|
|
test("bind multiple", function() {
|
|
var result;
|
|
|
|
eventUtils.bind(window, 'mouseup mousedown', function(e) {
|
|
result[e.type] = true;
|
|
});
|
|
|
|
result = {};
|
|
eventUtils.fire(window, 'mouseup');
|
|
eventUtils.fire(window, 'mousedown');
|
|
eventUtils.fire(window, 'click');
|
|
deepEqual(result, {mouseup: true, mousedown: true});
|
|
});
|
|
|
|
test("bind/fire bubbling", function() {
|
|
var result;
|
|
|
|
eventUtils.bind(window, 'click', function() {
|
|
result.window = true;
|
|
});
|
|
|
|
eventUtils.bind(document, 'click', function() {
|
|
result.document = true;
|
|
});
|
|
|
|
eventUtils.bind(document.body, 'click', function() {
|
|
result.body = true;
|
|
});
|
|
|
|
eventUtils.bind(document.getElementById('content'), 'click', function() {
|
|
result.content = true;
|
|
});
|
|
|
|
eventUtils.bind(document.getElementById('inner'), 'click', function() {
|
|
result.inner = true;
|
|
});
|
|
|
|
result = {};
|
|
eventUtils.fire(window, 'click');
|
|
deepEqual(result, {window: true});
|
|
|
|
result = {};
|
|
eventUtils.fire(document, 'click');
|
|
deepEqual(result, {document: true, window: true});
|
|
|
|
result = {};
|
|
eventUtils.fire(document.body, 'click');
|
|
deepEqual(result, {body: true, document: true, window: true});
|
|
|
|
result = {};
|
|
eventUtils.fire(document.getElementById('content'), 'click');
|
|
deepEqual(result, {content: true, body: true, document: true, window: true});
|
|
|
|
result = {};
|
|
eventUtils.fire(document.getElementById('inner'), 'click');
|
|
deepEqual(result, {inner: true, content: true, body: true, document: true, window: true});
|
|
});
|
|
|
|
test("bind/fire stopImmediatePropagation", function() {
|
|
var result;
|
|
|
|
eventUtils.bind(window, 'click', function() {
|
|
result.click1 = true;
|
|
});
|
|
|
|
eventUtils.bind(window, 'click', function(e) {
|
|
result.click2 = true;
|
|
e.stopImmediatePropagation();
|
|
});
|
|
|
|
eventUtils.bind(window, 'click', function() {
|
|
result.click3 = true;
|
|
});
|
|
|
|
result = {};
|
|
eventUtils.fire(window, 'click');
|
|
deepEqual(result, {click1: true, click2: true});
|
|
});
|
|
|
|
test("bind/fire stopPropagation", function() {
|
|
var result;
|
|
|
|
eventUtils.bind(window, 'click', function() {
|
|
result.click1 = true;
|
|
});
|
|
|
|
eventUtils.bind(document.body, 'click', function() {
|
|
result.click2 = true;
|
|
});
|
|
|
|
eventUtils.bind(document.getElementById('inner'), 'click', function(e) {
|
|
result.click3 = true;
|
|
e.stopPropagation();
|
|
});
|
|
|
|
result = {};
|
|
eventUtils.fire(document.getElementById('inner'), 'click');
|
|
deepEqual(result, {click3: true});
|
|
});
|
|
|
|
test("clean window", function() {
|
|
var result;
|
|
|
|
eventUtils.bind(window, 'click', function() {
|
|
result.click1 = true;
|
|
});
|
|
|
|
eventUtils.bind(document.body, 'click', function() {
|
|
result.click2 = true;
|
|
});
|
|
|
|
eventUtils.bind(document.getElementById('content'), 'click', function() {
|
|
result.click3 = true;
|
|
});
|
|
|
|
eventUtils.bind(document.getElementById('inner'), 'click', function() {
|
|
result.click4 = true;
|
|
});
|
|
|
|
result = {};
|
|
eventUtils.fire(document.getElementById('inner'), 'click');
|
|
deepEqual(result, {click1: true, click2: true, click3: true, click4: true});
|
|
|
|
eventUtils.clean(window);
|
|
result = {};
|
|
eventUtils.fire(document.getElementById('inner'), 'click');
|
|
deepEqual(result, {});
|
|
});
|
|
|
|
test("clean document", function() {
|
|
var result;
|
|
|
|
eventUtils.bind(window, 'click', function() {
|
|
result.click1 = true;
|
|
});
|
|
|
|
eventUtils.bind(document, 'click', function() {
|
|
result.click2 = true;
|
|
});
|
|
|
|
eventUtils.bind(document.body, 'click', function() {
|
|
result.click3 = true;
|
|
});
|
|
|
|
eventUtils.bind(document.getElementById('content'), 'click', function() {
|
|
result.click4 = true;
|
|
});
|
|
|
|
eventUtils.bind(document.getElementById('inner'), 'click', function() {
|
|
result.click5 = true;
|
|
});
|
|
|
|
result = {};
|
|
eventUtils.fire(document.getElementById('inner'), 'click');
|
|
deepEqual(result, {click1: true, click2: true, click3: true, click4: true, click5: true});
|
|
|
|
eventUtils.clean(document);
|
|
result = {};
|
|
eventUtils.fire(document.getElementById('inner'), 'click');
|
|
deepEqual(result, {click1: true});
|
|
});
|
|
|
|
test("clean element", function() {
|
|
var result;
|
|
|
|
eventUtils.bind(window, 'click', function() {
|
|
result.click1 = true;
|
|
});
|
|
|
|
eventUtils.bind(document.body, 'click', function() {
|
|
result.click2 = true;
|
|
});
|
|
|
|
eventUtils.bind(document.getElementById('content'), 'click', function() {
|
|
result.click3 = true;
|
|
});
|
|
|
|
eventUtils.bind(document.getElementById('inner'), 'click', function() {
|
|
result.click4 = true;
|
|
});
|
|
|
|
result = {};
|
|
eventUtils.fire(document.getElementById('inner'), 'click');
|
|
deepEqual(result, {click1: true, click2: true, click3: true, click4: true});
|
|
|
|
eventUtils.clean(document.getElementById('content'));
|
|
result = {};
|
|
eventUtils.fire(document.getElementById('inner'), 'click');
|
|
deepEqual(result, {click1: true, click2: true});
|
|
});
|
|
|
|
test("mouseenter/mouseleave bind/unbind", function() {
|
|
var result = {};
|
|
|
|
eventUtils.bind(document.body, 'mouseenter mouseleave', function(e) {
|
|
result[e.type] = true;
|
|
});
|
|
|
|
eventUtils.fire(document.body, 'mouseenter');
|
|
eventUtils.fire(document.body, 'mouseleave');
|
|
|
|
deepEqual(result, {mouseenter: true, mouseleave: true});
|
|
|
|
result = {};
|
|
eventUtils.clean(document.body);
|
|
eventUtils.fire(document.body, 'mouseenter');
|
|
eventUtils.fire(document.body, 'mouseleave');
|
|
deepEqual(result, {});
|
|
});
|
|
|
|
/*
|
|
asyncTest("focusin/focusout bind/unbind", function() {
|
|
var result = {};
|
|
|
|
window.setTimeout(function() {
|
|
eventUtils.bind(document.body, 'focusin focusout', function(e) {
|
|
// IE will fire a focusout on the parent element if you focus an element within not a big deal so lets detect it in the test
|
|
if (e.type == "focusout" && e.target.contains(document.activeElement)) {
|
|
return;
|
|
}
|
|
|
|
result[e.type] = result[e.type] ? ++result[e.type] : 1;
|
|
});
|
|
|
|
start();
|
|
document.getElementById('content').focus();
|
|
document.getElementById('inner').focus();
|
|
|
|
deepEqual(result, {focusin: 2, focusout: 1});
|
|
}, 0);
|
|
});
|
|
*/
|
|
|
|
test("bind unbind fire clean on null", function() {
|
|
eventUtils.bind(null, 'click', function() {});
|
|
eventUtils.unbind(null, 'click', function() {});
|
|
eventUtils.fire(null, {});
|
|
eventUtils.clean(null);
|
|
ok(true, "No exception");
|
|
});
|
|
|
|
test("bind ready when page is loaded", function() {
|
|
var ready;
|
|
|
|
eventUtils.bind(window, 'ready', function() {
|
|
ready = true;
|
|
});
|
|
|
|
ok(eventUtils.domLoaded, "DomLoaded state true");
|
|
ok(ready, "Window is ready.");
|
|
});
|
|
|
|
test("event states when event object is fired twice", function() {
|
|
var result = {};
|
|
|
|
eventUtils.bind(window, 'keydown', function(e) {result[e.type] = true;e.preventDefault();e.stopPropagation();});
|
|
eventUtils.bind(window, 'keyup', function(e) {result[e.type] = true;e.stopImmediatePropagation();});
|
|
|
|
var event = {};
|
|
eventUtils.fire(window, 'keydown', event);
|
|
eventUtils.fire(window, 'keyup', event);
|
|
|
|
ok(event.isDefaultPrevented(), "Default is prevented.");
|
|
ok(event.isPropagationStopped(), "Propagation is stopped.");
|
|
ok(event.isImmediatePropagationStopped(), "Immediate propagation is stopped.");
|
|
|
|
deepEqual(result, {keydown: true, keyup: true});
|
|
});
|
|
|
|
test("unbind inside callback", function() {
|
|
var data;
|
|
|
|
function append(value) {
|
|
return function() {
|
|
data += value;
|
|
};
|
|
}
|
|
|
|
function callback() {
|
|
eventUtils.unbind(window, 'click', callback);
|
|
data += 'b';
|
|
}
|
|
|
|
data = '';
|
|
eventUtils.bind(window, 'click', append("a"));
|
|
eventUtils.bind(window, 'click', callback);
|
|
eventUtils.bind(window, 'click', append("c"));
|
|
|
|
eventUtils.fire(window, 'click', {});
|
|
equal(data, 'abc');
|
|
|
|
data = '';
|
|
eventUtils.fire(window, 'click', {});
|
|
equal(data, 'ac');
|
|
});
|
|
|
|
test("ready/DOMContentLoaded (domLoaded = true)", function() {
|
|
var evt;
|
|
|
|
eventUtils.bind(window, "ready", function(e) {evt = e;});
|
|
equal(evt.type, "ready");
|
|
});
|
|
|
|
test("ready/DOMContentLoaded (document.readyState check)", function() {
|
|
var evt;
|
|
|
|
try {
|
|
document.readyState = "loading";
|
|
} catch (e) {
|
|
ok(true, "IE doesn't allow us to set document.readyState");
|
|
return;
|
|
}
|
|
|
|
eventUtils.domLoaded = false;
|
|
document.readyState = "loading";
|
|
eventUtils.bind(window, "ready", function(e) {evt = e;});
|
|
ok(typeof(evt) !== "undefined");
|
|
|
|
eventUtils.domLoaded = false;
|
|
document.readyState = "complete";
|
|
eventUtils.bind(window, "ready", function(e) {evt = e;});
|
|
equal(evt.type, "ready");
|
|
});
|