| Index: new-options.js |
| =================================================================== |
| --- a/new-options.js |
| +++ b/new-options.js |
| @@ -470,6 +470,22 @@ |
| }); |
| } |
| + function openDocLink(id) |
| + { |
| + getDocLink(id, function(link) |
| + { |
| + if (id == "share-general") |
| + openSharePopup(link); |
| + else |
| + location.href = link; |
| + }); |
| + } |
| + |
| + function switchTab(id) |
| + { |
| + location.hash = id; |
| + } |
| + |
| function onClick(e) |
| { |
| var context = document.querySelector(".show-context-menu"); |
| @@ -488,6 +504,7 @@ |
| element = element.parentElement; |
| } |
| + var element = findParentData(e.target, "action", true); |
| var actions = element.getAttribute("data-action").split(","); |
| for (var i = 0; i < actions.length; i++) |
| { |
| @@ -527,7 +544,12 @@ |
| closeDialog(); |
| break; |
| case "open-dialog": |
| - openDialog(element.getAttribute("data-dialog")); |
| + var dialog = findParentData(element, "dialog", false); |
| + openDialog(dialog); |
| + break; |
| + case "open-doclink": |
| + var doclink = findParentData(element, "doclink", false); |
| + openDocLink(doclink); |
| break; |
| case "save-custom-filters": |
| sendMessageHandleErrors( |
| @@ -542,8 +564,8 @@ |
| }); |
| break; |
| case "switch-tab": |
| - document.body.setAttribute("data-tab", |
| - element.getAttribute("data-tab")); |
| + var tabId = findParentData(e.target, "tab", false); |
| + switchTab(tabId); |
| break; |
| case "toggle-pref": |
| ext.backgroundPage.sendMessage( |
| @@ -611,6 +633,122 @@ |
| } |
| } |
| + function getKey(e) |
| + { |
| + // e.keyCode has been deprecated so we attempt to use e.key |
| + if ("key" in e) |
| + return e.key; |
| + return getKey.keys[e.keyCode]; |
| + } |
| + getKey.keys = { |
| + 9: "Tab", |
| + 13: "Enter", |
| + 27: "Escape", |
| + 37: "ArrowLeft", |
| + 38: "ArrowUp", |
| + 39: "ArrowRight", |
| + 40: "ArrowDown" |
| + }; |
| + |
| + function onKeyUp(e) |
| + { |
| + var key = getKey(e); |
| + var element = document.activeElement; |
| + if (!key || !element) |
| + return; |
| + |
| + var container = findParentData(element, "action", true); |
| + if (!container || !container.hasAttribute("data-keys")) |
| + return; |
| + |
| + var keys = container.getAttribute("data-keys").split(" "); |
| + if (keys.indexOf(key) < 0) |
| + return; |
| + |
| + switch (container.getAttribute("data-action")) |
| + { |
| + case "add-domain-exception": |
| + addWhitelistedDomain(); |
| + break; |
| + case "open-doclink": |
| + var doclink = findParentData(element, "doclink", false); |
| + openDocLink(doclink); |
| + break; |
| + case "switch-tab": |
| + if (key == "Enter") |
| + { |
| + var tabId = findParentData(element, "tab", false); |
| + switchTab(tabId); |
| + } |
| + else if (element.hasAttribute("aria-selected")) |
| + { |
| + if (key == "ArrowLeft" || key == "ArrowUp") |
| + { |
| + element = element.previousElementSibling |
| + || container.lastElementChild; |
| + } |
| + else if (key == "ArrowRight" || key == "ArrowDown") |
| + { |
| + element = element.nextElementSibling |
| + || container.firstElementChild; |
| + } |
| + |
| + var tabId = findParentData(element, "tab", false); |
| + switchTab(tabId); |
| + } |
| + break; |
| + } |
| + } |
| + |
| + function selectTabItem(tabId, container, focus) |
| + { |
| + // Show tab content |
| + document.body.setAttribute("data-tab", tabId); |
| + |
| + // Select tab |
| + var tabList = container.querySelector("[role='tablist']"); |
| + if (!tabList) |
| + return null; |
| + |
| + var previousTab = tabList.querySelector("[aria-selected]"); |
| + previousTab.removeAttribute("aria-selected"); |
| + previousTab.setAttribute("tabindex", -1); |
| + |
| + var tab = tabList.querySelector("li[data-tab='" + tabId + "']"); |
| + tab.setAttribute("aria-selected", true); |
| + tab.setAttribute("tabindex", 0); |
| + |
| + var tabContentId = tab.getAttribute("aria-controls"); |
| + var tabContent = document.getElementById(tabContentId); |
| + |
| + // Select sub tabs |
| + if (tab.hasAttribute("data-subtab")) |
| + selectTabItem(tab.getAttribute("data-subtab"), tabContent, false); |
| + |
| + if (tab && focus) |
| + tab.focus(); |
| + |
| + return tabContent; |
| + } |
| + |
| + function onHashChange() |
| + { |
| + var hash = location.hash.substr(1); |
| + if (!hash) |
| + return; |
| + |
| + // Select tab and parent tabs |
| + var tabIds = hash.split("-"); |
| + var tabContent = document.body; |
| + for (var i = 0; i < tabIds.length; i++) |
| + { |
| + var tabId = tabIds.slice(0, i + 1).join("-"); |
| + tabContent = selectTabItem(tabId, tabContent, true); |
| + if (!tabContent) |
| + break; |
| + } |
| + } |
| + |
| function onDOMLoaded() |
| { |
| populateLists(); |
| @@ -623,19 +761,6 @@ |
| searchStyle.innerHTML = "#all-lang-table li:not([data-search*=\"" + this.value.toLowerCase() + "\"]) { display: none; }"; |
| } |
| - function getKey(e) |
| - { |
| - // e.keyCode has been deprecated so we attempt to use e.key |
| - if ("key" in e) |
| - return e.key; |
| - return getKey.keys[e.keyCode]; |
| - } |
| - getKey.keys = { |
| - 9: "Tab", |
| - 13: "Enter", |
| - 27: "Escape" |
| - }; |
| - |
| // Initialize navigation sidebar |
| ext.backgroundPage.sendMessage( |
| { |
| @@ -651,16 +776,12 @@ |
| E("link-version").setAttribute("href", link); |
| }); |
| - getDocLink("contribute", function(link) |
| - { |
| - document.querySelector("#tab-contribute a").setAttribute("href", link); |
| - }); |
| - |
| updateShareLink(); |
| updateTooltips(); |
| // Initialize interactive UI elements |
| document.body.addEventListener("click", onClick, false); |
| + document.body.addEventListener("keyup", onKeyUp, false); |
| var placeholderValue = getMessage("options_dialog_language_find"); |
| E("find-language").setAttribute("placeholder", placeholderValue); |
| E("find-language").addEventListener("keyup", onFindLanguageKeyUp, false); |
| @@ -748,6 +869,8 @@ |
| break; |
| } |
| }, false); |
| + |
| + onHashChange(); |
| } |
| var focusedBeforeDialog = null; |
| @@ -1005,13 +1128,6 @@ |
| checkbox.setAttribute("aria-checked", value); |
| } |
| - function onShareLinkClick(e) |
| - { |
| - e.preventDefault(); |
| - |
| - getDocLink("share-general", openSharePopup); |
| - } |
| - |
| function updateShareLink() |
| { |
| var shareResources = [ |
| @@ -1028,14 +1144,7 @@ |
| if (!--checksRemaining) |
| { |
| // Hide the share tab if a script on the share page would be blocked |
| - var tab = E("tab-share"); |
| - if (isAnyBlocked) |
| - { |
| - tab.hidden = true; |
| - tab.removeEventListener("click", onShareLinkClick, false); |
| - } |
| - else |
| - tab.addEventListener("click", onShareLinkClick, false); |
| + E("tab-share").hidden = isAnyBlocked; |
| } |
| } |
| @@ -1177,4 +1286,5 @@ |
| }); |
| window.addEventListener("DOMContentLoaded", onDOMLoaded, false); |
| + window.addEventListener("hashchange", onHashChange, false); |
| })(); |