Skip to content

Instantly share code, notes, and snippets.

@rossjha
Last active September 2, 2021 14:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rossjha/7df04f749bb36aa239111d1fba512b92 to your computer and use it in GitHub Desktop.
Save rossjha/7df04f749bb36aa239111d1fba512b92 to your computer and use it in GitHub Desktop.
window-message-iframe
import Component from '@ember/component';
export default Component.extend({
// Properties
tagName: 'iframe',
attributeBindings: ['src', 'title'],
classNames: ['w-full', 'h-screen', 'border-none']
});
import Component from '@ember/component';
import { later } from '@ember/runloop';
import { get } from '@ember/object';
import { typeOf } from '@ember/utils';
import { inject as service } from '@ember/service';
export default Component.extend({
// Services
windowMessage: service('window-message'),
// Lifecycle Hooks
init() {
this._super(...arguments);
get(this, 'windowMessage').on('from:clicked-button', function (data) {
console.log('message received (parent),', data);
const messageElement = document.querySelector('.message');
messageElement.innerText = data;
});
},
didInsertElement() {
this._super(...arguments);
const { treatments } = this;
const iframeElement = this.element.querySelector('iframe');
const frameWindow = iframeElement.contentWindow;
later(this, () => {
get(this, 'windowMessage').sendMessage(frameWindow, {
type: 'show-treatments',
response: treatments
}, this.trustedDomain);
}, 100);
}
});
import Controller from '@ember/controller';
import { get, set } from "@ember/object"
import { inject as service } from '@ember/service';
export default Controller.extend({
windowMessage: service(),
init() {
this._super(...arguments);
get(this, 'windowMessage').registerMessageEvent();
set(this, 'treatments', [{
name: 'Treatment One',
code: '123'
}, {
name: 'Treatment Two',
code: '456'
}, {
name: 'Treatment Three',
code: '789'
}]
);
}
});
import Service from '@ember/service';
import { get } from "@ember/object";
import Evented from '@ember/object/evented';
import { typeOf } from '@ember/utils';
import ENV from '../config/environment';
export default Service.extend(Evented, {
// Properties
window,
trustedDomains: ['https://kd183.sse.codesandbox.io'],
// Lifecycle Hooks
willDestroy() {
this._super(...arguments);
this.deregisterMessageEvent();
},
// Methods
registerMessageEvent() {
get(this, 'window').addEventListener('message', this.onMessage.bind(this));
},
deregisterMessageEvent() {
get(this, 'window').removeEventListener('message', this.onMessage.bind(this));
},
onMessage(evt) {
const { data, origin } = evt;
if (!this.isTrustedOrigin(origin)) {
return;
}
const { type, response } = data;
this.trigger(`from:${type}`, response);
},
sendMessage(frameWindow, message, targetOrigin) {
frameWindow.postMessage(message, "*");
},
isTrustedOrigin(origin) {
return get(this, 'trustedDomains').includes(origin);
}
});
<div class="message"></div>
{{#ui-rci
treatments=treatments
trustedDomain="https://kd183.sse.codesandbox.io"
as |rci|
}}
{{rci.iframe title="rci"}}
{{/ui-rci}}
{{yield
(hash
iframe=(component "ui-iframe" src=trustedDomain title=title)
)
}}
{
"version": "0.17.1",
"EmberENV": {
"FEATURES": {},
"_TEMPLATE_ONLY_GLIMMER_COMPONENTS": false,
"_APPLICATION_TEMPLATE_WRAPPER": true,
"_JQUERY_INTEGRATION": true
},
"options": {
"use_pods": false,
"enable-testing": false
},
"dependencies": {
"jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.js",
"ember": "2.18.2",
"ember-template-compiler": "2.18.2",
"ember-testing": "2.18.2"
},
"addons": {
"@glimmer/component": "1.0.0",
"ember-data": "2.18.5"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment