1 { WindowTracker, isBrowserWindow } = require 'window-utils'
5 constructor: (@idFunc, @newFunc) ->
10 @bucket[id] or @bucket[id] = @newFunc obj
14 delete @bucket[id] if id
17 class WindowEventTracker
18 constructor: (events, eventFilter = null) ->
20 handlerFilter = (handler) ->
22 if !eventFilter or eventFilter event
25 addEventListeners = (window) ->
26 for name, handler of events
27 window.addEventListener name, handlerFilter(handler), true
29 removeEventListeners = (window) ->
30 for name, handler of events
31 window.removeEventListener name, handlerFilter(handler), true
33 @windowTracker = new WindowTracker
35 if isBrowserWindow window
36 addEventListeners window
39 if isBrowserWindow window
40 removeEventListeners window
42 start: -> @windowTracker.start()
43 stop: -> @windowTracker.stop()
45 { interfaces: Ci } = Components
47 HTMLInputElement = Ci.nsIDOMHTMLInputElement
48 HTMLTextAreaElement = Ci.nsIDOMHTMLTextAreaElement
49 HTMLSelectElement = Ci.nsIDOMHTMLSelectElement
50 XULDocument = Ci.nsIDOMXULDocument
51 XULElement = Ci.nsIDOMXULElement
52 HTMLDocument = Ci.nsIDOMHTMLDocument
53 HTMLElement = Ci.nsIDOMHTMLElement
54 Window = Ci.nsIDOMWindow
55 ChromeWindow = Ci.nsIDOMChromeWindow
57 isRootWindow = (window) ->
58 window.location == "chrome://browser/content/browser.xul"
60 getEventWindow = (event) ->
61 if event.originalTarget instanceof Window
62 return event.originalTarget
64 doc = event.originalTarget.ownerDocument or event.originalTarget
65 if doc instanceof HTMLDocument or doc instanceof XULDocument
66 return doc.defaultView
68 getEventTabWindow = (event) ->
69 if window = getEventWindow event
70 if isRootWindow window
71 return window.gBrowser.tabs.selectedItem?.contentWindow.wrappedJSObject
75 getEventRootWindow = (event) ->
76 if window = getEventWindow event
77 return getRootWindow window
79 getEventTabBrowser = (event) ->
80 cw.gBrowser if cw = getEventRootWindow event
83 getRootWindow = (window) ->
84 return window.QueryInterface(Ci.nsIInterfaceRequestor)
85 .getInterface(Ci.nsIWebNavigation)
86 .QueryInterface(Ci.nsIDocShellTreeItem)
88 .QueryInterface(Ci.nsIInterfaceRequestor)
89 .getInterface(Window);
91 isElementEditable = (element) ->
92 return element.isContentEditable or \
93 element instanceof HTMLInputElement or \
94 element instanceof HTMLTextAreaElement or \
95 element instanceof HTMLSelectElement
97 getWindowId = (window) ->
98 return window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
99 .getInterface(Components.interfaces.nsIDOMWindowUtils)
103 Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
105 exports.WindowEventTracker = WindowEventTracker
106 exports.Bucket = Bucket
107 exports.isRootWindow = isRootWindow
108 exports.getEventWindow = getEventWindow
109 exports.getEventTabWindow = getEventTabWindow
110 exports.getEventRootWindow = getEventRootWindow
111 exports.getEventTabBrowser = getEventTabBrowser
113 exports.getWindowId = getWindowId
114 exports.getRootWindow = getRootWindow
115 exports.isElementEditable = isElementEditable
116 exports.getSessionStore = getSessionStore