]> git.gir.st - VimFx.git/blob - packages/utils.coffee
hints are finally showing up on the pages. currently they are displayed for all the...
[VimFx.git] / packages / utils.coffee
1 { WindowTracker, isBrowserWindow } = require 'window-utils'
2
3 { interfaces: Ci, classes: Cc } = Components
4
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)
7
8 class Bucket
9 constructor: (@idFunc, @newFunc) ->
10 @bucket = {}
11
12 get: (obj) ->
13 id = @idFunc obj
14 @bucket[id] or @bucket[id] = @newFunc obj
15
16 forget: (obj) ->
17 id = @idFunc obj
18 delete @bucket[id] if id
19
20
21 class WindowEventTracker
22 constructor: (events, eventFilter = null) ->
23
24 handlerFilter = (handler) ->
25 return (event) ->
26 if !eventFilter or eventFilter event
27 handler event
28
29 addEventListeners = (window) ->
30 for name, handler of events
31 window.addEventListener name, handlerFilter(handler), true
32
33 removeEventListeners = (window) ->
34 for name, handler of events
35 window.removeEventListener name, handlerFilter(handler), true
36
37 @windowTracker = new WindowTracker
38 track: (window) ->
39 if isBrowserWindow window
40 addEventListeners window
41
42 untrack: (window) ->
43 if isBrowserWindow window
44 removeEventListeners window
45
46 start: -> @windowTracker.start()
47 stop: -> @windowTracker.stop()
48
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
58
59 isRootWindow = (window) ->
60 window.location == "chrome://browser/content/browser.xul"
61
62 getEventWindow = (event) ->
63 if event.originalTarget instanceof Window
64 return event.originalTarget
65 else
66 doc = event.originalTarget.ownerDocument or event.originalTarget
67 if doc instanceof HTMLDocument or doc instanceof XULDocument
68 return doc.defaultView
69
70 getEventTabWindow = (event) ->
71 if window = getEventWindow event
72 if isRootWindow window
73 return window.gBrowser.tabs.selectedItem?.contentWindow.wrappedJSObject
74 else
75 return window
76
77 getEventRootWindow = (event) ->
78 if window = getEventWindow event
79 return getRootWindow window
80
81 getEventTabBrowser = (event) ->
82 cw.gBrowser if cw = getEventRootWindow event
83
84
85 getRootWindow = (window) ->
86 return window.QueryInterface(Ci.nsIInterfaceRequestor)
87 .getInterface(Ci.nsIWebNavigation)
88 .QueryInterface(Ci.nsIDocShellTreeItem)
89 .rootTreeItem
90 .QueryInterface(Ci.nsIInterfaceRequestor)
91 .getInterface(Window);
92
93 isElementEditable = (element) ->
94 return element.isContentEditable or \
95 element instanceof HTMLInputElement or \
96 element instanceof HTMLTextAreaElement or \
97 element instanceof HTMLSelectElement
98
99 getWindowId = (window) ->
100 return window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
101 .getInterface(Components.interfaces.nsIDOMWindowUtils)
102 .outerWindowID
103
104 getSessionStore = ->
105 Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
106
107 cssUri = do () ->
108 tools = {}
109 Cu.import "resource://gre/modules/Services.jsm", tools
110 (name) ->
111 baseURI = tools.Services.io.newURI __SCRIPT_URI_SPEC__, null, null
112 uri = tools.Services.io.newURI "resources/#{ name }.css", null, baseURI
113 return uri
114
115 loadCss = (name) ->
116 sss.loadAndRegisterSheet(cssUri(name), sss.USER_SHEET)
117
118 unloadCss = (name) ->
119 uri = cssUri(name)
120 if sss.sheetRegistered(uri, sss.USER_SHEET)
121 sss.unregisterSheet(uri, sss.USER_SHEET)
122
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
130
131 exports.getWindowId = getWindowId
132 exports.getRootWindow = getRootWindow
133 exports.isElementEditable = isElementEditable
134 exports.getSessionStore = getSessionStore
135
136 exports.loadCss = loadCss
137 exports.unloadCss = unloadCss
Imprint / Impressum