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

Side by Side Diff: options.js

Issue 29340571: Issue 3687 - Add experimental support for Safari content blockers (Closed)
Patch Set: Created April 19, 2016, 1:59 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
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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 var addFilter = wrapper({type: "filters.add"}, "text"); 77 var addFilter = wrapper({type: "filters.add"}, "text");
78 var getFilters = wrapper({type: "filters.get"}, "subscriptionUrl"); 78 var getFilters = wrapper({type: "filters.get"}, "subscriptionUrl");
79 var removeFilter = wrapper({type: "filters.remove"}, "text"); 79 var removeFilter = wrapper({type: "filters.remove"}, "text");
80 80
81 var i18n = ext.i18n; 81 var i18n = ext.i18n;
82 var whitelistedDomainRegexp = /^@@\|\|([^\/:]+)\^\$document$/; 82 var whitelistedDomainRegexp = /^@@\|\|([^\/:]+)\^\$document$/;
83 var delayedSubscriptionSelection = null; 83 var delayedSubscriptionSelection = null;
84 84
85 var acceptableAdsUrl; 85 var acceptableAdsUrl;
86 86
87 // Loads options and sets UI elements accordingly 87 // Loads options from localStorage and sets UI elements accordingly
88 function loadOptions() 88 function loadOptions()
89 { 89 {
90 // Set page title to i18n version of "Adblock Plus Options" 90 // Set page title to i18n version of "Adblock Plus Options"
91 document.title = i18n.getMessage("options"); 91 document.title = i18n.getMessage("options");
92 92
93 // Set links 93 // Set links
94 getPref("subscriptions_exceptionsurl", function(url) 94 getPref("subscriptions_exceptionsurl", function(url)
95 { 95 {
96 acceptableAdsUrl = url; 96 acceptableAdsUrl = url;
97 $("#acceptableAdsLink").attr("href", acceptableAdsUrl); 97 $("#acceptableAdsLink").attr("href", acceptableAdsUrl);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 // Popuplate option checkboxes 141 // Popuplate option checkboxes
142 initCheckbox("shouldShowBlockElementMenu"); 142 initCheckbox("shouldShowBlockElementMenu");
143 initCheckbox("show_devtools_panel"); 143 initCheckbox("show_devtools_panel");
144 initCheckbox("shouldShowNotifications", { 144 initCheckbox("shouldShowNotifications", {
145 key: "notifications_ignoredcategories", 145 key: "notifications_ignoredcategories",
146 get: function(ignoredcategories) 146 get: function(ignoredcategories)
147 { 147 {
148 return ignoredcategories.indexOf("*") == -1; 148 return ignoredcategories.indexOf("*") == -1;
149 } 149 }
150 }); 150 });
151 initCheckbox("safariContentBlocker", {onChange: function(checkbox)
152 {
153 var restartMessage = document.getElementById("restart-safari");
154 restartMessage.hidden = true;
155
156 // When the user has chosen to use the legacy APIs but Safari has disabled
157 // them we need to show a "Please restart Safari" message.
158 if (!checkbox.checked)
Sebastian Noack 2016/05/12 11:12:22 As discussed with Thomas on the review for the rel
kzar 2016/05/17 15:15:38 I don't understand what you mean by "persistent lo
Sebastian Noack 2016/05/17 18:35:24 At the very least this logic is inconsistent with
kzar 2016/05/17 19:20:21 Acknowledged.
159 {
160 ext.backgroundPage.sendMessage({type: "safari.contentBlockingActive"},
161 function (contentBlockingActive)
162 {
163 if (contentBlockingActive)
164 restartMessage.hidden = false;
165 });
166 }
167 }});
151 168
152 getInfo("features", function(features) 169 getInfo("features", function(features)
153 { 170 {
154 if (!features.devToolsPanel) 171 if (!features.devToolsPanel)
155 document.getElementById("showDevtoolsPanelContainer").hidden = true; 172 document.getElementById("showDevtoolsPanelContainer").hidden = true;
173
174 // Only show the option for Safari content blocking API if the user is
175 // running Safari and both the legacy and content blocking APIs are
176 // available.
177 document.getElementById("safariContentBlockerContainer").hidden = !(
178 features.safariContentBlocker &&
179 typeof safari != "undefined" &&
180 "canLoad" in safari.self.tab &&
181 "onbeforeload" in Element.prototype
182 );
156 }); 183 });
157 getPref("notifications_showui", function(notifications_showui) 184 getPref("notifications_showui", function(notifications_showui)
158 { 185 {
159 if (!notifications_showui) 186 if (!notifications_showui)
160 document.getElementById("shouldShowNotificationsContainer").hidden = true; 187 document.getElementById("shouldShowNotificationsContainer").hidden = true;
161 }); 188 });
162 189
163 // Register listeners in the background message responder 190 // Register listeners in the background message responder
164 ext.backgroundPage.sendMessage({ 191 ext.backgroundPage.sendMessage({
165 type: "app.listen", 192 type: "app.listen",
166 filter: ["addSubscription", "focusSection"] 193 filter: ["addSubscription", "focusSection"]
167 }); 194 });
168 ext.backgroundPage.sendMessage( 195 ext.backgroundPage.sendMessage(
169 { 196 {
170 type: "filters.listen", 197 type: "filters.listen",
171 filter: ["added", "loaded", "removed"] 198 filter: ["added", "loaded", "removed"]
172 }); 199 });
173 ext.backgroundPage.sendMessage( 200 ext.backgroundPage.sendMessage(
174 { 201 {
175 type: "prefs.listen", 202 type: "prefs.listen",
176 filter: ["notifications_ignoredcategories", "notifications_showui", 203 filter: ["notifications_ignoredcategories", "notifications_showui",
177 "safari_contentblocker", "show_devtools_panel", 204 "safariContentBlocker", "show_devtools_panel",
178 "shouldShowBlockElementMenu"] 205 "shouldShowBlockElementMenu"]
179 }); 206 });
180 ext.backgroundPage.sendMessage( 207 ext.backgroundPage.sendMessage(
181 { 208 {
182 type: "subscriptions.listen", 209 type: "subscriptions.listen",
183 filter: ["added", "disabled", "homepage", "lastDownload", "removed", 210 filter: ["added", "disabled", "homepage", "lastDownload", "removed",
184 "title", "downloadStatus", "downloading"] 211 "title", "downloadStatus", "downloading"]
185 }); 212 });
186 213
187 // Load recommended subscriptions 214 // Load recommended subscriptions
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 262
236 for (var i = 0; i < subscriptions.length; i++) 263 for (var i = 0; i < subscriptions.length; i++)
237 convertSpecialSubscription(subscriptions[i]); 264 convertSpecialSubscription(subscriptions[i]);
238 }); 265 });
239 } 266 }
240 267
241 function initCheckbox(id, descriptor) 268 function initCheckbox(id, descriptor)
242 { 269 {
243 var checkbox = document.getElementById(id); 270 var checkbox = document.getElementById(id);
244 var key = descriptor && descriptor.key || id; 271 var key = descriptor && descriptor.key || id;
272 var onChange;
273 if (descriptor && descriptor.onChange)
274 onChange = descriptor.onChange.bind(undefined, checkbox);
245 getPref(key, function(value) 275 getPref(key, function(value)
246 { 276 {
247 if (descriptor && descriptor.get) 277 if (descriptor && descriptor.get)
248 checkbox.checked = descriptor.get(value); 278 checkbox.checked = descriptor.get(value);
249 else 279 else
250 checkbox.checked = value; 280 checkbox.checked = value;
281
282 if (onChange)
283 onChange();
251 }); 284 });
252 285
253 checkbox.addEventListener("click", function() 286 checkbox.addEventListener("click", function()
254 { 287 {
255 if (descriptor && descriptor.toggle)
256 checkbox.checked = descriptor.toggle();
257 togglePref(key); 288 togglePref(key);
258 }, false); 289 }, false);
290
291 if (onChange)
292 checkbox.addEventListener("change", onChange);
259 } 293 }
260 294
261 function loadRecommendations() 295 function loadRecommendations()
262 { 296 {
263 fetch("subscriptions.xml") 297 fetch("subscriptions.xml")
264 .then(function(response) 298 .then(function(response)
265 { 299 {
266 return response.text(); 300 return response.text();
267 }) 301 })
268 .then(function(text) 302 .then(function(text)
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 document.getElementById("shouldShowNotificationsContainer").hidden = !valu e; 532 document.getElementById("shouldShowNotificationsContainer").hidden = !valu e;
499 return; 533 return;
500 case "notifications_ignoredcategories": 534 case "notifications_ignoredcategories":
501 key = "shouldShowNotifications"; 535 key = "shouldShowNotifications";
502 value = value.indexOf("*") == -1; 536 value = value.indexOf("*") == -1;
503 break; 537 break;
504 } 538 }
505 539
506 var checkbox = document.getElementById(key); 540 var checkbox = document.getElementById(key);
507 if (checkbox) 541 if (checkbox)
542 {
508 checkbox.checked = value; 543 checkbox.checked = value;
544 // Apparently modifying the checked attribute for a checkbox does not
Sebastian Noack 2016/05/12 11:12:23 If you want to emulate user actions that's what th
kzar 2016/05/17 15:15:37 Calling .click() would also toggle the checkbox ri
Sebastian Noack 2016/05/17 18:35:25 I wonder whether the change listener is even neces
kzar 2016/05/17 19:20:21 We also need to call the logic when the checkbox i
Sebastian Noack 2016/05/18 07:03:29 Well, in the new options page we call the same fun
kzar 2016/05/18 08:02:48 Yes, I already do that here.
Sebastian Noack 2016/05/18 08:13:37 But why can't you put the logic simply here then i
kzar 2016/05/18 09:28:47 Oh I finally understand, I think you mean that we
Sebastian Noack 2016/05/18 10:07:24 I don't see how that makes anything more confusing
kzar 2016/05/18 10:43:40 Done.
545 // dispatch the change event automatically...
546 checkbox.dispatchEvent(new Event("change"));
547 }
509 } 548 }
510 549
511 function onFilterMessage(action, filter) 550 function onFilterMessage(action, filter)
512 { 551 {
513 switch (action) 552 switch (action)
514 { 553 {
515 case "loaded": 554 case "loaded":
516 reloadFilters(); 555 reloadFilters();
517 break; 556 break;
518 case "added": 557 case "added":
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 onFilterMessage(message.action, message.args[0]); 787 onFilterMessage(message.action, message.args[0]);
749 break; 788 break;
750 case "prefs.respond": 789 case "prefs.respond":
751 onPrefMessage(message.action, message.args[0]); 790 onPrefMessage(message.action, message.args[0]);
752 break; 791 break;
753 case "subscriptions.respond": 792 case "subscriptions.respond":
754 onSubscriptionMessage(message.action, message.args[0]); 793 onSubscriptionMessage(message.action, message.args[0]);
755 break; 794 break;
756 } 795 }
757 }); 796 });
OLDNEW

Powered by Google App Engine
This is Rietveld