diff --git a/src/canvas/types.ts b/src/canvas/types.ts
index d1798e148..7f9d31623 100644
--- a/src/canvas/types.ts
+++ b/src/canvas/types.ts
@@ -100,6 +100,36 @@ export enum CanvasEvents {
* });
*/
pointer = 'canvas:pointer',
+
+ /**
+ * @event `canvas:frame:load` Frame loaded in canvas.
+ * The event is triggered right after iframe's `onload`.
+ * @example
+ * editor.on('canvas:frame:load', ({ window }) => {
+ * console.log('Frame loaded', window);
+ * });
+ */
+ frameLoad = 'canvas:frame:load',
+
+ /**
+ * @event `canvas:frame:load:head` Frame head loaded in canvas.
+ * The event is triggered right after iframe's finished to load the head elemenets (eg. scripts)
+ * @example
+ * editor.on('canvas:frame:load:head', ({ window }) => {
+ * console.log('Frame head loaded', window);
+ * });
+ */
+ frameLoadHead = 'canvas:frame:load:head',
+
+ /**
+ * @event `canvas:frame:load:body` Frame body loaded in canvas.
+ * The event is triggered when the body is rendered with components.
+ * @example
+ * editor.on('canvas:frame:load:body', ({ window }) => {
+ * console.log('Frame completed the body render', window);
+ * });
+ */
+ frameLoadBody = 'canvas:frame:load:body',
}
/**{END_EVENTS}*/
diff --git a/src/canvas/view/FrameView.ts b/src/canvas/view/FrameView.ts
index 615d54e35..56a15f724 100644
--- a/src/canvas/view/FrameView.ts
+++ b/src/canvas/view/FrameView.ts
@@ -1,6 +1,6 @@
import { bindAll, debounce, isString, isUndefined } from 'underscore';
import { ModuleView } from '../../abstract';
-import { BoxRect } from '../../common';
+import { BoxRect, ObjectAny } from '../../common';
import CssRulesView from '../../css_composer/view/CssRulesView';
import ComponentWrapperView from '../../dom_components/view/ComponentWrapperView';
import Droppable from '../../utils/Droppable';
@@ -18,6 +18,7 @@ import { hasDnd, setViewEl } from '../../utils/mixins';
import Canvas from '../model/Canvas';
import Frame from '../model/Frame';
import FrameWrapView from './FrameWrapView';
+import CanvasEvents from '../types';
export default class FrameView extends ModuleView {
/** @ts-ignore */
@@ -290,14 +291,14 @@ export default class FrameView extends ModuleView {
const { $el, ppfx, em } = this;
$el.attr({ class: `${ppfx}frame` });
this.renderScripts();
- em.trigger('frame:render', this);
+ em.trigger('frame:render', this); // deprecated
return this;
}
renderScripts() {
const { el, model, em } = this;
const evLoad = 'frame:load';
- const evOpts = { el, model, view: this };
+ const evOpts: ObjectAny = { el, model, view: this };
const canvas = this.getCanvasModel();
const appendScript = (scripts: any[]) => {
if (scripts.length > 0) {
@@ -314,8 +315,10 @@ export default class FrameView extends ModuleView {
scriptEl.onerror = scriptEl.onload = appendScript.bind(null, scripts);
}
} else {
+ em?.trigger(CanvasEvents.frameLoadHead, evOpts);
this.renderBody();
- em && em.trigger(evLoad, evOpts);
+ em?.trigger(CanvasEvents.frameLoadBody, evOpts);
+ em?.trigger(evLoad, evOpts); // deprecated
}
};
@@ -327,7 +330,9 @@ export default class FrameView extends ModuleView {
doc.write(frameContent);
doc.close();
}
- em && em.trigger(`${evLoad}:before`, evOpts);
+ evOpts.window = this.getWindow();
+ em?.trigger(`${evLoad}:before`, evOpts); // deprecated
+ em?.trigger(CanvasEvents.frameLoad, evOpts);
appendScript([...canvas.get('scripts')]);
};
}