| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 | /* global $, interfaceConfig */
import VideoLayout from '../videolayout/VideoLayout';
import LargeContainer from '../videolayout/LargeContainer';
import UIEvents from '../../../service/UI/UIEvents';
import Filmstrip from '../videolayout/Filmstrip';
/**
 * Etherpad options.
 */
const options = $.param({
    showControns: true,
    showChat: false,
    showLineNumbers: true,
    useMonospaceFont: false
});
/**
 *
 */
function bubbleIframeMouseMove(iframe) {
    const existingOnMouseMove = iframe.contentWindow.onmousemove;
    iframe.contentWindow.onmousemove = function(e) {
        if (existingOnMouseMove) {
            existingOnMouseMove(e);
        }
        const evt = document.createEvent('MouseEvents');
        const boundingClientRect = iframe.getBoundingClientRect();
        evt.initMouseEvent(
            'mousemove',
            true, // bubbles
            false, // not cancelable
            window,
            e.detail,
            e.screenX,
            e.screenY,
            e.clientX + boundingClientRect.left,
            e.clientY + boundingClientRect.top,
            e.ctrlKey,
            e.altKey,
            e.shiftKey,
            e.metaKey,
            e.button,
            null // no related element
        );
        iframe.dispatchEvent(evt);
    };
}
/**
 * Default Etherpad frame width.
 */
const DEFAULT_WIDTH = 640;
/**
 * Default Etherpad frame height.
 */
const DEFAULT_HEIGHT = 480;
const ETHERPAD_CONTAINER_TYPE = 'etherpad';
/**
 * Container for Etherpad iframe.
 */
class Etherpad extends LargeContainer {
    /**
     * Creates new Etherpad object
     */
    constructor(domain, name) {
        super();
        const iframe = document.createElement('iframe');
        iframe.id = 'etherpadIFrame';
        iframe.src = `${domain + name}?${options}`;
        iframe.frameBorder = 0;
        iframe.scrolling = 'no';
        iframe.width = DEFAULT_WIDTH;
        iframe.height = DEFAULT_HEIGHT;
        iframe.setAttribute('style', 'visibility: hidden;');
        this.container.appendChild(iframe);
        iframe.onload = function() {
            document.domain = document.domain;
            bubbleIframeMouseMove(iframe);
            setTimeout(() => {
                const doc = iframe.contentDocument;
                // the iframes inside of the etherpad are
                // not yet loaded when the etherpad iframe is loaded
                const outer = doc.getElementsByName('ace_outer')[0];
                bubbleIframeMouseMove(outer);
                const inner = doc.getElementsByName('ace_inner')[0];
                bubbleIframeMouseMove(inner);
            }, 2000);
        };
        this.iframe = iframe;
    }
    /**
     *
     */
    get isOpen() {
        return Boolean(this.iframe);
    }
    /**
     *
     */
    get container() {
        return document.getElementById('etherpad');
    }
    /**
     *
     */
    resize(containerWidth, containerHeight) {
        let height, width;
        if (interfaceConfig.VERTICAL_FILMSTRIP) {
            height = containerHeight;
            width = containerWidth - Filmstrip.getFilmstripWidth();
        } else {
            height = containerHeight - Filmstrip.getFilmstripHeight();
            width = containerWidth;
        }
        $(this.iframe)
            .width(width)
            .height(height);
    }
    /**
     *
     */
    show() {
        const $iframe = $(this.iframe);
        const $container = $(this.container);
        const self = this;
        return new Promise(resolve => {
            $iframe.fadeIn(300, () => {
                self.bodyBackground = document.body.style.background;
                document.body.style.background = '#eeeeee';
                $iframe.css({ visibility: 'visible' });
                $container.css({ zIndex: 2 });
                resolve();
            });
        });
    }
    /**
     *
     */
    hide() {
        const $iframe = $(this.iframe);
        const $container = $(this.container);
        document.body.style.background = this.bodyBackground;
        return new Promise(resolve => {
            $iframe.fadeOut(300, () => {
                $iframe.css({ visibility: 'hidden' });
                $container.css({ zIndex: 0 });
                resolve();
            });
        });
    }
    /**
     * @return {boolean} do not switch on dominant speaker event if on stage.
     */
    stayOnStage() {
        return true;
    }
}
/**
 * Manager of the Etherpad frame.
 */
export default class EtherpadManager {
    /**
     *
     */
    constructor(domain, name, eventEmitter) {
        if (!domain || !name) {
            throw new Error('missing domain or name');
        }
        this.domain = domain;
        this.name = name;
        this.eventEmitter = eventEmitter;
        this.etherpad = null;
    }
    /**
     *
     */
    get isOpen() {
        return Boolean(this.etherpad);
    }
    /**
     *
     */
    isVisible() {
        return VideoLayout.isLargeContainerTypeVisible(ETHERPAD_CONTAINER_TYPE);
    }
    /**
     * Create new Etherpad frame.
     */
    openEtherpad() {
        this.etherpad = new Etherpad(this.domain, this.name);
        VideoLayout.addLargeVideoContainer(
            ETHERPAD_CONTAINER_TYPE,
            this.etherpad
        );
    }
    /**
     * Toggle Etherpad frame visibility.
     * Open new Etherpad frame if there is no Etherpad frame yet.
     */
    toggleEtherpad() {
        if (!this.isOpen) {
            this.openEtherpad();
        }
        const isVisible = this.isVisible();
        VideoLayout.showLargeVideoContainer(
            ETHERPAD_CONTAINER_TYPE, !isVisible);
        this.eventEmitter
            .emit(UIEvents.TOGGLED_SHARED_DOCUMENT, !isVisible);
    }
}
 |