Skip to content

Commit 04ee7df

Browse files
Merge pull request #2074 from florianlevy/17.2.0
Prevent event listener accumulation
2 parents 37aea4e + 8f5e810 commit 04ee7df

File tree

3 files changed

+66
-8
lines changed

3 files changed

+66
-8
lines changed

.github/workflows/build.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ jobs:
5555
run: ls
5656

5757
- name: Upload Artefact
58-
uses: actions/upload-artifact@v3
58+
uses: actions/upload-artifact@v4
5959
with:
6060
name: angular_auth_oidc_client_artefact
6161
path: dist/angular-auth-oidc-client
@@ -71,7 +71,7 @@ jobs:
7171
node-version: 20
7272

7373
- name: Download Artefact
74-
uses: actions/download-artifact@v3
74+
uses: actions/download-artifact@v4
7575
with:
7676
name: angular_auth_oidc_client_artefact
7777
path: angular-auth-oidc-client-artefact
@@ -111,7 +111,7 @@ jobs:
111111
node-version: 20
112112

113113
- name: Download Artefact
114-
uses: actions/download-artifact@v3
114+
uses: actions/download-artifact@v4
115115
with:
116116
name: angular_auth_oidc_client_artefact
117117
path: angular-auth-oidc-client-artefact
@@ -151,7 +151,7 @@ jobs:
151151
node-version: 20
152152

153153
- name: Download Artefact
154-
uses: actions/download-artifact@v3
154+
uses: actions/download-artifact@v4
155155
with:
156156
name: angular_auth_oidc_client_artefact
157157
path: angular-auth-oidc-client-artefact
@@ -191,7 +191,7 @@ jobs:
191191
node-version: 20
192192

193193
- name: Download Artefact
194-
uses: actions/download-artifact@v3
194+
uses: actions/download-artifact@v4
195195
with:
196196
name: angular_auth_oidc_client_artefact
197197
path: angular-auth-oidc-client-artefact
@@ -235,7 +235,7 @@ jobs:
235235
node-version: 18
236236

237237
- name: Download Artefact
238-
uses: actions/download-artifact@v3
238+
uses: actions/download-artifact@v4
239239
with:
240240
name: angular_auth_oidc_client_artefact
241241
path: angular-auth-oidc-client-artefact

projects/angular-auth-oidc-client/src/lib/iframe/check-session.service.spec.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,60 @@ describe('CheckSessionService', () => {
304304
}));
305305
});
306306

307+
describe('bindMessageEventToIframe', () => {
308+
it('remove event listener when iframeMessageEventListener already exist', () => {
309+
const serviceAsAny = checkSessionService as any;
310+
const defaultView = serviceAsAny.document.defaultView;
311+
const configuration = { configId: 'configId1' };
312+
const existingListener = serviceAsAny.messageHandler.bind(
313+
this,
314+
configuration
315+
);
316+
317+
serviceAsAny.iframeMessageEventListener = existingListener;
318+
319+
const spyRemoveEventListener = spyOn(defaultView, 'removeEventListener');
320+
321+
serviceAsAny.bindMessageEventToIframe(configuration);
322+
323+
expect(spyRemoveEventListener).toHaveBeenCalledOnceWith(
324+
'message',
325+
existingListener,
326+
false
327+
);
328+
});
329+
330+
it('doesn\'t remove event listener when iframeMessageEventListener not exist', () => {
331+
const serviceAsAny = checkSessionService as any;
332+
const defaultView = serviceAsAny.document.defaultView;
333+
334+
serviceAsAny.iframeMessageEventListener = undefined;
335+
336+
const spyRemoveEventListener = spyOn(defaultView, 'removeEventListener');
337+
const configuration = { configId: 'configId1' };
338+
339+
serviceAsAny.bindMessageEventToIframe(configuration);
340+
341+
expect(spyRemoveEventListener).not.toHaveBeenCalled();
342+
});
343+
344+
it('add event listener', () => {
345+
const serviceAsAny = checkSessionService as any;
346+
const defaultView = serviceAsAny.document.defaultView;
347+
348+
const spyAddEventListener = spyOn(defaultView, 'addEventListener');
349+
const configuration = { configId: 'configId1' };
350+
351+
serviceAsAny.bindMessageEventToIframe(configuration);
352+
353+
expect(spyAddEventListener).toHaveBeenCalledOnceWith(
354+
'message',
355+
jasmine.any(Function),
356+
false
357+
);
358+
});
359+
});
360+
307361
describe('isCheckSessionConfigured', () => {
308362
it('returns true if startCheckSession on config is true', () => {
309363
const config = { configId: 'configId1', startCheckSession: true };

projects/angular-auth-oidc-client/src/lib/iframe/check-session.service.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,13 +289,17 @@ export class CheckSessionService implements OnDestroy {
289289
}
290290

291291
private bindMessageEventToIframe(configuration: OpenIdConfiguration): void {
292+
const defaultView = this.document.defaultView;
293+
294+
if (this.iframeMessageEventListener && defaultView) {
295+
defaultView.removeEventListener('message', this.iframeMessageEventListener, false);
296+
}
297+
292298
this.iframeMessageEventListener = this.messageHandler.bind(
293299
this,
294300
configuration
295301
);
296302

297-
const defaultView = this.document.defaultView;
298-
299303
if (defaultView) {
300304
defaultView.addEventListener(
301305
'message',

0 commit comments

Comments
 (0)