From 48dcf959ffb866ecb0025ccbcec3ee22a25c132d Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sun, 3 May 2015 16:23:35 +0100 Subject: [PATCH] Refactor browser unload task handling Make it possible to register multiple task functions that will be called when the window is unloaded --- boot/boot.js | 26 +++++++++++++++++++++++++- core/modules/saver-handler.js | 4 ++-- core/modules/syncer.js | 4 ++-- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index 7161da3bd..bc974c6d5 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -1738,7 +1738,8 @@ $tw.boot.startup = function(options) { languagesEnvVar: "TIDDLYWIKI_LANGUAGE_PATH", editionsEnvVar: "TIDDLYWIKI_EDITION_PATH" }, - log: {} // Log flags + log: {}, // Log flags + unloadTasks: [] }); if(!$tw.boot.tasks.readBrowserTiddlers) { // For writable tiddler files, a hashmap of title to {filepath:,type:,hasMetaFile:} @@ -1797,6 +1798,20 @@ $tw.boot.startup = function(options) { // Install the tiddler deserializer modules $tw.Wiki.tiddlerDeserializerModules = Object.create(null); $tw.modules.applyMethods("tiddlerdeserializer",$tw.Wiki.tiddlerDeserializerModules); + // Call unload handlers in the browser + if($tw.browser) { + window.onbeforeunload = function(event) { + event = event || {}; + var result; + $tw.utils.each($tw.unloadTasks,function(task) { + var r = task(event); + if(r) { + result = r; + } + }); + return result; + } + } // Load tiddlers if($tw.boot.tasks.readBrowserTiddlers) { $tw.loadTiddlersBrowser(); @@ -1833,6 +1848,15 @@ $tw.boot.startup = function(options) { $tw.boot.executeNextStartupTask(); }; +/* +Add another unload task +*/ +$tw.addUnloadTask = function(task) { + if($tw.unloadTasks.indexOf(task) === -1) { + $tw.unloadTasks.push(task); + } +} + /* Execute the remaining eligible startup tasks */ diff --git a/core/modules/saver-handler.js b/core/modules/saver-handler.js index 3344495c7..78e0598a6 100644 --- a/core/modules/saver-handler.js +++ b/core/modules/saver-handler.js @@ -75,14 +75,14 @@ function SaverHandler(options) { } }); // Set up our beforeunload handler - window.onbeforeunload = function(event) { + $tw.addUnloadTask(function(event) { var confirmationMessage; if(self.isDirty()) { confirmationMessage = $tw.language.getString("UnsavedChangesWarning"); event.returnValue = confirmationMessage; // Gecko } return confirmationMessage; - }; + }); } // Install the save action handlers if($tw.browser) { diff --git a/core/modules/syncer.js b/core/modules/syncer.js index 617c54155..223998e1c 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -39,14 +39,14 @@ function Syncer(options) { // Browser event handlers if($tw.browser) { // Set up our beforeunload handler - window.onbeforeunload = function(event) { + $tw.addUnloadTask(function(event) { var confirmationMessage; if(self.isDirty()) { confirmationMessage = $tw.language.getString("UnsavedChangesWarning"); event.returnValue = confirmationMessage; // Gecko } return confirmationMessage; - }; + }); // Listen out for login/logout/refresh events in the browser $tw.rootWidget.addEventListener("tm-login",function() { self.handleLoginEvent();