From 1f2c1ec77488d5493046e825cc191e01d885bdab Mon Sep 17 00:00:00 2001 From: Anton Khodakivskiy Date: Wed, 4 Jul 2012 17:27:25 +0300 Subject: [PATCH] window utils for tracking opened/closed windows --- packages/window-utils.coffee | 55 ++++++++++++++++++++++++++++++++++ tests/test-window-utils.coffee | 20 +++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 packages/window-utils.coffee create mode 100644 tests/test-window-utils.coffee diff --git a/packages/window-utils.coffee b/packages/window-utils.coffee new file mode 100644 index 0000000..af16bf5 --- /dev/null +++ b/packages/window-utils.coffee @@ -0,0 +1,55 @@ +{ classes: Cc, interfaces: Ci, utils: Cu } = Components + +tools = {} +Cu.import "resource://gre/modules/Services.jsm", tools + +ww = tools.Services.ww + +runOnWindowLoad = (callback, window) -> + if window.document.readyState == 'complete' + callback window + else + onLoad = -> + window.removeEventListener 'load', arguments.callee, false + callback(window) + + window.addEventListener 'load', onLoad, false + +applyToWindows = (callback) -> + winEnum = ww.getWindowEnumerator() + while winEnum.hasMoreElements() + window = winEnum.getNext().QueryInterface(Ci.nsIDOMWindow) + runOnWindowLoad callback, window + +isBrowserWindow = (window) -> + return window.document.documentElement.getAttribute("windowtype") == "navigator:browser" + +class WindowObserver + constructor: (@delegate) -> + + observe: (subject, topic, data) -> + window = subject.QueryInterface(Ci.nsIDOMWindow) + switch topic + when 'domwindowopened' + runOnWindowLoad @delegate.track, window + when 'domwindowclosed' + runOnWindowLoad @delegate.untrack, window + +class WindowTracker + + constructor: (@delegate) -> + @observer = new WindowObserver @delegate + + start: -> + applyToWindows @delegate.track + ww.registerNotification @observer + + stop: -> + ww.unregisterNotification @observer + applyToWindows @delegate.untrack + + +exports.runOnWindowLoad = runOnWindowLoad +exports.applyToWindows = applyToWindows +exports.WindowTracker = WindowTracker +exports.isBrowserWindow = isBrowserWindow diff --git a/tests/test-window-utils.coffee b/tests/test-window-utils.coffee new file mode 100644 index 0000000..1366347 --- /dev/null +++ b/tests/test-window-utils.coffee @@ -0,0 +1,20 @@ +{ WindowTracker, isBrowserWindow, applyToWindows } = require '../packages/window-utils' + +setupModule = (module) -> + module.controller = mozmill.getBrowserController() + tabBrowser = new TabbedBrowsingAPI.tabBrowser(controller); + +testWindowTracker = () -> + + controller.open 'http://www.google.com' + + count = 0 + tracker = new WindowTracker + track: (window) -> count += 1 + untrack: (window) -> count += 1 + + tracker.start() + tracker.stop() + + expect.equal count, 2, 'WindowTracker failed' + -- 2.39.3