From 7866f9b2de5ad06f2d68829b906d4c2cb0a910cd Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 2 May 2015 17:22:23 +0100 Subject: [PATCH 1/2] Typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Typically for JavaScript, initialising an object as an array doesn’t break anything because an array is an object. Anyhow, it should be an object in this case. --- core/modules/wiki.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/wiki.js b/core/modules/wiki.js index bb42d5f8a..2eef93464 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -137,7 +137,7 @@ exports.enqueueTiddlerEvent = function(title,isDeleted) { this.changeCount[title] = 1; } // Trigger events - this.eventListeners = this.eventListeners || []; + this.eventListeners = this.eventListeners || {}; if(!this.eventsTriggered) { var self = this; $tw.utils.nextTick(function() { From 8708f817fa01e2380526aa7edbfb434a6b592a1c Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 2 May 2015 17:22:53 +0100 Subject: [PATCH 2/2] Improve garbage collection of external windows Now we remove event listeners when a window is closed --- core/modules/startup/windows.js | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/core/modules/startup/windows.js b/core/modules/startup/windows.js index cb4c755f5..75fd5a338 100644 --- a/core/modules/startup/windows.js +++ b/core/modules/startup/windows.js @@ -21,7 +21,8 @@ exports.synchronous = true; exports.startup = function() { $tw.rootWidget.addEventListener("tm-open-window",function(event) { // Get the parameters - var title = event.param || event.tiddlerTitle, + var refreshHandler, + title = event.param || event.tiddlerTitle, paramObject = event.paramObject || {}, template = paramObject.template || "$:/core/ui/ViewTemplate/body", width = paramObject.width || "700", @@ -29,14 +30,16 @@ exports.startup = function() { // Open the window var srcWindow = window.open("","external-" + title,"width=" + width + ",height=" + height), srcDocument = srcWindow.document; - srcWindow.onclose = function(event) { - console.log("closing popup"); - }; - srcWindow.addEventListener("close",function(event) { - console.log("closing2 popup"); - },false); + // Check for reopening the same window + if(srcWindow.haveInitialisedWindow) { + return; + } + // Initialise the document srcDocument.write(""); srcDocument.close(); + srcWindow.addEventListener("beforeunload",function(event) { + $tw.wiki.removeEventListener("change",refreshHandler); + },false); // Set up the styles var styleWidgetNode = $tw.wiki.makeTranscludeWidget("$:/core/ui/PageStylesheet",{document: $tw.fakeDocument}), styleContainer = $tw.fakeDocument.createElement("style"); @@ -44,19 +47,19 @@ exports.startup = function() { var styleElement = srcDocument.createElement("style"); styleElement.innerHTML = styleContainer.textContent; srcDocument.head.insertBefore(styleElement,srcDocument.head.firstChild); - $tw.wiki.addEventListener("change",function(changes) { - if(styleWidgetNode.refresh(changes,styleContainer,null)) { - styleElement.innerHTML = styleContainer.textContent; - } - }); // Render the text of the tiddler var parser = $tw.wiki.parseTiddler(template), widgetNode = $tw.wiki.makeWidget(parser,{document: srcDocument, variables: {currentTiddler: title}}); widgetNode.render(srcDocument.body,null); - $tw.wiki.addEventListener("change",function(changes) { + // Function to handle refreshes + refreshHandler = function(changes) { + if(styleWidgetNode.refresh(changes,styleContainer,null)) { + styleElement.innerHTML = styleContainer.textContent; + } widgetNode.refresh(changes); - }); - + }; + $tw.wiki.addEventListener("change",refreshHandler); + srcWindow.haveInitialisedWindow = true; }); };