1 { WindowTracker, isBrowserWindow } = require 'window-utils'
3 { interfaces: Ci, classes: Cc } = Components
5 sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService)
6 ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService)
9 constructor: (@idFunc, @newFunc) ->
14 @bucket[id] or @bucket[id] = @newFunc obj
18 delete @bucket[id] if id
21 class WindowEventTracker
22 constructor: (events, eventFilter = null) ->
24 handlerFilter = (handler) ->
26 if !eventFilter or eventFilter event
29 addEventListeners = (window) ->
30 for name, handler of events
31 window.addEventListener name, handlerFilter(handler), true
33 removeEventListeners = (window) ->
34 for name, handler of events
35 window.removeEventListener name, handlerFilter(handler), true
37 @windowTracker = new WindowTracker
39 if isBrowserWindow window
40 addEventListeners window
43 if isBrowserWindow window
44 removeEventListeners window
46 start: -> @windowTracker.start()
47 stop: -> @windowTracker.stop()
49 HTMLInputElement = Ci.nsIDOMHTMLInputElement
50 HTMLTextAreaElement = Ci.nsIDOMHTMLTextAreaElement
51 HTMLSelectElement = Ci.nsIDOMHTMLSelectElement
52 XULDocument = Ci.nsIDOMXULDocument
53 XULElement = Ci.nsIDOMXULElement
54 HTMLDocument = Ci.nsIDOMHTMLDocument
55 HTMLElement = Ci.nsIDOMHTMLElement
56 Window = Ci.nsIDOMWindow
57 ChromeWindow = Ci.nsIDOMChromeWindow
59 isRootWindow = (window) ->
60 window.location == "chrome://browser/content/browser.xul"
62 getEventWindow = (event) ->
63 if event.originalTarget instanceof Window
64 return event.originalTarget
66 doc = event.originalTarget.ownerDocument or event.originalTarget
67 if doc instanceof HTMLDocument or doc instanceof XULDocument
68 return doc.defaultView
70 getEventTabWindow = (event) ->
71 if window = getEventWindow event
72 if isRootWindow window
73 return window.gBrowser.tabs.selectedItem?.contentWindow.wrappedJSObject
77 getEventRootWindow = (event) ->
78 if window = getEventWindow event
79 return getRootWindow window
81 getEventTabBrowser = (event) ->
82 cw.gBrowser if cw = getEventRootWindow event
85 getRootWindow = (window) ->
86 return window.QueryInterface(Ci.nsIInterfaceRequestor)
87 .getInterface(Ci.nsIWebNavigation)
88 .QueryInterface(Ci.nsIDocShellTreeItem)
90 .QueryInterface(Ci.nsIInterfaceRequestor)
91 .getInterface(Window);
93 isElementEditable = (element) ->
94 return element.isContentEditable or \
95 element instanceof HTMLInputElement or \
96 element instanceof HTMLTextAreaElement or \
97 element instanceof HTMLSelectElement
99 getWindowId = (window) ->
100 return window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
101 .getInterface(Components.interfaces.nsIDOMWindowUtils)
105 Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
109 Cu.import "resource://gre/modules/Services.jsm", tools
111 baseURI = tools.Services.io.newURI __SCRIPT_URI_SPEC__, null, null
112 uri = tools.Services.io.newURI "resources/#{ name }.css", null, baseURI
116 sss.loadAndRegisterSheet(cssUri(name), sss.USER_SHEET)
118 unloadCss = (name) ->
120 if sss.sheetRegistered(uri, sss.USER_SHEET)
121 sss.unregisterSheet(uri, sss.USER_SHEET)
123 exports.WindowEventTracker = WindowEventTracker
124 exports.Bucket = Bucket
125 exports.isRootWindow = isRootWindow
126 exports.getEventWindow = getEventWindow
127 exports.getEventTabWindow = getEventTabWindow
128 exports.getEventRootWindow = getEventRootWindow
129 exports.getEventTabBrowser = getEventTabBrowser
131 exports.getWindowId = getWindowId
132 exports.getRootWindow = getRootWindow
133 exports.isElementEditable = isElementEditable
134 exports.getSessionStore = getSessionStore
136 exports.loadCss = loadCss
137 exports.unloadCss = unloadCss