]> git.gir.st - VimFx.git/blob - packages/utils.coffee
Merge branch 'hints' into develop
[VimFx.git] / packages / utils.coffee
1 { WindowTracker, isBrowserWindow } = require 'window-utils'
2
3
4 class Bucket
5 constructor: (@idFunc, @newFunc) ->
6 @bucket = {}
7
8 get: (obj) ->
9 id = @idFunc obj
10 @bucket[id] or @bucket[id] = @newFunc obj
11
12 forget: (obj) ->
13 id = @idFunc obj
14 delete @bucket[id] if id
15
16
17 class WindowEventTracker
18 constructor: (events, eventFilter = null) ->
19
20 handlerFilter = (handler) ->
21 return (event) ->
22 if !eventFilter or eventFilter event
23 handler event
24
25 addEventListeners = (window) ->
26 for name, handler of events
27 window.addEventListener name, handlerFilter(handler), true
28
29 removeEventListeners = (window) ->
30 for name, handler of events
31 window.removeEventListener name, handlerFilter(handler), true
32
33 @windowTracker = new WindowTracker
34 track: (window) ->
35 if isBrowserWindow window
36 addEventListeners window
37
38 untrack: (window) ->
39 if isBrowserWindow window
40 removeEventListeners window
41
42 start: -> @windowTracker.start()
43 stop: -> @windowTracker.stop()
44
45 { interfaces: Ci } = Components
46
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
56
57 isRootWindow = (window) ->
58 window.location == "chrome://browser/content/browser.xul"
59
60 getEventWindow = (event) ->
61 if event.originalTarget instanceof Window
62 return event.originalTarget
63 else
64 doc = event.originalTarget.ownerDocument or event.originalTarget
65 if doc instanceof HTMLDocument or doc instanceof XULDocument
66 return doc.defaultView
67
68 getEventTabWindow = (event) ->
69 if window = getEventWindow event
70 if isRootWindow window
71 return window.gBrowser.tabs.selectedItem?.contentWindow.wrappedJSObject
72 else
73 return window
74
75 getEventRootWindow = (event) ->
76 if window = getEventWindow event
77 return getRootWindow window
78
79 getEventTabBrowser = (event) ->
80 cw.gBrowser if cw = getEventRootWindow event
81
82
83 getRootWindow = (window) ->
84 return window.QueryInterface(Ci.nsIInterfaceRequestor)
85 .getInterface(Ci.nsIWebNavigation)
86 .QueryInterface(Ci.nsIDocShellTreeItem)
87 .rootTreeItem
88 .QueryInterface(Ci.nsIInterfaceRequestor)
89 .getInterface(Window);
90
91 isElementEditable = (element) ->
92 return element.isContentEditable or \
93 element instanceof HTMLInputElement or \
94 element instanceof HTMLTextAreaElement or \
95 element instanceof HTMLSelectElement
96
97 getWindowId = (window) ->
98 return window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
99 .getInterface(Components.interfaces.nsIDOMWindowUtils)
100 .outerWindowID
101
102 getSessionStore = ->
103 Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
104
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
112
113 exports.getWindowId = getWindowId
114 exports.getRootWindow = getRootWindow
115 exports.isElementEditable = isElementEditable
116 exports.getSessionStore = getSessionStore
Imprint / Impressum