| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 | 
							- /* global $, APP, interfaceConfig */
 - 
 - import { setDocumentEditingState } from '../../../react/features/etherpad';
 - import { getToolboxHeight } from '../../../react/features/toolbox';
 - 
 - 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({
 -     showControls: 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() {
 -             // eslint-disable-next-line no-self-assign
 -             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 - getToolboxHeight();
 -             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 });
 - 
 -                 APP.store.dispatch(setDocumentEditingState(true));
 - 
 -                 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 });
 - 
 -                 APP.store.dispatch(setDocumentEditingState(false));
 - 
 -                 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);
 - 
 -         APP.store.dispatch(setDocumentEditingState(!isVisible));
 -     }
 - }
 
 
  |