1 { WindowTracker, isBrowserWindow } = require 'window-utils'
3 class WindowEventTracker
4 constructor: (events, eventFilter = null) ->
6 handlerFilter = (handler) ->
8 if !eventFilter or eventFilter event
11 addEventListeners = (window) ->
12 for name, handler of events
13 window.addEventListener name, handlerFilter(handler), true
15 removeEventListeners = (window) ->
16 for name, handler of events
17 window.removeEventListener name, handlerFilter(handler), true
19 @windowTracker = new WindowTracker
21 if isBrowserWindow window
22 addEventListeners window
25 if isBrowserWindow window
26 removeEventListeners window
28 start: -> @windowTracker.start()
29 stop: -> @windowTracker.stop()
31 { interfaces: Ci } = Components
33 HTMLInputElement = Ci.nsIDOMHTMLInputElement
34 HTMLTextAreaElement = Ci.nsIDOMHTMLTextAreaElement
35 HTMLSelectElement = Ci.nsIDOMHTMLSelectElement
36 XULDocument = Ci.nsIDOMXULDocument
37 XULElement = Ci.nsIDOMXULElement
38 HTMLDocument = Ci.nsIDOMHTMLDocument
39 HTMLElement = Ci.nsIDOMHTMLElement
40 Window = Ci.nsIDOMWindow
41 ChromeWindow = Ci.nsIDOMChromeWindow
43 isRootWindow = (window) ->
44 window.location == "chrome://browser/content/browser.xul"
46 getEventWindow = (event) ->
47 if event.originalTarget instanceof Window
48 return event.originalTarget
50 doc = event.originalTarget.ownerDocument or event.originalTarget
51 if doc instanceof HTMLDocument or doc instanceof XULDocument
52 return doc.defaultView
54 getEventTabWindow = (event) ->
55 if window = getEventWindow event
56 if isRootWindow window
57 return window.gBrowser.tabs.selectedItem?.contentWindow.wrappedJSObject
61 getEventRootWindow = (event) ->
62 if window = getEventWindow event
63 return getRootWindow window
65 getEventTabBrowser = (event) ->
66 cw.gBrowser if cw = getEventRootWindow event
69 getRootWindow = (window) ->
70 return window.QueryInterface(Ci.nsIInterfaceRequestor)
71 .getInterface(Ci.nsIWebNavigation)
72 .QueryInterface(Ci.nsIDocShellTreeItem)
74 .QueryInterface(Ci.nsIInterfaceRequestor)
75 .getInterface(Window);
77 isElementEditable = (element) ->
78 return element.isContentEditable or \
79 element instanceof HTMLInputElement or \
80 element instanceof HTMLTextAreaElement or \
81 element instanceof HTMLSelectElement
83 getWindowId = (window) ->
84 return window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
85 .getInterface(Components.interfaces.nsIDOMWindowUtils)
89 Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
91 exports.WindowEventTracker = WindowEventTracker
92 exports.isRootWindow = isRootWindow
93 exports.getEventWindow = getEventWindow
94 exports.getEventTabWindow = getEventTabWindow
95 exports.getEventRootWindow = getEventRootWindow
96 exports.getEventTabBrowser = getEventTabBrowser
98 exports.getWindowId = getWindowId
99 exports.getRootWindow = getRootWindow
100 exports.isElementEditable = isElementEditable
101 exports.getSessionStore = getSessionStore