| (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); |
| |