Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: safari/common.js

Issue 16067002: Added Safari Support (Closed)
Patch Set: Made description for Safari long again. The 100 char limit given by the extension builder doesn't a… Created Oct. 31, 2013, 2:12 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « safari/background.js ('k') | safari/content.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * This file is part of Adblock Plus <http://adblockplus.org/>,
3 * Copyright (C) 2006-2013 Eyeo GmbH
4 *
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
7 * published by the Free Software Foundation.
8 *
9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18 (function() {
19 /* Events */
20
21 WrappedEventTarget = function(target, eventName, capture)
22 {
23 this._listeners = [];
24 this._wrappedListeners = [];
25
26 this._target = target;
27 this._eventName = eventName;
28 this._capture = capture;
29 };
30 WrappedEventTarget.prototype = {
31 addListener: function(listener)
32 {
33 var wrappedListener = this._wrapListener(listener);
34
35 this._listeners.push(listener);
36 this._wrappedListeners.push(wrappedListener);
37
38 this._target.addEventListener(
39 this._eventName,
40 wrappedListener,
41 this._capture
42 );
43 },
44 removeListener: function(listener)
45 {
46 var idx = this._listeners.indexOf(listener);
47
48 if (idx != -1)
49 {
50 this._target.removeEventListener(
51 this._eventName,
52 this._wrappedListeners[idx],
53 this._capture
54 );
55
56 this._listeners.splice(idx, 1);
57 this._wrappedListeners.splice(idx, 1);
58 }
59 }
60 };
61
62
63 MessageEventTarget = function(target)
64 {
65 WrappedEventTarget.call(this, target, "message", false);
66 };
67 MessageEventTarget.prototype = {
68 __proto__: WrappedEventTarget.prototype,
69 _wrapListener: function(listener)
70 {
71 return function(event) {
72 if (event.name.indexOf("request-") != 0)
73 return;
74
75 var sender = {};
76 var dispatcher;
77
78 if (event.target instanceof SafariBrowserTab)
79 {
80 dispatcher = event.target.page;
81 sender.tab = new Tab(event.target);
82 }
83 else
84 {
85 dispatcher = event.target.tab;
86 sender.tab = null;
87 }
88
89 listener(event.message, sender, function(message) {
90 dispatcher.dispatchMessage("response-" + event.name.substr(8), message );
91 });
92 };
93 }
94 };
95
96
97 /* Message passing */
98
99 var requestCounter = 0;
100
101 sendMessage = function(message, responseCallback)
102 {
103 var requestId = ++requestCounter;
104
105 if (responseCallback) {
106 var eventTarget = this._eventTarget;
107 var responseListener = function(event)
108 {
109 if (event.name == "response-" + requestId)
110 {
111 eventTarget.removeEventListener("message", responseListener, false);
112 responseCallback(event.message);
113 }
114 };
115 eventTarget.addEventListener("message", responseListener, false);
116 }
117
118 this._messageDispatcher.dispatchMessage("request-" + requestId, message);
119 };
120
121
122 /* I18n */
123
124 var I18n = function()
125 {
126 this._localeCandidates = this._getLocaleCandidates();
127 this._uiLocale = this._localeCandidates[0];
128 };
129 I18n.prototype = {
130 _getLocaleCandidates: function()
131 {
132 var bits, i, locale;
133 var candidates = [];
134 var default_locale = "en_US";
135
136 for (i = (bits = navigator.language.split("-")).length; i > 0; i--)
137 {
138 locale = bits.slice(0, i).join("_");
139 candidates.push(locale);
140
141 if (locale == default_locale)
142 return candidates;
143 }
144
145 candidates.push(default_locale);
146 return candidates;
147 },
148 _getCatalog: function(locale)
149 {
150 var xhr = new XMLHttpRequest();
151
152 xhr.open("GET", safari.extension.baseURI + "_locales/" + locale + "/messag es.json", false);
153
154 try {
155 xhr.send();
156 }
157 catch (e)
158 {
159 return null;
160 }
161
162 return JSON.parse(xhr.responseText);
163 },
164 getMessage: function(msgId, substitutions)
165 {
166 if (msgId == "@@ui_locale")
167 return this._uiLocale;
168
169 for (var i = 0; i < this._localeCandidates.length; i++)
170 {
171 var catalog = this._getCatalog(this._localeCandidates[i]);
172 if (!catalog)
173 {
174 // if there is no catalog for this locale
175 // candidate, dont"t try to load it again
176 this._localeCandidates.splice(i--, 1);
177 continue;
178 }
179
180 var msg = catalog[msgId];
181 if (!msg)
182 continue;
183
184 var msgstr = msg.message;
185 if (!msgstr)
186 continue;
187
188 for (var placeholder in msg.placeholders)
189 {
190 var placeholderDetails = msg.placeholders[placeholder];
191 if (!placeholderDetails || !placeholderDetails.content)
192 continue;
193 if (placeholderDetails.content.indexOf("$") != 0)
194 continue;
195
196 var placeholderIdx = parseInt(placeholderDetails.content.substr(1));
197 if (isNaN(placeholderIdx) || placeholderIdx < 1)
198 continue;
199
200 var placeholderValue;
201 if (Object.prototype.toString.call(substitutions) == "[object Array]")
202 placeholderValue = substitutions[placeholderIdx - 1];
203 else if (placeholderIdx == 1)
204 placeholderValue = substitutions;
205
206 msgstr = msgstr.replace("$" + placeholder + "$", placeholderValue || " ");
207 }
208
209 return msgstr;
210 }
211
212 return "";
213 }
214 };
215
216
217 /* API */
218
219 ext = {
220 getURL: function(path)
221 {
222 return safari.extension.baseURI + path;
223 },
224 i18n: new I18n()
225 };
226 })();
OLDNEW
« no previous file with comments | « safari/background.js ('k') | safari/content.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld