Skip to content

Commit 5e7cba7

Browse files
committed
feat: new listenToWindowResizeEvent option for html dimensions feature
In polling and mutation implementations, the web script uses window.addEventListener('resize', ...) which could cause infinite loops in some edge cases. You can choose to disable those listeners for those specific implementations via setting `listenToWindowResizeEvent` option to false.
1 parent 949fffb commit 5e7cba7

File tree

3 files changed

+24
-3
lines changed

3 files changed

+24
-3
lines changed

packages/webshell/etc/webshell.api.md

+1
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ export const HandleHTMLDimensionsFeature: FeatureClass<HandleHTMLDimensionsOptio
245245
export interface HandleHTMLDimensionsOptions {
246246
deltaMin?: number;
247247
forceImplementation?: HTMLDimensionsImplementation | false;
248+
listenToWindowResizeEvent?: boolean;
248249
pollingInterval?: number;
249250
}
250251

packages/webshell/src/features/HandleHTMLDimensionsFeature.ts

+15-1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export interface HandleHTMLDimensionsOptions {
4242
* @defaultValue 200
4343
*/
4444
pollingInterval?: number;
45+
4546
/**
4647
* The minimum difference between two updates' dimensions to trigger a change
4748
* event.
@@ -50,6 +51,18 @@ export interface HandleHTMLDimensionsOptions {
5051
* @defaultValue 0
5152
*/
5253
deltaMin?: number;
54+
55+
/**
56+
* Allow or disallow using `window.addEventListener('resize', handler)` to
57+
* complement dimensions extraction.
58+
*
59+
* @remarks
60+
* This option only affects 'polling' and 'resize' implementations.
61+
*
62+
*
63+
* @defaultValue `true`
64+
*/
65+
listenToWindowResizeEvent?: boolean;
5366
}
5467

5568
/**
@@ -82,7 +95,8 @@ export interface HTMLDimensions {
8295
const defaultOptions: Required<HandleHTMLDimensionsOptions> = {
8396
deltaMin: 0,
8497
forceImplementation: false,
85-
pollingInterval: 200
98+
pollingInterval: 200,
99+
listenToWindowResizeEvent: true
86100
};
87101

88102
/**

packages/webshell/src/features/HandleHTMLDimensionsFeature.webjs

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
function HandleHTMLDimensionsFeature(context) {
22
var options = context.options || {};
33
var forceImplementation = options.forceImplementation || false;
4+
var listenToWindowResizeEvent =
5+
options.listenToWindowResizeEvent === false ? false : true;
46
var pollingInterval =
57
typeof options.pollingInterval === 'number' ? options.pollingInterval : 200;
68
var deltaMin = options.deltaMin || 0;
@@ -62,7 +64,9 @@ function HandleHTMLDimensionsFeature(context) {
6264
) {
6365
// mutation mode
6466
var observerPostDimensions = createPostDimensions('mutation');
65-
window.addEventListener('resize', observerPostDimensions);
67+
if (listenToWindowResizeEvent) {
68+
window.addEventListener('resize', observerPostDimensions);
69+
}
6670
var observer = new MutationObserver(observerPostDimensions);
6771
observer.observe(document, {
6872
subtree: true,
@@ -72,7 +76,9 @@ function HandleHTMLDimensionsFeature(context) {
7276
} else {
7377
// polling mode
7478
var pollingPostDimensions = createPostDimensions('polling');
75-
window.addEventListener('resize', pollingPostDimensions);
79+
if (listenToWindowResizeEvent) {
80+
window.addEventListener('resize', pollingPostDimensions);
81+
}
7682
setInterval(pollingPostDimensions, pollingInterval);
7783
pollingPostDimensions();
7884
forceImplementation !== 'polling' &&

0 commit comments

Comments
 (0)