Skip to content

Commit 8b00e12

Browse files
authored
Merge pull request #114 from keithjgrant/patch-1
handle object type listeners
2 parents a404473 + f911433 commit 8b00e12

File tree

2 files changed

+57
-15
lines changed

2 files changed

+57
-15
lines changed

code-input.js

+13-7
Original file line numberDiff line numberDiff line change
@@ -864,26 +864,32 @@ var codeInput = {
864864
*/
865865
addEventListener(type, listener, options = undefined) {
866866
// Save a copy of the callback where `this` refers to the code-input element.
867-
// This callback is modified to only run when the handleEventsFromTextarea is set.
868-
let boundCallback = function(evt) { listener(evt); }.bind(this);
867+
let boundCallback = function (evt) {
868+
if (typeof listener === 'function') {
869+
listener(evt);
870+
} else if (listener && listener.handleEvent) {
871+
listener.handleEvent(evt);
872+
}
873+
}.bind(this);
869874
this.boundEventCallbacks[listener] = boundCallback;
870875

871876
if (codeInput.textareaSyncEvents.includes(type)) {
872877
// Synchronise with textarea, only when handleEventsFromTextarea is true
873-
let boundCallback = function(evt) { if(this.handleEventsFromTextarea) listener(evt); }.bind(this);
874-
this.boundEventCallbacks[listener] = boundCallback;
878+
// This callback is modified to only run when the handleEventsFromTextarea is set.
879+
let conditionalBoundCallback = function(evt) { if(this.handleEventsFromTextarea) boundCallback(evt); }.bind(this);
880+
this.boundEventCallbacks[listener] = conditionalBoundCallback;
875881

876882
if (options === undefined) {
877883
if(this.textareaElement == null) {
878884
this.addEventListener("code-input_load", () => { this.textareaElement.addEventListener(type, boundCallback); });
879885
} else {
880-
this.textareaElement.addEventListener(type, boundCallback);
886+
this.textareaElement.addEventListener(type, conditionalBoundCallback);
881887
}
882888
} else {
883889
if(this.textareaElement == null) {
884890
this.addEventListener("code-input_load", () => { this.textareaElement.addEventListener(type, boundCallback, options); });
885891
} else {
886-
this.textareaElement.addEventListener(type, boundCallback, options);
892+
this.textareaElement.addEventListener(type, conditionalBoundCallback, options);
887893
}
888894
}
889895
} else {
@@ -1041,4 +1047,4 @@ var codeInput = {
10411047
}
10421048
}
10431049

1044-
customElements.define("code-input", codeInput.CodeInput);
1050+
customElements.define("code-input", codeInput.CodeInput);

tests/tester.js

+44-8
Original file line numberDiff line numberDiff line change
@@ -210,17 +210,21 @@ console.log("I've got another line!", 2 < 3, "should be true.");`);
210210
console.log("I've got another line!", 2 &lt; 3, "should be true.");
211211
`); // Extra newline so line numbers visible if enabled
212212

213-
// Event Tests
213+
// Event Listener Tests
214+
// Function type listeners
214215
let numTimesInputCalled = 0;
215216
let numTimesChangeCalled = 0;
216-
codeInputElement.addEventListener("input", (evt) => {
217+
218+
let inputListener = (evt) => {
217219
if(!evt.isTrusted) { // To prevent duplicate calling due to allowInputEvents hack
218220
numTimesInputCalled++;
219221
}
220-
});
221-
codeInputElement.addEventListener("change", () => {
222+
};
223+
codeInputElement.addEventListener("input", inputListener);
224+
let changeListener = () => {
222225
numTimesChangeCalled++;
223-
});
226+
};
227+
codeInputElement.addEventListener("change", changeListener);
224228

225229
let inputDeletedListenerCalled = false;
226230
let deletedListener = () => {
@@ -235,9 +239,41 @@ console.log("I've got another line!", 2 &lt; 3, "should be true.");
235239
textarea.blur(); // Unfocus textarea - calls change event
236240
textarea.focus();
237241

238-
assertEqual("Core", "Input Event Listener Called Right Number of Times", numTimesInputCalled, 6);
239-
assertEqual("Core", "Change Event Listener Called Right Number of Times", numTimesChangeCalled, 1);
240-
testAssertion("Core", "Input Event Removed Listener Not Called", !inputDeletedListenerCalled, "(code-input element).removeEventListener did not work.");
242+
assertEqual("Core", "Function Event Listeners: Input Called Right Number of Times", numTimesInputCalled, 6);
243+
assertEqual("Core", "Function Event Listeners: Change Called Right Number of Times", numTimesChangeCalled, 1);
244+
testAssertion("Core", "Function Event Listeners: Input Removed Listener Not Called", !inputDeletedListenerCalled, "(code-input element).removeEventListener did not work.");
245+
246+
codeInputElement.removeEventListener("input", inputListener);
247+
codeInputElement.removeEventListener("change", changeListener);
248+
249+
// Repeat for Object type listeners
250+
numTimesInputCalled = 0;
251+
numTimesChangeCalled = 0;
252+
codeInputElement.addEventListener("input", {handleEvent: (evt) => {
253+
if(!evt.isTrusted) { // To prevent duplicate calling due to allowInputEvents hack
254+
numTimesInputCalled++;
255+
}
256+
}});
257+
codeInputElement.addEventListener("change", {handleEvent: () => {
258+
numTimesChangeCalled++;
259+
}});
260+
261+
inputDeletedListenerCalled = false;
262+
deletedListener = {handleEvent: () => {
263+
inputDeletedListenerCalled = true;
264+
}};
265+
codeInputElement.addEventListener("input", deletedListener);
266+
codeInputElement.removeEventListener("input", deletedListener);
267+
268+
// Make listeners be called
269+
textarea.focus(); // Focus textarea
270+
addText(textarea, " // Hi");
271+
textarea.blur(); // Unfocus textarea - calls change event
272+
textarea.focus();
273+
274+
assertEqual("Core", "Object Event Listeners: Input Called Right Number of Times", numTimesInputCalled, 6);
275+
assertEqual("Core", "Object Event Listeners: Change Called Right Number of Times", numTimesChangeCalled, 1);
276+
testAssertion("Core", "Object Event Listeners: Input Removed Listener Not Called", !inputDeletedListenerCalled, "(code-input element).removeEventListener did not work.");
241277

242278
// Changing language should be correct
243279
if(!isHLJS) {

0 commit comments

Comments
 (0)