| Index: new-options.js |
| =================================================================== |
| --- a/new-options.js |
| +++ b/new-options.js |
| @@ -20,7 +20,6 @@ |
| (function() |
| { |
| var subscriptionsMap = Object.create(null); |
| - var recommendationsMap = Object.create(null); |
| var filtersMap = Object.create(null); |
| var collections = Object.create(null); |
| var acceptableAdsUrl = null; |
| @@ -108,6 +107,12 @@ |
| var labelId = "label-" + (++maxLabelId); |
| var label = listItem.querySelector(".display"); |
| label.setAttribute("id", labelId); |
| + if (item.recommended && label.hasAttribute("data-tooltip")) |
| + { |
| + var tooltipId = label.getAttribute("data-tooltip"); |
| + tooltipId = tooltipId.replace("%value%", item.recommended); |
| + label.setAttribute("data-tooltip", tooltipId); |
| + } |
| var control = listItem.querySelector(".control"); |
| if (control) |
| @@ -388,9 +393,7 @@ |
| function updateLanguageCollections(subscription) |
| { |
| - var recommendation = recommendationsMap[subscription.url]; |
| - |
| - if (recommendation && recommendation.type == "ads") |
| + if (subscription.recommended == "ads") |
| { |
| if (subscription.disabled) |
| { |
| @@ -408,10 +411,9 @@ |
| function addSubscription(subscription) |
| { |
| var collection; |
| - if (subscription.url in recommendationsMap) |
| + if (subscription.recommended) |
| { |
| - var recommendation = recommendationsMap[subscription.url]; |
| - if (recommendation.type != "ads") |
| + if (subscription.recommended != "ads") |
| collection = collections.popular; |
| else if (subscription.disabled == false) |
| collection = collections.langs; |
| @@ -425,6 +427,7 @@ |
| collection.addItems(subscription); |
| subscriptionsMap[subscription.url] = subscription; |
| + updateTooltips(); |
| } |
| function updateSubscription(subscription) |
| @@ -432,7 +435,7 @@ |
| var knownSubscription = subscriptionsMap[subscription.url]; |
| for (var property in subscription) |
| { |
| - if (property == "title" && subscription.url in recommendationsMap) |
| + if (property == "title" && subscription.recommended) |
| knownSubscription.originalTitle = subscription.title; |
| else |
| knownSubscription[property] = subscription[property]; |
| @@ -473,14 +476,16 @@ |
| for (var i = 0; i < elements.length; i++) |
| { |
| var element = elements[i]; |
| - var subscription = Object.create(null); |
| - subscription.originalTitle = element.getAttribute("title"); |
| - subscription.url = element.getAttribute("url"); |
| - subscription.disabled = null; |
| - subscription.downloadStatus = null; |
| - subscription.homepage = null; |
| - var recommendation = Object.create(null); |
| - recommendation.type = element.getAttribute("type"); |
| + var type = element.getAttribute("type"); |
| + var subscription = { |
| + disabled: null, |
| + downloadStatus: null, |
| + homepage: null, |
| + originalTitle: element.getAttribute("title"), |
| + recommended: type, |
| + url: element.getAttribute("url") |
| + }; |
| + |
| var prefix = element.getAttribute("prefixes"); |
| if (prefix) |
| { |
| @@ -489,11 +494,10 @@ |
| } |
| else |
| { |
| - var type = recommendation.type.replace(/\W/g, "_"); |
| + type = type.replace(/\W/g, "_"); |
| subscription.title = getMessage("common_feature_" + type + "_title"); |
| } |
| - recommendationsMap[subscription.url] = recommendation; |
| addSubscription(subscription); |
| } |
| }); |
| @@ -679,6 +683,7 @@ |
| }); |
| updateShareLink(); |
| + updateTooltips(); |
| // Initialize interactive UI elements |
| document.body.addEventListener("click", onClick, false); |
| @@ -800,7 +805,6 @@ |
| { |
| subscriptionsMap = Object.create(null); |
| filtersMap = Object.create(null); |
| - recommendationsMap = Object.create(null); |
| // Empty collections and lists |
| for (var property in collections) |
| @@ -950,8 +954,7 @@ |
| case "removed": |
| var knownSubscription = subscriptionsMap[subscription.url]; |
| - if (subscription.url == acceptableAdsUrl || |
| - subscription.url in recommendationsMap) |
| + if (subscription.url == acceptableAdsUrl || subscription.recommended) |
| { |
| subscription.disabled = true; |
| onSubscriptionMessage("disabled", subscription); |
| @@ -1067,6 +1070,84 @@ |
| checkShareResource(shareResources[i], onResult); |
| } |
| + function getMessages(id) |
| + { |
| + var messages = []; |
| + for (var i = 1; true; i++) |
| + { |
| + var message = ext.i18n.getMessage(id + "_" + i); |
| + if (!message) |
| + break; |
| + |
| + messages.push(message); |
| + } |
| + return messages; |
| + } |
| + |
| + function updateTooltips() |
| + { |
| + var anchors = document.querySelectorAll(":not(.tooltip) > [data-tooltip]"); |
| + for (var i = 0; i < anchors.length; i++) |
| + { |
| + var anchor = anchors[i]; |
| + var id = anchor.getAttribute("data-tooltip"); |
| + |
| + var wrapper = document.createElement("div"); |
| + wrapper.className = "tooltip"; |
| + anchor.parentNode.replaceChild(wrapper, anchor); |
| + wrapper.appendChild(anchor); |
| + |
| + var topTexts = getMessages(id); |
| + var 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")) |
| + { |
| + var title = topTexts.concat(bottomTexts).join("\n\n"); |
| + anchor.setAttribute("title", title); |
| + continue; |
| + } |
| + |
| + var tooltip = document.createElement("div"); |
| + tooltip.setAttribute("role", "tooltip"); |
| + |
| + var flip = anchor.getAttribute("data-tooltip-flip"); |
| + if (flip) |
| + tooltip.className = "flip-" + flip; |
| + |
| + var imageSource = anchor.getAttribute("data-tooltip-image"); |
| + if (imageSource) |
| + { |
| + var image = document.createElement("img"); |
| + image.src = imageSource; |
| + image.alt = ""; |
| + tooltip.appendChild(image); |
| + } |
| + |
| + for (var j = 0; j < topTexts.length; j++) |
| + { |
| + var paragraph = document.createElement("p"); |
| + paragraph.innerHTML = topTexts[j]; |
| + tooltip.appendChild(paragraph); |
| + } |
| + if (bottomTexts.length > 0) |
| + { |
| + var notes = document.createElement("div"); |
| + notes.className = "notes"; |
| + for (var j = 0; j < bottomTexts.length; j++) |
| + { |
| + var paragraph = document.createElement("p"); |
| + paragraph.innerHTML = bottomTexts[j]; |
| + notes.appendChild(paragraph); |
| + } |
| + tooltip.appendChild(notes); |
| + } |
| + |
| + wrapper.appendChild(tooltip); |
| + } |
| + } |
| + |
| ext.onMessage.addListener(function(message) |
| { |
| switch (message.type) |