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

Side by Side Diff: options.js

Issue 29333819: Issue 2375 - Implement "Blocking lists" section in new options page (Closed)
Patch Set: Addressed Thomas comments Created Jan. 22, 2016, 9:53 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
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-2015 Eyeo GmbH 3 * Copyright (C) 2006-2015 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 26 matching lines...) Expand all
37 { 37 {
38 placeholder = document.createElement("li"); 38 placeholder = document.createElement("li");
39 placeholder.className = "empty-placeholder"; 39 placeholder.className = "empty-placeholder";
40 placeholder.textContent = ext.i18n.getMessage(text); 40 placeholder.textContent = ext.i18n.getMessage(text);
41 table.appendChild(placeholder); 41 table.appendChild(placeholder);
42 } 42 }
43 else if (placeholder) 43 else if (placeholder)
44 table.removeChild(placeholder); 44 table.removeChild(placeholder);
45 } 45 }
46 46
47 Collection.prototype._createElementQuery = function(item)
48 {
49 var access = (item.url || item.text).replace(/'/g, "\\'");
50 return function(container)
51 {
52 return container.querySelector("[data-access='" + access + "']");
53 };
54 };
55
47 Collection.prototype.addItems = function() 56 Collection.prototype.addItems = function()
48 { 57 {
49 var length = Array.prototype.push.apply(this.items, arguments); 58 var length = Array.prototype.push.apply(this.items, arguments);
50 if (length == 0) 59 if (length == 0)
51 return; 60 return;
52 61
53 this.items.sort(function(a, b) 62 this.items.sort(function(a, b)
54 { 63 {
55 var aValue = (a.title || a.text || a.url).toLowerCase(); 64 var aValue = (a.title || a.text || a.url).toLowerCase();
56 var bValue = (b.title || b.text || b.url).toLowerCase(); 65 var bValue = (b.title || b.text || b.url).toLowerCase();
57 return aValue.localeCompare(bValue); 66 return aValue.localeCompare(bValue);
58 }); 67 });
59 68
60 for (var j = 0; j < this.details.length; j++) 69 for (var j = 0; j < this.details.length; j++)
61 { 70 {
62 var table = E(this.details[j].id); 71 var table = E(this.details[j].id);
63 var template = table.querySelector("template"); 72 var template = table.querySelector("template");
64 for (var i = 0; i < arguments.length; i++) 73 for (var i = 0; i < arguments.length; i++)
65 { 74 {
66 var item = arguments[i]; 75 var item = arguments[i];
67 var text = item.title || item.url || item.text; 76 var text = item.title || item.url || item.text;
68 var listItem = document.createElement("li"); 77 var listItem = document.createElement("li");
69 listItem.appendChild(document.importNode(template.content, true)); 78 listItem.appendChild(document.importNode(template.content, true));
70 listItem.setAttribute("data-access", item.url || item.text); 79 listItem.setAttribute("data-access", item.url || item.text);
71 listItem.querySelector(".display").textContent = text; 80 listItem.querySelector(".display").textContent = text;
72 if (text) 81 if (text)
73 listItem.setAttribute("data-search", text.toLowerCase()); 82 listItem.setAttribute("data-search", text.toLowerCase());
74 83
84 updateBlockingList(listItem, item);
Thomas Greiner 2016/01/27 17:16:57 This doesn't belong into Collection since it's spe
saroyanm 2016/01/28 17:00:11 We are calling this method on observer as well, Th
Thomas Greiner 2016/01/29 17:48:08 This code is only relevant for subscriptions. Howe
75 var control = listItem.querySelector(".control"); 85 var control = listItem.querySelector(".control");
76 if (control) 86 if (control)
77 { 87 {
78 control.addEventListener("click", this.details[j].onClick, false); 88 control.addEventListener("click", this.details[j].onClick, false);
79 control.checked = item.disabled == false; 89 control.checked = item.disabled == false;
80 } 90 }
81 91
82 this._setEmpty(table, null); 92 this._setEmpty(table, null);
83 if (table.hasChildNodes()) 93 if (table.hasChildNodes())
84 table.insertBefore(listItem, table.childNodes[this.items.indexOf(item) ]); 94 table.insertBefore(listItem,
95 table.childNodes[this.items.indexOf(item)]);
Thomas Greiner 2016/01/25 15:40:32 Detail: Please use braces around it if you occupy
saroyanm 2016/01/26 18:36:19 Done.
Thomas Greiner 2016/01/27 17:16:58 Detail: What I meant with "indent using double-spa
saroyanm 2016/01/28 17:00:12 Got it, sorry for that, I was thinking that we nee
85 else 96 else
86 table.appendChild(listItem); 97 table.appendChild(listItem);
87 } 98 }
88 } 99 }
89 return length; 100 return length;
90 }; 101 };
91 102
92 Collection.prototype.removeItem = function(item) 103 Collection.prototype.removeItem = function(item)
93 { 104 {
94 var index = this.items.indexOf(item); 105 var index = this.items.indexOf(item);
95 if (index == -1) 106 if (index == -1)
96 return; 107 return;
97 108
98 this.items.splice(index, 1); 109 this.items.splice(index, 1);
110 var getListElement = this._createElementQuery(item);
99 for (var i = 0; i < this.details.length; i++) 111 for (var i = 0; i < this.details.length; i++)
100 { 112 {
101 var table = E(this.details[i].id); 113 var table = E(this.details[i].id);
102 var element = table.childNodes[index]; 114 var element = getListElement(table);
103 element.parentElement.removeChild(element); 115 element.parentElement.removeChild(element);
104 if (this.items.length == 0) 116 if (this.items.length == 0)
105 this._setEmpty(table, this.details[i].emptyText); 117 this._setEmpty(table, this.details[i].emptyText);
106 } 118 }
107 }; 119 };
108 120
109 Collection.prototype.clearAll = function() 121 Collection.prototype.clearAll = function()
110 { 122 {
111 this.items = []; 123 this.items = [];
112 for (var i = 0; i < this.details.length; i++) 124 for (var i = 0; i < this.details.length; i++)
113 { 125 {
114 var table = E(this.details[i].id); 126 var table = E(this.details[i].id);
115 var template = table.querySelector("template"); 127 var template = table.querySelector("template");
116 table.innerHTML = ""; 128 var staticElements = [];
Thomas Greiner 2016/01/25 15:40:33 The above two variables are no longer used.
saroyanm 2016/01/26 18:36:19 Done.
117 table.appendChild(template); 129 var element = table.firstChild;
130 while (element)
131 {
132 if ((element.tagName == "LI" && !element.classList.contains("static")) | |
133 element.nodeType == 3)
134 table.removeChild(element);
135 element = element.nextSibling
136 }
137
118 this._setEmpty(table, this.details[i].emptyText); 138 this._setEmpty(table, this.details[i].emptyText);
119 } 139 }
120 }; 140 };
121 141
122 function onToggleSubscriptionClick(e) 142 Collection.prototype.hasId = function(id)
143 {
144 for (var i = 0; i < this.details.length; i++)
145 if (this.details[i].id == id)
146 return true;
147
148 return false;
149 };
150
151 function updateBlockingList(listItem, subscription)
152 {
153 var dateElement = listItem.querySelector(".date");
154 var timeElement = listItem.querySelector(".time");
155
156 if(dateElement && timeElement)
157 {
158 if (subscription.downloadStatus &&
159 subscription.downloadStatus != "synchronize_ok")
160 {
161 var map =
162 {
163 "synchronize_invalid_url": "options_subscription_lastDownload_invalidU RL",
164 "synchronize_connection_error": "options_subscription_lastDownload_con nectionError",
165 "synchronize_invalid_data": "options_subscription_lastDownload_invalid Data",
166 "synchronize_checksum_mismatch": "options_subscription_lastDownload_ch ecksumMismatch"
167 };
168 if (subscription.downloadStatus in map)
169 timeElement.textContent = ext.i18n.getMessage(map[subscription.downloa dStatus]);
170 else
171 timeElement.textContent = subscription.downloadStatus;
172 }
173 else if (subscription.lastDownload > 0)
174 {
175 var timedate = i18n_timeDateStrings(subscription.lastDownload * 1000);
176 var date = new Date(subscription.lastDownload * 1000);
177 dateElement.textContent = date.getFullYear() + "-" +
178 date.getMonth()+1 + "-" + date.getDate();
179 timeElement.textContent = date.getHours() + ":" + date.getMinutes();
180 }
181 }
182 var websiteElement = listItem.querySelector(".context-menu .website");
183 var sourceElement = listItem.querySelector(".context-menu .source");
184 if (websiteElement && subscription.homepage)
185 websiteElement.setAttribute("href", subscription.homepage);
186 if (sourceElement)
187 sourceElement.setAttribute("href", subscription.url);
188 }
189
190 function toggleRemoveSubscription(e)
123 { 191 {
124 e.preventDefault(); 192 e.preventDefault();
125 var subscriptionUrl = e.target.parentNode.getAttribute("data-access"); 193 var subscriptionUrl = getParentAccessElement(e.target).
194 getAttribute("data-access");
126 if (!e.target.checked) 195 if (!e.target.checked)
127 { 196 {
128 ext.backgroundPage.sendMessage({ 197 ext.backgroundPage.sendMessage({
129 type: "subscriptions.remove", 198 type: "subscriptions.remove",
130 url: subscriptionUrl 199 url: subscriptionUrl
131 }); 200 });
132 } 201 }
133 else 202 else
134 addEnableSubscription(subscriptionUrl); 203 addEnableSubscription(subscriptionUrl);
135 } 204 }
136 205
206 function toggleDisableSubscription(e)
207 {
208 e.preventDefault();
209 var subscriptionUrl = e.target.parentNode.getAttribute("data-access");
210 ext.backgroundPage.sendMessage(
211 {
212 type: "subscriptions.toggle",
213 keepInstalled: true,
214 url: subscriptionUrl
215 });
216 }
217
137 function onAddLanguageSubscriptionClick(e) 218 function onAddLanguageSubscriptionClick(e)
138 { 219 {
139 e.preventDefault(); 220 e.preventDefault();
140 var url = this.parentNode.getAttribute("data-access"); 221 var url = this.parentNode.getAttribute("data-access");
141 addEnableSubscription(url); 222 addEnableSubscription(url);
142 } 223 }
143 224
144 function onRemoveFilterClick() 225 function onRemoveFilterClick()
145 { 226 {
146 var filter = this.parentNode.getAttribute("data-access"); 227 var filter = this.parentNode.getAttribute("data-access");
147 ext.backgroundPage.sendMessage( 228 ext.backgroundPage.sendMessage(
148 { 229 {
149 type: "filters.remove", 230 type: "filters.remove",
150 text: filter 231 text: filter
151 }); 232 });
152 } 233 }
153 234
154 collections.popular = new Collection( 235 collections.popular = new Collection(
155 [ 236 [
156 { 237 {
157 id: "recommend-list-table", 238 id: "recommend-list-table",
158 onClick: onToggleSubscriptionClick 239 onClick: toggleRemoveSubscription
159 } 240 }
160 ]); 241 ]);
161 collections.langs = new Collection( 242 collections.langs = new Collection(
162 [ 243 [
163 { 244 {
164 id: "blocking-languages-table", 245 id: "blocking-languages-table",
165 emptyText: "options_dialog_language_added_empty", 246 emptyText: "options_dialog_language_added_empty",
166 onClick: onToggleSubscriptionClick 247 onClick: toggleRemoveSubscription
167 }, 248 },
168 { 249 {
169 id: "blocking-languages-dialog-table", 250 id: "blocking-languages-dialog-table",
170 emptyText: "options_dialog_language_added_empty" 251 emptyText: "options_dialog_language_added_empty"
171 } 252 }
172 ]); 253 ]);
173 collections.allLangs = new Collection( 254 collections.allLangs = new Collection(
174 [ 255 [
175 { 256 {
176 id: "all-lang-table", 257 id: "all-lang-table",
177 emptyText: "options_dialog_language_other_empty", 258 emptyText: "options_dialog_language_other_empty",
178 onClick: onAddLanguageSubscriptionClick 259 onClick: onAddLanguageSubscriptionClick
179 } 260 }
180 ]); 261 ]);
181 collections.acceptableAds = new Collection( 262 collections.acceptableAds = new Collection(
182 [ 263 [
183 { 264 {
184 id: "acceptableads-table", 265 id: "acceptableads-table",
185 onClick: onToggleSubscriptionClick 266 onClick: toggleRemoveSubscription
186 } 267 }
187 ]); 268 ]);
188 collections.custom = new Collection( 269 collections.custom = new Collection(
189 [ 270 [
190 { 271 {
191 id: "custom-list-table", 272 id: "custom-list-table",
192 onClick: onToggleSubscriptionClick 273 onClick: toggleRemoveSubscription
193 } 274 }
194 ]); 275 ]);
195 collections.whitelist = new Collection( 276 collections.whitelist = new Collection(
196 [ 277 [
197 { 278 {
198 id: "whitelisting-table", 279 id: "whitelisting-table",
199 emptyText: "options_whitelisted_empty", 280 emptyText: "options_whitelisted_empty",
200 onClick: onRemoveFilterClick 281 onClick: onRemoveFilterClick
201 } 282 }
202 ]); 283 ]);
203 collections.customFilters = new Collection( 284 collections.customFilters = new Collection(
204 [ 285 [
205 { 286 {
206 id: "custom-filters-table", 287 id: "custom-filters-table",
207 emptyText: "options_customFilters_empty" 288 emptyText: "options_customFilters_empty"
208 } 289 }
209 ]); 290 ]);
291 collections.blockingLists = new Collection(
292 [
293 {
294 id: "blocking-lists-table",
295 onClick: toggleDisableSubscription
296 }
297 ]);
210 298
211 function updateSubscription(subscription) 299 function observeSubscription(subscription)
212 { 300 {
213 var subscriptionUrl = subscription.url; 301 function onObjectChanged(change)
214 var knownSubscription = subscriptionsMap[subscriptionUrl];
215 if (knownSubscription)
216 knownSubscription.disabled = subscription.disabled;
217 else
218 { 302 {
219 getAcceptableAdsURL(function(acceptableAdsUrl) 303 for (var i = 0; i < change.length; i++)
220 { 304 {
221 function onObjectChanged() 305 var property = change[i].name;
306 if (property == "disabled")
222 { 307 {
223 var access = (subscriptionUrl || subscription.text).replace(/'/g, "\\' "); 308 var access = (subscription.url ||
309 subscription.text).replace(/'/g, "\\'");
224 var elements = document.querySelectorAll("[data-access='" + access + " ']"); 310 var elements = document.querySelectorAll("[data-access='" + access + " ']");
225 for (var i = 0; i < elements.length; i++) 311 for (var i = 0; i < elements.length; i++)
226 { 312 {
227 var element = elements[i]; 313 var element = elements[i];
314 var tableId = element.parentElement ? element.parentElement.id : "";
228 var control = element.querySelector(".control"); 315 var control = element.querySelector(".control");
229 if (control.localName == "input") 316 if (control && control.localName == "input")
230 control.checked = subscription.disabled == false; 317 control.checked = subscription.disabled == false;
231 if (subscriptionUrl in recommendationsMap) 318 if (subscription.url in recommendationsMap)
232 { 319 {
233 var recommendation = recommendationsMap[subscriptionUrl]; 320 var recommendation = recommendationsMap[subscription.url];
234 if (recommendation.type == "ads") 321 if (recommendation.type == "ads" &&
322 (collections.langs.hasId(tableId) ||
323 collections.allLangs.hasId(tableId)))
Thomas Greiner 2016/01/25 15:40:33 I've been thinking about this again. Wouldn't you
saroyanm 2016/01/26 18:36:18 I assume you are referring to the "Collection.prot
Thomas Greiner 2016/01/27 17:16:57 I guess you're right. We can leave it here for now
saroyanm 2016/01/28 17:00:11 Done, hope now it's more clear.
235 { 324 {
236 if (subscription.disabled == false) 325 if (subscription.disabled == false)
237 { 326 {
238 collections.allLangs.removeItem(subscription); 327 collections.allLangs.removeItem(subscription);
239 collections.langs.addItems(subscription); 328 collections.langs.addItems(subscription);
240 } 329 }
241 else 330 else
242 { 331 {
243 collections.allLangs.addItems(subscription); 332 collections.allLangs.addItems(subscription);
244 collections.langs.removeItem(subscription); 333 collections.langs.removeItem(subscription);
245 } 334 }
246 } 335 }
247 } 336 }
248 } 337 }
249 } 338 }
339 else
340 {
341 var blockingListId = collections.blockingLists.details[0].id;
342 var blockingList = document.getElementById(blockingListId);
343 var listItem = blockingList.querySelector("[data-access='" +
344 subscription.url + "']");
345 if (listItem)
346 updateBlockingList(listItem, subscription);
347 }
348 }
349 }
250 350
251 if (!Object.observe) 351 if (!Object.observe)
352 {
353 ["disabled", "lastDownload"].forEach(function(property)
354 {
355 subscription["$" + property] = subscription[property];
356 Object.defineProperty(subscription, property,
252 { 357 {
253 // Currently only "disabled" property of subscription used for observa tion 358 get: function()
254 // but with Advanced tab implementation we should also add more proper ties.
255 ["disabled"].forEach(function(property)
256 { 359 {
257 subscription["$" + property] = subscription[property]; 360 return this["$" + property];
258 Object.defineProperty(subscription, property, 361 },
259 { 362 set: function(value)
260 get: function() 363 {
261 { 364 this["$" + property] = value;
262 return this["$" + property]; 365 var change = Object.create(null);
263 }, 366 change.name = property;
264 set: function(value) 367 onObjectChanged([change]);
265 { 368 }
266 this["$" + property] = value; 369 });
267 onObjectChanged(); 370 });
268 } 371 }
269 }); 372 else
270 }); 373 {
271 } 374 Object.observe(subscription, onObjectChanged);
272 else 375 }
273 { 376 }
274 Object.observe(subscription, onObjectChanged);
275 }
276 377
378 function updateSubscription(subscription)
379 {
380 var subscriptionUrl = subscription.url;
381 var knownSubscription = subscriptionsMap[subscriptionUrl];
382 if (knownSubscription)
383 {
384 for (var param in subscription)
Thomas Greiner 2016/01/25 15:40:31 Detail: It's a property, not a parameter.
saroyanm 2016/01/26 18:36:19 Done.
385 if (param != "title")
Thomas Greiner 2016/01/25 15:40:31 Why did you specifically exclude the "title" prope
saroyanm 2016/01/26 18:36:19 To use titles specified in Recommendation, so the
Thomas Greiner 2016/01/27 17:16:57 Right, forgot about that case. It's actually tric
saroyanm 2016/01/28 17:00:11 Acknowledged.
386 knownSubscription[param] = subscription[param];
387 }
388 else
389 {
390 observeSubscription(subscription);
391 getAcceptableAdsURL(function(acceptableAdsUrl)
392 {
277 var collection = null; 393 var collection = null;
278 if (subscriptionUrl in recommendationsMap) 394 if (subscriptionUrl in recommendationsMap)
279 { 395 {
280 var recommendation = recommendationsMap[subscriptionUrl]; 396 var recommendation = recommendationsMap[subscriptionUrl];
281 if (recommendation.type != "ads") 397 if (recommendation.type != "ads")
282 collection = collections.popular; 398 collection = collections.popular;
283 else if (subscription.disabled == false) 399 else if (subscription.disabled == false)
284 collection = collections.langs; 400 collection = collections.langs;
285 else 401 else
286 collection = collections.allLangs; 402 collection = collections.allLangs;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 var elements = doc.documentElement.getElementsByTagName("subscription"); 440 var elements = doc.documentElement.getElementsByTagName("subscription");
325 for (var i = 0; i < elements.length; i++) 441 for (var i = 0; i < elements.length; i++)
326 { 442 {
327 var element = elements[i]; 443 var element = elements[i];
328 var subscription = Object.create(null); 444 var subscription = Object.create(null);
329 subscription.title = element.getAttribute("title"); 445 subscription.title = element.getAttribute("title");
330 subscription.url = element.getAttribute("url"); 446 subscription.url = element.getAttribute("url");
331 subscription.disabled = null; 447 subscription.disabled = null;
332 subscription.downloadStatus = null; 448 subscription.downloadStatus = null;
333 subscription.homepage = null; 449 subscription.homepage = null;
334 subscription.lastSuccess = null;
335 var recommendation = Object.create(null); 450 var recommendation = Object.create(null);
336 recommendation.type = element.getAttribute("type"); 451 recommendation.type = element.getAttribute("type");
337 var prefix = element.getAttribute("prefixes"); 452 var prefix = element.getAttribute("prefixes");
338 if (prefix) 453 if (prefix)
339 { 454 {
340 prefix = prefix.replace(/\W/g, "_"); 455 prefix = prefix.replace(/\W/g, "_");
341 subscription.title = ext.i18n.getMessage("options_language_" + prefi x); 456 subscription.title = ext.i18n.getMessage("options_language_" + prefi x);
342 } 457 }
343 else 458 else
344 { 459 {
345 var type = recommendation.type.replace(/\W/g, "_"); 460 var type = recommendation.type.replace(/\W/g, "_");
346 subscription.title = ext.i18n.getMessage("common_feature_" + type + "_title"); 461 subscription.title = ext.i18n.getMessage("common_feature_" + type + "_title");
347 } 462 }
348 463
349 recommendationsMap[subscription.url] = recommendation; 464 recommendationsMap[subscription.url] = recommendation;
350 updateSubscription(subscription); 465 updateSubscription(subscription);
351 } 466 }
352 }); 467 });
353 } 468 }
354 469
470 function getParentAccessElement(element)
471 {
472 while (!element.getAttribute("data-access"))
473 element = element.parentNode;
Thomas Greiner 2016/01/25 15:40:33 This may cause an exception if there is no parent
saroyanm 2016/01/26 18:36:19 Like it, thanks.
474
475 return element;
476 }
477
355 function onClick(e) 478 function onClick(e)
356 { 479 {
357 var element = e.target; 480 var element = e.target;
358 while (true) 481 while (true)
359 { 482 {
360 if (!element) 483 if (!element)
484 {
485 var context = document.querySelector(".context");
486 if (context)
487 context.classList.remove("context");
361 return; 488 return;
489 }
362 490
363 if (element.hasAttribute("data-action")) 491 if (element.hasAttribute("data-action"))
364 break; 492 break;
365 493
366 element = element.parentElement; 494 element = element.parentElement;
367 } 495 }
368 496
369 var actions = element.getAttribute("data-action").split(","); 497 var actions = element.getAttribute("data-action").split(",");
370 for (var i = 0; i < actions.length; i++) 498 for (var i = 0; i < actions.length; i++)
371 { 499 {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 { 540 {
413 type: "filters.importRaw", 541 type: "filters.importRaw",
414 text: E("custom-filters-raw").value 542 text: E("custom-filters-raw").value
415 }); 543 });
416 E("custom-filters").classList.remove("mode-edit"); 544 E("custom-filters").classList.remove("mode-edit");
417 break; 545 break;
418 case "switch-tab": 546 case "switch-tab":
419 document.body.setAttribute("data-tab", 547 document.body.setAttribute("data-tab",
420 element.getAttribute("data-tab")); 548 element.getAttribute("data-tab"));
421 break; 549 break;
550 case "update-all-subscriptions":
551 ext.backgroundPage.sendMessage(
552 {
553 type: "subscriptions.update"
554 });
555 break;
556 case "open-context-menu":
557 var listItem = getParentAccessElement(element);
558 var contextMenu = listItem.querySelector(".content");
559 listItem.classList.add("context");
560 break;
561 case "update-now":
562 ext.backgroundPage.sendMessage(
563 {
564 type: "subscriptions.update",
565 url: getParentAccessElement(element).getAttribute("data-access")
566 });
567 getParentAccessElement(element).classList.remove("context");
Thomas Greiner 2016/01/25 15:40:33 Why not just add a "close-context-menu" action to
saroyanm 2016/01/26 18:36:19 Done.
568 break;
569 case "website":
570 getParentAccessElement(element).classList.remove("context");
571 break;
572 case "source":
573 getParentAccessElement(element).classList.remove("context");
574 break;
575 case "delete":
Thomas Greiner 2016/01/25 15:40:33 Detail: This message name doesn't describe what it
saroyanm 2016/01/26 18:36:18 Done.
576 ext.backgroundPage.sendMessage(
577 {
578 type: "subscriptions.remove",
579 url: getParentAccessElement(element).getAttribute("data-access")
580 });
581 getParentAccessElement(element).classList.remove("context");
582 break;
422 } 583 }
423 } 584 }
424 } 585 }
425 586
426 function onDOMLoaded() 587 function onDOMLoaded()
427 { 588 {
428 var recommendationTemplate = document.querySelector("#recommend-list-table t emplate");
429 var popularText = ext.i18n.getMessage("options_popular");
430 recommendationTemplate.content.querySelector(".popular").textContent = popul arText;
431 var languagesTemplate = document.querySelector("#all-lang-table template");
432 var buttonText = ext.i18n.getMessage("options_button_add");
433 languagesTemplate.content.querySelector(".button-add span").textContent = bu ttonText;
434
435 populateLists(); 589 populateLists();
436
437 function onFindLanguageKeyUp() 590 function onFindLanguageKeyUp()
438 { 591 {
439 var searchStyle = E("search-style"); 592 var searchStyle = E("search-style");
440 if (!this.value) 593 if (!this.value)
441 searchStyle.innerHTML = ""; 594 searchStyle.innerHTML = "";
442 else 595 else
443 searchStyle.innerHTML = "#all-lang-table li:not([data-search*=\"" + this .value.toLowerCase() + "\"]) { display: none; }"; 596 searchStyle.innerHTML = "#all-lang-table li:not([data-search*=\"" + this .value.toLowerCase() + "\"]) { display: none; }";
444 } 597 }
445 598
446 function getKey(e) 599 function getKey(e)
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 updateShareLink(); 851 updateShareLink();
699 break; 852 break;
700 } 853 }
701 } 854 }
702 855
703 function onSubscriptionMessage(action, subscription) 856 function onSubscriptionMessage(action, subscription)
704 { 857 {
705 switch (action) 858 switch (action)
706 { 859 {
707 case "added": 860 case "added":
861 updateSubscription(subscription);
862 updateShareLink();
863
864 var knownSubscription = subscriptionsMap[subscription.url];
865 if (knownSubscription)
866 collections.blockingLists.addItems(knownSubscription);
867 else
868 collections.blockingLists.addItems(subscription);
869 break;
708 case "disabled": 870 case "disabled":
709 updateSubscription(subscription); 871 updateSubscription(subscription);
710 updateShareLink(); 872 updateShareLink();
711 break; 873 break;
874 case "lastDownload":
875 updateSubscription(subscription);
876 break;
712 case "homepage": 877 case "homepage":
713 // TODO: NYI 878 // TODO: NYI
714 break; 879 break;
715 case "removed": 880 case "removed":
881 var knownSubscription = subscriptionsMap[subscription.url];
716 getAcceptableAdsURL(function(acceptableAdsUrl) 882 getAcceptableAdsURL(function(acceptableAdsUrl)
717 { 883 {
718 if (subscription.url == acceptableAdsUrl) 884 if (subscription.url == acceptableAdsUrl)
719 { 885 {
720 subscription.disabled = true; 886 subscription.disabled = true;
721 updateSubscription(subscription); 887 updateSubscription(subscription);
722 } 888 }
723 else 889 else
724 { 890 {
725 var knownSubscription = subscriptionsMap[subscription.url];
726 if (subscription.url in recommendationsMap) 891 if (subscription.url in recommendationsMap)
727 knownSubscription.disabled = true; 892 knownSubscription.disabled = true;
728 else 893 else
729 { 894 {
730 collections.custom.removeItem(knownSubscription); 895 collections.custom.removeItem(knownSubscription);
731 delete subscriptionsMap[subscription.url]; 896 delete subscriptionsMap[subscription.url];
732 } 897 }
733 } 898 }
734 updateShareLink(); 899 updateShareLink();
735 }); 900 });
901 collections.blockingLists.removeItem(knownSubscription);
Thomas Greiner 2016/01/25 15:40:38 Detail: Semantically, updating the UI should happe
saroyanm 2016/01/26 18:36:18 Done.
736 break; 902 break;
737 case "title": 903 case "title":
738 // TODO: NYI 904 // TODO: NYI
739 break; 905 break;
740 } 906 }
741 } 907 }
742 908
743 function onShareLinkClick(e) 909 function onShareLinkClick(e)
744 { 910 {
745 e.preventDefault(); 911 e.preventDefault();
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 filter: ["addSubscription", "error"] 980 filter: ["addSubscription", "error"]
815 }); 981 });
816 ext.backgroundPage.sendMessage( 982 ext.backgroundPage.sendMessage(
817 { 983 {
818 type: "filters.listen", 984 type: "filters.listen",
819 filter: ["added", "loaded", "removed"] 985 filter: ["added", "loaded", "removed"]
820 }); 986 });
821 ext.backgroundPage.sendMessage( 987 ext.backgroundPage.sendMessage(
822 { 988 {
823 type: "subscriptions.listen", 989 type: "subscriptions.listen",
824 filter: ["added", "disabled", "homepage", "removed", "title"] 990 filter: ["added", "disabled", "homepage", "lastDownload", "removed", "title" , "updated"]
Thomas Greiner 2016/01/25 15:40:32 Detail: You removed the handling for "updated" so
saroyanm 2016/01/26 18:36:20 Done.
825 }); 991 });
826 992
827 window.addEventListener("DOMContentLoaded", onDOMLoaded, false); 993 window.addEventListener("DOMContentLoaded", onDOMLoaded, false);
828 })(); 994 })();
OLDNEW

Powered by Google App Engine
This is Rietveld