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

Side by Side Diff: options.js

Issue 29334038: Issue 2802/2358 - Dynamically generate tooltips in options page (Closed)
Patch Set: Created Jan. 19, 2016, 6:24 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
« no previous file with comments | « options.html ('k') | skin/options.css » ('j') | skin/options.css » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 { 61 {
62 var table = E(this.details[j].id); 62 var table = E(this.details[j].id);
63 var template = table.querySelector("template"); 63 var template = table.querySelector("template");
64 for (var i = 0; i < arguments.length; i++) 64 for (var i = 0; i < arguments.length; i++)
65 { 65 {
66 var item = arguments[i]; 66 var item = arguments[i];
67 var text = item.title || item.url || item.text; 67 var text = item.title || item.url || item.text;
68 var listItem = document.createElement("li"); 68 var listItem = document.createElement("li");
69 listItem.appendChild(document.importNode(template.content, true)); 69 listItem.appendChild(document.importNode(template.content, true));
70 listItem.setAttribute("data-access", item.url || item.text); 70 listItem.setAttribute("data-access", item.url || item.text);
71 listItem.querySelector(".display").textContent = text; 71 var display = listItem.querySelector(".display");
72 if (item.type)
73 display.setAttribute("data-tooltip-value", item.type);
74 display.textContent = text;
72 if (text) 75 if (text)
73 listItem.setAttribute("data-search", text.toLowerCase()); 76 listItem.setAttribute("data-search", text.toLowerCase());
74 77
75 var control = listItem.querySelector(".control"); 78 var control = listItem.querySelector(".control");
76 if (control) 79 if (control)
77 { 80 {
78 control.addEventListener("click", this.details[j].onClick, false); 81 control.addEventListener("click", this.details[j].onClick, false);
79 control.checked = item.disabled == false; 82 control.checked = item.disabled == false;
80 } 83 }
81 84
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 collections.langs.addItems(subscription); 242 collections.langs.addItems(subscription);
240 } 243 }
241 else 244 else
242 { 245 {
243 collections.allLangs.addItems(subscription); 246 collections.allLangs.addItems(subscription);
244 collections.langs.removeItem(subscription); 247 collections.langs.removeItem(subscription);
245 } 248 }
246 } 249 }
247 } 250 }
248 } 251 }
252 updateTooltips();
249 } 253 }
250 254
251 if (!Object.observe) 255 if (!Object.observe)
252 { 256 {
253 // Currently only "disabled" property of subscription used for observa tion 257 // Currently only "disabled" property of subscription used for observa tion
254 // but with Advanced tab implementation we should also add more proper ties. 258 // but with Advanced tab implementation we should also add more proper ties.
255 ["disabled"].forEach(function(property) 259 ["disabled"].forEach(function(property)
256 { 260 {
257 subscription["$" + property] = subscription[property]; 261 subscription["$" + property] = subscription[property];
258 Object.defineProperty(subscription, property, 262 Object.defineProperty(subscription, property,
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 return response.text(); 322 return response.text();
319 }) 323 })
320 .then(function(text) 324 .then(function(text)
321 { 325 {
322 var list = document.getElementById("subscriptionSelector"); 326 var list = document.getElementById("subscriptionSelector");
323 var doc = new DOMParser().parseFromString(text, "application/xml"); 327 var doc = new DOMParser().parseFromString(text, "application/xml");
324 var elements = doc.documentElement.getElementsByTagName("subscription"); 328 var elements = doc.documentElement.getElementsByTagName("subscription");
325 for (var i = 0; i < elements.length; i++) 329 for (var i = 0; i < elements.length; i++)
326 { 330 {
327 var element = elements[i]; 331 var element = elements[i];
328 var subscription = Object.create(null); 332 var recommendation = {type: element.getAttribute("type")};
329 subscription.title = element.getAttribute("title"); 333 var subscription = {
330 subscription.url = element.getAttribute("url"); 334 title: element.getAttribute("title"),
331 subscription.disabled = null; 335 url: element.getAttribute("url"),
332 subscription.downloadStatus = null; 336 disabled: null,
333 subscription.homepage = null; 337 downloadStatus: null,
334 subscription.lastSuccess = null; 338 homepage: null,
335 var recommendation = Object.create(null); 339 lastSuccess: null,
336 recommendation.type = element.getAttribute("type"); 340 type: recommendation.type
341 };
337 var prefix = element.getAttribute("prefixes"); 342 var prefix = element.getAttribute("prefixes");
338 if (prefix) 343 if (prefix)
339 { 344 {
340 prefix = prefix.replace(/\W/g, "_"); 345 prefix = prefix.replace(/\W/g, "_");
341 subscription.title = ext.i18n.getMessage("options_language_" + prefi x); 346 subscription.title = ext.i18n.getMessage("options_language_" + prefi x);
342 } 347 }
343 else 348 else
344 { 349 {
345 var type = recommendation.type.replace(/\W/g, "_"); 350 var type = recommendation.type.replace(/\W/g, "_");
346 subscription.title = ext.i18n.getMessage("common_feature_" + type + "_title"); 351 subscription.title = ext.i18n.getMessage("common_feature_" + type + "_title");
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
774 } 779 }
775 else 780 else
776 tab.addEventListener("click", onShareLinkClick, false); 781 tab.addEventListener("click", onShareLinkClick, false);
777 } 782 }
778 } 783 }
779 784
780 for (var i = 0; i < shareResources.length; i++) 785 for (var i = 0; i < shareResources.length; i++)
781 checkShareResource(shareResources[i], onResult); 786 checkShareResource(shareResources[i], onResult);
782 } 787 }
783 788
789 function getMessages(id)
790 {
791 var messages = [];
792 for (var i = 1; true; i++)
793 {
794 var message = ext.i18n.getMessage(id + "_" + i);
795 if (!message)
796 break;
797
798 messages.push(message);
799 }
800 return messages;
801 }
802
803 function updateTooltips()
804 {
805 var anchors = document.querySelectorAll(":not(.tooltip) > [data-tooltip]");
806 for (var i = 0; i < anchors.length; i++)
807 {
808 var anchor = anchors[i];
809 var id = anchor.getAttribute("data-tooltip");
810 id = id.replace("%value%", anchor.getAttribute("data-tooltip-value"));
811
812 var wrapper = document.createElement("div");
813 wrapper.className = "tooltip";
814 anchor.parentNode.replaceChild(wrapper, anchor);
815 wrapper.appendChild(anchor);
816
817 var topTexts = getMessages(id);
818 var bottomTexts = getMessages(id + "_notes");
819
820 // We have to use native tooltips to avoid issues when attaching a tooltip
821 // to an element in a scrollable list or otherwise it might get cut off
822 if (anchor.hasAttribute("data-tooltip-native"))
823 {
824 var title = topTexts.concat(bottomTexts).join("\n\n");
825 anchor.setAttribute("title", title);
826 continue;
827 }
828
829 var tooltip = document.createElement("div");
830 tooltip.setAttribute("role", "tooltip");
831
832 var flip = anchor.getAttribute("data-tooltip-flip");
833 if (flip)
834 tooltip.className = "flip-" + flip;
835
836 var imageSource = anchor.getAttribute("data-tooltip-image");
837 if (imageSource)
838 {
839 var image = document.createElement("img");
840 image.src = imageSource;
841 image.alt = "";
842 tooltip.appendChild(image);
843 }
844
845 for (var j = 0; j < topTexts.length; j++)
846 {
847 var paragraph = document.createElement("p");
848 paragraph.textContent = topTexts[j];
849 tooltip.appendChild(paragraph);
850 }
851 if (bottomTexts.length > 0)
852 {
853 var notes = document.createElement("div");
854 notes.className = "notes";
855 for (var j = 0; j < bottomTexts.length; j++)
856 {
857 var paragraph = document.createElement("p");
858 paragraph.textContent = bottomTexts[j];
859 notes.appendChild(paragraph);
860 }
861 tooltip.appendChild(notes);
862 }
863
864 wrapper.appendChild(tooltip);
865 }
866 }
867
784 ext.onMessage.addListener(function(message) 868 ext.onMessage.addListener(function(message)
785 { 869 {
786 switch (message.type) 870 switch (message.type)
787 { 871 {
788 case "app.listen": 872 case "app.listen":
789 if (message.action == "addSubscription") 873 if (message.action == "addSubscription")
790 { 874 {
791 var subscription = message.args[0]; 875 var subscription = message.args[0];
792 var dialog = E("dialog-content-predefined"); 876 var dialog = E("dialog-content-predefined");
793 dialog.querySelector("h3").textContent = subscription.title || ""; 877 dialog.querySelector("h3").textContent = subscription.title || "";
(...skipping 25 matching lines...) Expand all
819 filter: ["added", "loaded", "removed"] 903 filter: ["added", "loaded", "removed"]
820 }); 904 });
821 ext.backgroundPage.sendMessage( 905 ext.backgroundPage.sendMessage(
822 { 906 {
823 type: "subscriptions.listen", 907 type: "subscriptions.listen",
824 filter: ["added", "disabled", "homepage", "removed", "title"] 908 filter: ["added", "disabled", "homepage", "removed", "title"]
825 }); 909 });
826 910
827 window.addEventListener("DOMContentLoaded", onDOMLoaded, false); 911 window.addEventListener("DOMContentLoaded", onDOMLoaded, false);
828 })(); 912 })();
OLDNEW
« no previous file with comments | « options.html ('k') | skin/options.css » ('j') | skin/options.css » ('J')

Powered by Google App Engine
This is Rietveld