Left: | ||
Right: |
OLD | NEW |
---|---|
1 /* | 1 /* |
2 * This file is part of Adblock Plus <http://adblockplus.org/>, | 2 * This file is part of Adblock Plus <http://adblockplus.org/>, |
3 * Copyright (C) 2006-2013 Eyeo GmbH | 3 * Copyright (C) 2006-2013 Eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
77 | 77 |
78 /* Tabs */ | 78 /* Tabs */ |
79 | 79 |
80 Tab = function(tab) | 80 Tab = function(tab) |
81 { | 81 { |
82 this._tab = tab; | 82 this._tab = tab; |
83 | 83 |
84 this.browserAction = new BrowserAction(this); | 84 this.browserAction = new BrowserAction(this); |
85 | 85 |
86 this.onLoading = new LoadingTabEventTarget(tab); | 86 this.onLoading = new LoadingTabEventTarget(tab); |
87 this.onBeforeNavigate = new TabEventTarget(tab, "beforeNavigate", false); | |
88 this.onCompleted = new TabEventTarget(tab, "navigate", false); | 87 this.onCompleted = new TabEventTarget(tab, "navigate", false); |
89 this.onActivated = new TabEventTarget(tab, "activate", false); | 88 this.onActivated = new TabEventTarget(tab, "activate", false); |
90 this.onRemoved = new TabEventTarget(tab, "close", false); | 89 this.onRemoved = new TabEventTarget(tab, "close", false); |
91 }; | 90 }; |
92 Tab.prototype = { | 91 Tab.prototype = { |
93 get url() | 92 get url() |
94 { | 93 { |
95 return this._tab.url; | 94 return this._tab.url; |
96 }, | 95 }, |
97 close: function() | 96 close: function() |
98 { | 97 { |
99 this._tab.close(); | 98 this._tab.close(); |
100 }, | 99 }, |
101 activate: function() | 100 activate: function() |
102 { | 101 { |
103 this._tab.activate(); | 102 this._tab.activate(); |
104 }, | 103 }, |
105 sendMessage: function(message, responseCallback) | 104 sendMessage: function(message, responseCallback) |
106 { | 105 { |
107 _sendMessage( | 106 _sendMessage( |
108 message, responseCallback, | 107 message, responseCallback, |
109 this._tab.page, this._tab | 108 this._tab.page, this._tab |
110 ); | 109 ); |
111 } | 110 } |
112 }; | 111 }; |
113 | 112 |
114 TabMap = function(deleteTabOnBeforeNavigate) | 113 TabMap = function(deleteTabOnLoading) |
Wladimir Palant
2014/01/23 13:34:13
Having to change a parameter name just because the
Sebastian Noack
2014/01/23 13:51:13
Done.
| |
115 { | 114 { |
116 this._tabs = []; | 115 this._tabs = []; |
Wladimir Palant
2014/01/23 13:34:13
This property is no longer in use.
Sebastian Noack
2014/01/23 13:51:13
Done.
| |
117 this._values = []; | 116 this._data = []; |
118 | 117 |
119 this._deleteOnEvent = this._deleteOnEvent.bind(this); | 118 this.delete = this.delete.bind(this); |
120 this._deleteTabOnBeforeNavigate = deleteTabOnBeforeNavigate; | 119 this._delete = this._delete.bind(this); |
120 | |
121 this._deleteTabOnLoading = deleteTabOnLoading; | |
121 }; | 122 }; |
122 TabMap.prototype = | 123 TabMap.prototype = |
123 { | 124 { |
125 _indexOf: function(tab) | |
126 { | |
127 for (var i = 0; i < this._data.length; i++) | |
128 if (this._data[i].tab._tab == tab._tab) | |
129 return i; | |
130 | |
131 return -1; | |
132 }, | |
133 _delete: function(tab) | |
134 { | |
135 // delay so that other onClosed listeners can still look this tab up | |
136 setTimeout(this.delete.bind(this, tab), 0); | |
137 }, | |
124 get: function(tab) { | 138 get: function(tab) { |
125 var idx; | 139 var idx; |
126 | 140 |
127 if (!tab || (idx = this._tabs.indexOf(tab._tab)) == -1) | 141 if (!tab || (idx = this._indexOf(tab)) == -1) |
128 return null; | 142 return null; |
129 | 143 |
130 return this._values[idx]; | 144 return this._data[idx].value; |
131 }, | 145 }, |
132 set: function(tab, value) | 146 set: function(tab, value) |
133 { | 147 { |
134 var idx = this._tabs.indexOf(tab._tab); | 148 var idx = this._indexOf(tab); |
135 | 149 |
136 if (idx != -1) | 150 if (idx != -1) |
137 this._values[idx] = value; | 151 this._data[idx].value = value; |
138 else | 152 else |
139 { | 153 { |
140 this._tabs.push(tab._tab); | 154 this._data.push({value: value, tab: tab}); |
141 this._values.push(value); | |
142 | 155 |
143 tab._tab.addEventListener("close", this._deleteOnEvent, false); | 156 tab.onRemoved.addListener(this._delete); |
144 if (this._deleteTabOnBeforeNavigate) | 157 if (this._deleteTabOnLoading) |
145 tab._tab.addEventListener("beforeNavigate", this._deleteOnEvent, false ); | 158 tab.onLoading.addListener(this.delete); |
Wladimir Palant
2014/01/23 13:34:13
What if about:blank is loaded into the tab or some
Sebastian Noack
2014/01/23 13:51:13
I've just checked that. And surprisingly our conte
| |
146 } | 159 } |
147 }, | 160 }, |
148 has: function(tab) | 161 has: function(tab) |
149 { | 162 { |
150 return this._tabs.indexOf(tab._tab) != -1; | 163 return this._indexOf(tab) != -1; |
151 }, | 164 }, |
152 clear: function() | 165 clear: function() |
153 { | 166 { |
154 while (this._tabs.length > 0) | 167 while (this._data.length > 0) |
155 this._delete(this._tabs[0]); | 168 this.delete(this._data[0].tab); |
156 }, | |
157 _delete: function(tab) | |
158 { | |
159 var idx = this._tabs.indexOf(tab); | |
160 | |
161 if (idx != -1) | |
162 { | |
163 this._tabs.splice(idx, 1); | |
164 this._values.splice(idx, 1); | |
165 | |
166 tab.removeEventListener("close", this._deleteOnEvent, false); | |
167 tab.removeEventListener("beforeNavigate", this._deleteOnEvent, false); | |
168 } | |
169 }, | |
170 _deleteOnEvent: function(event) | |
171 { | |
172 // delay so that other event handlers can still look this tab up | |
173 setTimeout(this._delete.bind(this, event.target), 0); | |
174 } | 169 } |
175 }; | 170 }; |
176 TabMap.prototype["delete"] = function(tab) | 171 TabMap.prototype["delete"] = function(tab) |
Wladimir Palant
2014/01/23 13:34:13
I am still wondering why this method isn't defined
Sebastian Noack
2014/01/23 13:51:13
It leads to a syntax error, at least in Safari and
Wladimir Palant
2014/01/23 14:44:37
No, for me it doesn't (tested in Safari 7.0 and Ch
Sebastian Noack
2014/01/23 15:27:44
You are right. I tried it in the console, and in t
| |
177 { | 172 { |
178 this._delete(tab._tab); | 173 var idx = this._indexOf(tab); |
174 | |
175 if (idx != -1) | |
176 { | |
177 tab = this._data[idx].tab; | |
178 this._data.splice(idx, 1); | |
179 | |
180 tab.onRemoved.removeListener(this._delete); | |
181 tab.onLoading.removeListener(this.delete); | |
182 } | |
179 }; | 183 }; |
180 | 184 |
181 ext.tabs = { | 185 ext.tabs = { |
182 onLoading: new LoadingTabEventTarget(safari.application), | 186 onLoading: new LoadingTabEventTarget(safari.application), |
183 onBeforeNavigate: new TabEventTarget(safari.application, "beforeNavigate", t rue), | |
184 onCompleted: new TabEventTarget(safari.application, "navigate", true), | 187 onCompleted: new TabEventTarget(safari.application, "navigate", true), |
185 onActivated: new TabEventTarget(safari.application, "activate", true), | 188 onActivated: new TabEventTarget(safari.application, "activate", true), |
186 onRemoved: new TabEventTarget(safari.application, "close", true) | 189 onRemoved: new TabEventTarget(safari.application, "close", true) |
187 }; | 190 }; |
188 | 191 |
189 | 192 |
190 /* Browser actions */ | 193 /* Browser actions */ |
191 | 194 |
192 var toolbarItemProperties = {}; | 195 var toolbarItemProperties = {}; |
193 | 196 |
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
705 for (var i = 0; i < contextMenuItems.length; i++) | 708 for (var i = 0; i < contextMenuItems.length; i++) |
706 { | 709 { |
707 if (contextMenuItems[i].id == event.command) | 710 if (contextMenuItems[i].id == event.command) |
708 { | 711 { |
709 contextMenuItems[i].onclick(event.userInfo.srcUrl, new Tab(safari.applic ation.activeBrowserWindow.activeTab)); | 712 contextMenuItems[i].onclick(event.userInfo.srcUrl, new Tab(safari.applic ation.activeBrowserWindow.activeTab)); |
710 break; | 713 break; |
711 } | 714 } |
712 } | 715 } |
713 }, false); | 716 }, false); |
714 })(); | 717 })(); |
OLD | NEW |