@joryio/web-sdk 1.3.0 → 1.3.1-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +1 -1
- package/dist/core/config.d.ts +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/inapp.d.ts +15 -0
- package/dist/core/inapp.d.ts.map +1 -1
- package/dist/index.d.mts +2 -1
- package/dist/joryio-sw.js +1 -1
- package/dist/joryio.cjs.js +75 -9
- package/dist/joryio.min.js +2 -2
- package/dist/joryio.min.js.map +1 -1
- package/dist/joryio.mjs +75 -9
- package/dist/joryio.umd.js +75 -9
- package/package.json +1 -1
- package/src/core/config.ts +13 -10
- package/src/core/inapp.ts +171 -44
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.3.1 - 2026-10-24
|
|
4
|
+
|
|
5
|
+
Fixed: HTML modals and slide-ups are responsive. The message frame used to start narrow and take the width the content reported, so the author's media queries (for example `@media (max-width: 560px)`) fired even on a desktop screen. The frame is now given min(maxWidth, viewport width - 16px on each side) before the content loads (`maxWidth` comes from the "Max width" field in the dashboard; modal 600 and slide-up 400 when unset), re-fits when the window is resized, and only its height follows the content.
|
|
6
|
+
|
|
7
|
+
Fixed: the height is measured from the message body, so a message can shrink as well as grow (a form replaced by its thank-you line).
|
|
8
|
+
|
|
9
|
+
No API changes. Banner and fullscreen messages are unchanged.
|
|
10
|
+
|
|
3
11
|
## 1.3.0 - 2026-10-06
|
|
4
12
|
|
|
5
13
|
First public release.
|
package/README.md
CHANGED
|
@@ -205,7 +205,7 @@ Messages arrive in one of two shapes:
|
|
|
205
205
|
- **Native** - structured data (headline, body, image, buttons) written into plain DOM elements as text nodes. No iframe, no script execution.
|
|
206
206
|
- **HTML** - author-supplied markup and CSS, shown in a sandboxed iframe.
|
|
207
207
|
|
|
208
|
-
**HTML messages are off by default.** Joryio
|
|
208
|
+
**HTML messages are off by default.** Joryio keeps the markup as written; what stops an author's scripts and event handlers is the frame's Content-Security-Policy, which carries a fresh nonce per message so only the SDK's own bootstrap runs, and blocks network calls and form posts. The iframe can still execute script at your page's origin, so the residual risk is a gap in that policy, such as a browser that does not enforce it. Opting in is a decision for your own team:
|
|
209
209
|
|
|
210
210
|
```javascript
|
|
211
211
|
const joryio = new JoryioSDK({
|
package/dist/core/config.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "1.3.
|
|
1
|
+
export declare const SDK_VERSION = "1.3.1";
|
|
2
2
|
export declare const DEFAULT_API_ENDPOINT = "https://api-eu1.joryio.com/api";
|
|
3
3
|
export declare function normalizeApiEndpoint(raw: string | undefined | null): string;
|
|
4
4
|
export declare const DEFAULT_BATCH_SIZE = 50;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,UAAU,CAAC;AACnC,eAAO,MAAM,oBAAoB,mCAAmC,CAAC;AAarE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAY3E;AACD,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAM3C,eAAO,MAAM,kBAAkB,OAAO,CAAC;AACvC,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAC7C,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAE7C,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAC7C,eAAO,MAAM,uBAAuB,QAAiB,CAAC;AAEtD,MAAM,WAAW,mBAAmB;IAElC,eAAe,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAE9C,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAE7C,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAE3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAWlB,cAAc,CAAC,EAAE,mBAAmB,GAAG,oBAAoB,CAAC;IAO5D,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,cAAc,CAAC,EAAE,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
package/dist/core/inapp.d.ts
CHANGED
|
@@ -38,6 +38,7 @@ export interface InAppCampaign {
|
|
|
38
38
|
html: string;
|
|
39
39
|
css: string;
|
|
40
40
|
assets?: unknown[];
|
|
41
|
+
maxWidth?: number;
|
|
41
42
|
} | {
|
|
42
43
|
kind: 'native';
|
|
43
44
|
title?: string;
|
|
@@ -96,6 +97,13 @@ export interface InAppBridge {
|
|
|
96
97
|
preparePushPermission?: () => void;
|
|
97
98
|
}
|
|
98
99
|
export declare function escapeStyleText(css: string): string;
|
|
100
|
+
export declare const IN_APP_DEFAULT_MAX_WIDTH: {
|
|
101
|
+
readonly modal: 600;
|
|
102
|
+
readonly slideup: 400;
|
|
103
|
+
};
|
|
104
|
+
export declare const IN_APP_VIEWPORT_MARGIN = 16;
|
|
105
|
+
export declare function inAppMaxWidth(campaign: Pick<InAppCampaign, 'type' | 'content'>): number | null;
|
|
106
|
+
export declare function inAppFrameWidth(maxWidth: number, viewportWidth: number, margin?: number): number;
|
|
99
107
|
export declare function scopeCssRules(rules: ArrayLike<unknown>, scope: string): string;
|
|
100
108
|
export declare function normalizedElementId(raw: unknown): string | undefined;
|
|
101
109
|
export declare function cssValue(raw: unknown): string | null;
|
|
@@ -123,6 +131,9 @@ export declare class InAppMessagingManager {
|
|
|
123
131
|
private syncAgainChanges;
|
|
124
132
|
private claimed;
|
|
125
133
|
private iframes;
|
|
134
|
+
private frameMaxWidths;
|
|
135
|
+
private viewportListener?;
|
|
136
|
+
private viewportTimer?;
|
|
126
137
|
private allowHtmlJsInAppMessages;
|
|
127
138
|
private capabilities;
|
|
128
139
|
private callHost;
|
|
@@ -149,6 +160,10 @@ export declare class InAppMessagingManager {
|
|
|
149
160
|
private renderTemplate;
|
|
150
161
|
private undisplayableReason;
|
|
151
162
|
private display;
|
|
163
|
+
private hostViewportWidth;
|
|
164
|
+
private sizeContentFrame;
|
|
165
|
+
private watchViewport;
|
|
166
|
+
private unwatchViewportIfIdle;
|
|
152
167
|
private buildSrcdoc;
|
|
153
168
|
private scopeCss;
|
|
154
169
|
dismiss(campaignId: string, action?: string): Promise<void>;
|
package/dist/core/inapp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inapp.d.ts","sourceRoot":"","sources":["../../src/core/inapp.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAQ/C,MAAM,WAAW,iBAAiB;IAEhC,iBAAiB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC;IACnD,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAE3E,gBAAgB,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC;CACpC;AAMD,MAAM,WAAW,mBAAmB;IAKlC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC;IAExB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,cAAc,CAAC,EAAE,mBAAmB,GAAG,oBAAoB,CAAC;IAE5D,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,mBAAmB,GAAG,oBAAoB,CAAC;IAC3D,YAAY,CAAC,EAAE;QAEb,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC/B,UAAU,EAAE,MAAM,CAAC;QACnB,0BAA0B,CAAC,EAAE,MAAM,CAAC;KACrC,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IAQrB,SAAS,CAAC,EAAE,MAAM,CAAC;IAiBnB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAUhB,OAAO,CAAC,EACJ;
|
|
1
|
+
{"version":3,"file":"inapp.d.ts","sourceRoot":"","sources":["../../src/core/inapp.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -325,7 +325,7 @@ declare class IdentityManager {
|
|
|
325
325
|
isIdentified(): boolean;
|
|
326
326
|
}
|
|
327
327
|
|
|
328
|
-
declare const SDK_VERSION = "1.3.
|
|
328
|
+
declare const SDK_VERSION = "1.3.1";
|
|
329
329
|
interface InAppDisplayOptions {
|
|
330
330
|
defaultPosition?: 'top' | 'center' | 'bottom';
|
|
331
331
|
defaultAnimation?: 'fade' | 'slide' | 'none';
|
|
@@ -403,6 +403,7 @@ interface InAppCampaign {
|
|
|
403
403
|
html: string;
|
|
404
404
|
css: string;
|
|
405
405
|
assets?: unknown[];
|
|
406
|
+
maxWidth?: number;
|
|
406
407
|
} | {
|
|
407
408
|
kind: 'native';
|
|
408
409
|
title?: string;
|
package/dist/joryio-sw.js
CHANGED
package/dist/joryio.cjs.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Joryio Web SDK v1.3.
|
|
2
|
+
* Joryio Web SDK v1.3.1-beta.2
|
|
3
3
|
* (c) 2026 Joryio. All rights reserved.
|
|
4
4
|
* @license Commercial - see https://github.com/joryio/joryio-web-sdk/blob/main/LICENSE
|
|
5
5
|
*/
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
9
9
|
|
|
10
|
-
const SDK_VERSION = '1.3.
|
|
10
|
+
const SDK_VERSION = '1.3.1';
|
|
11
11
|
const DEFAULT_API_ENDPOINT = 'https://api-eu1.joryio.com/api';
|
|
12
12
|
function normalizeApiEndpoint(raw) {
|
|
13
13
|
const trimmed = (raw || '').trim();
|
|
@@ -2265,6 +2265,21 @@ class UTMManager {
|
|
|
2265
2265
|
function escapeStyleText(css) {
|
|
2266
2266
|
return typeof css === 'string' ? css.replace(/<\//g, '<\\/') : '';
|
|
2267
2267
|
}
|
|
2268
|
+
const IN_APP_DEFAULT_MAX_WIDTH = { modal: 600, slideup: 400 };
|
|
2269
|
+
const IN_APP_VIEWPORT_MARGIN = 16;
|
|
2270
|
+
function inAppMaxWidth(campaign) {
|
|
2271
|
+
var _a;
|
|
2272
|
+
if (campaign.type !== 'modal' && campaign.type !== 'slideup')
|
|
2273
|
+
return null;
|
|
2274
|
+
if (((_a = campaign.content) === null || _a === void 0 ? void 0 : _a.kind) !== 'html')
|
|
2275
|
+
return null;
|
|
2276
|
+
const mw = campaign.content.maxWidth;
|
|
2277
|
+
return typeof mw === 'number' && Number.isFinite(mw) && mw > 0 ? Math.floor(mw) : IN_APP_DEFAULT_MAX_WIDTH[campaign.type];
|
|
2278
|
+
}
|
|
2279
|
+
function inAppFrameWidth(maxWidth, viewportWidth, margin = IN_APP_VIEWPORT_MARGIN) {
|
|
2280
|
+
const available = Math.max(0, Math.floor(viewportWidth) - 2 * margin);
|
|
2281
|
+
return Math.max(0, Math.min(Math.floor(maxWidth), available));
|
|
2282
|
+
}
|
|
2268
2283
|
const HOST_BRIDGE_KEY = '__joryioInApp';
|
|
2269
2284
|
const IMPRESSIONS_STORAGE_KEY = 'inapp_impressions';
|
|
2270
2285
|
const MAX_DISPLAYED_MESSAGES = 500;
|
|
@@ -2380,6 +2395,7 @@ class InAppMessagingManager {
|
|
|
2380
2395
|
this.syncAgain = false;
|
|
2381
2396
|
this.claimed = new Set();
|
|
2382
2397
|
this.iframes = new Map();
|
|
2398
|
+
this.frameMaxWidths = new Map();
|
|
2383
2399
|
this.allowHtmlJsInAppMessages = false;
|
|
2384
2400
|
this.bridge = null;
|
|
2385
2401
|
this.auth = null;
|
|
@@ -2499,16 +2515,13 @@ class InAppMessagingManager {
|
|
|
2499
2515
|
this.trackImpression(campaignId, 'clicked').catch(() => { });
|
|
2500
2516
|
return this.submitForm(campaignId, values);
|
|
2501
2517
|
},
|
|
2502
|
-
setSize: (campaignId,
|
|
2518
|
+
setSize: (campaignId, _width, height) => {
|
|
2503
2519
|
var _a;
|
|
2504
2520
|
const iframe = this.iframes.get(campaignId);
|
|
2505
2521
|
if (!iframe || !Number.isFinite(height) || height <= 0)
|
|
2506
2522
|
return;
|
|
2507
2523
|
const type = (_a = this.displayedMessages.get(campaignId)) === null || _a === void 0 ? void 0 : _a.campaign.type;
|
|
2508
2524
|
iframe.style.height = type === 'fullscreen' ? '100%' : `${Math.ceil(height)}px`;
|
|
2509
|
-
if ((type === 'modal' || type === 'slideup') && Number.isFinite(width) && width > 0) {
|
|
2510
|
-
iframe.style.width = `${Math.ceil(width)}px`;
|
|
2511
|
-
}
|
|
2512
2525
|
},
|
|
2513
2526
|
};
|
|
2514
2527
|
}
|
|
@@ -3206,6 +3219,13 @@ class InAppMessagingManager {
|
|
|
3206
3219
|
if (campaign.type === 'banner' || campaign.type === 'fullscreen') {
|
|
3207
3220
|
iframe.style.width = '100%';
|
|
3208
3221
|
}
|
|
3222
|
+
const maxWidth = inAppMaxWidth(campaign);
|
|
3223
|
+
if (maxWidth !== null) {
|
|
3224
|
+
container.style.maxWidth = 'none';
|
|
3225
|
+
this.frameMaxWidths.set(campaign.id, maxWidth);
|
|
3226
|
+
iframe.style.width = `${inAppFrameWidth(maxWidth, this.hostViewportWidth())}px`;
|
|
3227
|
+
this.watchViewport();
|
|
3228
|
+
}
|
|
3209
3229
|
iframe.srcdoc = this.buildSrcdoc(campaign.id, renderedHtml, ((_d = campaign.content) === null || _d === void 0 ? void 0 : _d.kind) === 'html' ? campaign.content.css : '', campaign.type);
|
|
3210
3230
|
container.appendChild(iframe);
|
|
3211
3231
|
this.iframes.set(campaign.id, iframe);
|
|
@@ -3259,13 +3279,53 @@ class InAppMessagingManager {
|
|
|
3259
3279
|
this.callHost('onMessageDisplay', () => { var _a, _b; return (_b = (_a = this.displayOptions).onDisplay) === null || _b === void 0 ? void 0 : _b.call(_a, message); });
|
|
3260
3280
|
this.logger.info(`Displayed campaign: ${campaign.name} (${campaign.id})`);
|
|
3261
3281
|
}
|
|
3282
|
+
hostViewportWidth() {
|
|
3283
|
+
const doc = typeof document !== 'undefined' ? document.documentElement : null;
|
|
3284
|
+
const cw = doc && typeof doc.clientWidth === 'number' ? doc.clientWidth : 0;
|
|
3285
|
+
if (cw > 0)
|
|
3286
|
+
return cw;
|
|
3287
|
+
return typeof window !== 'undefined' && typeof window.innerWidth === 'number' ? window.innerWidth : 0;
|
|
3288
|
+
}
|
|
3289
|
+
sizeContentFrame(campaignId) {
|
|
3290
|
+
const iframe = this.iframes.get(campaignId);
|
|
3291
|
+
const maxWidth = this.frameMaxWidths.get(campaignId);
|
|
3292
|
+
if (!iframe || maxWidth === undefined)
|
|
3293
|
+
return;
|
|
3294
|
+
iframe.style.width = `${inAppFrameWidth(maxWidth, this.hostViewportWidth())}px`;
|
|
3295
|
+
}
|
|
3296
|
+
watchViewport() {
|
|
3297
|
+
if (this.viewportListener || typeof window === 'undefined' || typeof window.addEventListener !== 'function')
|
|
3298
|
+
return;
|
|
3299
|
+
this.viewportListener = () => {
|
|
3300
|
+
if (this.viewportTimer)
|
|
3301
|
+
clearTimeout(this.viewportTimer);
|
|
3302
|
+
this.viewportTimer = setTimeout(() => {
|
|
3303
|
+
this.viewportTimer = undefined;
|
|
3304
|
+
for (const id of this.frameMaxWidths.keys())
|
|
3305
|
+
this.sizeContentFrame(id);
|
|
3306
|
+
}, 100);
|
|
3307
|
+
};
|
|
3308
|
+
window.addEventListener('resize', this.viewportListener);
|
|
3309
|
+
}
|
|
3310
|
+
unwatchViewportIfIdle() {
|
|
3311
|
+
if (this.frameMaxWidths.size > 0 || !this.viewportListener)
|
|
3312
|
+
return;
|
|
3313
|
+
if (typeof window !== 'undefined' && typeof window.removeEventListener === 'function') {
|
|
3314
|
+
window.removeEventListener('resize', this.viewportListener);
|
|
3315
|
+
}
|
|
3316
|
+
this.viewportListener = undefined;
|
|
3317
|
+
if (this.viewportTimer) {
|
|
3318
|
+
clearTimeout(this.viewportTimer);
|
|
3319
|
+
this.viewportTimer = undefined;
|
|
3320
|
+
}
|
|
3321
|
+
}
|
|
3262
3322
|
buildSrcdoc(campaignId, html, css, type) {
|
|
3263
3323
|
const cid = JSON.stringify(campaignId);
|
|
3264
3324
|
const key = JSON.stringify(HOST_BRIDGE_KEY);
|
|
3265
3325
|
const contentSized = type === 'modal' || type === 'slideup';
|
|
3266
|
-
const bodySizing = contentSized ? 'body{display:
|
|
3326
|
+
const bodySizing = contentSized ? 'body{display:flow-root;}' : '';
|
|
3267
3327
|
const bootstrap = `(function(){
|
|
3268
|
-
var CID=${cid},KEY=${key};
|
|
3328
|
+
var CID=${cid},KEY=${key},SIZED=${contentSized ? 'true' : 'false'};
|
|
3269
3329
|
// Per-device visibility: tag the root with the REAL device class from the
|
|
3270
3330
|
// HOST page viewport (the iframe is message-sized, so its own innerWidth is
|
|
3271
3331
|
// useless here). The jr-vp-* → jr-hide-* rules in <style> then hide elements
|
|
@@ -3314,7 +3374,7 @@ class InAppMessagingManager {
|
|
|
3314
3374
|
var p=window.joryioBridge.submitForm(d);if(!p||typeof p.then!=='function'){msg('This form cannot be sent here.',false);f.removeAttribute('data-jry-busy');if(btn)btn.disabled=false;return}
|
|
3315
3375
|
p.then(function(r){if(r&&r.ok){if(r.redirect){window.joryioBridge.navigate(r.redirect,'_top');return}var els2=f.querySelectorAll('input,select,textarea,button');for(var j=0;j<els2.length;j++){els2[j].disabled=true}msg(r.message||'Thank you.',true)}else{msg((r&&(r.message||(r.errors&&r.errors[0])))||'Something went wrong. Please try again.',false);f.removeAttribute('data-jry-busy');if(btn)btn.disabled=false}}).catch(function(){msg('Something went wrong. Please try again.',false);f.removeAttribute('data-jry-busy');if(btn)btn.disabled=false});
|
|
3316
3376
|
},true);
|
|
3317
|
-
function reportSize(){try{var b=document.body,de=document.documentElement;var w=Math.max(b?b.scrollWidth:0,de.scrollWidth);var h=Math.max(b?b.scrollHeight:0,de.scrollHeight);call('setSize',[w,h]);}catch(e){}}
|
|
3377
|
+
function reportSize(){try{var b=document.body,de=document.documentElement;var w=Math.max(b?b.scrollWidth:0,de.scrollWidth);var h=SIZED&&b?Math.ceil(Math.max(b.scrollHeight,b.getBoundingClientRect?b.getBoundingClientRect().height:0)):Math.max(b?b.scrollHeight:0,de.scrollHeight);call('setSize',[w,h]);}catch(e){}}
|
|
3318
3378
|
if(document.readyState!=='loading')reportSize();else document.addEventListener('DOMContentLoaded',reportSize);
|
|
3319
3379
|
window.addEventListener('load',reportSize);
|
|
3320
3380
|
try{if(window.ResizeObserver&&document.body){new ResizeObserver(reportSize).observe(document.body);}}catch(e){}
|
|
@@ -3376,6 +3436,8 @@ class InAppMessagingManager {
|
|
|
3376
3436
|
container.remove();
|
|
3377
3437
|
}
|
|
3378
3438
|
this.iframes.delete(campaignId);
|
|
3439
|
+
this.frameMaxWidths.delete(campaignId);
|
|
3440
|
+
this.unwatchViewportIfIdle();
|
|
3379
3441
|
if (backdrop) {
|
|
3380
3442
|
backdrop.remove();
|
|
3381
3443
|
}
|
|
@@ -3603,6 +3665,8 @@ class InAppMessagingManager {
|
|
|
3603
3665
|
this.displayedMessages.clear();
|
|
3604
3666
|
this.watchedAttributes.clear();
|
|
3605
3667
|
this.iframes.clear();
|
|
3668
|
+
this.frameMaxWidths.clear();
|
|
3669
|
+
this.unwatchViewportIfIdle();
|
|
3606
3670
|
this.logger.info('In-app messaging state cleared');
|
|
3607
3671
|
}
|
|
3608
3672
|
forgetImpressions() {
|
|
@@ -3643,6 +3707,8 @@ class InAppMessagingManager {
|
|
|
3643
3707
|
this.impressionTimestamps.clear();
|
|
3644
3708
|
this.watchedAttributes.clear();
|
|
3645
3709
|
this.iframes.clear();
|
|
3710
|
+
this.frameMaxWidths.clear();
|
|
3711
|
+
this.unwatchViewportIfIdle();
|
|
3646
3712
|
if (typeof window !== 'undefined') {
|
|
3647
3713
|
delete window[HOST_BRIDGE_KEY];
|
|
3648
3714
|
}
|