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