This commit is contained in:
karol@jagiello.it 2018-12-29 23:14:11 +01:00
parent 8ee996217a
commit cae1943bce
8 changed files with 569 additions and 324 deletions

File diff suppressed because one or more lines are too long

View File

@ -182,6 +182,10 @@ function StartBackgroundListeners() {
sendResponse(b.bg_running); sendResponse(b.bg_running);
return; return;
} }
if (message.command == "is_bg_safe_mode") {
sendResponse(b.safe_mode);
return;
}
if (message.command == "reload") { if (message.command == "reload") {
window.location.reload(); window.location.reload();
return; return;
@ -309,6 +313,32 @@ function StartBackgroundListeners() {
b.schedule_save++; b.schedule_save++;
return; return;
} }
if (message.command == "all_tabs_exist") {
let yes = true;
for (let Win in message.windows) {
for (let Tab in message.windows[Win].tabs) {
if (b.tabs[message.windows[Win].tabs[Tab].id] == undefined) {
yes = false;
}
}
}
sendResponse(yes);
return;
}
if (message.command == "does_tabs_match") {
let match = true;
for (let Win in message.windows) {
for (let Tab in message.windows[Win].tabs) {
if (b.tabs[message.windows[Win].tabs[Tab].id] != undefined) {
if (message.windows[Win].tabs[Tab].parent !== b.tabs[message.windows[Win].tabs[Tab].id].parent) {
match = false;
}
}
}
}
sendResponse(match);
return;
}
if (message.command == "discard_tab") { if (message.command == "discard_tab") {
DiscardTab(message.tabId); DiscardTab(message.tabId);
return; return;
@ -547,14 +577,6 @@ function SafeModeCheck() {
} }
}); });
} }
if (browserId == "O") {
chrome.runtime.sendMessage({command: "reload_sidebar"});
window.location.reload();
}
if (browserId == "V") {
chrome.runtime.sendMessage({command: "reload_sidebar"});
window.location.reload();
}
} }
}, 2000); }, 2000);
} }

View File

