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

Side by Side Diff: options.js

Issue 29371763: Issue 4795 - Use modern JavaScript syntax (Closed)
Patch Set: Addressed some more feedback Created Jan. 18, 2017, 11:44 a.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 | « notification.js ('k') | popup.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * This file is part of Adblock Plus <https://adblockplus.org/>, 2 * This file is part of Adblock Plus <https://adblockplus.org/>,
3 * Copyright (C) 2006-2016 Eyeo GmbH 3 * Copyright (C) 2006-2016 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 14 matching lines...) Expand all
25 * returned function will take the corresponding 25 * returned function will take the corresponding
26 * values as arguments. 26 * values as arguments.
27 * @return The generated messaging function, optionally taking any values as 27 * @return The generated messaging function, optionally taking any values as
28 * specified by the paramKeys and finally an optional callback. 28 * specified by the paramKeys and finally an optional callback.
29 * (Although the value arguments are optional their index must be 29 * (Although the value arguments are optional their index must be
30 * maintained. E.g. if you omit the first value you must omit the 30 * maintained. E.g. if you omit the first value you must omit the
31 * second too.) 31 * second too.)
32 */ 32 */
33 function wrapper(baseMessage /* , [paramKeys] */) 33 function wrapper(baseMessage /* , [paramKeys] */)
34 { 34 {
35 var paramKeys = []; 35 let paramKeys = [];
36 for (var i = 1; i < arguments.length; i++) 36 for (let i = 1; i < arguments.length; i++)
37 paramKeys.push(arguments[i]); 37 paramKeys.push(arguments[i]);
38 38
39 return function(/* [paramValues], callback */) 39 return function(/* [paramValues], callback */)
40 { 40 {
41 var message = Object.create(null); 41 let message = Object.create(null);
42 for (var key in baseMessage) 42 for (let key in baseMessage)
43 if (baseMessage.hasOwnProperty(key)) 43 if (baseMessage.hasOwnProperty(key))
44 message[key] = baseMessage[key]; 44 message[key] = baseMessage[key];
45 45
46 var paramValues = []; 46 let paramValues = [];
47 var callback; 47 let callback;
48 48
49 if (arguments.length > 0) 49 if (arguments.length > 0)
50 { 50 {
51 var lastArg = arguments[arguments.length - 1]; 51 let lastArg = arguments[arguments.length - 1];
52 if (typeof lastArg == "function") 52 if (typeof lastArg == "function")
53 callback = lastArg; 53 callback = lastArg;
54 54
55 for (var i = 0; i < arguments.length - (callback ? 1 : 0); i++) 55 for (let i = 0; i < arguments.length - (callback ? 1 : 0); i++)
56 message[paramKeys[i]] = arguments[i]; 56 message[paramKeys[i]] = arguments[i];
57 } 57 }
58 58
59 ext.backgroundPage.sendMessage(message, callback); 59 ext.backgroundPage.sendMessage(message, callback);
60 }; 60 };
61 } 61 }
62 62
63 var getDocLink = wrapper({type: "app.get", what: "doclink"}, "link"); 63 const getDocLink = wrapper({type: "app.get", what: "doclink"}, "link");
64 var getInfo = wrapper({type: "app.get"}, "what"); 64 const getInfo = wrapper({type: "app.get"}, "what");
65 var getPref = wrapper({type: "prefs.get"}, "key"); 65 const getPref = wrapper({type: "prefs.get"}, "key");
66 var togglePref = wrapper({type: "prefs.toggle"}, "key"); 66 const togglePref = wrapper({type: "prefs.toggle"}, "key");
67 var getSubscriptions = wrapper({type: "subscriptions.get"}, 67 const getSubscriptions = wrapper({type: "subscriptions.get"},
68 "downloadable", "special"); 68 "downloadable", "special");
69 var removeSubscription = wrapper({type: "subscriptions.remove"}, "url"); 69 const removeSubscription = wrapper({type: "subscriptions.remove"}, "url");
70 var addSubscription = wrapper({type: "subscriptions.add"}, 70 const addSubscription = wrapper({type: "subscriptions.add"},
71 "url", "title", "homepage"); 71 "url", "title", "homepage");
72 var toggleSubscription = wrapper({type: "subscriptions.toggle"}, 72 const toggleSubscription = wrapper({type: "subscriptions.toggle"},
73 "url", "keepInstalled"); 73 "url", "keepInstalled");
74 var updateSubscription = wrapper({type: "subscriptions.update"}, "url"); 74 const updateSubscription = wrapper({type: "subscriptions.update"}, "url");
75 var importRawFilters = wrapper({type: "filters.importRaw"}, 75 const importRawFilters = wrapper({type: "filters.importRaw"},
76 "text", "removeExisting"); 76 "text", "removeExisting");
77 var addFilter = wrapper({type: "filters.add"}, "text"); 77 const addFilter = wrapper({type: "filters.add"}, "text");
78 var getFilters = wrapper({type: "filters.get"}, "subscriptionUrl"); 78 const getFilters = wrapper({type: "filters.get"}, "subscriptionUrl");
79 var removeFilter = wrapper({type: "filters.remove"}, "text"); 79 const removeFilter = wrapper({type: "filters.remove"}, "text");
80 80
81 var i18n = ext.i18n; 81 const whitelistedDomainRegexp = /^@@\|\|([^\/:]+)\^\$document$/;
82 var whitelistedDomainRegexp = /^@@\|\|([^\/:]+)\^\$document$/; 82 let delayedSubscriptionSelection = null;
83 var delayedSubscriptionSelection = null;
84 83
85 var acceptableAdsUrl; 84 let acceptableAdsUrl;
86 85
87 // Loads options from localStorage and sets UI elements accordingly 86 // Loads options from localStorage and sets UI elements accordingly
88 function loadOptions() 87 function loadOptions()
89 { 88 {
90 // Set page title to i18n version of "Adblock Plus Options" 89 // Set page title to i18n version of "Adblock Plus Options"
91 document.title = i18n.getMessage("options"); 90 document.title = i18n.getMessage("options");
92 91
93 // Set links 92 // Set links
94 getPref("subscriptions_exceptionsurl", function(url) 93 getPref("subscriptions_exceptionsurl", url =>
95 { 94 {
96 acceptableAdsUrl = url; 95 acceptableAdsUrl = url;
97 $("#acceptableAdsLink").attr("href", acceptableAdsUrl); 96 $("#acceptableAdsLink").attr("href", acceptableAdsUrl);
98 }); 97 });
99 getDocLink("acceptable_ads", function(url) 98 getDocLink("acceptable_ads", url =>
100 { 99 {
101 $("#acceptableAdsDocs").attr("href", url); 100 $("#acceptableAdsDocs").attr("href", url);
102 }); 101 });
103 getDocLink("filterdoc", function(url) 102 getDocLink("filterdoc", url =>
104 { 103 {
105 setLinks("filter-must-follow-syntax", url); 104 setLinks("filter-must-follow-syntax", url);
106 }); 105 });
107 getInfo("application", function(application) 106 getInfo("application", application =>
108 { 107 {
109 getInfo("platform", function(platform) 108 getInfo("platform", platform =>
110 { 109 {
111 if (platform == "chromium" && application != "opera") 110 if (platform == "chromium" && application != "opera")
112 application = "chrome"; 111 application = "chrome";
113 112
114 getDocLink(application + "_support", function(url) 113 getDocLink(application + "_support", url =>
115 { 114 {
116 setLinks("found-a-bug", url); 115 setLinks("found-a-bug", url);
117 }); 116 });
118 }); 117 });
119 }); 118 });
120 119
121 // Add event listeners 120 // Add event listeners
122 $("#updateFilterLists").click(updateFilterLists); 121 $("#updateFilterLists").click(updateFilterLists);
123 $("#startSubscriptionSelection").click(startSubscriptionSelection); 122 $("#startSubscriptionSelection").click(startSubscriptionSelection);
124 $("#subscriptionSelector").change(updateSubscriptionSelection); 123 $("#subscriptionSelector").change(updateSubscriptionSelection);
(...skipping 11 matching lines...) Expand all
136 $("button").button(); 135 $("button").button();
137 $(".refreshButton").button("option", "icons", {primary: "ui-icon-refresh"}); 136 $(".refreshButton").button("option", "icons", {primary: "ui-icon-refresh"});
138 $(".addButton").button("option", "icons", {primary: "ui-icon-plus"}); 137 $(".addButton").button("option", "icons", {primary: "ui-icon-plus"});
139 $(".removeButton").button("option", "icons", {primary: "ui-icon-minus"}); 138 $(".removeButton").button("option", "icons", {primary: "ui-icon-minus"});
140 139
141 // Popuplate option checkboxes 140 // Popuplate option checkboxes
142 initCheckbox("shouldShowBlockElementMenu"); 141 initCheckbox("shouldShowBlockElementMenu");
143 initCheckbox("show_devtools_panel"); 142 initCheckbox("show_devtools_panel");
144 initCheckbox("shouldShowNotifications", "notifications_ignoredcategories"); 143 initCheckbox("shouldShowNotifications", "notifications_ignoredcategories");
145 144
146 getInfo("features", function(features) 145 getInfo("features", features =>
147 { 146 {
148 if (!features.devToolsPanel) 147 if (!features.devToolsPanel)
149 document.getElementById("showDevtoolsPanelContainer").hidden = true; 148 document.getElementById("showDevtoolsPanelContainer").hidden = true;
150 }); 149 });
151 getPref("notifications_showui", function(notifications_showui) 150 getPref("notifications_showui", notifications_showui =>
152 { 151 {
153 if (!notifications_showui) 152 if (!notifications_showui)
154 document.getElementById("shouldShowNotificationsContainer").hidden = true; 153 document.getElementById("shouldShowNotificationsContainer").hidden = true;
155 }); 154 });
156 155
157 // Register listeners in the background message responder 156 // Register listeners in the background message responder
158 ext.backgroundPage.sendMessage({ 157 ext.backgroundPage.sendMessage({
159 type: "app.listen", 158 type: "app.listen",
160 filter: ["addSubscription", "focusSection"] 159 filter: ["addSubscription", "focusSection"]
161 }); 160 });
(...skipping 18 matching lines...) Expand all
180 // Load recommended subscriptions 179 // Load recommended subscriptions
181 loadRecommendations(); 180 loadRecommendations();
182 181
183 // Show user's filters 182 // Show user's filters
184 reloadFilters(); 183 reloadFilters();
185 } 184 }
186 $(loadOptions); 185 $(loadOptions);
187 186
188 function convertSpecialSubscription(subscription) 187 function convertSpecialSubscription(subscription)
189 { 188 {
190 getFilters(subscription.url, function(filters) 189 getFilters(subscription.url, filters =>
191 { 190 {
192 for (var j = 0; j < filters.length; j++) 191 for (let filter of filters)
193 { 192 {
194 var filter = filters[j].text; 193 if (whitelistedDomainRegexp.test(filter.text))
195 if (whitelistedDomainRegexp.test(filter))
196 appendToListBox("excludedDomainsBox", RegExp.$1); 194 appendToListBox("excludedDomainsBox", RegExp.$1);
197 else 195 else
198 appendToListBox("userFiltersBox", filter); 196 appendToListBox("userFiltersBox", filter.text);
199 } 197 }
200 }); 198 });
201 } 199 }
202 200
203 // Reloads the displayed subscriptions and filters 201 // Reloads the displayed subscriptions and filters
204 function reloadFilters() 202 function reloadFilters()
205 { 203 {
206 // Load user filter URLs 204 // Load user filter URLs
207 var container = document.getElementById("filterLists"); 205 let container = document.getElementById("filterLists");
208 while (container.lastChild) 206 while (container.lastChild)
209 container.removeChild(container.lastChild); 207 container.removeChild(container.lastChild);
210 208
211 getSubscriptions(true, false, function(subscriptions) 209 getSubscriptions(true, false, subscriptions =>
212 { 210 {
213 for (var i = 0; i < subscriptions.length; i++) 211 for (let subscription of subscriptions)
214 { 212 {
215 var subscription = subscriptions[i];
216 if (subscription.url == acceptableAdsUrl) 213 if (subscription.url == acceptableAdsUrl)
217 $("#acceptableAds").prop("checked", !subscription.disabled); 214 $("#acceptableAds").prop("checked", !subscription.disabled);
218 else 215 else
219 addSubscriptionEntry(subscription); 216 addSubscriptionEntry(subscription);
220 } 217 }
221 }); 218 });
222 219
223 // User-entered filters 220 // User-entered filters
224 getSubscriptions(false, true, function(subscriptions) 221 getSubscriptions(false, true, subscriptions =>
225 { 222 {
226 document.getElementById("userFiltersBox").innerHTML = ""; 223 document.getElementById("userFiltersBox").innerHTML = "";
227 document.getElementById("excludedDomainsBox").innerHTML = ""; 224 document.getElementById("excludedDomainsBox").innerHTML = "";
228 225
229 for (var i = 0; i < subscriptions.length; i++) 226 for (let subscription of subscriptions)
230 convertSpecialSubscription(subscriptions[i]); 227 convertSpecialSubscription(subscription);
231 }); 228 });
232 } 229 }
233 230
234 function initCheckbox(id, key) 231 function initCheckbox(id, key)
235 { 232 {
236 key = key || id; 233 key = key || id;
237 var checkbox = document.getElementById(id); 234 let checkbox = document.getElementById(id);
238 235
239 getPref(key, function(value) 236 getPref(key, value =>
240 { 237 {
241 onPrefMessage(key, value); 238 onPrefMessage(key, value);
242 }); 239 });
243 240
244 checkbox.addEventListener("click", function() 241 checkbox.addEventListener("click", () =>
245 { 242 {
246 togglePref(key); 243 togglePref(key);
247 }, false); 244 }, false);
248 } 245 }
249 246
250 function loadRecommendations() 247 function loadRecommendations()
251 { 248 {
252 fetch("subscriptions.xml") 249 fetch("subscriptions.xml")
253 .then(function(response) 250 .then(response =>
254 { 251 {
255 return response.text(); 252 return response.text();
256 }) 253 })
257 .then(function(text) 254 .then(text =>
258 { 255 {
259 var selectedIndex = 0; 256 let selectedIndex = 0;
260 var selectedPrefix = null; 257 let selectedPrefix = null;
261 var matchCount = 0; 258 let matchCount = 0;
262 259
263 var list = document.getElementById("subscriptionSelector"); 260 let list = document.getElementById("subscriptionSelector");
264 var doc = new DOMParser().parseFromString(text, "application/xml"); 261 let doc = new DOMParser().parseFromString(text, "application/xml");
265 var elements = doc.documentElement.getElementsByTagName("subscription"); 262 let elements = doc.documentElement.getElementsByTagName("subscription");
266 263
267 for (var i = 0; i < elements.length; i++) 264 for (let i = 0; i < elements.length; i++)
268 { 265 {
269 var element = elements[i]; 266 let element = elements[i];
270 var option = new Option(); 267 let option = new Option();
271 option.text = element.getAttribute("title") + " (" + 268 option.text = element.getAttribute("title") + " (" +
272 element.getAttribute("specialization") + ")"; 269 element.getAttribute("specialization") + ")";
273 option._data = { 270 option._data = {
274 title: element.getAttribute("title"), 271 title: element.getAttribute("title"),
275 url: element.getAttribute("url"), 272 url: element.getAttribute("url"),
276 homepage: element.getAttribute("homepage") 273 homepage: element.getAttribute("homepage")
277 }; 274 };
278 275
279 var prefix = element.getAttribute("prefixes"); 276 let prefix = element.getAttribute("prefixes");
280 if (prefix) 277 if (prefix)
281 { 278 {
282 prefix = prefix.replace(/\W/g, "_"); 279 prefix = prefix.replace(/\W/g, "_");
283 option.style.fontWeight = "bold"; 280 option.style.fontWeight = "bold";
284 option.style.backgroundColor = "#E0FFE0"; 281 option.style.backgroundColor = "#E0FFE0";
285 option.style.color = "#000000"; 282 option.style.color = "#000000";
286 if (!selectedPrefix || selectedPrefix.length < prefix.length) 283 if (!selectedPrefix || selectedPrefix.length < prefix.length)
287 { 284 {
288 selectedIndex = i; 285 selectedIndex = i;
289 selectedPrefix = prefix; 286 selectedPrefix = prefix;
(...skipping 10 matching lines...) Expand all
300 if (Math.random() * matchCount < 1) 297 if (Math.random() * matchCount < 1)
301 { 298 {
302 selectedIndex = i; 299 selectedIndex = i;
303 selectedPrefix = prefix; 300 selectedPrefix = prefix;
304 } 301 }
305 } 302 }
306 } 303 }
307 list.appendChild(option); 304 list.appendChild(option);
308 } 305 }
309 306
310 var option = new Option(); 307 let option = new Option();
311 var label = i18n.getMessage("filters_addSubscriptionOther_label"); 308 let label = i18n.getMessage("filters_addSubscriptionOther_label");
312 option.text = label + "\u2026"; 309 option.text = label + "\u2026";
313 option._data = null; 310 option._data = null;
314 list.appendChild(option); 311 list.appendChild(option);
315 312
316 list.selectedIndex = selectedIndex; 313 list.selectedIndex = selectedIndex;
317 314
318 if (delayedSubscriptionSelection) 315 if (delayedSubscriptionSelection)
319 startSubscriptionSelection.apply(null, delayedSubscriptionSelection); 316 startSubscriptionSelection.apply(null, delayedSubscriptionSelection);
320 }); 317 });
321 } 318 }
322 319
323 function startSubscriptionSelection(title, url) 320 function startSubscriptionSelection(title, url)
324 { 321 {
325 var list = document.getElementById("subscriptionSelector"); 322 let list = document.getElementById("subscriptionSelector");
326 if (list.length == 0) 323 if (list.length == 0)
327 { 324 {
328 delayedSubscriptionSelection = [title, url]; 325 delayedSubscriptionSelection = [title, url];
329 return; 326 return;
330 } 327 }
331 328
332 $("#tabs").tabs("select", 0); 329 $("#tabs").tabs("select", 0);
333 $("#addSubscriptionContainer").show(); 330 $("#addSubscriptionContainer").show();
334 $("#addSubscriptionButton").hide(); 331 $("#addSubscriptionButton").hide();
335 $("#subscriptionSelector").focus(); 332 $("#subscriptionSelector").focus();
336 if (typeof url != "undefined") 333 if (typeof url != "undefined")
337 { 334 {
338 list.selectedIndex = list.length - 1; 335 list.selectedIndex = list.length - 1;
339 document.getElementById("customSubscriptionTitle").value = title; 336 document.getElementById("customSubscriptionTitle").value = title;
340 document.getElementById("customSubscriptionLocation").value = url; 337 document.getElementById("customSubscriptionLocation").value = url;
341 } 338 }
342 updateSubscriptionSelection(); 339 updateSubscriptionSelection();
343 document.getElementById("addSubscriptionContainer").scrollIntoView(true); 340 document.getElementById("addSubscriptionContainer").scrollIntoView(true);
344 } 341 }
345 342
346 function updateSubscriptionSelection() 343 function updateSubscriptionSelection()
347 { 344 {
348 var list = document.getElementById("subscriptionSelector"); 345 let list = document.getElementById("subscriptionSelector");
349 var data = list.options[list.selectedIndex]._data; 346 let data = list.options[list.selectedIndex]._data;
350 if (data) 347 if (data)
351 $("#customSubscriptionContainer").hide(); 348 $("#customSubscriptionContainer").hide();
352 else 349 else
353 { 350 {
354 $("#customSubscriptionContainer").show(); 351 $("#customSubscriptionContainer").show();
355 $("#customSubscriptionTitle").focus(); 352 $("#customSubscriptionTitle").focus();
356 } 353 }
357 } 354 }
358 355
359 function addSubscriptionClicked() 356 function addSubscriptionClicked()
360 { 357 {
361 var list = document.getElementById("subscriptionSelector"); 358 let list = document.getElementById("subscriptionSelector");
362 var data = list.options[list.selectedIndex]._data; 359 let data = list.options[list.selectedIndex]._data;
363 if (data) 360 if (data)
364 addSubscription(data.url, data.title, data.homepage); 361 addSubscription(data.url, data.title, data.homepage);
365 else 362 else
366 { 363 {
367 var url = document.getElementById("customSubscriptionLocation").value.trim() ; 364 let url = document.getElementById("customSubscriptionLocation").value.trim() ;
368 if (!/^https?:/i.test(url)) 365 if (!/^https?:/i.test(url))
369 { 366 {
370 alert(i18n.getMessage("global_subscription_invalid_location")); 367 alert(i18n.getMessage("global_subscription_invalid_location"));
371 $("#customSubscriptionLocation").focus(); 368 $("#customSubscriptionLocation").focus();
372 return; 369 return;
373 } 370 }
374 371
375 var title = document.getElementById("customSubscriptionTitle").value.trim(); 372 let title = document.getElementById("customSubscriptionTitle").value.trim();
376 if (!title) 373 if (!title)
377 title = url; 374 title = url;
378 375
379 addSubscription(url, title, null); 376 addSubscription(url, title, null);
380 } 377 }
381 378
382 $("#addSubscriptionContainer").hide(); 379 $("#addSubscriptionContainer").hide();
383 $("#customSubscriptionContainer").hide(); 380 $("#customSubscriptionContainer").hide();
384 $("#addSubscriptionButton").show(); 381 $("#addSubscriptionButton").show();
385 } 382 }
386 383
387 function toggleAcceptableAds() 384 function toggleAcceptableAds()
388 { 385 {
389 toggleSubscription(acceptableAdsUrl, true); 386 toggleSubscription(acceptableAdsUrl, true);
390 } 387 }
391 388
392 function findSubscriptionElement(subscription) 389 function findSubscriptionElement(subscription)
393 { 390 {
394 var children = document.getElementById("filterLists").childNodes; 391 for (let child of document.getElementById("filterLists").childNodes)
395 for (var i = 0; i < children.length; i++) 392 if (child._subscription.url == subscription.url)
396 if (children[i]._subscription.url == subscription.url) 393 return child;
397 return children[i];
398 return null; 394 return null;
399 } 395 }
400 396
401 function updateSubscriptionInfo(element, subscription) 397 function updateSubscriptionInfo(element, subscription)
402 { 398 {
403 if (subscription) 399 if (subscription)
404 element._subscription = subscription; 400 element._subscription = subscription;
405 else 401 else
406 subscription = element._subscription; 402 subscription = element._subscription;
407 403
408 var title = element.getElementsByClassName("subscriptionTitle")[0]; 404 let title = element.getElementsByClassName("subscriptionTitle")[0];
409 title.textContent = subscription.title; 405 title.textContent = subscription.title;
410 title.setAttribute("title", subscription.url); 406 title.setAttribute("title", subscription.url);
411 if (subscription.homepage) 407 if (subscription.homepage)
412 title.href = subscription.homepage; 408 title.href = subscription.homepage;
413 else 409 else
414 title.href = subscription.url; 410 title.href = subscription.url;
415 411
416 var enabled = element.getElementsByClassName("subscriptionEnabled")[0]; 412 let enabled = element.getElementsByClassName("subscriptionEnabled")[0];
417 enabled.checked = !subscription.disabled; 413 enabled.checked = !subscription.disabled;
418 414
419 var lastUpdate = element.getElementsByClassName("subscriptionUpdate")[0]; 415 let lastUpdate = element.getElementsByClassName("subscriptionUpdate")[0];
420 lastUpdate.classList.remove("error"); 416 lastUpdate.classList.remove("error");
421 417
422 var downloadStatus = subscription.downloadStatus; 418 let downloadStatus = subscription.downloadStatus;
423 if (subscription.isDownloading) 419 if (subscription.isDownloading)
424 { 420 {
425 lastUpdate.textContent = i18n.getMessage("filters_subscription_lastDownload_ inProgress"); 421 lastUpdate.textContent = i18n.getMessage("filters_subscription_lastDownload_ inProgress");
426 } 422 }
427 else if (downloadStatus && downloadStatus != "synchronize_ok") 423 else if (downloadStatus && downloadStatus != "synchronize_ok")
428 { 424 {
429 var map = 425 let map =
430 { 426 {
431 "synchronize_invalid_url": "filters_subscription_lastDownload_invalidURL" , 427 "synchronize_invalid_url": "filters_subscription_lastDownload_invalidURL" ,
432 "synchronize_connection_error": "filters_subscription_lastDownload_connec tionError", 428 "synchronize_connection_error": "filters_subscription_lastDownload_connec tionError",
433 "synchronize_invalid_data": "filters_subscription_lastDownload_invalidDat a", 429 "synchronize_invalid_data": "filters_subscription_lastDownload_invalidDat a",
434 "synchronize_checksum_mismatch": "filters_subscription_lastDownload_check sumMismatch" 430 "synchronize_checksum_mismatch": "filters_subscription_lastDownload_check sumMismatch"
435 }; 431 };
436 if (downloadStatus in map) 432 if (downloadStatus in map)
437 lastUpdate.textContent = i18n.getMessage(map[downloadStatus]); 433 lastUpdate.textContent = i18n.getMessage(map[downloadStatus]);
438 else 434 else
439 lastUpdate.textContent = downloadStatus; 435 lastUpdate.textContent = downloadStatus;
440 lastUpdate.classList.add("error"); 436 lastUpdate.classList.add("error");
441 } 437 }
442 else if (subscription.lastDownload > 0) 438 else if (subscription.lastDownload > 0)
443 { 439 {
444 var timeDate = i18n_timeDateStrings(subscription.lastDownload * 1000); 440 let timeDate = i18n_timeDateStrings(subscription.lastDownload * 1000);
445 var messageID = (timeDate[1] ? "last_updated_at" : "last_updated_at_today"); 441 let messageID = (timeDate[1] ? "last_updated_at" : "last_updated_at_today");
446 lastUpdate.textContent = i18n.getMessage(messageID, timeDate); 442 lastUpdate.textContent = i18n.getMessage(messageID, timeDate);
447 } 443 }
448 } 444 }
449 445
450 function onSubscriptionMessage(action, subscription) 446 function onSubscriptionMessage(action, subscription)
451 { 447 {
452 var element = findSubscriptionElement(subscription); 448 let element = findSubscriptionElement(subscription);
453 449
454 switch (action) 450 switch (action)
455 { 451 {
456 case "disabled": 452 case "disabled":
457 case "downloading": 453 case "downloading":
458 case "downloadStatus": 454 case "downloadStatus":
459 case "homepage": 455 case "homepage":
460 case "lastDownload": 456 case "lastDownload":
461 case "title": 457 case "title":
462 if (element) 458 if (element)
(...skipping 21 matching lines...) Expand all
484 switch (key) 480 switch (key)
485 { 481 {
486 case "notifications_showui": 482 case "notifications_showui":
487 document.getElementById("shouldShowNotificationsContainer").hidden = !valu e; 483 document.getElementById("shouldShowNotificationsContainer").hidden = !valu e;
488 return; 484 return;
489 case "notifications_ignoredcategories": 485 case "notifications_ignoredcategories":
490 key = "shouldShowNotifications"; 486 key = "shouldShowNotifications";
491 value = value.indexOf("*") == -1; 487 value = value.indexOf("*") == -1;
492 break; 488 break;
493 } 489 }
494 var checkbox = document.getElementById(key); 490 let checkbox = document.getElementById(key);
495 if (checkbox) 491 if (checkbox)
496 checkbox.checked = value; 492 checkbox.checked = value;
497 } 493 }
498 494
499 function onFilterMessage(action, filter) 495 function onFilterMessage(action, filter)
500 { 496 {
501 switch (action) 497 switch (action)
502 { 498 {
503 case "loaded": 499 case "loaded":
504 reloadFilters(); 500 reloadFilters();
(...skipping 10 matching lines...) Expand all
515 else 511 else
516 removeFromListBox("userFiltersBox", filter.text); 512 removeFromListBox("userFiltersBox", filter.text);
517 break; 513 break;
518 } 514 }
519 } 515 }
520 516
521 // Add a filter string to the list box. 517 // Add a filter string to the list box.
522 function appendToListBox(boxId, text) 518 function appendToListBox(boxId, text)
523 { 519 {
524 // Note: document.createElement("option") is unreliable in Opera 520 // Note: document.createElement("option") is unreliable in Opera
525 var elt = new Option(); 521 let elt = new Option();
526 elt.text = text; 522 elt.text = text;
527 elt.value = text; 523 elt.value = text;
528 document.getElementById(boxId).appendChild(elt); 524 document.getElementById(boxId).appendChild(elt);
529 } 525 }
530 526
531 // Remove a filter string from a list box. 527 // Remove a filter string from a list box.
532 function removeFromListBox(boxId, text) 528 function removeFromListBox(boxId, text)
533 { 529 {
534 let list = document.getElementById(boxId); 530 let list = document.getElementById(boxId);
535 let selector = "option[value=" + CSS.escape(text) + "]"; 531 let selector = "option[value=" + CSS.escape(text) + "]";
536 for (let option of list.querySelectorAll(selector)) 532 for (let option of list.querySelectorAll(selector))
537 list.removeChild(option); 533 list.removeChild(option);
538 } 534 }
539 535
540 function addWhitelistDomain(event) 536 function addWhitelistDomain(event)
541 { 537 {
542 event.preventDefault(); 538 event.preventDefault();
543 539
544 var domain = document.getElementById("newWhitelistDomain").value.replace(/\s/g , ""); 540 let domain = document.getElementById("newWhitelistDomain").value.replace(/\s/g , "");
545 document.getElementById("newWhitelistDomain").value = ""; 541 document.getElementById("newWhitelistDomain").value = "";
546 if (!domain) 542 if (!domain)
547 return; 543 return;
548 544
549 var filterText = "@@||" + domain + "^$document"; 545 let filterText = "@@||" + domain + "^$document";
550 addFilter(filterText); 546 addFilter(filterText);
551 } 547 }
552 548
553 // Adds filter text that user typed to the selection box 549 // Adds filter text that user typed to the selection box
554 function addTypedFilter(event) 550 function addTypedFilter(event)
555 { 551 {
556 event.preventDefault(); 552 event.preventDefault();
557 553
558 var element = document.getElementById("newFilter"); 554 let element = document.getElementById("newFilter");
559 addFilter(element.value, function(errors) 555 addFilter(element.value, errors =>
560 { 556 {
561 if (errors.length > 0) 557 if (errors.length > 0)
562 alert(errors.join("\n")); 558 alert(errors.join("\n"));
563 else 559 else
564 element.value = ""; 560 element.value = "";
565 }); 561 });
566 } 562 }
567 563
568 // Removes currently selected whitelisted domains 564 // Removes currently selected whitelisted domains
569 function removeSelectedExcludedDomain(event) 565 function removeSelectedExcludedDomain(event)
570 { 566 {
571 event.preventDefault(); 567 event.preventDefault();
572 var excludedDomainsBox = document.getElementById("excludedDomainsBox"); 568 let remove = [];
573 var remove = []; 569 for (let option of document.getElementById("excludedDomainsBox").options)
574 for (var i = 0; i < excludedDomainsBox.length; i++) 570 if (option.selected)
575 if (excludedDomainsBox.options[i].selected) 571 remove.push(option.value);
576 remove.push(excludedDomainsBox.options[i].value);
577 if (!remove.length) 572 if (!remove.length)
578 return; 573 return;
579 574
580 for (var i = 0; i < remove.length; i++) 575 for (let domain of remove)
581 removeFilter("@@||" + remove[i] + "^$document"); 576 removeFilter("@@||" + domain + "^$document");
582 } 577 }
583 578
584 // Removes all currently selected filters 579 // Removes all currently selected filters
585 function removeSelectedFilters(event) 580 function removeSelectedFilters(event)
586 { 581 {
587 event.preventDefault(); 582 event.preventDefault();
588 for (let option of document.querySelectorAll("#userFiltersBox > option:checked ")) 583 for (let option of document.querySelectorAll("#userFiltersBox > option:checked "))
589 removeFilter(option.value); 584 removeFilter(option.value);
590 } 585 }
591 586
(...skipping 15 matching lines...) Expand all
607 { 602 {
608 rawFilters.style.display = "none"; 603 rawFilters.style.display = "none";
609 } 604 }
610 605
611 document.getElementById("rawFiltersText").value = filters.join("\n"); 606 document.getElementById("rawFiltersText").value = filters.join("\n");
612 } 607 }
613 608
614 // Imports filters in the raw text box 609 // Imports filters in the raw text box
615 function importRawFiltersText() 610 function importRawFiltersText()
616 { 611 {
617 var text = document.getElementById("rawFiltersText").value; 612 let text = document.getElementById("rawFiltersText").value;
618 613
619 importRawFilters(text, true, function(errors) 614 importRawFilters(text, true, errors =>
620 { 615 {
621 if (errors.length > 0) 616 if (errors.length > 0)
622 alert(errors.join("\n")); 617 alert(errors.join("\n"));
623 else 618 else
624 $("#rawFilters").hide(); 619 $("#rawFilters").hide();
625 }); 620 });
626 } 621 }
627 622
628 // Called when user explicitly requests filter list updates 623 // Called when user explicitly requests filter list updates
629 function updateFilterLists() 624 function updateFilterLists()
630 { 625 {
631 // Without the URL parameter this will update all subscriptions 626 // Without the URL parameter this will update all subscriptions
632 updateSubscription(); 627 updateSubscription();
633 } 628 }
634 629
635 // Adds a subscription entry to the UI. 630 // Adds a subscription entry to the UI.
636 function addSubscriptionEntry(subscription) 631 function addSubscriptionEntry(subscription)
637 { 632 {
638 var template = document.getElementById("subscriptionTemplate"); 633 let template = document.getElementById("subscriptionTemplate");
639 var element = template.cloneNode(true); 634 let element = template.cloneNode(true);
640 element.removeAttribute("id"); 635 element.removeAttribute("id");
641 element._subscription = subscription; 636 element._subscription = subscription;
642 637
643 var removeButton = element.getElementsByClassName("subscriptionRemoveButton")[ 0]; 638 let removeButton = element.getElementsByClassName("subscriptionRemoveButton")[ 0];
644 removeButton.setAttribute("title", removeButton.textContent); 639 removeButton.setAttribute("title", removeButton.textContent);
645 removeButton.textContent = "\xD7"; 640 removeButton.textContent = "\xD7";
646 removeButton.addEventListener("click", function() 641 removeButton.addEventListener("click", () =>
647 { 642 {
648 if (!confirm(i18n.getMessage("global_remove_subscription_warning"))) 643 if (!confirm(i18n.getMessage("global_remove_subscription_warning")))
649 return; 644 return;
650 645
651 removeSubscription(subscription.url); 646 removeSubscription(subscription.url);
652 }, false); 647 }, false);
653 648
654 getPref("additional_subscriptions", function(additionalSubscriptions) 649 getPref("additional_subscriptions", additionalSubscriptions =>
655 { 650 {
656 if (additionalSubscriptions.indexOf(subscription.url) != -1) 651 if (additionalSubscriptions.indexOf(subscription.url) != -1)
657 removeButton.style.visibility = "hidden"; 652 removeButton.style.visibility = "hidden";
658 }); 653 });
659 654
660 var enabled = element.getElementsByClassName("subscriptionEnabled")[0]; 655 let enabled = element.getElementsByClassName("subscriptionEnabled")[0];
661 enabled.addEventListener("click", function() 656 enabled.addEventListener("click", () =>
662 { 657 {
663 subscription.disabled = !subscription.disabled; 658 subscription.disabled = !subscription.disabled;
664 toggleSubscription(subscription.url, true); 659 toggleSubscription(subscription.url, true);
665 }, false); 660 }, false);
666 661
667 updateSubscriptionInfo(element); 662 updateSubscriptionInfo(element);
668 663
669 document.getElementById("filterLists").appendChild(element); 664 document.getElementById("filterLists").appendChild(element);
670 } 665 }
671 666
672 function setLinks(id) 667 function setLinks(id)
673 { 668 {
674 var element = document.getElementById(id); 669 let element = document.getElementById(id);
675 if (!element) 670 if (!element)
676 return; 671 return;
677 672
678 var links = element.getElementsByTagName("a"); 673 let links = element.getElementsByTagName("a");
679 for (var i = 0; i < links.length; i++) 674 for (let i = 0; i < links.length; i++)
680 { 675 {
681 if (typeof arguments[i + 1] == "string") 676 if (typeof arguments[i + 1] == "string")
682 { 677 {
683 links[i].href = arguments[i + 1]; 678 links[i].href = arguments[i + 1];
684 links[i].setAttribute("target", "_blank"); 679 links[i].setAttribute("target", "_blank");
685 } 680 }
686 else if (typeof arguments[i + 1] == "function") 681 else if (typeof arguments[i + 1] == "function")
687 { 682 {
688 links[i].href = "javascript:void(0);"; 683 links[i].href = "javascript:void(0);";
689 links[i].addEventListener("click", arguments[i + 1], false); 684 links[i].addEventListener("click", arguments[i + 1], false);
690 } 685 }
691 } 686 }
692 } 687 }
693 688
694 ext.onMessage.addListener(function(message) 689 ext.onMessage.addListener(message =>
695 { 690 {
696 switch (message.type) 691 switch (message.type)
697 { 692 {
698 case "app.respond": 693 case "app.respond":
699 switch (message.action) 694 switch (message.action)
700 { 695 {
701 case "addSubscription": 696 case "addSubscription":
702 var subscription = message.args[0]; 697 let subscription = message.args[0];
703 startSubscriptionSelection(subscription.title, subscription.url); 698 startSubscriptionSelection(subscription.title, subscription.url);
704 break; 699 break;
705 case "focusSection": 700 case "focusSection":
706 var tabs = document.getElementsByClassName("ui-tabs-panel"); 701 for (let tab of document.getElementsByClassName("ui-tabs-panel"))
707 for (var i = 0; i < tabs.length; i++)
708 { 702 {
709 var found = tabs[i].querySelector( 703 let found = tab.querySelector(
710 "[data-section='" + message.args[0] + "']" 704 "[data-section='" + message.args[0] + "']"
711 ); 705 );
712 if (!found) 706 if (!found)
713 continue; 707 continue;
714 708
715 var previous = document.getElementsByClassName("focused"); 709 let previous = document.getElementsByClassName("focused");
716 if (previous.length > 0) 710 if (previous.length > 0)
717 previous[0].classList.remove("focused"); 711 previous[0].classList.remove("focused");
718 712
719 var tab = $("[href='#" + tabs[i].id + "']"); 713 let index = $("[href='#" + tab.id + "']").parent().index();
720 $("#tabs").tabs("select", tab.parent().index()); 714 $("#tabs").tabs("select", index);
721 found.classList.add("focused"); 715 found.classList.add("focused");
722 } 716 }
723 break; 717 break;
724 } 718 }
725 break; 719 break;
726 case "filters.respond": 720 case "filters.respond":
727 onFilterMessage(message.action, message.args[0]); 721 onFilterMessage(message.action, message.args[0]);
728 break; 722 break;
729 case "prefs.respond": 723 case "prefs.respond":
730 onPrefMessage(message.action, message.args[0]); 724 onPrefMessage(message.action, message.args[0]);
731 break; 725 break;
732 case "subscriptions.respond": 726 case "subscriptions.respond":
733 onSubscriptionMessage(message.action, message.args[0]); 727 onSubscriptionMessage(message.action, message.args[0]);
734 break; 728 break;
735 } 729 }
736 }); 730 });
OLDNEW
« no previous file with comments | « notification.js ('k') | popup.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld