Index: options.js |
diff --git a/options.js b/options.js |
index 3055baa441154856edac4c5b9f556150d27fbb6c..f0793806d8906ecaf41fa75fcdf6d4851663dc57 100644 |
--- a/options.js |
+++ b/options.js |
@@ -84,7 +84,7 @@ var delayedSubscriptionSelection = null; |
var acceptableAdsUrl; |
-// Loads options and sets UI elements accordingly |
+// Loads options from localStorage and sets UI elements accordingly |
function loadOptions() |
{ |
// Set page title to i18n version of "Adblock Plus Options" |
@@ -148,11 +148,38 @@ function loadOptions() |
return ignoredcategories.indexOf("*") == -1; |
} |
}); |
+ initCheckbox("safariContentBlocker", {onChange: function(checkbox) |
+ { |
+ var restartMessage = document.getElementById("restart-safari"); |
+ restartMessage.hidden = true; |
+ |
+ // When the user has chosen to use the legacy APIs but Safari has disabled |
+ // them we need to show a "Please restart Safari" message. |
+ if (!checkbox.checked) |
+ { |
+ ext.backgroundPage.sendMessage({type: "safari.contentBlockingActive"}, |
+ function (contentBlockingActive) |
+ { |
+ if (contentBlockingActive) |
+ restartMessage.hidden = false; |
+ }); |
+ } |
+ }}); |
getInfo("features", function(features) |
{ |
if (!features.devToolsPanel) |
document.getElementById("showDevtoolsPanelContainer").hidden = true; |
+ |
+ // Only show the option for Safari content blocking API if the user is |
+ // running Safari and both the legacy and content blocking APIs are |
+ // available. |
+ document.getElementById("safariContentBlockerContainer").hidden = !( |
+ features.safariContentBlocker && |
+ typeof safari != "undefined" && |
+ "canLoad" in safari.self.tab && |
+ "onbeforeload" in Element.prototype |
+ ); |
}); |
getPref("notifications_showui", function(notifications_showui) |
{ |
@@ -174,7 +201,7 @@ function loadOptions() |
{ |
type: "prefs.listen", |
filter: ["notifications_ignoredcategories", "notifications_showui", |
- "safari_contentblocker", "show_devtools_panel", |
+ "safariContentBlocker", "show_devtools_panel", |
"shouldShowBlockElementMenu"] |
}); |
ext.backgroundPage.sendMessage( |
@@ -242,20 +269,27 @@ function initCheckbox(id, descriptor) |
{ |
var checkbox = document.getElementById(id); |
var key = descriptor && descriptor.key || id; |
+ var onChange; |
+ if (descriptor && descriptor.onChange) |
+ onChange = descriptor.onChange.bind(undefined, checkbox); |
getPref(key, function(value) |
{ |
if (descriptor && descriptor.get) |
checkbox.checked = descriptor.get(value); |
else |
checkbox.checked = value; |
+ |
+ if (onChange) |
+ onChange(); |
}); |
checkbox.addEventListener("click", function() |
{ |
- if (descriptor && descriptor.toggle) |
- checkbox.checked = descriptor.toggle(); |
togglePref(key); |
}, false); |
+ |
+ if (onChange) |
+ checkbox.addEventListener("change", onChange); |
} |
function loadRecommendations() |
@@ -505,7 +539,12 @@ function onPrefMessage(key, value) |
var checkbox = document.getElementById(key); |
if (checkbox) |
+ { |
checkbox.checked = value; |
+ // Apparently modifying the checked attribute for a checkbox does not |
+ // dispatch the change event automatically... |
+ checkbox.dispatchEvent(new Event("change")); |
+ } |
} |
function onFilterMessage(action, filter) |