(function(window) { var ORIGIN_ = location.protocol + '//' + location.host; function SlideController() { this.popup = null; this.isPopup = window.opener; if (this.setupDone()) { window.addEventListener('message', this.onMessage_.bind(this), false); // Close popups if we reload the main window. window.addEventListener('beforeunload', function(e) { if (this.popup) { this.popup.close(); } }.bind(this), false); } } SlideController.PRESENTER_MODE_PARAM = 'presentme'; SlideController.prototype.setupDone = function() { var params = location.search.substring(1).split('&').map(function(el) { return el.split('='); }); var presentMe = null; for (var i = 0, param; param = params[i]; ++i) { if (param[0].toLowerCase() == SlideController.PRESENTER_MODE_PARAM) { presentMe = param[1] == 'true'; break; } } if (presentMe !== null) { localStorage.ENABLE_PRESENTOR_MODE = presentMe; // TODO: use window.history.pushState to update URL instead of the redirect. if (window.history.replaceState) { window.history.replaceState({}, '', location.pathname); } else { location.replace(location.pathname); return false; } } var enablePresenterMode = localStorage.getItem('ENABLE_PRESENTOR_MODE'); if (enablePresenterMode && JSON.parse(enablePresenterMode)) { // Only open popup from main deck. Don't want recursive popup opening! if (!this.isPopup) { var opts = 'menubar=no,location=yes,resizable=yes,scrollbars=no,status=no'; this.popup = window.open(location.href, 'mywindow', opts); // Loading in the popup? Trigger the hotkey for turning presenter mode on. this.popup.addEventListener('load', function(e) { var evt = this.popup.document.createEvent('Event'); evt.initEvent('keydown', true, true); evt.keyCode = 'P'.charCodeAt(0); this.popup.document.dispatchEvent(evt); // this.popup.document.body.classList.add('with-notes'); // document.body.classList.add('popup'); }.bind(this), false); } } return true; } SlideController.prototype.onMessage_ = function(e) { var data = e.data; // Restrict messages to being from this origin. Allow local developmet // from file:// though. // TODO: It would be dope if FF implemented location.origin! if (e.origin != ORIGIN_ && ORIGIN_.indexOf('file://') != 0) { alert('Someone tried to postMessage from an unknown origin'); return; } // if (e.source.location.hostname != 'localhost') { // alert('Someone tried to postMessage from an unknown origin'); // return; // } if ('keyCode' in data) { var evt = document.createEvent('Event'); evt.initEvent('keydown', true, true); evt.keyCode = data.keyCode; document.dispatchEvent(evt); } }; SlideController.prototype.sendMsg = function(msg) { // // Send message to popup window. // if (this.popup) { // this.popup.postMessage(msg, ORIGIN_); // } // Send message to main window. if (this.isPopup) { // TODO: It would be dope if FF implemented location.origin. window.opener.postMessage(msg, '*'); } }; window.SlideController = SlideController; })(window);