Index: new-options.js |
=================================================================== |
--- a/new-options.js |
+++ b/new-options.js |
@@ -25,6 +25,7 @@ |
let filtersMap = Object.create(null); |
let collections = Object.create(null); |
let acceptableAdsUrl = null; |
+ let acceptableAdsPrivacyUrl = null; |
let isCustomFiltersLoaded = false; |
let {getMessage} = ext.i18n; |
let customFilters = []; |
@@ -83,8 +84,6 @@ |
Collection.prototype._getItemTitle = function(item, i) |
{ |
- if (item.url == acceptableAdsUrl) |
- return getMessage("options_acceptableAds_description"); |
if (this.details[i].useOriginalTitle && item.originalTitle) |
return item.originalTitle; |
return item.title || item.url || item.text; |
@@ -98,9 +97,9 @@ |
// disabled, but only be removed. That way it's grouped together with |
// the "Own filter list" which cannot be disabled either at the bottom |
// of the filter lists in the Advanced tab. |
- if (a.url == acceptableAdsUrl) |
+ if (isAcceptableAds(a.url)) |
return 1; |
- if (b.url == acceptableAdsUrl) |
+ if (isAcceptableAds(b.url)) |
return -1; |
// Make sure that newly added entries always appear on top in descending |
@@ -134,12 +133,19 @@ |
listItem.setAttribute("data-access", item.url || item.text); |
listItem.setAttribute("role", "section"); |
- let label = listItem.querySelector(".display"); |
- if (item.recommended && label.hasAttribute("data-tooltip")) |
+ let tooltip = listItem.querySelector("[data-tooltip]"); |
+ if (tooltip) |
{ |
- let tooltipId = label.getAttribute("data-tooltip"); |
+ let tooltipId = tooltip.getAttribute("data-tooltip"); |
tooltipId = tooltipId.replace("%value%", item.recommended); |
- label.setAttribute("data-tooltip", tooltipId); |
+ if (getMessage(tooltipId)) |
+ { |
+ tooltip.setAttribute("data-tooltip", tooltipId); |
+ } |
+ else |
+ { |
+ tooltip.parentNode.removeChild(tooltip); |
+ } |
} |
for (let control of listItem.querySelectorAll(".control")) |
@@ -214,7 +220,9 @@ |
continue; |
let title = this._getItemTitle(item, i); |
- element.querySelector(".display").textContent = title; |
+ for (let displayElement of element.querySelectorAll(".display")) |
Thomas Greiner
2017/08/16 17:57:09
According to https://developer.mozilla.org/en-US/d
saroyanm
2017/08/17 11:21:17
well spotted.
saroyanm
2017/08/17 21:24:07
Done.
|
+ displayElement.textContent = title; |
+ |
element.setAttribute("aria-label", title); |
if (this.details[i].searchable) |
element.setAttribute("data-search", title.toLowerCase()); |
@@ -222,7 +230,7 @@ |
if (control) |
{ |
control.setAttribute("aria-checked", item.disabled == false); |
- if (item.url == acceptableAdsUrl && this == collections.filterLists) |
+ if (isAcceptableAds(item.url) && this == collections.filterLists) |
control.disabled = true; |
} |
@@ -330,31 +338,21 @@ |
return true; |
} |
- collections.popular = new Collection([ |
+ collections.security = new Collection([ |
{ |
- id: "recommend-list-table" |
+ id: "recommend-security-list-table" |
} |
]); |
collections.langs = new Collection([ |
{ |
id: "blocking-languages-table", |
- emptyText: ["options_dialog_language_added_empty"] |
- }, |
- { |
- id: "blocking-languages-dialog-table", |
- emptyText: ["options_dialog_language_added_empty"] |
+ emptyText: ["options_language_empty"] |
} |
]); |
collections.allLangs = new Collection([ |
{ |
- id: "all-lang-table", |
- emptyText: ["options_dialog_language_other_empty"], |
- searchable: true |
- } |
- ]); |
- collections.acceptableAds = new Collection([ |
- { |
- id: "acceptableads-table" |
+ id: "all-lang-table-add", |
+ emptyText: ["options_dialog_language_other_empty"] |
} |
]); |
collections.custom = new Collection([ |
@@ -375,43 +373,41 @@ |
} |
]); |
- function toggleShowLanguage(subscription) |
+ function addSubscription(subscription) |
{ |
- if (subscription.recommended == "ads") |
+ let collection = null; |
+ if (subscription.recommended) |
{ |
- if (subscription.disabled) |
+ if (isProtection(subscription.recommended)) |
{ |
+ collection = collections.security; |
Thomas Greiner
2017/08/16 17:57:10
Detail: The previous comments for this still appli
saroyanm
2017/08/17 21:24:07
Done.
|
+ } |
+ else if (subscription.recommended == "ads") |
+ { |
+ if (subscription.disabled == false) |
+ collection = collections.langs; |
+ |
collections.allLangs.addItem(subscription); |
- collections.langs.removeItem(subscription); |
+ } |
+ else if (subscription.disabled == false) |
+ { |
+ collection = collections.custom; |
Thomas Greiner
2017/08/16 17:57:10
So we're still putting recommended subscriptions i
saroyanm
2017/08/17 11:21:19
Yes, because according to the subscription.xml "Ma
Thomas Greiner
2017/08/17 12:06:05
If they are in subscriptions.xml but are not suppo
saroyanm
2017/08/17 12:32:08
Is it the decision that we can make ?
If so I'm
Thomas Greiner
2017/08/17 12:49:06
We are the ones who added them in the first place
saroyanm
2017/08/17 14:06:18
Thanks for clarifying that, in this case whole log
saroyanm
2017/08/17 21:24:05
Done.
|
} |
else |
Thomas Greiner
2017/08/16 17:57:09
This part of the if-statement is redundant because
saroyanm
2017/08/17 11:21:18
agree.
saroyanm
2017/08/17 21:24:05
Done.
|
{ |
- collections.allLangs.removeItem(subscription); |
- collections.langs.addItem(subscription); |
+ subscriptionsMap[subscription.url] = subscription; |
+ return; |
} |
} |
- } |
+ else if (!isAcceptableAds(subscription.url)) |
+ { |
+ collection = collections.custom; |
+ } |
- function addSubscription(subscription) |
- { |
- let collection; |
- if (subscription.recommended) |
- { |
- if (subscription.recommended != "ads") |
- collection = collections.popular; |
- else if (subscription.disabled == false) |
- collection = collections.langs; |
- else |
- collection = collections.allLangs; |
- } |
- else if (subscription.url == acceptableAdsUrl) |
- collection = collections.acceptableAds; |
- else |
- collection = collections.custom; |
+ if (collection) |
+ collection.addItem(subscription); |
- collection.addItem(subscription); |
subscriptionsMap[subscription.url] = subscription; |
- toggleShowLanguage(subscription); |
updateTooltips(); |
} |
@@ -420,7 +416,26 @@ |
for (let name in collections) |
collections[name].updateItem(subscription); |
- toggleShowLanguage(subscription); |
+ if (subscription.recommended == "ads") |
+ { |
+ if (subscription.disabled) |
+ collections.langs.removeItem(subscription); |
+ else |
+ collections.langs.addItem(subscription); |
+ } |
+ else if (!isProtection(subscription.recommended) && |
+ !isAcceptableAds(subscription.url)) |
+ { |
+ if (subscription.disabled == false) |
+ { |
+ collections.custom.addItem(subscription); |
Thomas Greiner
2017/08/16 17:57:09
Again, it seems like we're still putting recommend
saroyanm
2017/08/17 11:21:17
As, same as the comment above, the definition of t
saroyanm
2017/08/17 21:24:05
Done.
|
+ updateTooltips(); |
+ } |
+ else |
+ { |
+ collections.custom.removeItem(subscription); |
+ } |
+ } |
} |
function updateFilter(filter) |
@@ -561,6 +576,24 @@ |
case "cancel-custom-filters": |
setCustomFiltersView("read"); |
break; |
+ case "change-language-subscription": |
+ for (let key in subscriptionsMap) |
+ { |
+ let subscription = subscriptionsMap[key]; |
+ let subscriptionType = subscription.recommended; |
+ if (subscriptionType == "ads" && subscription.disabled == false) |
+ { |
+ ext.backgroundPage.sendMessage({ |
+ type: "subscriptions.remove", |
+ url: subscription.url |
+ }); |
+ ext.backgroundPage.sendMessage({ |
+ type: "subscriptions.add", |
+ url: findParentData(element, "access", false) |
+ }); |
+ } |
Thomas Greiner
2017/08/16 17:57:10
Detail: Let's exit the loop as soon as we find the
saroyanm
2017/08/17 21:24:06
Done.
|
+ } |
+ break; |
case "close-dialog": |
closeDialog(); |
break; |
@@ -612,6 +645,36 @@ |
setCustomFiltersView("read"); |
}); |
break; |
+ case "switch-acceptable-ads": |
Thomas Greiner
2017/08/16 17:57:10
It's great that the code has been made more consis
saroyanm
2017/08/17 11:21:18
I think I missed the part of combining them into o
Thomas Greiner
2017/08/17 12:06:05
Your proposal is perfectly fine. :)
saroyanm
2017/08/17 21:24:04
Done.
|
+ ext.backgroundPage.sendMessage({ |
+ type: "subscriptions.remove", |
+ url: acceptableAdsPrivacyUrl |
+ }); |
+ ext.backgroundPage.sendMessage({ |
+ type: "subscriptions.add", |
+ url: acceptableAdsUrl |
+ }); |
+ break; |
+ case "switch-privacy-acceptable-ads": |
+ ext.backgroundPage.sendMessage({ |
+ type: "subscriptions.remove", |
+ url: acceptableAdsUrl |
+ }); |
+ ext.backgroundPage.sendMessage({ |
+ type: "subscriptions.add", |
+ url: acceptableAdsPrivacyUrl |
+ }); |
+ break; |
+ case "switch-no-acceptable-ads": |
+ ext.backgroundPage.sendMessage({ |
+ type: "subscriptions.remove", |
+ url: acceptableAdsPrivacyUrl |
+ }); |
+ ext.backgroundPage.sendMessage({ |
+ type: "subscriptions.remove", |
+ url: acceptableAdsUrl |
+ }); |
+ break; |
case "switch-tab": |
let tabId = findParentData(element, "tab", false); |
switchTab(tabId); |
@@ -788,17 +851,6 @@ |
function onDOMLoaded() |
{ |
populateLists(); |
- function onFindLanguageKeyUp() |
- { |
- let searchStyle = E("search-style"); |
- if (!this.value) |
- searchStyle.innerHTML = ""; |
- else |
- { |
- searchStyle.innerHTML = "#all-lang-table li:not([data-search*=\"" + |
- this.value.toLowerCase() + "\"]) { display: none; }"; |
- } |
- } |
// Initialize navigation sidebar |
ext.backgroundPage.sendMessage({ |
@@ -820,9 +872,6 @@ |
// Initialize interactive UI elements |
document.body.addEventListener("click", onClick, false); |
document.body.addEventListener("keyup", onKeyUp, false); |
- let placeholderValue = getMessage("options_dialog_language_find"); |
- E("find-language").setAttribute("placeholder", placeholderValue); |
- E("find-language").addEventListener("keyup", onFindLanguageKeyUp, false); |
let exampleValue = getMessage("options_whitelist_placeholder_example", |
["www.example.com"]); |
E("whitelisting-textbox").setAttribute("placeholder", exampleValue); |
@@ -831,6 +880,11 @@ |
E("whitelisting-add-button").disabled = !e.target.value; |
}, false); |
+ getDocLink("acceptable_ads_criteria", (link) => |
+ { |
+ setLinks("enable-aa-description", link); |
+ }); |
+ |
// Advanced tab |
let customize = document.querySelectorAll("#customize li[data-pref]"); |
customize = Array.prototype.map.call(customize, (checkbox) => |
@@ -969,6 +1023,41 @@ |
focusedBeforeDialog.focus(); |
} |
+ function setDntNotification(state) |
+ { |
+ if (state) |
+ E("acceptable-ads").classList.add("show-dnt-notification"); |
+ else |
+ E("acceptable-ads").classList.remove("show-dnt-notification"); |
+ } |
+ |
+ function setAcceptableAds(option) |
+ { |
+ let optionsContainer = E("acceptable-ads"); |
+ switch (option) |
+ { |
+ case "default": |
+ optionsContainer.querySelector("[value='ads']").checked = true; |
+ break; |
+ case "privacy": |
+ optionsContainer.querySelector("[value='ads,privacy']").checked = true; |
+ break; |
+ case "none": |
+ optionsContainer.querySelector("[value='none']").checked = true; |
+ break; |
+ } |
+ } |
+ |
+ function isAcceptableAds(url) |
+ { |
+ return url == acceptableAdsUrl || url == acceptableAdsPrivacyUrl; |
+ } |
+ |
+ function isProtection(type) |
+ { |
+ return type == "privacy" || type == "social"; |
+ } |
+ |
function populateLists() |
{ |
subscriptionsMap = Object.create(null); |
@@ -1014,15 +1103,24 @@ |
disabled: true |
}); |
- // Load user subscriptions |
ext.backgroundPage.sendMessage({ |
- type: "subscriptions.get", |
- downloadable: true |
+ type: "prefs.get", |
+ key: "subscriptions_exceptionsurl_privacy" |
}, |
- (subscriptions) => |
+ (urlPrivacy) => |
{ |
- for (let subscription of subscriptions) |
- onSubscriptionMessage("added", subscription); |
+ acceptableAdsPrivacyUrl = urlPrivacy; |
+ |
+ // Load user subscriptions |
+ ext.backgroundPage.sendMessage({ |
+ type: "subscriptions.get", |
+ downloadable: true |
+ }, |
+ (subscriptions) => |
+ { |
+ for (let subscription of subscriptions) |
+ onSubscriptionMessage("added", subscription); |
+ }); |
}); |
}); |
} |
@@ -1130,14 +1228,33 @@ |
else |
addSubscription(subscription); |
+ if (subscription.url == acceptableAdsUrl) |
+ setAcceptableAds("default"); |
Thomas Greiner
2017/08/16 17:57:10
We cannot determine the current state based on whi
saroyanm
2017/08/17 11:21:18
I agree. I'll update accordingly.
saroyanm
2017/08/17 21:24:04
Done.
|
+ |
+ if (subscription.url == acceptableAdsPrivacyUrl) |
+ { |
+ setAcceptableAds("privacy"); |
+ if (!navigator.doNotTrack) |
+ setDntNotification(true); |
+ } |
+ |
collections.filterLists.addItem(subscription); |
break; |
case "removed": |
- if (subscription.url == acceptableAdsUrl || subscription.recommended) |
+ if (subscription.recommended == "ads" || |
+ isProtection(subscription.recommended)) |
{ |
subscription.disabled = true; |
onSubscriptionMessage("disabled", subscription); |
} |
+ if (isAcceptableAds(subscription.url)) |
+ { |
+ setAcceptableAds("none"); |
+ if (subscription.url == acceptableAdsPrivacyUrl) |
+ { |
+ setDntNotification(false); |
+ } |
+ } |
else |
{ |
collections.custom.removeItem(subscription); |
Thomas Greiner
2017/08/16 17:57:09
Detail: Recommended subscriptions should not be in
saroyanm
2017/08/17 21:24:06
Done.
|
@@ -1232,20 +1349,6 @@ |
checkShareResource(sharedResource, onResult); |
} |
- function getMessages(id) |
- { |
- let messages = []; |
- for (let i = 1; true; i++) |
- { |
- let message = ext.i18n.getMessage(id + "_" + i); |
- if (!message) |
- break; |
- |
- messages.push(message); |
- } |
- return messages; |
- } |
- |
function updateTooltips() |
{ |
let anchors = document.querySelectorAll(":not(.tooltip) > [data-tooltip]"); |
@@ -1258,52 +1361,12 @@ |
anchor.parentNode.replaceChild(wrapper, anchor); |
wrapper.appendChild(anchor); |
- let topTexts = getMessages(id); |
- let bottomTexts = getMessages(id + "_notes"); |
- |
- // We have to use native tooltips to avoid issues when attaching a tooltip |
- // to an element in a scrollable list or otherwise it might get cut off |
- if (anchor.hasAttribute("data-tooltip-native")) |
- { |
- let title = topTexts.concat(bottomTexts).join("\n\n"); |
- anchor.setAttribute("title", title); |
- continue; |
- } |
- |
let tooltip = document.createElement("div"); |
tooltip.setAttribute("role", "tooltip"); |
- let flip = anchor.getAttribute("data-tooltip-flip"); |
- if (flip) |
- tooltip.className = "flip-" + flip; |
- |
- let imageSource = anchor.getAttribute("data-tooltip-image"); |
- if (imageSource) |
- { |
- let image = document.createElement("img"); |
- image.src = imageSource; |
- image.alt = ""; |
- tooltip.appendChild(image); |
- } |
- |
- for (let topText of topTexts) |
- { |
- let paragraph = document.createElement("p"); |
- paragraph.innerHTML = topText; |
- tooltip.appendChild(paragraph); |
- } |
- if (bottomTexts.length > 0) |
- { |
- let notes = document.createElement("div"); |
- notes.className = "notes"; |
- for (let bottomText of bottomTexts) |
- { |
- let paragraph = document.createElement("p"); |
- paragraph.innerHTML = bottomText; |
- notes.appendChild(paragraph); |
- } |
- tooltip.appendChild(notes); |
- } |
+ let paragraph = document.createElement("p"); |
+ paragraph.textContent = getMessage(id); |
+ tooltip.appendChild(paragraph); |
wrapper.appendChild(tooltip); |
} |