@ -1,113 +1,9 @@
// VIVALDI // VIVALDI
function VivaldiLegacyAddWindowData(win) {
b.windows[win.id] = { activeTabId: 0, group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: { tab_list: { id: "tab_list", index: 0, active_tab: 0, prev_active_tab: 0, name: labels.ungrouped_group, font: "" } }, folders: {} };
}
function VivaldiLegacyHashURL(tab) {
if (b.tabs[tab.id] == undefined) { b.tabs[tab.id] = { hash: 0, parent: tab.pinned ? "pin_list" : (b.windows[tab.windowId] ? b.windows[tab.windowId].active_group : "tab_list"), index: (Object.keys(b.tabs).length + 1), expand: "n" }; }
let hash = 0;
for (let charIndex = 0; charIndex < tab.url.length; charIndex++) {
hash += tab.url.charCodeAt(charIndex);
}
b.tabs[tab.id].hash = hash;
}
function VivaldiStart() { function VivaldiStart() {
chrome.windows.getAll({ windowTypes: ['normal'], populate: true }, function(w) { chrome.windows.getAll({ windowTypes: ['normal'], populate: true }, function(w) {
chrome.storage.local.get(null, function(storage) { chrome.storage.local.get(null, function(storage) {
// LOAD PREFERENCES // LOAD PREFERENCES
Preferences_GetCurrentPreferences(storage); Preferences_GetCurrentPreferences(storage);
// LEGACY START TO CONVERT DATA
if ((storage.data_version == undefined && storage.tabs != undefined && storage.tabs.length) || (storage.data_version != undefined && storage.data_version < 2)) {
b.safe_mode = true;
let refTabs = {};
let refWins = {};
let tabs_matched = 0;
let LoadedWindows = storage.windows ? storage.windows : [];
let LoadedTabs = storage.tabs ? storage.tabs : [];
let CurrentTabsCount = 0;
for (let win of w) {
CurrentTabsCount += win.tabs.length;
}
for (let win of w) {
let url1 = win.tabs[0].url;
let url2 = win.tabs[win.tabs.length - 1].url;
VivaldiLegacyAddWindowData(win);
if (opt.skip_load == false) {
for (let loadedWin of LoadedWindows) {
if ((loadedWin.url1 == url1 || loadedWin.url2 == url2) && refWins[loadedWin.id] == undefined) {
refWins[loadedWin.id] = win.id;
if (loadedWin.group_bar) b.windows[win.id].group_bar = loadedWin.group_bar;
if (loadedWin.search_filter) b.windows[win.id].search_filter = loadedWin.search_filter;
if (loadedWin.active_shelf) b.windows[win.id].active_shelf = loadedWin.active_shelf;
if (loadedWin.active_group) b.windows[win.id].active_group = loadedWin.active_group;
if (Object.keys(loadedWin.groups).length > 0) b.windows[win.id].groups = Object.assign({}, loadedWin.groups);
if (Object.keys(loadedWin.folders).length > 0) b.windows[win.id].folders = Object.assign({}, loadedWin.folders);
break;
}
}
}
}
for (let win of w) {
for (let tab of win.tabs) {
VivaldiLegacyHashURL(tab);
if (tab.active) b.windows[win.id].activeTabId = tab.id;
}
}
if (opt.skip_load == false && LoadedTabs.length > 0) {
for (let win of w) {
for (tab of win.tabs) {
for (let loadedTab of LoadedTabs) {
if (loadedTab.hash == b.tabs[tab.id].hash && refTabs[loadedTab.id] == undefined) {
refTabs[loadedTab.id] = tab.id;
if (loadedTab.parent) b.tabs[tab.id].parent = loadedTab.parent;
if (loadedTab.index) b.tabs[tab.id].index = loadedTab.index;
if (loadedTab.expand) b.tabs[tab.id].expand = loadedTab.expand;
tabs_matched++;
break;
}
}
}
}
for (let tabId in b.tabs) {
if (refTabs[b.tabs[tabId].parent] != undefined) b.tabs[tabId].parent = refTabs[b.tabs[tabId].parent];
}
for (let windowId in b.windows) {
for (let group in b.windows[windowId].groups) {
if (refTabs[b.windows[windowId].groups[group].active_tab]) b.windows[windowId].groups[group].active_tab = refTabs[b.windows[windowId].groups[group].active_tab];
if (refTabs[b.windows[windowId].groups[group].prev_active_tab]) b.windows[windowId].groups[group].prev_active_tab = refTabs[b.windows[windowId].groups[group].prev_active_tab];
}
}
}
for (let win of w) {
if (b.windows[win.id]) b.windows[win.id].ttid = JSON.parse(win.extData).ext_id;
for (let tab of win.tabs) {
if (b.tabs[tab.id]) b.tabs[tab.id].ttid = JSON.parse(tab.extData).ext_id;
}
}
let Windows = {};
let Tabs = {};
for (let win of w) {
if (b.windows[win.id] != undefined && b.windows[win.id].ttid != undefined && b.windows[win.id].group_bar != undefined && b.windows[win.id].search_filter != undefined && b.windows[win.id].active_shelf != undefined && b.windows[win.id].active_group != undefined && b.windows[win.id].groups != undefined && b.windows[win.id].folders != undefined) {
Windows[b.windows[win.id].ttid] = { ttid: b.windows[win.id].ttid, group_bar: b.windows[win.id].group_bar, search_filter: b.windows[win.id].search_filter, active_shelf: b.windows[win.id].active_shelf, active_group: b.windows[win.id].active_group, groups: b.windows[win.id].groups, folders: b.windows[win.id].folders };
for (let groupId in b.windows[win.id].groups) {
if (b.tabs[b.windows[win.id].groups[groupId].active_tab]) Windows[b.windows[win.id].ttid].groups[groupId].active_tab = b.tabs[b.windows[win.id].groups[groupId].active_tab].ttid;
if (b.tabs[b.windows[win.id].groups[groupId].prev_active_tab]) Windows[b.windows[win.id].ttid].groups[groupId].prev_active_tab = b.tabs[b.windows[win.id].groups[groupId].prev_active_tab].ttid;
}
}
for (let tab of win.tabs) {
if (b.tabs[tab.id] != undefined && b.tabs[tab.id].ttid != undefined && b.tabs[tab.id].parent != undefined && b.tabs[tab.id].index != undefined && b.tabs[tab.id].expand != undefined) {
Tabs[b.tabs[tab.id].ttid] = { ttid: b.tabs[tab.id].ttid, parent: (b.tabs[b.tabs[tab.id].parent] ? b.tabs[b.tabs[tab.id].parent].ttid : b.tabs[tab.id].parent), index: b.tabs[tab.id].index, expand: b.tabs[tab.id].expand };
}
}
}
chrome.storage.local.set({ data_version: 2, windows: Windows, tabs: Tabs });
chrome.storage.local.remove("t_count");
chrome.storage.local.remove("w_count");
chrome.runtime.sendMessage({command: "reload_sidebar"});
window.location.reload();
}
if (storage.data_version == undefined || storage.data_version == 2) { if (storage.data_version == undefined || storage.data_version == 2) {
// load tabs and windows from storage // load tabs and windows from storage
let refTabs = {}; let refTabs = {};
@ -251,8 +147,18 @@ async function VivaldiAutoSaveData(BAK, LoopTimer) {
function VivaldiAddWindowData(win) { function VivaldiAddWindowData(win) {
let extData = JSON.parse(win.extData); let extData = win.extData.match("ext_id") != null ? JSON.parse(win.extData).ext_id : win.index;
if (b.windows[win.id] == undefined) b.windows[win.id] = { ttid: (win.extData.match("ext_id") != null ? JSON.parse(win.extData).ext_id : win.index), activeTabId: 0, group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: { tab_list: { id: "tab_list", index: 0, active_tab: 0, prev_active_tab: 0, name: labels.ungrouped_group, font: "" } }, folders: {} }; if (b.windows[win.id] == undefined) b.windows[win.id] = { ttid: extData, activeTabId: 0, group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: { tab_list: { id: "tab_list", index: 0, active_tab: 0, prev_active_tab: 0, name: labels.ungrouped_group, font: "" } }, folders: {} };
if (extData == win.index) {
let retry = setInterval(function() {
chrome.windows.get(win.id, {populate: false}, function(retry_win) {
if (retry_win.extData.match("ext_id") != null) {
b.windows[retry_win.id].ttid = JSON.parse(retry_win.extData).ext_id;
clearInterval(retry);
}
});
}, 2000);
}
return b.windows[win.id].ttid; return b.windows[win.id].ttid;
} }

View File

@ -14,7 +14,8 @@
"19": "icons/16.png", "19": "icons/16.png",
"16": "icons/16.png" "16": "icons/16.png"
}, },
"permissions": [ "tabs", "sessions", "storage", "unlimitedStorage", "bookmarks", "tabHide" ], "permissions": [ "<all_urls>", "tabs", "sessions", "storage", "unlimitedStorage", "bookmarks", "tabHide" ],
"sidebar_action": { "sidebar_action": {
"default_icon": { "default_icon": {
"16": "icons/16.png", "16": "icons/16.png",
@ -28,25 +29,21 @@
"browser_action": { "browser_action": {
"default_icon": "icons/24.png" "default_icon": "icons/24.png"
}, },
"commands": {
"_execute_browser_action": {
"suggested_key": { "default": "F1" },
"description": "toggle Tree Tabs"
},
"close_tree": {
"suggested_key": { "default": "Alt+W" },
"description": "close tree"
}
},
"applications": { "applications": {
"gecko": { "gecko": {
"id": "TreeTabs@jagiello.it", "id": "TreeTabs@jagiello.it",
"strict_min_version": "63.0" "strict_min_version": "57.0"
} }
}, },
"options_ui": { "options_ui": {
"page": "options/options.html", "page": "options/options.html",
"open_in_tab": true "open_in_tab": true
}, },
"version": "1.9.0" "commands": {
"close_tree": {
"suggested_key": { "default": "Alt+W" },
"description": "close tree"
}
},
"version": "1.9.1"
} }

View File

@ -375,8 +375,6 @@ function Manager_ImportMergeTabs(LoadedWindows) {
if (opt.debug) Utils_log("f: Manager_ImportMergeTabs"); if (opt.debug) Utils_log("f: Manager_ImportMergeTabs");
Manager_ShowStatusBar({show: true, spinner: true, message: chrome.i18n.getMessage("status_bar_loaded_tree_structure")}); Manager_ShowStatusBar({show: true, spinner: true, message: chrome.i18n.getMessage("status_bar_loaded_tree_structure")});
chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(CurrentWindows) { chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(CurrentWindows) {
let TotalTabsCount = 0;
let tabsMade = 0;
let New = {}; let New = {};
for (let CurrentWindow of CurrentWindows) { // Current Windows for (let CurrentWindow of CurrentWindows) { // Current Windows
for (let LoadedWindow of LoadedWindows) { // Loaded Windows for (let LoadedWindow of LoadedWindows) { // Loaded Windows
@ -410,7 +408,6 @@ function Manager_ImportMergeTabs(LoadedWindows) {
} }
} }
for (let LoadedWindow of LoadedWindows) { // CONVERT ARRAY TABS TO OBJECTS, FOR MISSING WINDOWS for (let LoadedWindow of LoadedWindows) { // CONVERT ARRAY TABS TO OBJECTS, FOR MISSING WINDOWS
TotalTabsCount += LoadedWindow.tabs.length;
if (New[LoadedWindow.id] == undefined) { if (New[LoadedWindow.id] == undefined) {
New[LoadedWindow.id] = Object.assign({}, LoadedWindow); New[LoadedWindow.id] = Object.assign({}, LoadedWindow);
let NewTabs = {}; let NewTabs = {};
@ -423,7 +420,6 @@ function Manager_ImportMergeTabs(LoadedWindows) {
for (let windowId in New) { // Loaded Windows for (let windowId in New) { // Loaded Windows
if (New[windowId].oldId == undefined) { // missing window, lets make one if (New[windowId].oldId == undefined) { // missing window, lets make one
let FirstTabId = Object.keys(New[windowId].tabs)[0]; let FirstTabId = Object.keys(New[windowId].tabs)[0];
let tabsMade = 0;
let window_params; let window_params;
if (browserId == "F") { if (browserId == "F") {
if ((New[windowId].tabs[FirstTabId].url).startsWith("about")) { if ((New[windowId].tabs[FirstTabId].url).startsWith("about")) {
@ -441,10 +437,7 @@ function Manager_ImportMergeTabs(LoadedWindows) {
New[windowId].oldId = New[windowId].id; New[windowId].oldId = New[windowId].id;
New[windowId].id = new_window.id; New[windowId].id = new_window.id;
if (new_window.tabs[0]) { if (new_window.tabs[0]) {
tabsMade++;
New[windowId].tabs[FirstTabId].oldId = New[windowId].tabs[FirstTabId].id; New[windowId].tabs[FirstTabId].oldId = New[windowId].tabs[FirstTabId].id;
New[windowId].tabs[FirstTabId].id = new_window.tabs[0].id; New[windowId].tabs[FirstTabId].id = new_window.tabs[0].id;
if (New[windowId].tabs[FirstTabId].parent == "pin_list") chrome.tabs.update(new_window.tabs[0].id, {pinned: true}); if (New[windowId].tabs[FirstTabId].parent == "pin_list") chrome.tabs.update(new_window.tabs[0].id, {pinned: true});
@ -462,12 +455,10 @@ function Manager_ImportMergeTabs(LoadedWindows) {
params = {active: false, windowId: new_window.id, url: New[windowId].tabs[Tab].url}; params = {active: false, windowId: new_window.id, url: New[windowId].tabs[Tab].url};
} }
chrome.tabs.create(params, function(new_tab) { chrome.tabs.create(params, function(new_tab) {
tabsMade++;
if (new_tab) { if (new_tab) {
New[windowId].tabs[Tab].oldId = New[windowId].tabs[Tab].id; New[windowId].tabs[Tab].oldId = New[windowId].tabs[Tab].id;
New[windowId].tabs[Tab].id = new_tab.id; New[windowId].tabs[Tab].id = new_tab.id;
if (New[windowId].tabs[Tab].parent == "pin_list") chrome.tabs.update(new_tab.id, {pinned: true}); if (New[windowId].tabs[Tab].parent == "pin_list") chrome.tabs.update(new_tab.id, {pinned: true});
if (browserId == "F" && New[windowId].tabs[Tab].favicon > 0) browser.sessions.setTabValue(new_tab.id, "CachedFaviconUrl", New[windowId].favicons[New[windowId].tabs[Tab].favicon]); if (browserId == "F" && New[windowId].tabs[Tab].favicon > 0) browser.sessions.setTabValue(new_tab.id, "CachedFaviconUrl", New[windowId].favicons[New[windowId].tabs[Tab].favicon]);
} }
}); });
@ -503,17 +494,13 @@ function Manager_ImportMergeTabs(LoadedWindows) {
params = {active: false, windowId: New[windowId].id, url: New[windowId].tabs[Tab].url}; params = {active: false, windowId: New[windowId].id, url: New[windowId].tabs[Tab].url};
} }
chrome.tabs.create(params, function(new_tab) { chrome.tabs.create(params, function(new_tab) {
tabsMade++;
if (new_tab) { if (new_tab) {
New[windowId].tabs[Tab].oldId = New[windowId].tabs[Tab].id; New[windowId].tabs[Tab].oldId = New[windowId].tabs[Tab].id;
New[windowId].tabs[Tab].id = new_tab.id; New[windowId].tabs[Tab].id = new_tab.id;
if (New[windowId].tabs[Tab].parent == "pin_list") chrome.tabs.update(new_tab.id, {pinned: true}); if (New[windowId].tabs[Tab].parent == "pin_list") chrome.tabs.update(new_tab.id, {pinned: true});
if (browserId == "F" && New[windowId].tabs[Tab].favicon > 0) browser.sessions.setTabValue(new_tab.id, "CachedFaviconUrl", New[windowId].favicons[New[windowId].tabs[Tab].favicon]); if (browserId == "F" && New[windowId].tabs[Tab].favicon > 0) browser.sessions.setTabValue(new_tab.id, "CachedFaviconUrl", New[windowId].favicons[New[windowId].tabs[Tab].favicon]);
} }
}); });
} else {
tabsMade++;
} }
} }
}); });
@ -522,28 +509,32 @@ function Manager_ImportMergeTabs(LoadedWindows) {
} }
let STOP = 0; let STOP = 0;
let WaitForFinish = setInterval(function() { let WaitForFinish = setInterval(function() {
if (STOP > 10) clearInterval(WaitForFinish); STOP++; if (STOP > 60) clearInterval(WaitForFinish); STOP++; // stop after 5 minutes
if (tabsMade == TotalTabsCount) { chrome.runtime.sendMessage({command: "all_tabs_exist", windows: New}, function(exist) {
setTimeout(function() { if (exist == true) {
for (let windowId in New) { chrome.runtime.sendMessage({command: "does_tabs_match", windows: New}, function(match) {
for (let Tab in New[windowId].tabs) { if (match == false) {
if (New[windowId].tabs[New[windowId].tabs[Tab].parent]) { for (let windowId in New) {
New[windowId].tabs[Tab].parent = New[windowId].tabs[New[windowId].tabs[Tab].parent].id; for (let Tab in New[windowId].tabs) {
if (New[windowId].tabs[New[windowId].tabs[Tab].parent]) {
New[windowId].tabs[Tab].parent = New[windowId].tabs[New[windowId].tabs[Tab].parent].id;
}
}
for (let Tab in New[windowId].tabs) {
chrome.runtime.sendMessage({command: "update_tab", tabId: New[windowId].tabs[Tab].id, tab: {index: New[windowId].tabs[Tab].index, expand: New[windowId].tabs[Tab].expand, parent: New[windowId].tabs[Tab].parent}});
if (browserId != "O" && browserId != "F") setTimeout(function() {chrome.runtime.sendMessage({command: "discard_tab", tabId: New[windowId].tabs[Tab].id});}, 5000);
}
if (New[windowId].id == tt.CurrentWindowId) {
Manager_RecreateTreeStructure(New[windowId].groups, New[windowId].folders, New[windowId].tabs);
} else {
chrome.runtime.sendMessage({command: "remote_update", groups: New[windowId].groups, folders: New[windowId].folders, tabs: New[windowId].tabs, windowId: New[windowId].id});
}
STOP = 61;
} }
} }
for (let Tab in New[windowId].tabs) { });
chrome.runtime.sendMessage({command: "update_tab", tabId: New[windowId].tabs[Tab].id, tab: {index: New[windowId].tabs[Tab].index, expand: New[windowId].tabs[Tab].expand, parent: New[windowId].tabs[Tab].parent}}); }
if (browserId != "O" && browserId != "F") chrome.runtime.sendMessage({command: "discard_tab", tabId: New[windowId].tabs[Tab].id}); });
}
if (New[windowId].id == tt.CurrentWindowId) {
Manager_RecreateTreeStructure(New[windowId].groups, New[windowId].folders, New[windowId].tabs);
} else {
chrome.runtime.sendMessage({command: "remote_update", groups: New[windowId].groups, folders: New[windowId].folders, tabs: New[windowId].tabs, windowId: New[windowId].id});
}
}
}, 3000);
STOP = 11;
}
}, 3000); }, 3000);
}); });
} }
@ -565,24 +556,24 @@ function Manager_RecreateSession(LoadedWindows) {
chrome.windows.create(window_params, function(new_window) { chrome.windows.create(window_params, function(new_window) {
chrome.runtime.sendMessage({command: "save_groups", windowId: new_window.id, groups: LoadedWindow.groups}); chrome.runtime.sendMessage({command: "save_groups", windowId: new_window.id, groups: LoadedWindow.groups});
chrome.runtime.sendMessage({command: "save_folders", windowId: new_window.id, folders: LoadedWindow.folders}); chrome.runtime.sendMessage({command: "save_folders", windowId: new_window.id, folders: LoadedWindow.folders});
NewTabs[LoadedWindow.tabs[0].id] = {id: LoadedWindow.tabs[0].id, newId: new_window.tabs[0].id, expand: LoadedWindow.tabs[0].expand, favicon: LoadedWindow.tabs[0].favicon, index: LoadedWindow.tabs[0].index, parent: LoadedWindow.tabs[0].parent, title: LoadedWindow.tabs[0].title}; NewTabs[LoadedWindow.tabs[0].id] = {id: new_window.tabs[0].id, expand: LoadedWindow.tabs[0].expand, favicon: LoadedWindow.tabs[0].favicon, index: LoadedWindow.tabs[0].index, parent: LoadedWindow.tabs[0].parent, title: LoadedWindow.tabs[0].title};
if (browserId == "F" && LoadedWindow.tabs[0].favicon > 0) browser.sessions.setTabValue(new_window.tabs[0].id, "CachedFaviconUrl", LoadedWindow.favicons[LoadedWindow.tabs[0].favicon]); if (browserId == "F" && LoadedWindow.tabs[0].favicon > 0) browser.sessions.setTabValue(new_window.tabs[0].id, "CachedFaviconUrl", LoadedWindow.favicons[LoadedWindow.tabs[0].favicon]);
for (let Tab of LoadedWindow.tabs) { for (let Tab of LoadedWindow.tabs) {
if (Tab.id != LoadedWindow.tabs[0].id) { // skip first tab if (Tab.id != LoadedWindow.tabs[0].id) { // skip first tab
let params; let params;
if (browserId == "F") { if (browserId == "F") {
if ((Tab.url).startsWith("about")) { if ((Tab.url).startsWith("about")) {
params = {active: false, windowId: tt.CurrentWindowId}; params = {active: false, windowId: new_window.id};
} else { } else {
params = {active: false, windowId: tt.CurrentWindowId, url: Tab.url, discarded: true, title: Tab.title}; params = {active: false, windowId: new_window.id, url: Tab.url, discarded: true, title: Tab.title};
} }
} else { } else {
params = {active: false, windowId: new_window.id, url: Tab.url}; params = {active: false, windowId: new_window.id, url: Tab.url};
} }
chrome.tabs.create(params, function(new_tab) { chrome.tabs.create(params, function(new_tab) {
NewTabs[Tab.id] = {id: Tab.id, newId: 0, favicon: Tab.favicon, index: Tab.index, parent: Tab.parent, title: Tab.title, expand: Tab.expand}; NewTabs[Tab.id] = {id: 0, favicon: Tab.favicon, index: Tab.index, parent: Tab.parent, title: Tab.title, expand: Tab.expand};
if (new_tab) { if (new_tab) {
NewTabs[Tab.id].newId = new_tab.id; NewTabs[Tab.id].id = new_tab.id;
if (browserId == "F" && Tab.favicon > 0) browser.sessions.setTabValue(new_tab.id, "CachedFaviconUrl", LoadedWindow.favicons[Tab.favicon]); if (browserId == "F" && Tab.favicon > 0) browser.sessions.setTabValue(new_tab.id, "CachedFaviconUrl", LoadedWindow.favicons[Tab.favicon]);
} }
}); });
@ -590,23 +581,26 @@ function Manager_RecreateSession(LoadedWindows) {
} }
let STOP = 0; let STOP = 0;
let WaitForFinish = setInterval(function() { let WaitForFinish = setInterval(function() {
if (STOP > 10) clearInterval(WaitForFinish); STOP++; if (STOP > 60) clearInterval(WaitForFinish); STOP++; // stop after 5 minutes
if (Object.keys(NewTabs).length == LoadedWindow.tabs.length) { if (Object.keys(NewTabs).length == LoadedWindow.tabs.length) {
for (let tabId in NewTabs) { setTimeout(function() {
if (NewTabs[NewTabs[tabId].parent] != undefined) NewTabs[tabId].parent = NewTabs[NewTabs[tabId].parent].newId; for (let Tab in NewTabs) {
if (NewTabs[tabId].parent == "pin_list") chrome.tabs.update(parseInt(NewTabs[tabId].newId), {pinned: true}); if (NewTabs[NewTabs[Tab].parent] != undefined) NewTabs[Tab].parent = NewTabs[NewTabs[Tab].parent].id;
if (browserId != "O" && browserId != "F") chrome.runtime.sendMessage({command: "discard_tab", tabId: parseInt(NewTabs[tabId].newId)}); if (NewTabs[Tab].parent == "pin_list") chrome.tabs.update(NewTabs[Tab].id, {pinned: true});
} if (browserId != "O" && browserId != "F") setTimeout(function() {chrome.runtime.sendMessage({command: "discard_tab", tabId: NewTabs[Tab].id});}, 5000);
for (let tabId in NewTabs) {
chrome.runtime.sendMessage({command: "update_tab", tabId: parseInt(NewTabs[tabId].newId), tab: {index: NewTabs[tabId].index, expand: NewTabs[tabId].expand, parent: NewTabs[tabId].parent}});
}
chrome.runtime.sendMessage({command: "sidebar_started", windowId: new_window.id}, function(response) {
if (response) {
chrome.runtime.sendMessage({command: "remote_update", groups: LoadedWindow.groups, folders: LoadedWindow.folders, tabs: NewTabs, windowId: new_window.id});
STOP = 11;
} }
}); for (let Tab in NewTabs) {
STOP = 7; chrome.runtime.sendMessage({command: "update_tab", tabId: parseInt(NewTabs[Tab].id), tab: {index: NewTabs[Tab].index, expand: NewTabs[Tab].expand, parent: NewTabs[Tab].parent}});
}
chrome.runtime.sendMessage({command: "sidebar_started", windowId: new_window.id}, function(response) {
if (response) {
chrome.runtime.sendMessage({command: "remote_update", groups: LoadedWindow.groups, folders: LoadedWindow.folders, tabs: NewTabs, windowId: new_window.id}, function(response) {
// if (response)
});
}
});
STOP = 61;
}, 5000);
} }
}, 5000); }, 5000);
}); });
@ -614,14 +608,13 @@ function Manager_RecreateSession(LoadedWindows) {
} }
function Manager_RecreateGroup(LoadedGroup) { function Manager_RecreateGroup(LoadedGroup) {
if (opt.debug) Utils_log("f: Manager_RecreateGroup"); if (opt.debug) Utils_log("f: Manager_RecreateGroup");
let NewGroupId = Groups_AddNewGroup(LoadedGroup.group.name, LoadedGroup.group.font); let NewGroupId = Groups_AddNewGroup(LoadedGroup.group.name, LoadedGroup.group.font);
let NewFolders = {}; let NewFolders = {};
let RefTabs = {}; // let RefTabs = {};
let NewTabs = {}; let NewTabs = {};
let LastTabId = "NO_TAB_YET"; // let LastTabId = "NO_TAB_YET";
if (Object.keys(LoadedGroup.folders).length > 0) { if (Object.keys(LoadedGroup.folders).length > 0) {
for (var folder in LoadedGroup.folders) { for (var folder in LoadedGroup.folders) {
let newId = Folders_AddNewFolder({ParentId: NewGroupId, Name: LoadedGroup.folders[folder].name, ExpandState: LoadedGroup.folders[folder].expand}); let newId = Folders_AddNewFolder({ParentId: NewGroupId, Name: LoadedGroup.folders[folder].name, ExpandState: LoadedGroup.folders[folder].expand});
@ -651,42 +644,45 @@ function Manager_RecreateGroup(LoadedGroup) {
params = {active: false, windowId: tt.CurrentWindowId, url: Tab.url}; params = {active: false, windowId: tt.CurrentWindowId, url: Tab.url};
} }
chrome.tabs.create(params, function(new_tab) { chrome.tabs.create(params, function(new_tab) {
NewTabs[Tab.id] = {id: new_tab.id, favicon: Tab.favicon, index: Tab.index, parent: Tab.parent, title: Tab.title, expand: Tab.expand};
if (new_tab) { if (new_tab) {
NewTabs[Tab.id].id = new_tab.id;
if (browserId == "F" && Tab.favicon > 0) browser.sessions.setTabValue(new_tab.id, "CachedFaviconUrl", LoadedGroup.favicons[Tab.favicon]); if (browserId == "F" && Tab.favicon > 0) browser.sessions.setTabValue(new_tab.id, "CachedFaviconUrl", LoadedGroup.favicons[Tab.favicon]);
NewTabs[new_tab.id] = {id: new_tab.id, favicon: Tab.favicon, index: Tab.index, parent: Tab.parent, title: Tab.title, expand: Tab.expand}; if (browserId != "O" && browserId != "F") setTimeout(function() {chrome.runtime.sendMessage({command: "discard_tab", tabId: new_tab.id});}, 5000);
RefTabs[Tab.id] = new_tab.id; // LastTabId = new_tab.id;
if (browserId != "O" && browserId != "F") chrome.runtime.sendMessage({command: "discard_tab", tabId: new_tab.id});
LastTabId = new_tab.id;
} else {
RefTabs[Tab.id] = "failed: "+Tab.id;
} }
// else {
// RefTabs[Tab.id] = "failed: "+Tab.id;
// }
}); });
} }
} }
let STOP = 0; let STOP = 0;
let WaitForFinish = setInterval(function() { let WaitForFinish = setInterval(function() {
if (STOP > 600) clearInterval(WaitForFinish); STOP++;// just stop after 10 minutes if (STOP > 300) clearInterval(WaitForFinish); STOP++;// just stop after 5 minutes
if (document.getElementById("°" + NewGroupId) != null) { if (document.getElementById("°" + NewGroupId) != null) {
if (Object.keys(LoadedGroup.folders).length > 0 && LoadedGroup.tabs.length == 0) { if (Object.keys(LoadedGroup.folders).length > 0 && LoadedGroup.tabs.length == 0) {
Manager_RecreateTreeStructure({}, NewFolders, {}); Manager_RecreateTreeStructure({}, NewFolders, {});
STOP = 601; STOP = 301;
} }
if (LoadedGroup.tabs.length > 0 && Object.keys(RefTabs).length == LoadedGroup.tabs.length && document.getElementById(LastTabId) != null) { if (LoadedGroup.tabs.length > 0 && Object.keys(NewTabs).length == LoadedGroup.tabs.length /* && document.getElementById(LastTabId) != null */) {
for (let tabId in NewTabs) { setTimeout(function() {
if (RefTabs[NewTabs[tabId].parent] != undefined) { for (let tabId in NewTabs) {
NewTabs[tabId].parent = RefTabs[NewTabs[tabId].parent]; if (NewTabs[NewTabs[tabId].parent] != undefined) {
} else { NewTabs[tabId].parent = NewTabs[NewTabs[tabId].parent].id;
if ((NewTabs[tabId].parent).startsWith("f_") && LoadedGroup.folders[NewTabs[tabId].parent]) {
NewTabs[tabId].parent = LoadedGroup.folders[NewTabs[tabId].parent].newId;
} else { } else {
if ((NewTabs[tabId].parent).startsWith("g_") || NewTabs[tabId].parent == "tab_list") { if ((NewTabs[tabId].parent).startsWith("f_") && LoadedGroup.folders[NewTabs[tabId].parent]) {
NewTabs[tabId].parent = NewGroupId; NewTabs[tabId].parent = LoadedGroup.folders[NewTabs[tabId].parent].newId;
} else {
if ((NewTabs[tabId].parent).startsWith("g_") || NewTabs[tabId].parent == "tab_list") {
NewTabs[tabId].parent = NewGroupId;
}
} }
} }
} }
} Manager_RecreateTreeStructure({}, NewFolders, NewTabs);
Manager_RecreateTreeStructure({}, NewFolders, NewTabs); STOP = 301;
STOP = 601; }, 5000);
} }
} }
}, 1000); }, 1000);
@ -720,8 +716,8 @@ function Manager_RecreateTreeStructure(groups, folders, tabs) { // groups, folde
if (tb != null && tbp != null && tb != undefined && tbp != undefined) { if (tb != null && tbp != null && tb != undefined && tbp != undefined) {
tbp.appendChild(tb); tbp.appendChild(tb);
if (tabs[tab].expand != "") tb.classList.add(tabs[tab].expand); if (tabs[tab].expand != "") tb.classList.add(tabs[tab].expand);
if (tb.classList.contains("pin")) chrome.tabs.update(tabs[tab].id, {pinned: false});
} }
if (tb.classList.contains("pin")) chrome.tabs.update(tabs[tab].id, {pinned: false});
} }
} }
} }

View File

@ -470,9 +470,9 @@ async function Tabs_LoadFavicon(tabId, Img, TryUrls, TabHeaderNode, i) {
async function Tabs_SaveTabs() { async function Tabs_SaveTabs() {
setInterval(function() { setInterval(function() {
if (opt.debug) Utils_log("f: Tabs_SaveTabs");
if (tt.schedule_update_data > 1) tt.schedule_update_data = 1; if (tt.schedule_update_data > 1) tt.schedule_update_data = 1;
if (tt.schedule_update_data > 0) { if (tt.schedule_update_data > 0) {
if (opt.debug) Utils_log("f: Tabs_SaveTabs");
let pins_data = []; let pins_data = [];
let tabs_data = []; let tabs_data = [];
for (let tabId in tt.tabs) { for (let tabId in tt.tabs) {

View File

@ -174,7 +174,7 @@ function StartSidebarListeners() {
return; return;
} }
if (message.command == "tab_removed") { if (message.command == "tab_removed") {
if (opt.debug) {Utils_log("chrome event: " + message.command + ", tabId: " + message.tabId);} if (opt.debug) Utils_log("chrome event: " + message.command + ", tabId: " + message.tabId);
let mTab = document.getElementById(message.tabId); let mTab = document.getElementById(message.tabId);
if (mTab != null && tt.tabs[message.tabId]) { if (mTab != null && tt.tabs[message.tabId]) {
let ctParent = mTab.childNodes[1]; let ctParent = mTab.childNodes[1];
@ -214,17 +214,18 @@ function StartSidebarListeners() {
if (message.command == "tab_updated") { if (message.command == "tab_updated") {
if (opt.debug) Utils_log("chrome event: " + message.command + ", tabId: " + message.tabId); if (opt.debug) Utils_log("chrome event: " + message.command + ", tabId: " + message.tabId);
if (tt.tabs[message.tabId]) { if (tt.tabs[message.tabId]) {
if (message.changeInfo.favIconUrl != undefined || message.changeInfo.url != undefined) { // if (message.changeInfo.favIconUrl != undefined || message.changeInfo.url != undefined) {
if (message.changeInfo.favIconUrl != undefined || message.changeInfo.title != undefined) {
if (browserId == "F" && (message.changeInfo.favIconUrl == undefined || message.changeInfo.favIconUrl == "")) browser.sessions.setTabValue(message.tabId, "CachedFaviconUrl", ""); if (browserId == "F" && (message.changeInfo.favIconUrl == undefined || message.changeInfo.favIconUrl == "")) browser.sessions.setTabValue(message.tabId, "CachedFaviconUrl", "");
setTimeout(function() { setTimeout(function() {
if (tt.tabs[message.tabId]) tt.tabs[message.tabId].GetFaviconAndTitle(true); if (tt.tabs[message.tabId]) tt.tabs[message.tabId].GetFaviconAndTitle(true);
}, 100); }, 100);
} }
if (message.changeInfo.title != undefined) { // if (message.changeInfo.title != undefined) {
setTimeout(function() { // setTimeout(function() {
if (tt.tabs[message.tabId]) tt.tabs[message.tabId].GetFaviconAndTitle(true); // if (tt.tabs[message.tabId]) tt.tabs[message.tabId].GetFaviconAndTitle(true);
}, 1000); // }, 1000);
} // }
if (message.changeInfo.audible != undefined || message.changeInfo.mutedInfo != undefined) tt.tabs[message.tabId].RefreshMediaIcon(); if (message.changeInfo.audible != undefined || message.changeInfo.mutedInfo != undefined) tt.tabs[message.tabId].RefreshMediaIcon();
if (message.changeInfo.discarded != undefined) tt.tabs[message.tabId].RefreshDiscarded(); if (message.changeInfo.discarded != undefined) tt.tabs[message.tabId].RefreshDiscarded();
if (message.changeInfo.pinned != undefined) { if (message.changeInfo.pinned != undefined) {
@ -287,89 +288,90 @@ function Initialize() {
Toolbar_RestoreToolbarShelf(); Toolbar_RestoreToolbarShelf();
Toolbar_RestoreToolbarSearchFilter(); Toolbar_RestoreToolbarSearchFilter();
} }
chrome.runtime.sendMessage({command: "is_bg_safe_mode"}, function(safe_mode) {
chrome.runtime.sendMessage({command: "get_browser_tabs"}, function(bgtabs) { if (safe_mode) {
chrome.runtime.sendMessage({command: "get_folders", windowId: tt.CurrentWindowId}, function(f) { SafeModeMessage();
tt.folders = Object.assign({}, f); }
chrome.runtime.sendMessage({command: "get_groups", windowId: tt.CurrentWindowId}, function(g) { chrome.runtime.sendMessage({command: "get_browser_tabs"}, function(bgtabs) {
tt.groups = Object.assign({}, g); chrome.runtime.sendMessage({command: "get_folders", windowId: tt.CurrentWindowId}, function(f) {
// APPEND GROUPS tt.folders = Object.assign({}, f);
Groups_AppendGroups(tt.groups); chrome.runtime.sendMessage({command: "get_groups", windowId: tt.CurrentWindowId}, function(g) {
tt.groups = Object.assign({}, g);
// APPEND GROUPS
Groups_AppendGroups(tt.groups);
// APPEND FOLDERS TO TABLIST // APPEND FOLDERS TO TABLIST
Folders_PreAppendFolders(tt.folders); Folders_PreAppendFolders(tt.folders);
// APPEND TABS TO TABLIST // APPEND TABS TO TABLIST
for (const tab of window.tabs) { for (const tab of window.tabs) {
tt.tabs[tab.id] = new Tabs_ttTab({tab: tab, Append: true, SkipSetActive: true, AdditionalClass: ((bgtabs[tab.id] && bgtabs[tab.id].expand != "") ? bgtabs[tab.id].expand : undefined)}); tt.tabs[tab.id] = new Tabs_ttTab({tab: tab, Append: true, SkipSetActive: true, AdditionalClass: ((bgtabs[tab.id] && bgtabs[tab.id].expand != "") ? bgtabs[tab.id].expand : undefined)});
} }
// APPEND FOLDERS TO CORRECT PARENTS // APPEND FOLDERS TO CORRECT PARENTS
Folders_AppendFolders(tt.folders); Folders_AppendFolders(tt.folders);
// APPEND TABS TO CORRECT PARENTS // APPEND TABS TO CORRECT PARENTS
if (opt.skip_load == false) { if (opt.skip_load == false) {
for (const tab of window.tabs) { for (const tab of window.tabs) {
if (bgtabs[tab.id] && !tab.pinned) { if (bgtabs[tab.id] && !tab.pinned) {
let TabParent = document.getElementById("°"+bgtabs[tab.id].parent); let TabParent = document.getElementById("°"+bgtabs[tab.id].parent);
if (TabParent != null && document.querySelector("[id='"+tab.id+"'] #°"+bgtabs[tab.id].parent) == null) { if (TabParent != null && document.querySelector("[id='"+tab.id+"'] #°"+bgtabs[tab.id].parent) == null) {
TabParent.appendChild(tt.tabs[tab.id].Node); TabParent.appendChild(tt.tabs[tab.id].Node);
} }
} }
} }
} }
// SET ACTIVE TAB FOR EACH GROUP, REARRENGE EVERYTHING AND START BROWSER LISTENERS // SET ACTIVE TAB FOR EACH GROUP, REARRENGE EVERYTHING AND START BROWSER LISTENERS
Groups_SetActiveTabInEachGroup(); Groups_SetActiveTabInEachGroup();
Tabs_RearrangeTree(bgtabs, tt.folders, true); Tabs_RearrangeTree(bgtabs, tt.folders, true);
StartSidebarListeners(); StartSidebarListeners();
DOM_SetEvents(); DOM_SetEvents();
Manager_SetManagerEvents(); Manager_SetManagerEvents();
Menu_HideMenus(); Menu_HideMenus();
if (opt.switch_with_scroll) { if (opt.switch_with_scroll) {
DOM_BindTabsSwitchingToMouseWheel("pin_list"); DOM_BindTabsSwitchingToMouseWheel("pin_list");
} }
if (opt.syncro_tabbar_tabs_order || opt.syncro_tabbar_groups_tabs_order) { if (opt.syncro_tabbar_tabs_order || opt.syncro_tabbar_groups_tabs_order) {
Tabs_RearrangeBrowserTabs(); Tabs_RearrangeBrowserTabs();
} }
Theme_RestorePinListRowSettings(); Theme_RestorePinListRowSettings();
Manager_StartAutoSaveSession(); Manager_StartAutoSaveSession();
if (browserId == "O") { if (browserId == "O") {
DOM_AutoRefreshMediaIcons(); DOM_AutoRefreshMediaIcons();
} }
setTimeout(function() { setTimeout(function() {
DOM_RefreshExpandStates(); DOM_RefreshExpandStates();
DOM_RefreshCounters(); DOM_RefreshCounters();
Groups_SetActiveTabInEachGroup(); Groups_SetActiveTabInEachGroup();
}, 1000); }, 1000);
Manager_ShowStatusBar({show: true, spinner: false, message: "Ready.", hideTimeout: 2000}); Manager_ShowStatusBar({show: true, spinner: false, message: chrome.i18n.getMessage("status_bar_ready"), hideTimeout: 2000});
setTimeout(function() { setTimeout(function() {
Tabs_SaveTabs(); Tabs_SaveTabs();
delete DefaultToolbar; delete DefaultToolbar;
delete DefaultTheme; delete DefaultTheme;
delete DefaultPreferences; delete DefaultPreferences;
if (storage.emergency_reload != undefined) { }, 5000);
chrome.storage.local.remove("emergency_reload");
} if (browserId != "F") {
}, 5000); if (storage.windows_BAK1 && Object.keys(storage["windows_BAK1"]).length > 0 && document.getElementById("button_load_bak1") != null) { document.getElementById("button_load_bak1").classList.remove("disabled"); }
if (storage.windows_BAK2 && Object.keys(storage["windows_BAK2"]).length > 0 && document.getElementById("button_load_bak2") != null) { document.getElementById("button_load_bak2").classList.remove("disabled"); }
if (browserId != "F") { if (storage.windows_BAK3 && Object.keys(storage["windows_BAK3"]).length > 0 && document.getElementById("button_load_bak3") != null) { document.getElementById("button_load_bak3").classList.remove("disabled"); }
if (storage.windows_BAK1 && Object.keys(storage["windows_BAK1"]).length > 0 && document.getElementById("button_load_bak1") != null) { document.getElementById("button_load_bak1").classList.remove("disabled"); } }
if (storage.windows_BAK2 && Object.keys(storage["windows_BAK2"]).length > 0 && document.getElementById("button_load_bak2") != null) { document.getElementById("button_load_bak2").classList.remove("disabled"); } });
if (storage.windows_BAK3 && Object.keys(storage["windows_BAK3"]).length > 0 && document.getElementById("button_load_bak3") != null) { document.getElementById("button_load_bak3").classList.remove("disabled"); } });
} });
}); });
}); });
});
});
}); });
} }
@ -386,4 +388,20 @@ function Run() {
}); });
} }
function SafeModeMessage() {
let StatusBar = document.getElementById("status_bar");
if (StatusBar) {
StatusBar.onclick = function(event) {
if (event.which == 1) {
chrome.runtime.sendMessage({command: "reload"});
chrome.runtime.sendMessage({command: "reload_sidebar"});
location.reload();
}
}
setInterval(function() {
Manager_ShowStatusBar({show: true, spinner: false, message: chrome.i18n.getMessage("status_bar_running_in_safe_mode")});
}, 30);
}
}
document.addEventListener("DOMContentLoaded", Run(), false); document.addEventListener("DOMContentLoaded", Run(), false);

View File

@ -1,26 +1,334 @@
const english_base = {"extensionName":{"message":"Tree Tabs"},"extDesc":{"message":"Manage your tabs in the sidebar!"},"OpenSidebar":{"message":"Open Tree Tabs"},"button_new":{"message":"Press left mouse button to open new tab. \nPress middle mouse button to clone the active tab. \nPress right mouse button to scroll the list to the active tab."},"button_pin":{"message":"Pin / Unpin current tab"},"button_undo":{"message":"Reopen last closed"},"button_reboot":{"message":"Reload Tree Tabs_ Try this in case your tree hierarchy is lost after restart."},"button_detach":{"message":"Detach tab"},"button_move":{"message":"Detach tab"},"button_search":{"message":"Search tabs"},"button_tools":{"message":"Tools"},"button_groups":{"message":"Groups"},"filter_search_go_prev":{"message":"Previous search result"},"filter_search_go_next":{"message":"Next search result"},"button_bookmarks":{"message":"Unsorted bookmarks"},"button_downloads":{"message":"Downloads"},"button_history":{"message":"History"},"button_settings":{"message":"Settings"},"button_options":{"message":"Tree Tabs settings"},"button_extensions":{"message":"Extensions"}, const english_base = {
"button_unload":{"message":"Unload tabs"},"button_discard":{"message":"Unload tabs"},"button_filter_type":{"message":"Search titles or urls"},"button_groups_toolbar_hide":{"message":"Hide/Show Groups toolbar"},"button_new_group":{"message":"New group"},"button_remove_group":{"message":"Remove group.\nHold shift key to close tabs from this group"},"button_edit_group":{"message":"Rename group"},"button_import_group":{"message":"Import group"},"button_export_group":{"message":"Export group"},"button_backup":{"message":"Session"},"button_import_bak":{"message":"Import session"},"button_import_merge_bak":{"message":"Import and merge session.\nImporter will try to match current tabs with those from saved session, instead of opening a new window."},"button_export_bak":{"message":"Export session"},"button_load_bak1":{"message":"EMERGENCY if lost groupings: Load latest internal backup (autosave is made every 5 minutes)"},"button_load_bak2":{"message":"EMERGENCY if lost groupings: Load previous to latest internal backup (autosave is made every 10 minutes)"}, "extensionName":"",
"button_load_bak3":{"message":"EMERGENCY if lost groupings: Load oldest internal backup (autosave is made every 30 minutes)"},"button_folders":{"message":"Folders"},"button_new_folder":{"message":"New folder"},"button_remove_folder":{"message":"Remove selected folder/s"},"button_edit_folder":{"message":"Rename folder"},"menu_expand_all":{"message":"Expand all trees"},"menu_collapse_all":{"message":"Collapse all trees"},"menu_expand_tree":{"message":"Expand tree"},"menu_collapse_tree":{"message":"Collapse tree"},"menu_new_tab":{"message":"New tab"},"menu_new_pin":{"message":"New pinned tab"},"menu_duplicate_tab":{"message":"Duplicate"},"menu_detach_tab":{"message":"Detach"},"menu_reload_tab":{"message":"Reload"},"menu_pin_tab":{"message":"Pin"},"menu_mute_tab":{"message":"Mute"},"menu_mute_tree":{"message":"Mute tree"},"menu_unmute_tree":{"message":"Unmute tree"},"menu_unmute_tab":{"message":"Unmute"},"menu_mute_other":{"message":"Mute other"},"menu_unmute_other":{"message":"Unmute other"},"menu_unpin_tab":{"message":"Unpin"},"menu_close_tree":{"message":"Close tree"},"menu_close":{"message":"Close"}, "extDesc":"",
"menu_close_other":{"message":"Close other"},"menu_undo_close_tab":{"message":"Undo close"},"menu_treetabs_settings":{"message":"Settings"},"menu_unload":{"message":"Unload"},"menu_bookmark_tree":{"message":"Bookmark"},"menu_new_folder":{"message":"New folder"},"menu_rename_folder":{"message":"Rename folder"},"menu_delete_folder":{"message":"Delete"},"menu_new_group":{"message":"New group"},"menu_rename_group":{"message":"Rename"},"menu_delete_group":{"message":"Delete"},"menu_delete_group_tabs_close":{"message":"Delete with tabs"},"menu_groups_unload":{"message":"Unload"},"menu_bookmark_group":{"message":"Bookmark"},"menu_groups_hibernate":{"message":"Hibernate"},"menu_group_tabs_close":{"message":"Close tabs"},"status_bar_rearranging_tabs":{"message":"Rearranging tabs and folders"},"status_bar_rearranging_finished":{"message":"Rearranging: done."},"status_bar_loaded_tree_structure":{"message":"Loaded Tree structure..."},"status_bar_finding_ref_tabs":{"message":"Finding reference tabs..."},"status_bar_finding_other_windows":{"message":"Finding other windows to add tabs..."}, "OpenSidebar":"",
"status_bar_all_done":{"message":"All done."},"status_bar_autosave":{"message":"Autosave: "},"status_bar_quick_check_recreate_structure":{"message":"Quick check and recreating structure..."},"options_vivaldi":{"message":" Vivaldi "},"opt_url_for_web_panel":{"message":"Url for the Web Panel"},"options_pinned":{"message":" Pinned tabs bar "},"options_pin_list_multi_row":{"message":"Multi row list"},"option_allow_pin_close":{"message":"Allow to close pinned tabs"},"option_pin_attention_blinking":{"message":"Blink pinned tabs that ask for attention"},"option_audio_blinking":{"message":"Blink audio indicator"},"options_tabs":{"message":" Tabs "},"options_syncro_tabbar_tabs_order":{"message":"Synchronize browser tabs order with Tree Tabs, tabs can be unresponsive for a second after drag&drop. This option is needed for correct ctrl+tab switching. You can disable this option if you don't use keyboard shortcuts."},"options_switch_with_scroll":{"message":"Switch tabs with mouse wheel"},"options_tab_group_regex":{"message":"Tab group assignments (Items matching the given pattern will be moved to the designated group. Pattern accepts regular expressions.)"}, "button_new":"",
"option_tab_match":{"message":"Pattern"},"option_tab_group":{"message":"Group"},"options_orphaned_tabs_to_ungrouped":{"message":"Always place orphan tabs in the 'ungrouped' group"},"options_move_on_url_change":{"message":"Move tabs that match regexes"},"options_move_on_url_change_never":{"message":"never"},"options_move_on_url_change_from_empty":{"message":"when URL changes in Home tab (only Home tabs created by ctrl+t shortcut)"},"options_move_on_url_change_from_empty_b":{"message":"when URL changes in any Home tab"},"options_move_on_url_change_all_new":{"message":"when tab is created with a matching URL"},"options_move_on_url_change_always":{"message":"whenever URL changes to a matching pattern"},"options_always_show_close":{"message":"Show close button on all tabs and folders"},"options_never_show_close":{"message":"Never show close button (option above will be ignored)"},"options_collapse_other_trees":{"message":"Automatically collapse other trees on expand"},"options_open_tree_on_hover":{"message":"Auto expand collapsed trees when dragging and holding for a second over them"}, "button_pin":"",
"options_promote_children":{"message":"Promote children on close, if disabled, when closing the parent of a tree structure, all tabs and folders will be closed (be careful, because undo close tab will not recover the trees structure)"},"options_promote_children_in_first_child":{"message":"Promote first child as a parent"},"options_skip_load":{"message":"Discard tree structure after browser's restart, this option is for those who don't use browser's session. Basically it disables loading database at startup."},"options_midclick_tab":{"message":"Action for middle mouse click on tab"},"options_dbclick_tab":{"message":"Action for double click on tab"},"options_action_tab_none":{"message":"nothing"},"options_action_tab_new":{"message":"open new tab"},"options_action_tab_expand_collapse":{"message":"expand/collapse tree"},"options_action_tab_close":{"message":"close tab"},"options_action_tab_reload":{"message":"reload tab"},"options_action_tab_unload":{"message":"unload tab"},"options_action_tab_activate_previous_active":{"message":"go back to previous active tab (works only on unpinned tabs)"}, "button_undo":"",
"options_action_tab_undo_close":{"message":"reopen last closed tab"},"options_midclick_group":{"message":"Action for middle click on empty space on the left side or below the tabs"},"options_dbclick_group":{"message":"Action for double click on empty space on the left side or below the tabs"},"options_action_group_none":{"message":"nothing"},"options_action_group_new":{"message":"open new tab"},"options_action_group_activate_previous_active":{"message":"go back to previous active tab (works only on unpinned tabs)"},"options_action_group_undo_close_tab":{"message":"reopen last closed tab"},"options_append_pinned_tab":{"message":"Place pinned tabs"},"options_append_pinned_tab_first":{"message":"as first"},"options_append_pinned_tab_after":{"message":"after opener, or active"},"options_append_pinned_tab_last":{"message":"as last"},"options_append_child_tab":{"message":"Place children tabs"},"options_append_child_tab_top":{"message":"at the top (reverse hierarchy)"},"options_append_child_tab_bottom":{"message":" at the bottom"},"options_append_child_tab_after":{"message":"after parent tab (no automatic tree)"}, "button_reboot":"",
"options_append_orphan_tab":{"message":"Append orphan tabs"},"options_append_orphan_tab_top":{"message":"at the top of the group"},"options_append_orphan_tab_after_active":{"message":"after active tab"},"options_append_orphan_tab_bottom":{"message":"at the bottom of the group"},"options_append_orphan_tab_as_child":{"message":"treat as active's tab child"},"options_append_orphan_tab_active_parent_top":{"message":"at the same level as active tab, but on top"},"options_append_orphan_tab_active_parent_bottom":{"message":"at the same level as active tab, but on bottom"},"options_toolbar_new_tab":{"message":"Toolbar + (new tab button) should append tab"},"options_toolbar_new_tab_as_regular_orphan":{"message":"as a regular orphan tab (option above)"},"options_toolbar_new_tab_root_of_group":{"message":"at the bottom of the group"},"options_after_closing_active_tab":{"message":"After closing active tab,"},"options_after_closing_active_tab_go_up":{"message":"activate tab above"},"options_after_closing_active_tab_go_down":{"message":"activate tab below"},"options_after_closing_active_tab_go_up_seek_in_parent":{"message":"activate tab above if on the same level"}, "button_detach":"",
"options_after_closing_active_tab_go_down_seek_in_parent":{"message":"activate tab below if on the same level"},"options_after_closing_active_tab_go_browser":{"message":"let browser activate tab"},"options_append_child_tab_after_limit":{"message":"Once reached maximum tree depth, place tab on the same level, but"},"options_append_child_tab_after_limit_top":{"message":"at the top"},"options_append_child_tab_after_limit_after":{"message":"after parent"},"options_append_child_tab_after_limit_bottom":{"message":"at the bottom"},"options_show_counter_tabs":{"message":"Show children tabs count on tabs and folders titles"},"options_show_counter_tabs_hints":{"message":"Show children tabs count in tabs and folders hints"},"options_max_tree_depth":{"message":"Maximum tree depth: set it to -1 for unlimited branches, 0 for flat tabs placement (no trees), any number above 0 will be its maximum"},"options_max_tree_drag_drop":{"message":"Limit Drag&Drop to tree's maximum depth, so you can't drop tabs beyond maximum depth"},"options_groups":{"message":"Groups"},"options_show_counter_groups":{"message":"Show tabs count on groups"}, "button_move":"",
"options_groups_toolbar_default":{"message":"Show groups toolbar in new windows"},"options_syncro_tabbar_groups_tabs_order":{"message":"Synchronize browser tabs order after drag&drop of the group tabs. Tabs will sort for a long time, if browser has a lot of tabs open. This option is needed for correct ctrl+tab switching. You can disable this option if you don't use keyboard shortcuts."},"options_hide_other_groups_tabs_firefox":{"message":"Show Firefox tabs from current group only. Requires change in about:config, find 'extensions.webextensions.tabhide.enabled' and set it to true."},"options_folders":{"message":"Folders"},"options_midclick_folder":{"message":"Action for middle mouse click on folder"},"options_dbclick_folder":{"message":"Action for double click on folder"},"options_action_folder_none":{"message":"nothing"},"options_action_folder_rename":{"message":"rename folder"},"options_action_folder_new_folder":{"message":"open new folder"},"options_action_folder_new_tab":{"message":"open new tab"},"options_action_folder_expand_collapse":{"message":"expand/collapse tree"},"options_action_folder_close":{"message":"close folder"}, "button_search":"",
"options_action_folder_unload":{"message":"unload tabs in folder"},"options_global":{"message":"Global"},"options_theme":{"message":"Theme"},"options_rename_theme_button":{"message":"Rename"},"options_add_theme_button":{"message":"Add new"},"options_remove_theme_button":{"message":"Remove"},"options_import_theme_button":{"message":"Import"},"options_export_theme_button":{"message":"Export"},"options_share_theme_link":{"message":"Get more!"},"options_toolbar":{"message":" Toolbar "},"options_available_buttons":{"message":"Drag and drop buttons to arrange them, drop to the green box, buttons you don't want to use"},"options_reset_toolbar_button":{"message":"Reset toolbar"},"options_export_debug":{"message":"Export log file"},"options_print_debug":{"message":"Load log from file"},"options_toolbar_look":{"message":" Toolbar's look "},"hint_orphan_tab":{"message":"Orphan tab is a tab opened from an external source, which can be:"},"hint_ctrl_t":{"message":"ctrl+t shortcut"},"hint_from_pin":{"message":"link that opens new tab from pinned tab"},"hint_from_bookmark":{"message":"bookmark"},"hint_from_external_link":{"message":"external link"}, "button_tools":"",
"hint_from_popup":{"message":"popup opened as a tab (settings in browser, popup blocker or anything that redirects popups to new tabs)"},"hint_explained_new_tab_settings":{"message":"+ button in Tree Tabs toolbar, places new tabs in the root of the active group, unless set differently."},"hint_explained_orphan_after_active_settings":{"message":"If set to 'after active tab' and active tab is not in current group, tab will append to the root of the active group instead."},"button_background":{"message":"Toolbar buttons background"},"button_hover_background":{"message":"Toolbar buttons background, on mouse hover"},"button_on_background":{"message":"Toolbar active buttons background"},"button_icons":{"message":"Toolbar buttons icon color"},"button_icons_hover":{"message":"Toolbar buttons icon color, on mouse hover"},"button_on_icons":{"message":"Toolbar active buttons icon color"},"button_border":{"message":"Toolbar buttons border color"},"button_hover_border":{"message":"Toolbar buttons border color, on mouse hover"},"filter_box_font":{"message":"Search box, font color"},"filter_box_background":{"message":"Search box, font background color"}, "button_groups":"",
"filter_box_border":{"message":"Search box, border color"},"filter_clear_icon":{"message":"Clear search result x button color"},"toolbar_background":{"message":"Toolbar background color"},"toolbar_shelf_background":{"message":"Toolbar's shelf background color"},"toolbar_border_bottom":{"message":"Toolbar borders color"},"button_shelf_background":{"message":"Toolbar's shelf buttons background color"},"button_shelf_hover_background":{"message":"Toolbar's shelf buttons background color, on mouse hover"},"button_shelf_icons":{"message":"Toolbar's shelf buttons icon color"},"button_shelf_icons_hover":{"message":"Toolbar's shelf buttons icon color, on mouse hover"},"button_shelf_border":{"message":"Toolbar's shelf buttons border color"},"button_shelf_hover_border":{"message":"Toolbar's shelf buttons border color, on mouse hover"},"options_theme_tabs":{"message":" Tabs look "},"options_tabs_margin_overlap":{"message":"Tabs spacing:\nOverlap 1px, best for themes with borders"},"options_tabs_margin_0":{"message":"Tabs spacing:\nNo spacing, best for flat look"},"options_tabs_margin_1":{"message":"Tabs spacing:\nDefault, 1px between tabs"}, "filter_search_go_prev":"",
"options_tab_list_scrollbar_width_down":{"message":"Decrease scrollbars width"},"options_tab_list_scrollbar_width_up":{"message":"Increase scrollbars width"},"options_tab_list_scrollbar_height_down":{"message":"Decrease scrollbars height"},"options_tab_list_scrollbar_height_up":{"message":"Increase scrollbars height"},"options_tabs_indentation_down":{"message":"Decrease tabs indentation"},"options_tabs_indentation_up":{"message":"Increase tabs indentation"},"options_tabs_roundness_down":{"message":"Make tabs corners more square"},"options_tabs_roundness_up":{"message":"Make tabs rounder"},"options_tabs_size_down":{"message":"Decrease tabs size"},"options_tabs_size_up":{"message":"Increase tabs size"},"options_theme_tabs_sample_text_normal":{"message":"Normal"},"options_theme_tabs_sample_text_normal_hover":{"message":"Normal, mouse hover over"},"options_theme_tabs_sample_text_normal_selected":{"message":"Normal selected"},"options_theme_tabs_sample_text_normal_selected_hover":{"message":"Normal selected, mouse hover over"},"options_theme_tabs_sample_text_active":{"message":"Active"},"options_theme_tabs_sample_text_active_hover":{"message":"Active, mouse hover over"}, "filter_search_go_next":"",
"options_theme_tabs_sample_text_active_selected":{"message":"Active and selected"},"options_theme_tabs_sample_text_active_selected_hover":{"message":"Active and selected, mouse hover over"},"options_theme_tabs_sample_text_discarded":{"message":"Unloaded (discarded)"},"options_theme_tabs_sample_text_discarded_hover":{"message":"Unloaded, mouse hover over"},"options_theme_tabs_sample_text_discarded_selected":{"message":"Unloaded and selected"},"options_theme_tabs_sample_text_discarded_selected_hover":{"message":"Unloaded and selected, mouse hover over"},"options_theme_tabs_sample_text_search_result":{"message":"Search result"},"options_theme_tabs_sample_text_search_result_hover":{"message":"Search result, mouse hover over"},"options_theme_tabs_sample_text_search_result_active":{"message":"Search result active"},"options_theme_tabs_sample_text_search_result_active_hover":{"message":"Search result active, mouse hover over"},"options_theme_tabs_sample_text_search_result_selected":{"message":"Search result selected"},"options_theme_tabs_sample_text_search_result_selected_hover":{"message":"Search result selected, mouse hover over"}, "button_bookmarks":"",
"options_theme_tabs_sample_text_search_result_selected_active":{"message":"Search result selected, active"},"options_theme_tabs_sample_text_search_result_selected_active_hover":{"message":"Search result selected, active, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted":{"message":"Search result highlighted"},"options_theme_tabs_sample_text_search_result_highlighted_hover":{"message":"Search result highlighted, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted_active":{"message":"Search result highlighted, active"},"options_theme_tabs_sample_text_search_result_highlighted_active_hover":{"message":"Search result highlighted, active, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted_selected":{"message":"Search result highlighted, selected"},"options_theme_tabs_sample_text_search_result_highlighted_selected_hover":{"message":"Search result highlighted, selected, mouse hover over"},"options_theme_tabs_sample_text_search_result_highlighted_selected_active":{"message":"Search result highlighted, selected, active"}, "button_downloads":"",
"options_theme_tabs_sample_text_search_result_highlighted_selected_active_hover":{"message":"Search result highlighted, selected, active, mouse hover over"},"attention_background":{"message":"Tabs blinking for attention, background color"},"attention_border":{"message":"Tabs blinking for attention, border color"},"pin_list_border_bottom":{"message":"Pinned tabs list, border at the bottom color"},"pin_list_background":{"message":"Pinned tabs list, background color"},"folder_icon_open":{"message":"Open folder icon"},"folder_icon_closed":{"message":"Empty or closed folder icon"},"folder_icon_hover":{"message":"Folder icon on mouse hover"},"expand_open_background":{"message":"Open tree indicator"},"expand_closed_background":{"message":"Closed tree indicator"},"expand_hover_background":{"message":"Tree indicator on mouse hover"},"group_list_button_hover_background":{"message":"Group on mouse hover"},"group_list_borders":{"message":"Group list border"},"group_list_default_font_color":{"message":"Group list default font color"},"group_list_background":{"message":"Group list background color"},"tab_list_background":{"message":"Tabs background color"}, "button_history":"",
"drag_indicator":{"message":"Drag&Drop indicator"},"close_x":{"message":"x inside the close button"},"close_hover_x":{"message":"x inside the close button, on mouse hover"},"close_hover_border":{"message":"close button border, on mouse hover"},"close_hover_background":{"message":"close button box color, on mouse hover"},"scrollbar_thumb":{"message":"Scrollbar thumb"},"scrollbar_thumb_hover":{"message":"Scrollbar thumb, on mouse hover"},"scrollbar_track":{"message":"Scrollbar track"},"options_example_menu_item":{"message":"menu item"},"options_menu":{"message":" Menu "},"tabs_menu_hover_border":{"message":"menu item border, on mouse hover"},"tabs_menu_hover_background":{"message":"menu item background, on mouse hover"},"tabs_menu_separator":{"message":"menu separator"},"tabs_menu_font":{"message":"menu text color"},"tabs_menu_border":{"message":"menu border"},"tabs_menu_background":{"message":"menu background"},"options_there_is_a_theme_with_this_name":{"message":"Theme with this name already exists, try a new name"},"options_theme_name_cannot_be_empty":{"message":"Theme name cannot be empty, enter some name"}, "button_settings":"",
"options_no_theme_to_export":{"message":"No theme to export, maybe add a new one :)"},"options_loaded_theme_older_version":{"message":"Looks like loaded theme was saved in older version of the extension, some colors or options might be missing"},"options_loaded_theme_newer_version":{"message":"Looks like loaded theme was saved in a newer version of the extension, can't load!"},"options_vivaldi_copied_url":{"message":"Web Panel Url has been copied to clipboard, add a new Web Panel and paste url."},"options_copied_wallet_address":{"message":"Wallet address has been copied to clipboard"},"options_clear_data":{"message":"Sidebar is not loading? Reset! ATTENTION! All options and saved Themes will be lost!"},"options_development":{"message":"Development"},"options_debug":{"message":"Debug"},"group_edit_button_cancel":{"message":"Cancel"},"group_edit_button_confirm":{"message":"Ok"},"folder_edit_button_cancel":{"message":"Cancel"},"folder_edit_button_confirm":{"message":"Ok"},"manager_window_button_label_import_group":{"message":"Import group"},"manager_window_button_label_import_session":{"message":"Import session"}, "button_options":"",
"manager_window_button_label_save_current_session":{"message":"Save current session"},"caption_ungrouped_group":{"message":"Ungrouped"},"caption_noname_group":{"message":"untitled"},"caption_clear_filter":{"message":"Clear search results"},"caption_loading":{"message":"Loading..."},"caption_searchbox":{"message":" Search tabs..."},"manager_window_header_title":{"message":"Manager"},"menu_manager_window":{"message":"Open manager"},"button_manager_window":{"message":"Open manager window"},"manager_window_groups_button":{"message":"Hibernated groups"},"manager_window_sessions_button":{"message":"Saved sessions"},"manager_window_autosave_button":{"message":"Auto saved sessions"},"manager_window_button_label_hibernate_group":{"message":"Hibernate current group"},"manager_window_autosessions_maximum_saves_label":{"message":"Number of autosaves to keep:"},"manager_window_autosessions_save_timer_label":{"message":"Autosave every (minutes):"},"manager_window_delete_icon":{"message":"Remove"},"manager_window_savetofile_icon":{"message":"Save to file"},"manager_window_merge_icon":{"message":"Load and merge"},"manager_window_load_icon":{"message":"Load"}, "button_extensions":"",
"options_Remove_button":{"message":"Remove"},"add_tab_group_regex":{"message":"Add"},"menu_unload_tree":{"message":"Unload tree"}}; "button_unload":"",
"button_discard":"",
"button_filter_type":"",
"button_groups_toolbar_hide":"",
"button_new_group":"",
"button_remove_group":"",
"button_edit_group":"",
"button_import_group":"",
"button_export_group":"",
"button_backup":"",
"button_import_bak":"",
"button_import_merge_bak":"",
"button_export_bak":"",
"button_load_bak1":"",
"button_load_bak2":"",
"button_load_bak3":"",
"button_folders":"",
"button_new_folder":"",
"button_remove_folder":"",
"button_edit_folder":"",
"menu_expand_all":"",
"menu_collapse_all":"",
"menu_expand_tree":"",
"menu_collapse_tree":"",
"menu_new_tab":"",
"menu_new_pin":"",
"menu_duplicate_tab":"",
"menu_detach_tab":"",
"menu_reload_tab":"",
"menu_pin_tab":"",
"menu_mute_tab":"",
"menu_mute_tree":"",
"menu_unmute_tree":"",
"menu_unmute_tab":"",
"menu_mute_other":"",
"menu_unmute_other":"",
"menu_unpin_tab":"",
"menu_close_tree":"",
"menu_close":"",
"menu_close_other":"",
"menu_undo_close_tab":"",
"menu_treetabs_settings":"",
"menu_unload":"",
"menu_bookmark_tree":"",
"menu_new_folder":"",
"menu_rename_folder":"",
"menu_delete_folder":"",
"menu_new_group":"",
"menu_rename_group":"",
"menu_delete_group":"",
"menu_delete_group_tabs_close":"",
"menu_groups_unload":"",
"menu_bookmark_group":"",
"menu_groups_hibernate":"",
"menu_group_tabs_close":"",
"status_bar_rearranging_tabs":"",
"status_bar_rearranging_finished":"",
"status_bar_loaded_tree_structure":"",
"status_bar_finding_ref_tabs":"",
"status_bar_finding_other_windows":"",
"status_bar_all_done":"",
"status_bar_autosave":"",
"status_bar_quick_check_recreate_structure":"",
"options_vivaldi":"",
"opt_url_for_web_panel":"",
"options_pinned":"",
"options_pin_list_multi_row":"",
"option_allow_pin_close":"",
"option_pin_attention_blinking":"",
"option_audio_blinking":"",
"options_tabs":"",
"options_syncro_tabbar_tabs_order":"",
"options_switch_with_scroll":"",
"options_tab_group_regex":"",
"option_tab_match":"",
"option_tab_group":"",
"options_orphaned_tabs_to_ungrouped":"",
"options_move_on_url_change":"",
"options_move_on_url_change_never":"",
"options_move_on_url_change_from_empty":"",
"options_move_on_url_change_from_empty_b":"",
"options_move_on_url_change_all_new":"",
"options_move_on_url_change_always":"",
"options_always_show_close":"",
"options_never_show_close":"",
"options_collapse_other_trees":"",
"options_open_tree_on_hover":"",
"options_promote_children":"",
"options_promote_children_in_first_child":"",
"options_skip_load":"",
"options_midclick_tab":"",
"options_dbclick_tab":"",
"options_action_tab_none":"",
"options_action_tab_new":"",
"options_action_tab_expand_collapse":"",
"options_action_tab_close":"",
"options_action_tab_reload":"",
"options_action_tab_unload":"",
"options_action_tab_activate_previous_active":"",
"options_action_tab_undo_close":"",
"options_midclick_group":"",
"options_dbclick_group":"",
"options_action_group_none":"",
"options_action_group_new":"",
"options_action_group_activate_previous_active":"",
"options_action_group_undo_close_tab":"",
"options_append_pinned_tab":"",
"options_append_pinned_tab_first":"",
"options_append_pinned_tab_after":"",
"options_append_pinned_tab_last":"",
"options_append_child_tab":"",
"options_append_child_tab_top":"",
"options_append_child_tab_bottom":"",
"options_append_child_tab_after":"",
"options_append_orphan_tab":"",
"options_append_orphan_tab_top":"",
"options_append_orphan_tab_after_active":"",
"options_append_orphan_tab_bottom":"",
"options_append_orphan_tab_as_child":"",
"options_append_orphan_tab_active_parent_top":"",
"options_append_orphan_tab_active_parent_bottom":"",
"options_toolbar_new_tab":"",
"options_toolbar_new_tab_as_regular_orphan":"",
"options_toolbar_new_tab_root_of_group":"",
"options_after_closing_active_tab":"",
"options_after_closing_active_tab_go_up":"",
"options_after_closing_active_tab_go_down":"",
"options_after_closing_active_tab_go_up_seek_in_parent":"",
"options_after_closing_active_tab_go_down_seek_in_parent":"",
"options_after_closing_active_tab_go_browser":"",
"options_append_child_tab_after_limit":"",
"options_append_child_tab_after_limit_top":"",
"options_append_child_tab_after_limit_after":"",
"options_append_child_tab_after_limit_bottom":"",
"options_show_counter_tabs":"",
"options_show_counter_tabs_hints":"",
"options_max_tree_depth":"",
"options_max_tree_drag_drop":"",
"options_groups":"",
"options_show_counter_groups":"",
"options_groups_toolbar_default":"",
"options_syncro_tabbar_groups_tabs_order":"",
"options_hide_other_groups_tabs_firefox":"",
"options_folders":"",
"options_midclick_folder":"",
"options_dbclick_folder":"",
"options_action_folder_none":"",
"options_action_folder_rename":"",
"options_action_folder_new_folder":"",
"options_action_folder_new_tab":"",
"options_action_folder_expand_collapse":"",
"options_action_folder_close":"",
"options_action_folder_unload":"",
"options_global":"",
"options_theme":"",
"options_rename_theme_button":"",
"options_add_theme_button":"",
"options_remove_theme_button":"",
"options_import_theme_button":"",
"options_export_theme_button":"",
"options_share_theme_link":"",
"options_toolbar":"",
"options_available_buttons":"",
"options_reset_toolbar_button":"",
"options_export_debug":"",
"options_print_debug":"",
"options_toolbar_look":"",
"hint_orphan_tab":"",
"hint_ctrl_t":"",
"hint_from_pin":"",
"hint_from_bookmark":"",
"hint_from_external_link":"",
"hint_from_popup":"",
"hint_explained_new_tab_settings":"",
"hint_explained_orphan_after_active_settings":"",
"button_background":"",
"button_hover_background":"",
"button_on_background":"",
"button_icons":"",
"button_icons_hover":"",
"button_on_icons":"",
"button_border":"",
"button_hover_border":"",
"filter_box_font":"",
"filter_box_background":"",
"filter_box_border":"",
"filter_clear_icon":"",
"toolbar_background":"",
"toolbar_shelf_background":"",
"toolbar_border_bottom":"",
"button_shelf_background":"",
"button_shelf_hover_background":"",
"button_shelf_icons":"",
"button_shelf_icons_hover":"",
"button_shelf_border":"",
"button_shelf_hover_border":"",
"options_theme_tabs":"",
"options_tabs_margin_overlap":"",
"options_tabs_margin_0":"",
"options_tabs_margin_1":"",
"options_tab_list_scrollbar_width_down":"",
"options_tab_list_scrollbar_width_up":"",
"options_tab_list_scrollbar_height_down":"",
"options_tab_list_scrollbar_height_up":"",
"options_tabs_indentation_down":"",
"options_tabs_indentation_up":"",
"options_tabs_roundness_down":"",
"options_tabs_roundness_up":"",
"options_tabs_size_down":"",
"options_tabs_size_up":"",
"options_theme_tabs_sample_text_normal":"",
"options_theme_tabs_sample_text_normal_hover":"",
"options_theme_tabs_sample_text_normal_selected":"",
"options_theme_tabs_sample_text_normal_selected_hover":"",
"options_theme_tabs_sample_text_active":"",
"options_theme_tabs_sample_text_active_hover":"",
"options_theme_tabs_sample_text_active_selected":"",
"options_theme_tabs_sample_text_active_selected_hover":"",
"options_theme_tabs_sample_text_discarded":"",
"options_theme_tabs_sample_text_discarded_hover":"",
"options_theme_tabs_sample_text_discarded_selected":"",
"options_theme_tabs_sample_text_discarded_selected_hover":"",
"options_theme_tabs_sample_text_search_result":"",
"options_theme_tabs_sample_text_search_result_hover":"",
"options_theme_tabs_sample_text_search_result_active":"",
"options_theme_tabs_sample_text_search_result_active_hover":"",
"options_theme_tabs_sample_text_search_result_selected":"",
"options_theme_tabs_sample_text_search_result_selected_hover":"",
"options_theme_tabs_sample_text_search_result_selected_active":"",
"options_theme_tabs_sample_text_search_result_selected_active_hover":"",
"options_theme_tabs_sample_text_search_result_highlighted":"",
"options_theme_tabs_sample_text_search_result_highlighted_hover":"",
"options_theme_tabs_sample_text_search_result_highlighted_active":"",
"options_theme_tabs_sample_text_search_result_highlighted_active_hover":"",
"options_theme_tabs_sample_text_search_result_highlighted_selected":"",
"options_theme_tabs_sample_text_search_result_highlighted_selected_hover":"",
"options_theme_tabs_sample_text_search_result_highlighted_selected_active":"",
"options_theme_tabs_sample_text_search_result_highlighted_selected_active_hover":"",
"attention_background":"",
"attention_border":"",
"pin_list_border_bottom":"",
"pin_list_background":"",
"folder_icon_open":"",
"folder_icon_closed":"",
"folder_icon_hover":"",
"expand_open_background":"",
"expand_closed_background":"",
"expand_hover_background":"",
"group_list_button_hover_background":"",
"group_list_borders":"",
"group_list_default_font_color":"",
"group_list_background":"",
"tab_list_background":"",
"drag_indicator":"",
"close_x":"",
"close_hover_x":"",
"close_hover_border":"",
"close_hover_background":"",
"scrollbar_thumb":"",
"scrollbar_thumb_hover":"",
"scrollbar_track":"",
"options_example_menu_item":"",
"options_menu":"",
"tabs_menu_hover_border":"",
"tabs_menu_hover_background":"",
"tabs_menu_separator":"",
"tabs_menu_font":"",
"tabs_menu_border":"",
"tabs_menu_background":"",
"options_there_is_a_theme_with_this_name":"",
"options_theme_name_cannot_be_empty":"",
"options_no_theme_to_export":"",
"options_loaded_theme_older_version":"",
"options_loaded_theme_newer_version":"",
"options_vivaldi_copied_url":"",
"options_copied_wallet_address":"",
"options_clear_data":"",
"options_development":"",
"options_debug":"",
"group_edit_button_cancel":"",
"group_edit_button_confirm":"",
"folder_edit_button_cancel":"",
"folder_edit_button_confirm":"",
"manager_window_button_label_import_group":"",
"manager_window_button_label_import_session":"",
"manager_window_button_label_save_current_session":"",
"caption_ungrouped_group":"",
"caption_noname_group":"",
"caption_clear_filter":"",
"caption_loading":"",
"caption_searchbox":"",
"manager_window_header_title":"",
"menu_manager_window":"",
"button_manager_window":"",
"manager_window_groups_button":"",
"manager_window_sessions_button":"",
"manager_window_autosave_button":"",
"manager_window_button_label_hibernate_group":"",
"manager_window_autosessions_maximum_saves_label":"",
"manager_window_autosessions_save_timer_label":"",
"manager_window_delete_icon":"",
"manager_window_savetofile_icon":"",
"manager_window_merge_icon":"",
"manager_window_load_icon":"",
"options_Remove_button":"",
"add_tab_group_regex":"",
"menu_unload_tree":"",
"status_bar_running_in_safe_mode":"",
"status_bar_ready":""
};
let translator = { let translator = {
@ -32,30 +340,30 @@ let translator = {
} }
document.getElementById("load_translation").onclick = function(event) { document.getElementById("load_translation").onclick = function(event) {
if (event.which == 1) { if (event.which == 1) {
translator.File_OpenFile(); translator.File.OpenFile();
} }
} }
document.getElementById("export_translation").onclick = function(event) { document.getElementById("export_translation").onclick = function(event) {
if (event.which == 1) { if (event.which == 1) {
translator.File_SaveFile(); translator.File.SaveFile();
} }
} }
}, },
textBox: class { textBox: class {
constructor(p) { constructor(p) {
let textValue = chrome.i18n.getMessage(p.id);
let OriginalText = document.createElement("div"); let OriginalText = document.createElement("div");
OriginalText.classList = "original"; OriginalText.classList = "original";
OriginalText.id = p.id; OriginalText.id = p.id;
OriginalText.innerHTML = p.message; OriginalText.innerHTML = textValue;
body.appendChild(OriginalText); body.appendChild(OriginalText);
this.OriginalText = OriginalText; this.OriginalText = OriginalText;
let TextBox = document.createElement("textarea"); let TextBox = document.createElement("textarea");
TextBox.classList = "translated"; TextBox.classList = "translated";
TextBox.id = p.id; TextBox.id = p.id;
TextBox.style.width = "100%"; TextBox.style.width = "100%";
TextBox.value = ""; TextBox.value = textValue;
TextBox.style.whiteSpace = "normal"; TextBox.style.whiteSpace = "normal";
TextBox.style.marginBottom = "10px"; TextBox.style.marginBottom = "10px";
body.appendChild(TextBox); body.appendChild(TextBox);
@ -117,5 +425,3 @@ let translator = {
translator.init(); translator.init();