bump to v1.1

This commit is contained in:
karol@jagiello.it 2017-11-20 18:14:07 +01:00
parent 82a351c5d9
commit ca56e8fbe9
40 changed files with 955 additions and 544 deletions

BIN
Screenshots/Options.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

BIN
Screenshots/Options_FF.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

BIN
Screenshots/Sidebar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

48
TODO.txt Normal file
View File

@ -0,0 +1,48 @@
TOP PRIORITY:
Add a shortcut to open tree tabs sidebar
undo close to restore trees (will work ONLY in firefox)
Loading data using message
Close tab on Middle mouse click and not On Middle mouse down
Split Pin size in theme
add textbox for ungrouped name in options
LOW PRIORITY:
option for scrollbar on the left
folders
unread state?
menu: collapse entire tree
menu: expand tree
menu: copy urls of the selected tabs
menu: bookmark selected tabs/tree
menu: select all
menu: invert selection
options: Customising the context menu
click on active to return to previous tab
sort tabs/tree
maybe filter tabs on search
make tabs border width configurable, including size 0
make tab spacing confiogurable, including 0 size

View File

@ -0,0 +1 @@
{"ToolbarShow":true,"ColorsSet":{"scrollbar_thumb":"#666666","scrollbar_thumb_hover":"#999999","scrollbar_track":"#474747","toolbar_background":"#474747","toolbar_border_bottom":"#666666","button_border":"#474747","button_background":"#474747","button_hover_border":"#666666","button_hover_background":"#666666","button_icons":"#dddddd","filter_box_background":"#fafafa","filter_box_border":"#fafafa","filter_box_font":"#333333","filter_clear_icon":"#808080","pin_list_border_bottom":"#666666","pin_list_background":"#474747","tab_list_background":"#474747","tab_background":"#474747","tab_border":"#474747","tab_hover_background":"#666666","tab_hover_border":"#666666","tab_selected_background":"#666666","tab_selected_border":"#666666","tab_selected_hover_border":"#888888","tab_selected_hover_background":"#888888","tab_filtered":"#9a9500","tab_filtered_highlighted":"#ae7100","tab_filtered_selected":"#0f8079","tab_filtered_selected_active":"#1299a9","tab_title":"#eeeeee","tab_title_active":"#fefefe","tab_title_discarded":"#bbbbbb","drag_indicator":"#7090c8","close_x":"#eeeeee","close_hover_x":"#fefefe","close_hover_border":"#474747","close_hover_background":"#474747","expand_open_border":"#cccccc","expand_open_background":"#cccccc","expand_closed_border":"#999999","expand_closed_background":"#999999","expand_lines":"#cccccc","tabs_menu_font":"#333333","tabs_menu_background":"#fafafa","tabs_menu_border":"#bebebe","tabs_menu_hover_background":"#efefef","tabs_menu_hover_border":"#bebebe","tabs_menu_separator":"#efefef"},"TabsSizeSetNumber":4,"TabsSizeSet":{"pin_width":"30px","pin_height":"28px","tab_height":"23px","tab_height_line":"27px","expand_box_size":"5px","expand_box_top":"8px","expand_box_left":"3px","expand_line_h_top":"11px","expand_line_h_width":"12px","expand_line_h_oc_width":"3px","expand_line_v_top":"-11px","expand_line_v_left":"0px","expand_line_v_last_height":"23px","title_padding_with_close":"24px","title_font_size":"12.5px","title_padding_left":"25px","drag_area_top":"9px","drag_area_bottom":"6px","close_top":"4px","close_right":"4px","close_size":"14px","favicon_size":"16px 16px","favicon_pos":"4px center"},"ScrollbarPinList":"4","ScrollbarTabList":"10","theme_name":"dark by cvvar00","theme_version":1,"toolbar":"\n\t\t\t\t\t<div class=\"toolbar_int\" id=\"toolbar_main\">\n\t\t\t\t\t\t<div class=\"button\" id=\"button_new\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_pin\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_undo\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_search\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_tools\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"toolbar_int\" id=\"toolbar_search\">\n\t\t\t\t\t\t<div id=\"toolbar_search_input_box\">\n\t\t\t\t\t\t\t<input id=\"filter_box\" type=\"text\" placeholder=\"Search tabs...\">\n\t\t\t\t\t\t\t<div id=\"button_filter_clear\" style=\"opacity:0;\" type=\"reset\"></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div id=\"toolbar_search_buttons\">\n\t\t\t\t\t\t\t<div class=\"button\" id=\"button_filter_type\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t\t<div class=\"button\" id=\"filter_search_go_prev\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t\t<div class=\"button\" id=\"filter_search_go_next\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"toolbar_int\" id=\"toolbar_tools\">\n\t\t\t\t\t\t<div class=\"button\" id=\"button_options\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_bookmarks\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_downloads\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_history\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_settings\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_extensions\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_discard\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_move\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div id=\"toolbar_separator\">\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"toolbar_int\" id=\"toolbar_unused_buttons\">\n\t\t\t\t\t</div>\t\t\t\t\n\t\t\t\t"}

View File

@ -0,0 +1 @@
{"ToolbarShow":true,"ColorsSet":{"scrollbar_thumb":"#484848","scrollbar_thumb_hover":"#323232","scrollbar_track":"#3c3c3c","toolbar_background":"#484848","toolbar_border_bottom":"#323232","button_border":"#484848","button_background":"#484848","button_hover_border":"#323232","button_hover_background":"#323232","button_icons":"#adadad","filter_box_background":"#3c3c3c","filter_box_border":"#323232","filter_box_font":"#adadad","filter_clear_icon":"#adadad","pin_list_border_bottom":"#323232","pin_list_background":"#3c3c3c","tab_list_background":"#3c3c3c","tab_background":"#484848","tab_border":"#484848","tab_hover_background":"#323232","tab_hover_border":"#323232","tab_selected_background":"#707070","tab_selected_border":"#707070","tab_selected_hover_border":"#818181","tab_selected_hover_background":"#818181","tab_filtered":"#827e00","tab_filtered_highlighted":"#b37400","tab_filtered_selected":"#0f8079","tab_filtered_selected_active":"#1299a9","active_font_weight":"normal","tab_title":"#adadad","tab_title_active":"#cacaca","tab_title_discarded":"#7e7e7e","drag_indicator":"#c4c4c4","close_x":"#c4c4c4","close_hover_x":"#fbfcfe","close_hover_border":"#757676","close_hover_background":"#939394","expand_open_border":"#339bf3","expand_open_background":"#339bf3","expand_closed_border":"#818181","expand_closed_background":"#818181","expand_lines":"#9d9d9d","tabs_menu_font":"#333333","tabs_menu_background":"#fafafa","tabs_menu_border":"#bebebe","tabs_menu_hover_background":"#efefef","tabs_menu_hover_border":"#bebebe","tabs_menu_separator":"#efefef"},"TabsSizeSetNumber":2,"TabsSizeSet":{"pin_width":"26px","pin_height":"24px","tab_height":"19px","tab_height_line":"22px","expand_box_size":"5px","expand_box_top":"6px","expand_box_left":"3px","expand_line_h_top":"9px","expand_line_h_width":"12px","expand_line_h_oc_width":"3px","expand_line_v_top":"-9px","expand_line_v_left":"0px","expand_line_v_last_height":"19px","title_padding_with_close":"24px","title_font_size":"12px","title_padding_left":"25px","drag_area_top":"7px","drag_area_bottom":"5px","close_top":"2px","close_right":"2px","close_size":"13px","favicon_size":"16px 16px","favicon_pos":"4px center"},"ScrollbarPinList":"2","ScrollbarTabList":"16","theme_name":"dark by kroppy","theme_version":1,"toolbar":"\n\t\t\t\t\t<div class=\"toolbar_int\" id=\"toolbar_main\">\n\t\t\t\t\t\t<div class=\"button\" id=\"button_new\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_pin\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_undo\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_search\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_tools\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"toolbar_int\" id=\"toolbar_search\">\n\t\t\t\t\t\t<div id=\"toolbar_search_input_box\">\n\t\t\t\t\t\t\t<input id=\"filter_box\" type=\"text\" placeholder=\"Search tabs...\">\n\t\t\t\t\t\t\t<div id=\"button_filter_clear\" style=\"opacity:0;\" type=\"reset\"></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div id=\"toolbar_search_buttons\">\n\t\t\t\t\t\t\t<div class=\"button\" id=\"button_filter_type\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t\t<div class=\"button\" id=\"filter_search_go_prev\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t\t<div class=\"button\" id=\"filter_search_go_next\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"toolbar_int\" id=\"toolbar_tools\">\n\t\t\t\t\t\t<div class=\"button\" id=\"button_options\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_bookmarks\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_downloads\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_history\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_settings\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_extensions\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_discard\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_move\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div id=\"toolbar_separator\">\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"toolbar_int\" id=\"toolbar_unused_buttons\">\n\t\t\t\t\t</div>\t\t\t\t\n\t\t\t\t"}

View File

@ -0,0 +1 @@
{"ToolbarShow":true,"ColorsSet":{"scrollbar_thumb":"#cdcdcd","scrollbar_thumb_hover":"#a6a6a6","scrollbar_track":"#e4e4e4","toolbar_background":"#4a4a4a","toolbar_border_bottom":"#2f2f2f","button_border":"#4c4c4c","button_background":"#4a4a4a","button_hover_border":"#383838","button_hover_background":"#383838","button_icons":"#d7d7d7","filter_box_background":"#333333","filter_box_border":"#2d2d2d","filter_box_font":"#e3e3e3","filter_clear_icon":"#808080","pin_list_border_bottom":"#2f2f2f","pin_list_background":"#3f3f3f","tab_list_background":"#3f3f3f","tab_background":"#4a4a4a","tab_border":"#4a4a4a","tab_hover_background":"#383838","tab_hover_border":"#383838","tab_selected_background":"#333333","tab_selected_border":"#3e3e3e","tab_selected_hover_border":"#2d2d2d","tab_selected_hover_background":"#2d2d2d","tab_filtered":"#785400","tab_filtered_highlighted":"#8e5c00","tab_filtered_selected":"#0f8079","tab_filtered_selected_active":"#1299a9","active_font_weight":"bold","tab_title":"#e3e3e3","tab_title_active":"#ffffff","tab_title_discarded":"#7e7e7e","drag_indicator":"#e3e3e3","close_x":"#7d7d7d","close_hover_x":"#fbfcfe","close_hover_border":"#757676","close_hover_background":"#939394","expand_open_border":"#8a8a8a","expand_open_background":"#d0e2f0","expand_closed_border":"#969696","expand_closed_background":"#eaeaea","expand_lines":"#cccccc","tabs_menu_font":"#e5e5e5","tabs_menu_background":"#414141","tabs_menu_border":"#252525","tabs_menu_hover_background":"#252525","tabs_menu_hover_border":"#252525","tabs_menu_separator":"#525252"},"TabsSizeSetNumber":4,"TabsSizeSet":{"pin_width":"30px","pin_height":"28px","tab_height":"23px","tab_height_line":"26px","expand_box_size":"5px","expand_box_top":"8px","expand_box_left":"3px","expand_line_h_top":"11px","expand_line_h_width":"12px","expand_line_h_oc_width":"3px","expand_line_v_top":"-11px","expand_line_v_left":"0px","expand_line_v_last_height":"23px","title_padding_with_close":"24px","title_font_size":"12.5px","title_padding_left":"25px","drag_area_top":"9px","drag_area_bottom":"6px","close_top":"4px","close_right":"4px","close_size":"14px","favicon_size":"16px 16px","favicon_pos":"4px center"},"ScrollbarPinList":4,"ScrollbarTabList":16,"theme_name":"kvaps_dark","theme_version":1,"toolbar":"\n\t\t\t\t\t<div class=\"toolbar_int\" id=\"toolbar_main\">\n\t\t\t\t\t\t<div class=\"button\" id=\"button_new\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_pin\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_undo\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_search\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_tools\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"toolbar_int\" id=\"toolbar_search\">\n\t\t\t\t\t\t<div id=\"toolbar_search_input_box\">\n\t\t\t\t\t\t\t<input id=\"filter_box\" type=\"text\" placeholder=\"Search tabs...\">\n\t\t\t\t\t\t\t<div id=\"button_filter_clear\" style=\"opacity:0;\" type=\"reset\"></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div id=\"toolbar_search_buttons\">\n\t\t\t\t\t\t\t<div class=\"button\" id=\"button_filter_type\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t\t<div class=\"button\" id=\"filter_search_go_prev\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t\t<div class=\"button\" id=\"filter_search_go_next\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"toolbar_int\" id=\"toolbar_tools\">\n\t\t\t\t\t\t<div class=\"button\" id=\"button_options\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_bookmarks\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_downloads\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_history\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_settings\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_extensions\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_discard\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_move\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div id=\"toolbar_separator\">\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"toolbar_int\" id=\"toolbar_unused_buttons\">\n\t\t\t\t\t</div>\t\t\t\t\n\t\t\t\t"}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"ToolbarShow":true,"ColorsSet":{"scrollbar_thumb":"#c4c4c4","scrollbar_thumb_hover":"#787878","scrollbar_track":"#ffffff","toolbar_background":"#f6f6f6","toolbar_border_bottom":"#cccccc","button_border":"#f6f6f6","button_background":"#f6f6f6","button_hover_border":"#ecebee","button_hover_background":"#ecebee","button_icons":"#000000","filter_box_background":"#fafafa","filter_box_border":"#cccccc","filter_box_font":"#333333","filter_clear_icon":"#000000","pin_list_border_bottom":"#cccccc","pin_list_background":"#ffffff","tab_list_background":"#ffffff","tab_background":"#f6f6f6","tab_border":"#d2d2d2","tab_hover_background":"#d6d5d8","tab_hover_border":"#878787","tab_selected_background":"#c7f4e2","tab_selected_border":"#00caa7","tab_selected_hover_border":"#00caa7","tab_selected_hover_background":"#1de6b4","tab_filtered":"#ffa53b","tab_filtered_highlighted":"#ff8628","tab_filtered_selected":"#fff422","tab_filtered_selected_active":"#fff422","active_font_weight":"bold","tab_title":"#000000","tab_title_active":"#000000","tab_title_discarded":"#7e7e7e","drag_indicator":"#00caa7","close_x":"#3b3b3d","close_hover_x":"#000000","close_hover_border":"#939394","close_hover_background":"#b0adbd","expand_open_border":"#129071","expand_open_background":"#00caa7","expand_closed_border":"#969696","expand_closed_background":"#eaeaea","expand_lines":"#129071","tabs_menu_font":"#333333","tabs_menu_background":"#fafafa","tabs_menu_border":"#bebebe","tabs_menu_hover_background":"#efefef","tabs_menu_hover_border":"#bebebe","tabs_menu_separator":"#efefef"},"TabsSizeSetNumber":2,"TabsSizeSet":{"pin_width":"26px","pin_height":"24px","tab_height":"19px","tab_height_line":"22px","expand_box_size":"5px","expand_box_top":"6px","expand_box_left":"3px","expand_line_h_top":"9px","expand_line_h_width":"12px","expand_line_h_oc_width":"3px","expand_line_v_top":"-9px","expand_line_v_left":"0px","expand_line_v_last_height":"19px","title_padding_with_close":"24px","title_font_size":"12px","title_padding_left":"25px","drag_area_top":"7px","drag_area_bottom":"5px","close_top":"2px","close_right":"2px","close_size":"13px","favicon_size":"16px 16px","favicon_pos":"4px center"},"ScrollbarPinList":"4","ScrollbarTabList":"8","theme_name":"legacy by luetage","theme_version":1,"toolbar":"\n\t\t\t\t\t<div class=\"toolbar_int\" id=\"toolbar_main\">\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class=\"button\" id=\"button_new\"><div class=\"button_img\"></div></div><div class=\"button\" id=\"button_pin\"><div class=\"button_img\"></div></div><div class=\"button\" id=\"button_undo\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t<div class=\"button\" id=\"button_search\"><div class=\"button_img\"></div></div><div class=\"button on\" id=\"button_tools\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"toolbar_int hidden\" id=\"toolbar_search\">\n\t\t\t\t\t\t<div id=\"toolbar_search_input_box\">\n\t\t\t\t\t\t\t<input id=\"filter_box\" type=\"text\" placeholder=\"Search tabs...\">\n\t\t\t\t\t\t\t<div id=\"button_filter_clear\" style=\"opacity:0;\" type=\"reset\"></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div id=\"toolbar_search_buttons\">\n\t\t\t\t\t\t\t<div class=\"button url\" id=\"button_filter_type\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t\t<div class=\"button\" id=\"filter_search_go_prev\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t\t<div class=\"button\" id=\"filter_search_go_next\"><div class=\"button_img\"></div></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"toolbar_int\" id=\"toolbar_tools\">\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t<div class=\"button\" id=\"button_options\"><div class=\"button_img\"></div></div><div class=\"button\" id=\"button_bookmarks\"><div class=\"button_img\"></div></div><div class=\"button\" id=\"button_downloads\"><div class=\"button_img\"></div></div><div class=\"button\" id=\"button_history\"><div class=\"button_img\"></div></div><div class=\"button\" id=\"button_settings\"><div class=\"button_img\"></div></div><div class=\"button\" id=\"button_extensions\"><div class=\"button_img\"></div></div><div class=\"button\" id=\"button_discard\"><div class=\"button_img\"></div></div><div class=\"button\" id=\"button_move\" draggable=\"true\"><div class=\"button_img\"></div></div></div>\n\t\t\t\t\t<div id=\"toolbar_separator\">\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"toolbar_int\" id=\"toolbar_unused_buttons\">\n\t\t\t\t\t</div>\t\t\t\t\n\t\t\t\t"}

View File

@ -5,6 +5,9 @@
"extDesc": { "extDesc": {
"message": "Manage your tabs in the sidebar!" "message": "Manage your tabs in the sidebar!"
}, },
"OpenSidebar": {
"message": "Open Tree Tabs"
},
"button_new": { "button_new": {
@ -189,7 +192,7 @@
"message": " Tabs " "message": " Tabs "
}, },
"options_syncro_tabbar_tabs_order": { "options_syncro_tabbar_tabs_order": {
"message": "synchronise TabBar tabs order with Tree Tabs (with too many tabs, after moving tabs, Tree Tabs may be unresponsive for a second)" "message": "synchronise browser tabs order with Tree Tabs, tabs can be unresponsive for a second after drag&drop, but this option is needed for correct ctrl+tab switching"
}, },
"options_switch_with_scroll": { "options_switch_with_scroll": {
"message": "switch tabs with mouse wheel" "message": "switch tabs with mouse wheel"
@ -212,6 +215,11 @@
"options_promote_children": { "options_promote_children": {
"message": "promote children tabs on close, if disabled, when closing the parent of a tree structure, all tabs will be closed (be careful, because undo close tab will not recover the trees structure)" "message": "promote children tabs on close, if disabled, when closing the parent of a tree structure, all tabs 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 tab as a parent"
},
"options_skip_load": { "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." "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."
}, },
@ -268,7 +276,13 @@
"message": "at the bottom" "message": "at the bottom"
}, },
"options_max_tree_drag_drop": { "options_max_tree_drag_drop": {
"message": "Limit Drag&Drop to tree's maximum depth as well" "message": "limit Drag&Drop to tree's maximum depth as well"
},
"options_show_counter_tabs": {
"message": "show children tabs count on tab's title"
},
"options_show_counter_tabs_hints": {
"message": "show children tabs count in tab's hint"
}, },
"options_max_tree_depth": { "options_max_tree_depth": {
@ -277,6 +291,21 @@
"options_groups": {
"message": "Groups"
},
"options_show_counter_groups": {
"message": "show tabs count on groups"
},
"options_groups_toolbar_default": {
"message": "show groups toolbar in new windows"
},
@ -554,7 +583,7 @@
"options_clear_data": { "options_clear_data": {
"message": "Sidebar is not loading? Clear everything! ATTENTION! Tabs arrangement will be lost as well!" "message": "Sidebar is not loading? Reset! ATTENTION! All options and saved Themes will be lost!"
}, },
@ -582,7 +611,7 @@
"caption_ungrouped_group": { "caption_ungrouped_group": {
"message": "Ungrouped tabs" "message": "Ungrouped"
}, },
"caption_noname_group": { "caption_noname_group": {
"message": "untitled" "message": "untitled"

View File

@ -3,6 +3,7 @@
<head><meta charset="utf-8"/></head> <head><meta charset="utf-8"/></head>
<body></body> <body></body>
<script type="text/javascript" src="../scripts/global.js"></script> <script type="text/javascript" src="../scripts/global.js"></script>
<script type="text/javascript" src="../bg_v015_to_v1.js"></script> <script type="text/javascript" src="../legacy.js"></script>
<script type="text/javascript" src="../bg_ch.js"></script> <script type="text/javascript" src="../bg_ch.js"></script>
<script type="text/javascript" src="../bg_ff.js"></script>
</html> </html>

View File

@ -2,27 +2,20 @@
// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license // Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license
// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/
if (localStorage.getItem("t0") !== null){ if (browserId != "F") {
LoadV015(0);
} else {
LoadPreferences(); LoadPreferences();
ChromeLoadTabs(0); ChromeLoadTabs(0);
ChromeMessageListeners(); ChromeMessageListeners();
} }
function ChromeLoadTabs(retry) { function ChromeLoadTabs(retry) {
chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(w) { chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(w) {
var refTabs = {}; var refTabs = {};
var tabs_matched = 0; var tabs_matched = 0;
// load tabs and windows from hdd // load tabs and windows from hdd
var w_count = LoadData("w_count", 0); var w_count = LoadData("w_count", 0);
var t_count = LoadData("t_count", 0); var t_count = LoadData("t_count", 0);
var LoadedWindows = LoadData("windows", []); var LoadedWindows = LoadData("windows", []);
var LoadedTabs = LoadData("tabs", []); var LoadedTabs = LoadData("tabs", []);
// if loaded tabs mismatch by 50%, then try to load back // if loaded tabs mismatch by 50%, then try to load back
if (LoadedTabs.length < t_count*0.5 || retry > 0) { if (LoadedTabs.length < t_count*0.5 || retry > 0) {
LoadedTabs = LoadData("tabs_BAK"+retry, []); LoadedTabs = LoadData("tabs_BAK"+retry, []);
@ -31,24 +24,22 @@ function ChromeLoadTabs(retry) {
if (LoadedWindows.length < w_count || retry > 0) { if (LoadedWindows.length < w_count || retry > 0) {
LoadedWindows = LoadData("windows_BAK"+retry, []); LoadedWindows = LoadData("windows_BAK"+retry, []);
} }
// CACHED COUNTS // CACHED COUNTS
var WinCount = w.length; var WinCount = w.length;
var LoadedWinCount = LoadedWindows.length; var LoadedWinCount = LoadedWindows.length;
var LoadedTabsCount = LoadedTabs.length; var LoadedTabsCount = LoadedTabs.length;
for (var wIndex = 0; wIndex < WinCount; wIndex++) { for (var wIndex = 0; wIndex < WinCount; wIndex++) {
if (w[wIndex].tabs[0].url != "chrome://videopopout/") { // this is for opera for their extra video popup, which is weirdly queried as a "normal" window if (w[wIndex].tabs[0].url != "chrome://videopopout/") { // this is for opera for their extra video popup, which is weirdly queried as a "normal" window
let winId = w[wIndex].id; let winId = w[wIndex].id;
let url1 = w[wIndex].tabs[0].url; let url1 = w[wIndex].tabs[0].url;
let url2 = w[wIndex].tabs[w[wIndex].tabs.length-1].url; let url2 = w[wIndex].tabs[w[wIndex].tabs.length-1].url;
windows[winId] = {group_bar: true, active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, name: caption_ungrouped_group, font: ""}}, folders: {}}; windows[winId] = {group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, name: caption_ungrouped_group, font: ""}}, folders: {}};
for (var LwIndex = 0; LwIndex < LoadedWinCount; LwIndex++) { for (var LwIndex = 0; LwIndex < LoadedWinCount; LwIndex++) {
if (LoadedWindows[LwIndex].url1 == url1 || LoadedWindows[LwIndex].url2 == url2) { if (LoadedWindows[LwIndex].url1 == url1 || LoadedWindows[LwIndex].url2 == url2) {
windows[winId].group_bar = LoadedWindows[LwIndex].group_bar; if (LoadedWindows[LwIndex].group_bar) { windows[winId].group_bar = LoadedWindows[LwIndex].group_bar; }
windows[winId].active_shelf = LoadedWindows[LwIndex].active_shelf; if (LoadedWindows[LwIndex].search_filter) { windows[winId].search_filter = LoadedWindows[LwIndex].search_filter; }
windows[winId].active_group = LoadedWindows[LwIndex].active_group; if (LoadedWindows[LwIndex].active_shelf) { windows[winId].active_shelf = LoadedWindows[LwIndex].active_shelf; }
if (LoadedWindows[LwIndex].active_group) { windows[winId].active_group = LoadedWindows[LwIndex].active_group; }
if (Object.keys(LoadedWindows[LwIndex].groups).length > 0) { windows[winId].groups = Object.assign({}, LoadedWindows[LwIndex].groups); } if (Object.keys(LoadedWindows[LwIndex].groups).length > 0) { windows[winId].groups = Object.assign({}, LoadedWindows[LwIndex].groups); }
if (Object.keys(LoadedWindows[LwIndex].folders).length > 0) { windows[winId].folders = Object.assign({}, LoadedWindows[LwIndex].folders); } if (Object.keys(LoadedWindows[LwIndex].folders).length > 0) { windows[winId].folders = Object.assign({}, LoadedWindows[LwIndex].folders); }
LoadedWindows[LwIndex].url1 = ""; LoadedWindows[LwIndex].url1 = "";
@ -58,14 +49,12 @@ function ChromeLoadTabs(retry) {
} }
} }
} }
for (var wIndex = 0; wIndex < WinCount; wIndex++) { for (var wIndex = 0; wIndex < WinCount; wIndex++) {
var TabsCount = w[wIndex].tabs.length; var TabsCount = w[wIndex].tabs.length;
for (var tabIndex = 0; tabIndex < TabsCount; tabIndex++) { for (var tabIndex = 0; tabIndex < TabsCount; tabIndex++) {
ChromeHashURL(w[wIndex].tabs[tabIndex]); ChromeHashURL(w[wIndex].tabs[tabIndex]);
} }
} }
// compare saved tabs from storage to current session tabs, but can be skipped if set in options // compare saved tabs from storage to current session tabs, but can be skipped if set in options
if (opt.skip_load == false && LoadedTabs.length > 0) { if (opt.skip_load == false && LoadedTabs.length > 0) {
// match loaded tabs // match loaded tabs
@ -76,9 +65,9 @@ function ChromeLoadTabs(retry) {
let tabId = w[wIndex].tabs[tabIndex].id; let tabId = w[wIndex].tabs[tabIndex].id;
if (LoadedTabs[LtabIndex].hash == tabs[tabId].hash && refTabs[LoadedTabs[LtabIndex].id] == undefined) { if (LoadedTabs[LtabIndex].hash == tabs[tabId].hash && refTabs[LoadedTabs[LtabIndex].id] == undefined) {
refTabs[LoadedTabs[LtabIndex].id] = tabId; refTabs[LoadedTabs[LtabIndex].id] = tabId;
tabs[tabId].parent = LoadedTabs[LtabIndex].parent; if (LoadedTabs[LtabIndex].parent) { tabs[tabId].parent = LoadedTabs[LtabIndex].parent; }
tabs[tabId].index = LoadedTabs[LtabIndex].index; if (LoadedTabs[LtabIndex].index) { tabs[tabId].index = LoadedTabs[LtabIndex].index; }
tabs[tabId].expand = LoadedTabs[LtabIndex].expand; if (LoadedTabs[LtabIndex].expand) { tabs[tabId].expand = LoadedTabs[LtabIndex].expand; }
LoadedTabs[LtabIndex].hash = undefined; LoadedTabs[LtabIndex].hash = undefined;
tabs_matched++; tabs_matched++;
break; break;
@ -86,7 +75,6 @@ function ChromeLoadTabs(retry) {
} }
} }
} }
// replace parents tabIds for new ones, for that purpose refTabs was made before // replace parents tabIds for new ones, for that purpose refTabs was made before
for (var tabId in tabs) { for (var tabId in tabs) {
if (refTabs[tabs[tabId].parent] != undefined) { if (refTabs[tabs[tabId].parent] != undefined) {
@ -94,8 +82,6 @@ function ChromeLoadTabs(retry) {
} }
} }
} }
// replace active tab ids for each group using refTabs // replace active tab ids for each group using refTabs
for (var windowId in windows) { for (var windowId in windows) {
for (var group in windows[windowId].groups) { for (var group in windows[windowId].groups) {
@ -104,14 +90,10 @@ function ChromeLoadTabs(retry) {
} }
} }
} }
// will try to find tabs for 3 times // will try to find tabs for 3 times
if (opt.skip_load == true || retry > 2 || (tabs_matched > t_count*0.5)) { if (opt.skip_load == true || retry > 2 || (tabs_matched > t_count*0.5)) {
schedule_save++; schedule_save++;
hold = false; running = true;
ChromeAutoSaveData("", 1000); ChromeAutoSaveData("", 1000);
ChromeAutoSaveData("_BAK1", 300000); ChromeAutoSaveData("_BAK1", 300000);
ChromeAutoSaveData("_BAK2", 600000); ChromeAutoSaveData("_BAK2", 600000);
@ -122,14 +104,12 @@ function ChromeLoadTabs(retry) {
} }
}); });
} }
// You maybe are asking yourself why I save tabs in array? It's because, instead of, keeping 2 index numbers (one for browser tabs on top and one for my index in tree), it's easier to just arrange them in order and save it in localstorage. // You maybe are asking yourself why I save tabs in array? It's because, instead of, keeping 2 index numbers (one for browser tabs on top and one for my index in tree), it's easier to just arrange them in order and save it in localstorage.
// Another reason is that Object does not preserve order in chrome, I've been told that in Firefox it is. But I can't trust that. // Another reason is that Object does not preserve order in chrome, I've been told that in Firefox it is. But I can't trust that.
async function ChromeAutoSaveData(BackupName, LoopTimer) { async function ChromeAutoSaveData(BackupName, LoopTimer) {
setTimeout(function() { setInterval(function() {
ChromeAutoSaveData(BackupName, LoopTimer);
if (schedule_save > 1 || BackupName != "") {schedule_save = 1;} if (schedule_save > 1 || BackupName != "") {schedule_save = 1;}
if (!hold && schedule_save > 0 && Object.keys(tabs).length > 1) { if (running && schedule_save > 0 && Object.keys(tabs).length > 1) {
chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(w) { chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(w) {
var WinCount = w.length; var WinCount = w.length;
var t_count = 0; var t_count = 0;
@ -143,8 +123,8 @@ async function ChromeAutoSaveData(BackupName, LoopTimer) {
for (var wIndex = 0; wIndex < WinCount; wIndex++) { for (var wIndex = 0; wIndex < WinCount; wIndex++) {
let winId = w[wIndex].id; let winId = w[wIndex].id;
if (windows[winId] != undefined && windows[winId].group_bar != undefined && windows[winId].active_shelf != undefined && windows[winId].active_group != undefined && windows[winId].groups != undefined && windows[winId].folders != undefined) { if (windows[winId] != undefined && windows[winId].group_bar != undefined && windows[winId].search_filter != undefined && windows[winId].active_shelf != undefined && windows[winId].active_group != undefined && windows[winId].groups != undefined && windows[winId].folders != undefined) {
Windows.push({url1: w[wIndex].tabs[0].url, url2: w[wIndex].tabs[w[wIndex].tabs.length-1].url, group_bar: windows[winId].group_bar, active_shelf: windows[winId].active_shelf, active_group: windows[winId].active_group, groups: windows[winId].groups, folders: windows[winId].folders}); Windows.push({url1: w[wIndex].tabs[0].url, url2: w[wIndex].tabs[w[wIndex].tabs.length-1].url, group_bar: windows[winId].group_bar, search_filter: windows[winId].search_filter, active_shelf: windows[winId].active_shelf, active_group: windows[winId].active_group, groups: windows[winId].groups, folders: windows[winId].folders});
} }
let TabsCount = w[wIndex].tabs.length; let TabsCount = w[wIndex].tabs.length;
@ -167,7 +147,6 @@ async function ChromeAutoSaveData(BackupName, LoopTimer) {
} }
}, LoopTimer); }, LoopTimer);
} }
function ChromeHashURL(tab){ function ChromeHashURL(tab){
if (tabs[tab.id] == undefined) { if (tabs[tab.id] == undefined) {
tabs[tab.id] = {hash: 0, parent: tab.pinned ? "pin_list" : "tab_list", index: tab.index, expand: "n"}; tabs[tab.id] = {hash: 0, parent: tab.pinned ? "pin_list" : "tab_list", index: tab.index, expand: "n"};
@ -198,7 +177,7 @@ function ChromeListeners() {
}); });
chrome.tabs.onRemoved.addListener(function(tabId, removeInfo) { chrome.tabs.onRemoved.addListener(function(tabId, removeInfo) {
chrome.runtime.sendMessage({command: "tab_removed", windowId: removeInfo.windowId, tabId: tabId}); setTimeout(function() { chrome.runtime.sendMessage({command: "tab_removed", windowId: removeInfo.windowId, tabId: tabId}); },5);
delete tabs[tabId]; delete tabs[tabId];
schedule_save++; schedule_save++;
}); });
@ -259,7 +238,7 @@ function ChromeListeners() {
}); });
chrome.windows.onCreated.addListener(function(window) { chrome.windows.onCreated.addListener(function(window) {
windows[window.id] = {group_bar: true, active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, name: caption_ungrouped_group, font: ""}}, folders: {}}; windows[window.id] = {group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, name: caption_ungrouped_group, font: ""}}, folders: {}};
schedule_save++; schedule_save++;
}); });
@ -269,7 +248,7 @@ function ChromeListeners() {
}); });
chrome.runtime.onSuspend.addListener(function() { chrome.runtime.onSuspend.addListener(function() {
hold = true; running = false;
}); });
} }
@ -301,6 +280,24 @@ function ChromeMessageListeners() {
sendResponse(windows[message.windowId].active_group); sendResponse(windows[message.windowId].active_group);
} }
break; break;
case "set_search_filter":
windows[message.windowId].search_filter = message.search_filter;
schedule_save++;
break;
case "get_search_filter":
if (windows[message.windowId]) {
sendResponse(windows[message.windowId].search_filter);
}
break;
case "set_active_shelf": case "set_active_shelf":
windows[message.windowId].active_shelf = message.active_shelf; windows[message.windowId].active_shelf = message.active_shelf;
schedule_save++; schedule_save++;
@ -325,8 +322,8 @@ function ChromeMessageListeners() {
case "get_browser_tabs": case "get_browser_tabs":
sendResponse(tabs); sendResponse(tabs);
break; break;
case "is_bg_busy": case "is_bg_running":
sendResponse(hold); sendResponse(running);
break; break;
case "update_tab": case "update_tab":
if (tabs[message.tabId]) { if (tabs[message.tabId]) {
@ -336,6 +333,10 @@ function ChromeMessageListeners() {
schedule_save++; schedule_save++;
} }
break; break;
case "get_theme":
let theme = LoadData(("theme"+localStorage["current_theme"]), {"TabsSizeSetNumber": 2, "ToolbarShow": true, "toolbar": DefaultToolbar});
sendResponse(theme);
break;
} }
}); });
} }

212
bg_ff.js
View File

@ -2,26 +2,33 @@
// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license // Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license
// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/
if (localStorage.getItem("t0") !== null){ if (browserId == "F") {
LoadV015(0);
} else {
LoadPreferences(); LoadPreferences();
FirefoxStart(); FirefoxStart();
FirefoxMessageListeners(); FirefoxMessageListeners();
} }
function FirefoxStart() { function FirefoxStart() {
var SafeToRun = true; var SafeToRun = true;
chrome.tabs.query({windowType: "normal"}, function(t) { chrome.tabs.query({}, function(t) {
// will loop forever if session restore tab is found // will loop forever if session restore tab is found
for (var tabIndex = 0; tabIndex < t.length; tabIndex++) { for (var tabIndex = 0; tabIndex < t.length; tabIndex++) {
if (t[tabIndex].url.match("about:sessionrestore") && t.length < 5) { if (t[tabIndex].url.match("about:sessionrestore") && t.length < 10) {
SafeToRun = false; SafeToRun = false;
chrome.tabs.update(t[tabIndex].id, { active: true }); chrome.tabs.update(t[tabIndex].id, { active: true });
} }
if (tabIndex == t.length-1) { if (tabIndex == t.length-1) {
if (SafeToRun) { if (SafeToRun) {
if (localStorage.getItem("t0") !== null){
LoadV015(0);
} else {
if (localStorage.getItem("tabs") !== null){
FirefoxLoadV100(0);
} else {
FirefoxLoadTabs(0); FirefoxLoadTabs(0);
}
}
} else { } else {
setTimeout(function() { setTimeout(function() {
FirefoxStart(); FirefoxStart();
@ -32,113 +39,74 @@ function FirefoxStart() {
}); });
} }
function FirefoxLoadTabs(retry) { function FirefoxLoadTabs(retry) {
chrome.windows.getAll({windowTypes: ["normal"], populate: true}, function(w) { chrome.windows.getAll({windowTypes: ["normal"], populate: true}, function(w) {
var tt_ids = {};
var refTabs = {};
var tabs_matched = 0; var tabs_matched = 0;
var tabs_count = 0; var tabs_count = 0;
for (var wIndex = 0; wIndex < w.length; wIndex++) { for (var wIndex = 0; wIndex < w.length; wIndex++) {
tabs_count += w[wIndex].tabs.length; tabs_count += w[wIndex].tabs.length;
} }
// load tabs and windows from hdd
var LoadedWindows = LoadData("windows", []);
var LoadedTabs = LoadData("tabs", []);
// if loaded tabs mismatch by 50%, then try to load back
if (LoadedTabs.length < tabs_count*0.5 || retry > 0) {
LoadedTabs = LoadData("tabs_BAK"+retry, []);
}
// if loaded windows mismatch, then try to load back
if (LoadedWindows.length < w.length || retry > 0) {
LoadedWindows = LoadData("windows_BAK"+retry, []);
}
// CACHED COUNTS AND STUFF // CACHED COUNTS AND STUFF
var lastWinId = w[w.length-1].id; var lastWinId = w[w.length-1].id;
var lastTabId = w[w.length-1].tabs[w[w.length-1].tabs.length-1].id; var lastTabId = w[w.length-1].tabs[w[w.length-1].tabs.length-1].id;
var LoadedWinCount = LoadedWindows.length;
var LoadedTabsCount = LoadedTabs.length;
var WinCount = w.length; var WinCount = w.length;
for (var wIndex = 0; wIndex < WinCount; wIndex++) { for (var wIndex = 0; wIndex < WinCount; wIndex++) {
let winIndex = wIndex; let winIndex = wIndex;
let winId = w[winIndex].id; let winId = w[winIndex].id;
let tabsCount = w[winIndex].tabs.length; let tabsCount = w[winIndex].tabs.length;
let win = Promise.resolve(browser.sessions.getWindowValue(winId, "TTId")).then(function(TTId) { // LOAD TTID FROM FIREFOX GET WINDOW VALUE // LOAD TTID FROM FIREFOX GET WINDOW VALUE
if (TTId != undefined) { let win = Promise.resolve(browser.sessions.getWindowValue(winId, "TTdata")).then(function(WindowData) {
windows[winId] = {ttid: TTId, group_bar: true, active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, name: caption_ungrouped_group, font: ""}}, folders: {}};
if (opt.skip_load == false && WindowData != undefined) {
windows[winId] = Object.assign({}, WindowData);
} else { } else {
windows[winId] = {ttid: "", group_bar: true, active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, name: caption_ungrouped_group, font: ""}}, folders: {}}; windows[winId] = {ttid: "", group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, activetab_ttid: "", name: caption_ungrouped_group, font: ""}}, folders: {}};
} }
for (var tIndex = 0; tIndex < tabsCount; tIndex++) { for (var tIndex = 0; tIndex < tabsCount; tIndex++) {
let tabIndex = tIndex; let tabIndex = tIndex;
let tabId = w[winIndex].tabs[tabIndex].id; let tabId = w[winIndex].tabs[tabIndex].id;
let tabPinned = w[winIndex].tabs[tabIndex].pinned; let tabPinned = w[winIndex].tabs[tabIndex].pinned;
let tab = Promise.resolve(browser.sessions.getTabValue(tabId, "TTId")).then(function(TTId) { // LOAD TTID FROM FIREFOX GET TAB VALUE // LOAD TTID FROM FIREFOX GET TAB VALUE
if (TTId != undefined) { let tab = Promise.resolve(browser.sessions.getTabValue(tabId, "TTdata")).then(function(TabData) {
tabs[tabId] = {ttid: TTId, parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: "n"}; if (opt.skip_load == false && TabData != undefined) {
tabs[tabId] = Object.assign({}, TabData);
tt_ids[tabs[tabId].ttid] = tabId;
tabs_matched++;
} else { } else {
tabs[tabId] = {ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: "n"}; tabs[tabId] = {ttid: "", parent_ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: "n"};
} }
// IF ON LAST TAB AND LAST WINDOW, START MATCHING LOADED DATA // IF ON LAST TAB AND LAST WINDOW, START MATCHING LOADED DATA
if (tabId == lastTabId && winId == lastWinId) { if (tabId == lastTabId && winId == lastWinId) {
for (var ThisSessonWinId in windows) { for (var ThisSessonWinId in windows) {
if (windows[ThisSessonWinId].ttid != ""){ if (windows[ThisSessonWinId].ttid == ""){
for (var LwIndex = 0; LwIndex < LoadedWinCount; LwIndex++) {
if (LoadedWindows[LwIndex].ttid == windows[ThisSessonWinId].ttid) {
windows[ThisSessonWinId].group_bar = LoadedWindows[LwIndex].group_bar;
windows[ThisSessonWinId].active_shelf = LoadedWindows[LwIndex].active_shelf;
windows[ThisSessonWinId].active_group = LoadedWindows[LwIndex].active_group;
if (Object.keys(LoadedWindows[LwIndex].groups).length > 0) { windows[ThisSessonWinId].groups = Object.assign({}, LoadedWindows[LwIndex].groups); }
if (Object.keys(LoadedWindows[LwIndex].folders).length > 0) { windows[ThisSessonWinId].folders = Object.assign({}, LoadedWindows[LwIndex].folders); }
LoadedWindows[LwIndex].ttid = "";
break;
}
}
} else {
AppendWinTTId(parseInt(ThisSessonWinId)); AppendWinTTId(parseInt(ThisSessonWinId));
} }
} }
// OK, DONE WITH WINDOWS, START TABS LOOP // OK, DONE WITH WINDOWS, START TABS LOOP
for (var ThisSessonTabId in tabs) { for (var ThisSessonTabId in tabs) {
if (tabs[ThisSessonTabId].ttid != ""){ if (tabs[ThisSessonTabId].ttid == ""){
for (var LtabIndex = 0; LtabIndex < LoadedTabsCount; LtabIndex++) {
if (LoadedTabs[LtabIndex].ttid == tabs[ThisSessonTabId].ttid) {
refTabs[LoadedTabs[LtabIndex].id] = ThisSessonTabId;
tabs[ThisSessonTabId].parent = LoadedTabs[LtabIndex].parent;
tabs[ThisSessonTabId].index = LoadedTabs[LtabIndex].index;
tabs[ThisSessonTabId].expand = LoadedTabs[LtabIndex].expand;
LoadedTabs[LtabIndex].ttid = "";
tabs_matched++;
break;
}
}
} else {
AppendTabTTId(parseInt(ThisSessonTabId)); AppendTabTTId(parseInt(ThisSessonTabId));
} }
} }
// OK, DONE, NOW REPLACE OLD PARENTS IDS WITH THIS SESSION IDS // OK, DONE, NOW REPLACE OLD PARENTS IDS WITH THIS SESSION IDS
for (var ThisSessonTabId in tabs) { for (var ThisSessonTabId in tabs) {
if (refTabs[tabs[ThisSessonTabId].parent] != undefined) { if (tt_ids[tabs[ThisSessonTabId].parent_ttid] != undefined) {
tabs[ThisSessonTabId].parent = refTabs[tabs[ThisSessonTabId].parent]; tabs[ThisSessonTabId].parent = tt_ids[tabs[ThisSessonTabId].parent_ttid];
} }
} }
// OK, SAME THING FOR ACTIVE TABS IN GROUPS
// OK, SAME THING FOR ACTIVE TABS IN GROUPS
for (var ThisSessonWinId in windows) { for (var ThisSessonWinId in windows) {
for (var group in windows[ThisSessonWinId].groups) { for (var group in windows[ThisSessonWinId].groups) {
if (refTabs[windows[ThisSessonWinId].groups[group].activetab]) { if (tt_ids[windows[ThisSessonWinId].groups[group].activetab_ttid] != undefined) {
windows[ThisSessonWinId].groups[group].activetab = refTabs[windows[ThisSessonWinId].groups[group].activetab]; windows[ThisSessonWinId].groups[group].activetab = tt_ids[windows[ThisSessonWinId].groups[group].activetab_ttid];
} }
} }
} }
@ -146,14 +114,10 @@ function FirefoxLoadTabs(retry) {
// TODO // TODO
// replace parent tab ids for each folder using reference_tabs, unless tabs will be nested ONLY in tabs and folders ONLY in folders, I did not decide yet // replace parent tab ids for each folder using reference_tabs, unless tabs will be nested ONLY in tabs and folders ONLY in folders, I did not decide yet
// will try to find tabs for 3 times // will try to find tabs for 3 times
if (opt.skip_load == true || retry > 2 || (tabs_matched > tabs_count*0.5)) { if (opt.skip_load == true || retry > 2 || (tabs_matched > tabs_count*0.5)) {
hold = false; running = true;
FirefoxAutoSaveData("", 1000); FirefoxAutoSaveData();
FirefoxAutoSaveData("_BAK1", 300000);
FirefoxAutoSaveData("_BAK2", 600000);
FirefoxAutoSaveData("_BAK3", 1800000);
FirefoxListeners(); FirefoxListeners();
} else { } else {
setTimeout(function() {FirefoxLoadTabs(retry+1);}, 2000); setTimeout(function() {FirefoxLoadTabs(retry+1);}, 2000);
@ -168,53 +132,33 @@ function FirefoxLoadTabs(retry) {
} }
// save every second if there is anything to save obviously // save every second if there is anything to save obviously
// async function FirefoxAutoSaveData(BAK, timer) { async function FirefoxAutoSaveData() {
async function FirefoxAutoSaveData(BackupName, LoopTimer) { setInterval(function() {
setTimeout(function() { if (schedule_save > 1) {schedule_save = 1;}
FirefoxAutoSaveData(BackupName, LoopTimer); if (running && schedule_save > 0 && Object.keys(tabs).length > 1) {
if (schedule_save > 1 || BackupName != "") {schedule_save = 1;}
if (!hold && schedule_save > 0 && Object.keys(tabs).length > 1) {
chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(w) { chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(w) {
var WinCount = w.length; var WinCount = w.length;
var t_count = 0;
var counter = 0;
var Windows = [];
var Tabs = [];
for (var wIndex = 0; wIndex < WinCount; wIndex++) {
t_count = t_count + w[wIndex].tabs.length;
}
for (var wIndex = 0; wIndex < WinCount; wIndex++) { for (var wIndex = 0; wIndex < WinCount; wIndex++) {
let winId = w[wIndex].id; let winId = w[wIndex].id;
if (windows[winId] != undefined && windows[winId].ttid != undefined && windows[winId].group_bar != undefined && windows[winId].active_shelf != undefined && windows[winId].active_group != undefined && windows[winId].groups != undefined && windows[winId].folders != undefined) { if (windows[winId] != undefined && windows[winId].ttid != undefined && windows[winId].group_bar != undefined && windows[winId].search_filter != undefined && windows[winId].active_shelf != undefined && windows[winId].active_group != undefined && windows[winId].groups != undefined && windows[winId].folders != undefined) {
Windows.push({ttid: windows[winId].ttid, group_bar: windows[winId].group_bar, active_shelf: windows[winId].active_shelf, active_group: windows[winId].active_group, groups: windows[winId].groups, folders: windows[winId].folders}); browser.sessions.setWindowValue(winId, "TTdata", windows[winId] );
} }
let TabsCount = w[wIndex].tabs.length; let TabsCount = w[wIndex].tabs.length;
for (var tabIndex = 0; tabIndex < TabsCount; tabIndex++) { for (var tabIndex = 0; tabIndex < TabsCount; tabIndex++) {
let tabId = w[wIndex].tabs[tabIndex].id; let tabId = w[wIndex].tabs[tabIndex].id;
if (tabs[tabId] != undefined && tabs[tabId].ttid != undefined && tabs[tabId].parent != undefined && tabs[tabId].index != undefined && tabs[tabId].expand != undefined) { if (tabs[tabId] != undefined && tabs[tabId].ttid != undefined && tabs[tabId].parent != undefined && tabs[tabId].index != undefined && tabs[tabId].expand != undefined) {
Tabs.push({id: tabId, ttid: tabs[tabId].ttid, parent: tabs[tabId].parent, index: tabs[tabId].index, expand: tabs[tabId].expand}); browser.sessions.setTabValue( tabId, "TTdata", tabs[tabId] );
counter++;
} }
} }
if (counter == t_count) {
localStorage["t_count"] = JSON.stringify(t_count);
localStorage["w_count"] = JSON.stringify(WinCount);
localStorage["windows"+BackupName] = JSON.stringify(Windows);
localStorage["tabs"+BackupName] = JSON.stringify(Tabs);
}
} }
schedule_save--; schedule_save--;
}); });
} }
}, LoopTimer); }, 1000);
} }
function GenerateNewWindowID(){ function GenerateNewWindowID(){
var newID = GenerateRandomID(); var newID = "w_"+GenerateRandomID();
var newIdAvailable = true; var newIdAvailable = true;
for (var windowId in windows) { for (var windowId in windows) {
if (windows[windowId].ttid == newID) { if (windows[windowId].ttid == newID) {
@ -229,7 +173,7 @@ function GenerateNewWindowID(){
} }
function GenerateNewTabID(){ function GenerateNewTabID(){
var newID = GenerateRandomID(); var newID = "t_"+GenerateRandomID();
var newIdAvailable = true; var newIdAvailable = true;
for (var tabId in tabs) { for (var tabId in tabs) {
if (tabs[tabId].ttid == newID) { if (tabs[tabId].ttid == newID) {
@ -245,22 +189,22 @@ function GenerateNewTabID(){
function AppendTabTTId(tabId){ function AppendTabTTId(tabId){
let NewTTTabId = GenerateNewTabID(); let NewTTTabId = GenerateNewTabID();
browser.sessions.setTabValue(tabId, "TTId", NewTTTabId);
if (tabs[tabId] != undefined) { if (tabs[tabId] != undefined) {
tabs[tabId].ttid = NewTTTabId; tabs[tabId].ttid = NewTTTabId;
} else { } else {
tabs[tabId] = {ttid: NewTTTabId, parent: "tab_list", index: 0, expand: "n"}; tabs[tabId] = {ttid: NewTTTabId, parent: "tab_list", parent_ttid: "", index: 0, expand: "n"};
} }
browser.sessions.setTabValue( tabId, "TTdata", tabs[tabId] );
} }
function AppendWinTTId(windowId){ function AppendWinTTId(windowId){
let NewTTWindowId = GenerateNewWindowID(); let NewTTWindowId = GenerateNewWindowID();
browser.sessions.setWindowValue(windowId, "TTId", NewTTWindowId);
if (windows[windowId] != undefined) { if (windows[windowId] != undefined) {
windows[windowId].ttid = NewTTWindowId; windows[windowId].ttid = NewTTWindowId;
} else { } else {
windows[windowId] = {ttid: NewTTWindowId, group_bar: true, active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, name: caption_ungrouped_group, font: ""}}, folders: {}}; windows[windowId] = {ttid: NewTTWindowId, group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, activetab_ttid: "", name: caption_ungrouped_group, font: ""}}, folders: {}};
} }
browser.sessions.setWindowValue( windowId, "TTdata", windows[windowId] );
} }
function ReplaceParents(oldTabId, newTabId) { function ReplaceParents(oldTabId, newTabId) {
@ -270,7 +214,6 @@ function ReplaceParents(oldTabId, newTabId) {
tabs[tabId].parent = newTabId; tabs[tabId].parent = newTabId;
} }
} }
// TO DO FOLDERS // TO DO FOLDERS
} }
@ -279,6 +222,20 @@ var DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA = {};
// start all listeners // start all listeners
function FirefoxListeners() { function FirefoxListeners() {
// browser.commands.onCommand.addListener(function(command) {
// if (command == "open_sidebar") {
// browser.sidebarAction.setPanel({panel: (browser.extension.getURL("/sidebar.html")) });
// browser.sidebarAction.open();
// }
// chrome.windows.getLastFocused({windowTypes: ["normal"]}, function(window) {
// if (CurrentWindowId == window.id) {
// if (command == "open_sidebar") {
// ActivatePrevTab();
// }
// }
// });
// });
browser.browserAction.onClicked.addListener(function() { browser.browserAction.onClicked.addListener(function() {
browser.sidebarAction.setPanel({panel: (browser.extension.getURL("/sidebar.html")) }); browser.sidebarAction.setPanel({panel: (browser.extension.getURL("/sidebar.html")) });
browser.sidebarAction.open(); browser.sidebarAction.open();
@ -315,7 +272,7 @@ function FirefoxListeners() {
}); });
chrome.tabs.onRemoved.addListener(function(tabId, removeInfo) { chrome.tabs.onRemoved.addListener(function(tabId, removeInfo) {
chrome.runtime.sendMessage({command: "tab_removed", windowId: removeInfo.windowId, tabId: tabId}); setTimeout(function() { chrome.runtime.sendMessage({command: "tab_removed", windowId: removeInfo.windowId, tabId: tabId}); },5);
delete tabs[tabId]; delete tabs[tabId];
schedule_save++; schedule_save++;
}); });
@ -323,6 +280,8 @@ function FirefoxListeners() {
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if (changeInfo.pinned == true) { if (changeInfo.pinned == true) {
tabs[tabId].parent = "pin_list"; tabs[tabId].parent = "pin_list";
tabs[tabId].parent_ttid = "";
schedule_save++;
} }
if (changeInfo.title != undefined && !tab.active) { if (changeInfo.title != undefined && !tab.active) {
chrome.runtime.sendMessage({command: "tab_attention", windowId: tab.windowId, tabId: tabId}); chrome.runtime.sendMessage({command: "tab_attention", windowId: tab.windowId, tabId: tabId});
@ -382,6 +341,11 @@ function FirefoxMessageListeners() {
break; break;
case "save_groups": case "save_groups":
windows[message.windowId].groups = Object.assign({}, message.groups); windows[message.windowId].groups = Object.assign({}, message.groups);
for (var group in windows[message.windowId].groups) {
if (tabs[windows[message.windowId].groups[group].activetab]) {
windows[message.windowId].groups[group].activetab_ttid = tabs[windows[message.windowId].groups[group].activetab].ttid;
}
}
schedule_save++; schedule_save++;
break; break;
case "set_active_group": case "set_active_group":
@ -393,6 +357,15 @@ function FirefoxMessageListeners() {
sendResponse(windows[message.windowId].active_group); sendResponse(windows[message.windowId].active_group);
} }
break; break;
case "set_search_filter":
windows[message.windowId].search_filter = message.search_filter;
schedule_save++;
break;
case "get_search_filter":
if (windows[message.windowId]) {
sendResponse(windows[message.windowId].search_filter);
}
break;
case "set_active_shelf": case "set_active_shelf":
windows[message.windowId].active_shelf = message.active_shelf; windows[message.windowId].active_shelf = message.active_shelf;
schedule_save++; schedule_save++;
@ -417,17 +390,32 @@ function FirefoxMessageListeners() {
case "get_browser_tabs": case "get_browser_tabs":
sendResponse(tabs); sendResponse(tabs);
break; break;
case "is_bg_busy": case "is_bg_running":
sendResponse(hold); sendResponse(running);
break; break;
case "update_tab": case "update_tab":
if (tabs[message.tabId]) { if (tabs[message.tabId]) {
for (var parameter in message.tab) { if (message.tab.index) {
tabs[message.tabId][parameter] = message.tab[parameter]; tabs[message.tabId].index = message.tab.index;
}
if (message.tab.expand) {
tabs[message.tabId].expand = message.tab.expand;
}
if (message.tab.parent) {
tabs[message.tabId].parent = message.tab.parent;
if (tabs[message.tab.parent]) {
tabs[message.tabId].parent_ttid = tabs[message.tab.parent].ttid;
} else {
tabs[message.tabId].parent_ttid = "";
}
} }
schedule_save++; schedule_save++;
} }
break; break;
case "get_theme":
let theme = LoadData(("theme"+localStorage["current_theme"]), {"TabsSizeSetNumber": 2, "ToolbarShow": true, "toolbar": DefaultToolbar});
sendResponse(theme);
break;
} }
}); });
} }

View File

@ -1,106 +0,0 @@
// Copyright (c) 2017 kroppy. All rights reserved.
// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license
// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/
function OldHashTab(tab){
if (tabs[tab.id] == undefined){
tabs[tab.id] = {ttid: "", hash: 0, h: 0, parent: tab.pinned ? "pin_list" : "tab_list", index: tab.index, expand: "n"};
}
var hash = 0;
if (tab.url.length === 0){
return 0;
}
for (var i = 0; i < tab.url.length; i++){
hash = (hash << 5)-hash;
hash = hash+tab.url.charCodeAt(i);
hash |= 0;
}
tabs[tab.id].h = hash;
}
function LoadV015(retry){
var loaded_options = {};
for (var parameter in DefaultPreferences) {
opt[parameter] = DefaultPreferences[parameter];
}
// set loaded options
if (localStorage.getItem("current_options") !== null){
loaded_options = JSON.parse(localStorage["current_options"]);
}
for (var parameter in opt) {
if (loaded_options[parameter] != undefined && opt[parameter] != undefined){
opt[parameter] = loaded_options[parameter];
}
}
SavePreferences();
if (localStorage.getItem("current_options") !== null){
localStorage.removeItem("current_options");
}
chrome.tabs.query({windowType: "normal"}, function(qtabs){
// create current tabs object
qtabs.forEach(function(Tab){
OldHashTab(Tab);
});
var reference_tabs = {};
var tabs_to_save = [];
var tabs_matched = 0;
// compare saved tabs from storage to current session tabs, but can be skipped if set in options
qtabs.forEach(function(Tab){
for (var t = 0; t < 9999; t++){
if (localStorage.getItem("t"+t) !== null){
var LoadedTab = JSON.parse(localStorage["t"+t]);
if (LoadedTab[1] === tabs[Tab.id].h && reference_tabs[LoadedTab[0]] == undefined){
reference_tabs[LoadedTab[0]] = Tab.id;
tabs[Tab.id].parent = LoadedTab[2];
tabs[Tab.id].index = LoadedTab[3];
tabs[Tab.id].expand = LoadedTab[4];
tabs_matched++;
break;
}
} else {
break;
}
}
});
// replace parents tabIds to new ones, for that purpose reference_tabs was made before
for (var tabId in tabs){
if (reference_tabs[tabs[tabId].parent] != undefined){
tabs[tabId].parent = reference_tabs[tabs[tabId].parent];
}
}
if (browserId == "F") {
// append ids to firefox tabs
qtabs.forEach(function(Tab){
AppendTabTTId(Tab.id);
});
qtabs.forEach(function(Tab){
tabs_to_save.push({id: Tab.id, ttid: tabs[tabId].ttid, parent: tabs[Tab.id].parent, index: tabs[Tab.id].index, expand: tabs[Tab.id].expand});
});
} else {
// create new hashes
qtabs.forEach(function(Tab){
ChromeHashURL(Tab);
});
qtabs.forEach(function(Tab){
tabs_to_save.push({id: Tab.id, hash: tabs[Tab.id].hash, parent: tabs[Tab.id].parent, index: tabs[Tab.id].index, expand: tabs[Tab.id].expand});
});
}
localStorage["t_count"] = JSON.stringify(qtabs.length);
localStorage["tabs"] = JSON.stringify(tabs_to_save);
for (var t = 0; t < 9999; t++){
if (localStorage.getItem("t"+t) !== null){
localStorage.removeItem("t"+t);
}
}
window.location.reload();
});
}

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"/></head>
<body></body>
<script type="text/javascript" src="../scripts/global.js"></script>
<script type="text/javascript" src="../legacy.js"></script>
<script type="text/javascript" src="../bg_ch.js"></script>
<script type="text/javascript" src="../bg_ff.js"></script>
</html>

View File

@ -0,0 +1,43 @@
{
"manifest_version": 2,
"default_locale": "en",
"background": {
"page": "background.html",
"persistent": true
},
"name": "Tree Tabs",
"description": "__MSG_extDesc__",
"icons": {
"128": "icons/128.png",
"48": "icons/48.png",
"38": "icons/24.png",
"19": "icons/16.png",
"16": "icons/16.png"
},
"permissions": [ "tabs", "sessions", "<all_urls>" ],
"sidebar_action": {
"default_icon": {
"16": "icons/16.png",
"19": "icons/16.png",
"38": "icons/38.png"
},
"default_panel": "sidebar.html",
"default_title": "Tree Tabs",
"browser_style": false
},
"browser_action": {
"default_icon": "icons/24.png"
},
"applications": {
"gecko": {
"id": "TreeTabs@jagiello.it",
"strict_min_version": "57.0"
}
},
"options_ui": {
"page": "options.html",
"open_in_tab": true
},
"version": "0.0.16"
}

View File

@ -3,6 +3,6 @@
<head><meta charset="utf-8"/></head> <head><meta charset="utf-8"/></head>
<body></body> <body></body>
<script type="text/javascript" src="../scripts/global.js"></script> <script type="text/javascript" src="../scripts/global.js"></script>
<script type="text/javascript" src="../bg_v015_to_v1.js"></script> <script type="text/javascript" src="../legacy.js"></script>
<script type="text/javascript" src="../bg_ff.js"></script> <script type="text/javascript" src="../bg_ff.js"></script>
</html> </html>

View File

@ -39,5 +39,5 @@
"page": "options.html", "page": "options.html",
"open_in_tab": true "open_in_tab": true
}, },
"version": "0.0.16" "version": "1.1"
} }

View File

@ -0,0 +1,8 @@
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"/></head>
<body></body>
<script type="text/javascript" src="../scripts/global.js"></script>
<script type="text/javascript" src="../legacy.js"></script>
<script type="text/javascript" src="../bg_ch.js"></script>
</html>

View File

@ -3,7 +3,7 @@
"minimum_opera_version": "42", "minimum_opera_version": "42",
"default_locale": "en", "default_locale": "en",
"background": { "background": {
"scripts": [ "background.js" ], "page": "background.html",
"persistent": true "persistent": true
}, },
"name": "Tree Tabs", "name": "Tree Tabs",
@ -16,20 +16,6 @@
"16": "icons/16.png" "16": "icons/16.png"
}, },
"permissions": [ "tabs", "sessions", "<all_urls>" ], "permissions": [ "tabs", "sessions", "<all_urls>" ],
"commands": {
"goto_tab_above": {
"suggested_key": {
"default": "Alt+1"
},
"description": "Go to tab above"
},
"goto_tab_below": {
"suggested_key": {
"default": "Alt+2"
},
"description": "Go to tab below"
}
},
"sidebar_action": { "sidebar_action": {
"default_icon": { "default_icon": {
"19": "icons/16.png", "19": "icons/16.png",
@ -39,5 +25,5 @@
"default_title": "Tree Tabs" "default_title": "Tree Tabs"
}, },
"options_page": "options.html", "options_page": "options.html",
"version": "0.0.16" "version": "1.0"
} }

View File

@ -0,0 +1,8 @@
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"/></head>
<body></body>
<script type="text/javascript" src="../scripts/global.js"></script>
<script type="text/javascript" src="../legacy.js"></script>
<script type="text/javascript" src="../bg_ch.js"></script>
</html>

View File

@ -2,7 +2,7 @@
"manifest_version": 2, "manifest_version": 2,
"default_locale": "en", "default_locale": "en",
"background": { "background": {
"scripts": [ "background.js" ], "page": "background.html",
"persistent": true "persistent": true
}, },
"name": "Tree Tabs", "name": "Tree Tabs",
@ -15,20 +15,6 @@
"16": "icons/16.png" "16": "icons/16.png"
}, },
"permissions": [ "tabs", "sessions", "<all_urls>" ], "permissions": [ "tabs", "sessions", "<all_urls>" ],
"commands": {
"goto_tab_above": {
"suggested_key": {
"default": "Alt+1"
},
"description": "Go to tab above"
},
"goto_tab_below": {
"suggested_key": {
"default": "Alt+2"
},
"description": "Go to tab below"
}
},
"options_ui": { "options_ui": {
"page": "options.html", "page": "options.html",
"open_in_tab": false "open_in_tab": false

253
legacy.js Normal file
View File

@ -0,0 +1,253 @@
// Copyright (c) 2017 kroppy. All rights reserved.
// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license
// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/
function OldHashTab(tab){
if (tabs[tab.id] == undefined){
tabs[tab.id] = {ttid: "", hash: 0, h: 0, parent: tab.pinned ? "pin_list" : "tab_list", index: tab.index, expand: "n"};
}
var hash = 0;
if (tab.url.length === 0){
return 0;
}
for (var i = 0; i < tab.url.length; i++){
hash = (hash << 5)-hash;
hash = hash+tab.url.charCodeAt(i);
hash |= 0;
}
tabs[tab.id].h = hash;
}
function LoadV015(retry){
var loaded_options = {};
for (var parameter in DefaultPreferences) {
opt[parameter] = DefaultPreferences[parameter];
}
// set loaded options
if (localStorage.getItem("current_options") !== null){
loaded_options = JSON.parse(localStorage["current_options"]);
}
for (var parameter in opt) {
if (loaded_options[parameter] != undefined && opt[parameter] != undefined){
opt[parameter] = loaded_options[parameter];
}
}
SavePreferences();
if (localStorage.getItem("current_options") !== null){
localStorage.removeItem("current_options");
}
chrome.tabs.query({windowType: "normal"}, function(qtabs){
// create current tabs object
qtabs.forEach(function(Tab){
OldHashTab(Tab);
});
var reference_tabs = {};
var tabs_to_save = [];
var tabs_matched = 0;
// compare saved tabs from storage to current session tabs, but can be skipped if set in options
qtabs.forEach(function(Tab){
for (var t = 0; t < 9999; t++){
if (localStorage.getItem("t"+t) !== null){
var LoadedTab = JSON.parse(localStorage["t"+t]);
if (LoadedTab[1] === tabs[Tab.id].h && reference_tabs[LoadedTab[0]] == undefined){
reference_tabs[LoadedTab[0]] = Tab.id;
tabs[Tab.id].parent = LoadedTab[2];
tabs[Tab.id].index = LoadedTab[3];
tabs[Tab.id].expand = LoadedTab[4];
tabs_matched++;
break;
}
} else {
break;
}
}
});
// replace parents tabIds to new ones, for that purpose reference_tabs was made before
for (var tabId in tabs){
if (reference_tabs[tabs[tabId].parent] != undefined){
tabs[tabId].parent = reference_tabs[tabs[tabId].parent];
}
}
if (browserId == "F") {
// append ids to firefox tabs
qtabs.forEach(function(Tab){
AppendTabTTId(Tab.id);
});
qtabs.forEach(function(Tab){
tabs_to_save.push({id: Tab.id, ttid: tabs[tabId].ttid, parent: tabs[Tab.id].parent, index: tabs[Tab.id].index, expand: tabs[Tab.id].expand});
});
} else {
// create new hashes
qtabs.forEach(function(Tab){
ChromeHashURL(Tab);
});
qtabs.forEach(function(Tab){
tabs_to_save.push({id: Tab.id, hash: tabs[Tab.id].hash, parent: tabs[Tab.id].parent, index: tabs[Tab.id].index, expand: tabs[Tab.id].expand});
});
}
localStorage["t_count"] = JSON.stringify(qtabs.length);
localStorage["tabs"] = JSON.stringify(tabs_to_save);
for (var t = 0; t < 9999; t++){
if (localStorage.getItem("t"+t) !== null){
localStorage.removeItem("t"+t);
}
}
window.location.reload();
});
}
function FirefoxLoadV100(retry) {
chrome.windows.getAll({windowTypes: ["normal"], populate: true}, function(w) {
var refTabs = {};
var tabs_matched = 0;
var tabs_count = 0;
for (var wIndex = 0; wIndex < w.length; wIndex++) {
tabs_count += w[wIndex].tabs.length;
}
// load tabs and windows from hdd
var LoadedWindows = LoadData("windows", []);
var LoadedTabs = LoadData("tabs", []);
// if loaded tabs mismatch by 50%, then try to load back
if (LoadedTabs.length < tabs_count*0.5 || retry > 0) {
LoadedTabs = LoadData("tabs_BAK"+retry, []);
}
// if loaded windows mismatch, then try to load back
if (LoadedWindows.length < w.length || retry > 0) {
LoadedWindows = LoadData("windows_BAK"+retry, []);
}
// CACHED COUNTS AND STUFF
var lastWinId = w[w.length-1].id;
var lastTabId = w[w.length-1].tabs[w[w.length-1].tabs.length-1].id;
var LoadedWinCount = LoadedWindows.length;
var LoadedTabsCount = LoadedTabs.length;
var WinCount = w.length;
for (var wIndex = 0; wIndex < WinCount; wIndex++) {
let winIndex = wIndex;
let winId = w[winIndex].id;
let tabsCount = w[winIndex].tabs.length;
let win = Promise.resolve(browser.sessions.getWindowValue(winId, "TTId")).then(function(TTId) { // LOAD TTID FROM FIREFOX GET WINDOW VALUE
if (TTId != undefined) {
windows[winId] = {ttid: TTId, group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, activetab_ttid: "", name: caption_ungrouped_group, font: ""}}, folders: {}};
} else {
windows[winId] = {ttid: "", group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, activetab_ttid: "", name: caption_ungrouped_group, font: ""}}, folders: {}};
}
for (var tIndex = 0; tIndex < tabsCount; tIndex++) {
let tabIndex = tIndex;
let tabId = w[winIndex].tabs[tabIndex].id;
let tabPinned = w[winIndex].tabs[tabIndex].pinned;
let tab = Promise.resolve(browser.sessions.getTabValue(tabId, "TTId")).then(function(TTId) { // LOAD TTID FROM FIREFOX GET TAB VALUE
if (TTId != undefined) {
tabs[tabId] = {ttid: TTId, parent_ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: "n"};
} else {
tabs[tabId] = {ttid: "", parent_ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: "n"};
}
// IF ON LAST TAB AND LAST WINDOW, START MATCHING LOADED DATA
if (tabId == lastTabId && winId == lastWinId) {
for (var ThisSessonWinId in windows) {
if (windows[ThisSessonWinId].ttid != ""){
for (var LwIndex = 0; LwIndex < LoadedWinCount; LwIndex++) {
if (LoadedWindows[LwIndex].ttid == windows[ThisSessonWinId].ttid) {
if (LoadedWindows[LwIndex].group_bar) { windows[ThisSessonWinId].group_bar = LoadedWindows[LwIndex].group_bar; }
if (LoadedWindows[LwIndex].search_filter) { windows[ThisSessonWinId].search_filter = LoadedWindows[LwIndex].search_filter; }
if (LoadedWindows[LwIndex].active_shelf) { windows[winId].active_shelf = LoadedWindows[LwIndex].active_shelf; }
if (LoadedWindows[LwIndex].active_group) { windows[ThisSessonWinId].active_group = LoadedWindows[LwIndex].active_group; }
if (Object.keys(LoadedWindows[LwIndex].groups).length > 0) { windows[ThisSessonWinId].groups = Object.assign({}, LoadedWindows[LwIndex].groups); }
if (Object.keys(LoadedWindows[LwIndex].folders).length > 0) { windows[ThisSessonWinId].folders = Object.assign({}, LoadedWindows[LwIndex].folders); }
LoadedWindows[LwIndex].ttid = "";
break;
}
}
} else {
AppendWinTTId(parseInt(ThisSessonWinId));
}
}
// OK, DONE WITH WINDOWS, START TABS LOOP
for (var ThisSessonTabId in tabs) {
if (tabs[ThisSessonTabId].ttid != ""){
for (var LtabIndex = 0; LtabIndex < LoadedTabsCount; LtabIndex++) {
if (LoadedTabs[LtabIndex].ttid == tabs[ThisSessonTabId].ttid) {
refTabs[LoadedTabs[LtabIndex].id] = ThisSessonTabId;
if (LoadedTabs[LtabIndex].parent) { tabs[ThisSessonTabId].parent = LoadedTabs[LtabIndex].parent; }
if (LoadedTabs[LtabIndex].index) { tabs[ThisSessonTabId].index = LoadedTabs[LtabIndex].index; }
if (LoadedTabs[LtabIndex].expand) { tabs[ThisSessonTabId].expand = LoadedTabs[LtabIndex].expand; }
LoadedTabs[LtabIndex].ttid = "";
tabs_matched++;
break;
}
}
} else {
AppendTabTTId(parseInt(ThisSessonTabId));
}
}
// OK, DONE, NOW REPLACE OLD PARENTS IDS WITH THIS SESSION IDS
for (var ThisSessonTabId in tabs) {
if (refTabs[tabs[ThisSessonTabId].parent] != undefined) {
tabs[ThisSessonTabId].parent = refTabs[tabs[ThisSessonTabId].parent];
}
}
// OK, SAME THING FOR ACTIVE TABS IN GROUPS
for (var ThisSessonWinId in windows) {
for (var group in windows[ThisSessonWinId].groups) {
if (refTabs[windows[ThisSessonWinId].groups[group].activetab]) {
windows[ThisSessonWinId].groups[group].activetab = refTabs[windows[ThisSessonWinId].groups[group].activetab];
}
}
}
if (localStorage.getItem("t_count") !== null){
localStorage.removeItem("t_count");
}
if (localStorage.getItem("tabs_BAK1") !== null){
localStorage.removeItem("tabs_BAK1");
}
if (localStorage.getItem("tabs_BAK2") !== null){
localStorage.removeItem("tabs_BAK2");
}
if (localStorage.getItem("tabs_BAK3") !== null){
localStorage.removeItem("tabs_BAK3");
}
if (localStorage.getItem("tabs") !== null){
localStorage.removeItem("tabs");
}
if (localStorage.getItem("windows") !== null){
localStorage.removeItem(windows);
}
// will try to find tabs for 3 times
if (opt.skip_load == true || retry > 2 || (tabs_matched > tabs_count*0.5)) {
running = true;
FirefoxAutoSaveData();
FirefoxListeners();
} else {
setTimeout(function() {FirefoxLoadTabs(retry+1);}, 2000);
}
}
});
}
});
}
});
}

View File

@ -39,5 +39,5 @@
"page": "options.html", "page": "options.html",
"open_in_tab": true "open_in_tab": true
}, },
"version": "1.0" "version": "1.1"
} }

View File

@ -54,6 +54,21 @@
</table> </table>
</fieldset> </fieldset>
<fieldset class="field" id="field_groups">
<legend class="label" id="options_groups"></legend>
<table style="display:vinline-block;">
<tr>
<td><input type="checkbox" class="opt_checkbox bg_opt" id="groups_toolbar_default"></input></td>
<td style="position:relative;left:2px;width:3px;">-</td>
<td class="label" id="options_groups_toolbar_default"></td>
</tr>
<tr>
<td><input type="checkbox" class="opt_checkbox bg_opt" id="show_counter_groups"></input></td>
<td style="position:relative;left:2px;width:3px;">-</td>
<td class="label" id="options_show_counter_groups"></td>
</tr>
</table>
</fieldset>
<fieldset class="field" id="field_tabs"> <fieldset class="field" id="field_tabs">
<legend class="label" id="options_tabs"></legend> <legend class="label" id="options_tabs"></legend>
@ -98,6 +113,11 @@
<td style="position:relative;top:-5px;left:2px;width:3px;">-</td> <td style="position:relative;top:-5px;left:2px;width:3px;">-</td>
<td class="label" id="options_promote_children"></td> <td class="label" id="options_promote_children"></td>
</tr> </tr>
<tr>
<td><input type="checkbox" class="opt_checkbox bg_opt" id="promote_children_in_first_child"></input></td>
<td style="position:relative;left:2px;width:3px;">-</td>
<td class="label" id="options_promote_children_in_first_child"></td>
</tr>
<tr> <tr>
<td style="position:relative;top:-1px;"><input type="checkbox" class="opt_checkbox bg_opt" id="skip_load"></input></td> <td style="position:relative;top:-1px;"><input type="checkbox" class="opt_checkbox bg_opt" id="skip_load"></input></td>
<td style="position:relative;top:-1px;left:2px;width:3px;">-</td> <td style="position:relative;top:-1px;left:2px;width:3px;">-</td>
@ -108,6 +128,21 @@
<td style="position:relative;left:2px;width:3px;">-</td> <td style="position:relative;left:2px;width:3px;">-</td>
<td class="label" id="options_max_tree_drag_drop"></td> <td class="label" id="options_max_tree_drag_drop"></td>
</tr> </tr>
<tr>
<td><input type="checkbox" class="opt_checkbox bg_opt" id="show_counter_tabs"></input></td>
<td style="position:relative;left:2px;width:3px;">-</td>
<td class="label" id="options_show_counter_tabs"></td>
</tr>
<tr>
<td><input type="checkbox" class="opt_checkbox bg_opt" id="show_counter_tabs_hints"></input></td>
<td style="position:relative;left:2px;width:3px;">-</td>
<td class="label" id="options_show_counter_tabs_hints"></td>
</tr>
</table> </table>
<ul> <ul>

View File

@ -305,10 +305,17 @@ function SetEvents() {
}); });
// options that need reload // options that need reload
$(document).on("click", "#syncro_tabbar_tabs_order, #allow_pin_close, #switch_with_scroll, #always_show_close, #never_show_close, #close_other_trees", function(event) { $(document).on("click", "#syncro_tabbar_tabs_order, #allow_pin_close, #switch_with_scroll, #always_show_close, #never_show_close, #close_other_trees, #show_counter_tabs, #show_counter_tabs_hints", function(event) {
chrome.runtime.sendMessage({command: "reload_sidebar"}); chrome.runtime.sendMessage({command: "reload_sidebar"});
}); });
// options that need a total reload
$(document).on("click", "#groups_toolbar_default", function(event) {
chrome.runtime.sendMessage({command: "reload"});
chrome.runtime.sendMessage({command: "reload_sidebar"});
location.reload();
});
// set dropdown menu options // set dropdown menu options
$("#append_child_tab, #append_child_tab_after_limit, #after_closing_active_tab, #append_orphan_tab").change(function() { $("#append_child_tab, #append_child_tab_after_limit, #after_closing_active_tab, #append_orphan_tab").change(function() {
opt[this.id] = $(this).val(); opt[this.id] = $(this).val();

View File

@ -14,6 +14,9 @@ function LoadTheme(themeName) {
$("#toolbar").html(SelectedTheme.toolbar); $("#toolbar").html(SelectedTheme.toolbar);
$("#toolbar_unused_buttons").html(SelectedTheme.unused_buttons); $("#toolbar_unused_buttons").html(SelectedTheme.unused_buttons);
if (browserId == "F") {
$(".button#button_load_bak1, .button#button_load_bak2, .button#button_load_bak3").remove();
}
// expand toolbar options // expand toolbar options
SelectedTheme.ToolbarShow = $("#show_toolbar")[0].checked = SelectedTheme.ToolbarShow; SelectedTheme.ToolbarShow = $("#show_toolbar")[0].checked = SelectedTheme.ToolbarShow;
$("#field_show_toolbar").css({"height": $("#show_toolbar")[0].checked ? "" : "6"}); $("#field_show_toolbar").css({"height": $("#show_toolbar")[0].checked ? "" : "6"});

View File

@ -5,7 +5,6 @@
// ********** CHROME EVENTS *************** // ********** CHROME EVENTS ***************
function StartChromeListeners(){ function StartChromeListeners(){
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
if (message.command == "drag_drop") { if (message.command == "drag_drop") {
DragAndDrop.DragNodeClass = message.DragNodeClass; DragAndDrop.DragNodeClass = message.DragNodeClass;
@ -15,9 +14,6 @@ function StartChromeListeners(){
DragAndDrop.ComesFromWindowId = message.ComesFromWindowId; DragAndDrop.ComesFromWindowId = message.ComesFromWindowId;
DragAndDrop.Depth = message.Depth; DragAndDrop.Depth = message.Depth;
} }
if (message.command == "drag_dropped") {
DragAndDrop.Dropped = message.Dropped;
}
if (message.command == "reload_sidebar") { if (message.command == "reload_sidebar") {
window.location.reload(); window.location.reload();
} }
@ -42,12 +38,10 @@ function StartChromeListeners(){
if (message.windowId == CurrentWindowId) { if (message.windowId == CurrentWindowId) {
switch(message.command) { switch(message.command) {
case "tab_created": case "tab_created":
// if set to treat unparented tabs as active tab's child // if set to treat unparented tabs as active tab's child
if (opt.append_orphan_tab == "as_child" && message.tab.openerTabId == undefined && $(".active:visible")[0]) { if (opt.append_orphan_tab == "as_child" && message.tab.openerTabId == undefined && $(".active:visible")[0]) {
message.tab.openerTabId = $(".active:visible")[0].id; message.tab.openerTabId = $(".active:visible")[0].id;
} }
// child case // child case
if (message.tab.openerTabId) { if (message.tab.openerTabId) {
// append to tree // append to tree
@ -59,7 +53,6 @@ function StartChromeListeners(){
AppendTab({ tab: message.tab, ParentId: message.tab.openerTabId, Append: true, Scroll: true }); AppendTab({ tab: message.tab, ParentId: message.tab.openerTabId, Append: true, Scroll: true });
} }
} }
// if reached depth limit of the tree // if reached depth limit of the tree
if (opt.max_tree_depth > 0 && $("#"+message.tab.openerTabId).parents(".tab").length >= opt.max_tree_depth) { if (opt.max_tree_depth > 0 && $("#"+message.tab.openerTabId).parents(".tab").length >= opt.max_tree_depth) {
if (opt.append_child_tab_after_limit == "after") { if (opt.append_child_tab_after_limit == "after") {
@ -72,7 +65,6 @@ function StartChromeListeners(){
AppendTab({ tab: message.tab, ParentId: $("#"+message.tab.openerTabId).parent().parent()[0].id, Append: true, Scroll: true }); AppendTab({ tab: message.tab, ParentId: $("#"+message.tab.openerTabId).parent().parent()[0].id, Append: true, Scroll: true });
} }
} }
// place tabs flat, (should I merge it with orphans case?) // place tabs flat, (should I merge it with orphans case?)
if (opt.max_tree_depth == 0) { if (opt.max_tree_depth == 0) {
if (opt.append_child_tab_after_limit == "after") { if (opt.append_child_tab_after_limit == "after") {
@ -109,23 +101,37 @@ function StartChromeListeners(){
RefreshGUI(); RefreshGUI();
break; break;
case "tab_detached": case "tab_detached":
if (opt.promote_children && $("#"+message.tabId).is(".tab")) { if ($(".tab#"+message.tabId)[0]) {
$("#ch"+message.tabId).children().insertAfter($("#"+message.tabId)); if (opt.promote_children == true) {
if (opt.promote_children_in_first_child == true && $("#ch"+message.tabId).children().length > 1) {
let FirstChild = $("#ch"+message.tabId).children()[0];
$(FirstChild).insertAfter($("#"+message.tabId));
$("#ch"+FirstChild.id).append($("#ch"+message.tabId).children());
} else { } else {
$("#"+message.tabId).find(".tab").each(function() { $("#ch"+message.tabId).children().insertAfter($("#"+message.tabId));
}
} else {
$("#ch"+message.tabId).find(".tab").each(function() {
RemoveTabFromList(this.id); RemoveTabFromList(this.id);
}); });
} }
}
RemoveTabFromList(message.tabId); RemoveTabFromList(message.tabId);
setTimeout(function() { schedule_update_data++; },300); setTimeout(function() { schedule_update_data++; },300);
RefreshGUI(); RefreshGUI();
break; break;
case "tab_removed": case "tab_removed":
if ($(".tab#"+message.tabId)[0]) { if ($(".tab#"+message.tabId)[0]) {
if (opt.promote_children) { if (opt.promote_children == true) {
$("#ch"+message.tabId).children().insertAfter($("#"+message.tabId)); if (opt.promote_children_in_first_child == true && $("#ch"+message.tabId).children().length > 1) {
let FirstChild = $("#ch"+message.tabId).children()[0];
$(FirstChild).insertAfter($("#"+message.tabId));
$("#ch"+FirstChild.id).append($("#ch"+message.tabId).children());
} else { } else {
$("#"+message.tabId).find(".tab").each(function() { $("#ch"+message.tabId).children().insertAfter($("#"+message.tabId));
}
} else {
$("#ch"+message.tabId).find(".tab").each(function() {
chrome.tabs.remove(parseInt(this.id)); chrome.tabs.remove(parseInt(this.id));
}); });
} }
@ -143,12 +149,15 @@ function StartChromeListeners(){
break; break;
case "tab_updated": case "tab_updated":
if (message.changeInfo.favIconUrl != undefined || message.changeInfo.url != undefined) { if (message.changeInfo.favIconUrl != undefined || message.changeInfo.url != undefined) {
setTimeout(function() { GetFaviconAndTitle(message.tabId); },100); setTimeout(function() {
GetFaviconAndTitle(message.tabId, true);
},100);
} }
if (message.changeInfo.title != undefined) { if (message.changeInfo.title != undefined) {
setTimeout(function() { GetFaviconAndTitle(message.tabId); },1000); setTimeout(function() {
GetFaviconAndTitle(message.tabId, true);
},1000);
} }
if (message.changeInfo.audible != undefined || message.changeInfo.mutedInfo != undefined) { if (message.changeInfo.audible != undefined || message.changeInfo.mutedInfo != undefined) {
RefreshMediaIcon(message.tabId); RefreshMediaIcon(message.tabId);
} }

View File

@ -38,25 +38,20 @@ function SetDragAndDropEvents() {
// SET FOLDER DRAG SOURCE // SET FOLDER DRAG SOURCE
$(document).on("dragstart", ".folder_header", function(event) { $(document).on("dragstart", ".folder_header", function(event) {
DragAndDrop.DragNodeClass = "folder"; DragAndDrop.DragNodeClass = "folder";
DragAndDrop.Dropped = false;
event.stopPropagation(); event.stopPropagation();
event.originalEvent.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); event.originalEvent.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0);
event.originalEvent.dataTransfer.setData("text", ""); event.originalEvent.dataTransfer.setData("text", "");
DragAndDrop.ComesFromWindowId = CurrentWindowId; DragAndDrop.ComesFromWindowId = CurrentWindowId;
DragAndDrop.SelectedTabsIds.splice(0, DragAndDrop.SelectedTabsIds.length); DragAndDrop.SelectedTabsIds.splice(0, DragAndDrop.SelectedTabsIds.length);
DragAndDrop.TabsIds.splice(0, DragAndDrop.TabsIds.length); DragAndDrop.TabsIds.splice(0, DragAndDrop.TabsIds.length);
DragAndDrop.Parents.splice(0, DragAndDrop.Parents.length); DragAndDrop.Parents.splice(0, DragAndDrop.Parents.length);
// chrome.runtime.sendMessage({command: "drag_drop", DragNodeClass: "tab", SelectedTabsIds: DragAndDrop.SelectedTabsIds, TabsIds: DragAndDrop.TabsIds, Parents: DragAndDrop.Parents, ComesFromWindowId: CurrentWindowId, Depth: DragAndDrop.Depth});
}); });
// SET TAB DRAG SOURCE // SET TAB DRAG SOURCE
$(document).on("dragstart", ".tab_header", function(event) { $(document).on("dragstart", ".tab_header", function(event) {
DragAndDrop.DragNodeClass = "tab"; DragAndDrop.DragNodeClass = "tab";
DragAndDrop.Dropped = false;
event.stopPropagation(); event.stopPropagation();
event.originalEvent.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); event.originalEvent.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0);
event.originalEvent.dataTransfer.setData("text", ""); event.originalEvent.dataTransfer.setData("text", "");
@ -80,14 +75,14 @@ function SetDragAndDropEvents() {
DragAndDrop.Parents.splice(0, DragAndDrop.Parents.length); DragAndDrop.Parents.splice(0, DragAndDrop.Parents.length);
DragAndDrop.Depth = 0; DragAndDrop.Depth = 0;
$(".selected:visible").find(".tab").each(function() { $(".selected:visible").find(".pin, .tab").each(function() {
if ($(this).parents(".tab").length > DragAndDrop.Depth) { DragAndDrop.Depth = $(this).parents(".tab").length; } if ($(this).parents(".pin, .tab").length > DragAndDrop.Depth) { DragAndDrop.Depth = $(this).parents(".pin, .tab").length; }
}); });
DragAndDrop.Depth -= $(this).parents(".tab").length-1; DragAndDrop.Depth -= $(this).parents(".pin, .tab").length-1;
if (DragAndDrop.Depth < 0) { if (DragAndDrop.Depth < 0) {
DragAndDrop.Depth = 0; DragAndDrop.Depth = 0;
} }
console.log(DragAndDrop.Depth);
$(".selected:visible").each(function() { $(".selected:visible").each(function() {
DragAndDrop.SelectedTabsIds.push(parseInt(this.id)); DragAndDrop.SelectedTabsIds.push(parseInt(this.id));
DragAndDrop.TabsIds.push(parseInt(this.id)); DragAndDrop.TabsIds.push(parseInt(this.id));
@ -107,29 +102,47 @@ function SetDragAndDropEvents() {
$(".highlighted_drop_target").removeClass("highlighted_drop_target"); $(".highlighted_drop_target").removeClass("highlighted_drop_target");
}); });
// SET DROP TARGET WHEN ENTERING PINS AND TABS // SET DROP TARGET WHEN ENTERING PINS
$(document).on("dragenter", ".tab>.drag_entered_top:not(.highlighted_drop_target), .tab>.drag_entered_bottom:not(.highlighted_drop_target), .tab>.drag_enter_center:not(.highlighted_drop_target)", function(event) { $(document).on("dragenter", ".pin>.drag_entered_top:not(.highlighted_drop_target), .pin>.drag_entered_bottom:not(.highlighted_drop_target)", function(event) {
event.stopPropagation(); event.stopPropagation();
if ($(".selected:visible").find($(this)).length > 0 || DragAndDrop.DragNodeClass != "tab") { return; } if (DragAndDrop.DragNodeClass == "tab") {
if (opt.max_tree_drag_drop && opt.max_tree_depth >= 0) { $(".highlighted_drop_target").removeClass("highlighted_drop_target");
if ($(this).is(".drag_enter_center")) { $(this).addClass("highlighted_drop_target");
if (opt.max_tree_depth == 0) { return; }
if ($(this).parents(".tab").length + DragAndDrop.Depth > opt.max_tree_depth) { return; }
} else {
if ($(this).parents(".tab").length + DragAndDrop.Depth > opt.max_tree_depth+1) { return; }
} }
});
// SET DROP TARGET WHEN ENTERING TABS
$(document).on("dragenter", ".tab>.drag_entered_top:not(.highlighted_drop_target), .tab>.drag_entered_bottom:not(.highlighted_drop_target)", function(event) {
event.stopPropagation();
if ($(".selected:visible").find($(this)).length == 0 && DragAndDrop.DragNodeClass == "tab") {
if (opt.max_tree_drag_drop && opt.max_tree_depth >= 0) {
if ($(this).parents(".tab").length + DragAndDrop.Depth > opt.max_tree_depth+1) { return; }
} }
$(".highlighted_drop_target").removeClass("highlighted_drop_target"); $(".highlighted_drop_target").removeClass("highlighted_drop_target");
$(this).addClass("highlighted_drop_target"); $(this).addClass("highlighted_drop_target");
}
}); });
$(document).on("dragenter", ".tab>.drag_enter_center:not(.highlighted_drop_target)", function(event) {
event.stopPropagation();
if ($(".selected:visible").find($(this)).length == 0 && DragAndDrop.DragNodeClass == "tab" && opt.max_tree_depth != 0) {
if (opt.max_tree_drag_drop) {
if (opt.max_tree_depth == 0) { return; }
if ($(this).parents(".tab").length + DragAndDrop.Depth > opt.max_tree_depth) { return; }
}
$(".highlighted_drop_target").removeClass("highlighted_drop_target");
$(this).addClass("highlighted_drop_target");
}
});
// SET DROP TARGET WHEN ENTERING FOLDERS // SET DROP TARGET WHEN ENTERING FOLDERS
$(document).on("dragenter", ".folder>.drag_entered_top:not(.highlighted_drop_target), .folder>.drag_entered_bottom:not(.highlighted_drop_target), .folder>.drag_enter_center:not(.highlighted_drop_target)", function(event) { $(document).on("dragenter", ".folder>.drag_entered_top:not(.highlighted_drop_target), .folder>.drag_entered_bottom:not(.highlighted_drop_target), .folder>.drag_enter_center:not(.highlighted_drop_target)", function(event) {
event.stopPropagation(); event.stopPropagation();
if (DragAndDrop.DragNodeClass == "group") { return; } if (DragAndDrop.DragNodeClass != "group") {
// if (/* $(".selected:visible").find($(this)).length > 0 || */ DragAndDrop.DragNodeClass != "folder") { return; } // if (/* $(".selected:visible").find($(this)).length > 0 || */ DragAndDrop.DragNodeClass != "folder") { return; }
$(".highlighted_drop_target").removeClass("highlighted_drop_target"); $(".highlighted_drop_target").removeClass("highlighted_drop_target");
$(this).addClass("highlighted_drop_target"); $(this).addClass("highlighted_drop_target");
}
}); });
// SET DROP TARGET, PIN_LIST, TAB_LIST, GROUP OR GROUP_BUTTON // SET DROP TARGET, PIN_LIST, TAB_LIST, GROUP OR GROUP_BUTTON
@ -157,15 +170,10 @@ function SetDragAndDropEvents() {
// DROP // DROP
$(document).on("drop", "*", function(event) { $(document).on("drop", "*", function(event) {
DragAndDrop.Dropped = true;
chrome.runtime.sendMessage({command: "drag_dropped", DragAndDrop: true});
event.stopPropagation(); event.stopPropagation();
if (DragAndDrop.ComesFromWindowId == CurrentWindowId /* && ($(window).width() > event.clientX || $(window).height() > event.clientY) */) {
if (DragAndDrop.ComesFromWindowId == CurrentWindowId && MouseHoverOver != "" && $(".highlighted_drop_target")[0] != undefined) {
DropToTarget($(".highlighted_drop_target")); DropToTarget($(".highlighted_drop_target"));
} } else {
if (DragAndDrop.ComesFromWindowId != CurrentWindowId && $(".highlighted_drop_target")[0] != undefined) {
$(".selected").addClass("selected_frozen").removeClass("selected"); $(".selected").addClass("selected_frozen").removeClass("selected");
let target = $(".highlighted_drop_target"); let target = $(".highlighted_drop_target");
let counter = DragAndDrop.TabsIds.length; let counter = DragAndDrop.TabsIds.length;
@ -199,11 +207,14 @@ function SetDragAndDropEvents() {
// DETACH // DETACH
$(document).on("dragend", ".tab_header", function(event) { $(document).on("dragend", ".tab_header", function(event) {
setTimeout(function() { if (DragAndDrop.ComesFromWindowId == CurrentWindowId) {
if (DragAndDrop.Dropped == false && MouseHoverOver == "" && $(".highlighted_drop_target")[0] == undefined) { if (browserId == "F" && (event.screenX < event.view.mozInnerScreenX || event.screenX > (event.view.mozInnerScreenX + $(window).width()) || (event.screenY < event.view.mozInnerScreenY || event.screenY > (event.view.mozInnerScreenY + $(window).height())))) {
DetachTabs(DragAndDrop.TabsIds); DetachTabs(DragAndDrop.TabsIds);
} }
},1100); if (browserId != "F" && (event.pageX < 0 || event.pageX > $(window).width() || event.pageY < 0 || event.pageY > $(window).height())) {
DetachTabs(DragAndDrop.TabsIds);
}
}
}); });
@ -303,6 +314,28 @@ function DropToTarget(TargetNode) {
$(".highlighted_selected").addClass("selected").removeClass("highlighted_selected"); $(".highlighted_selected").addClass("selected").removeClass("highlighted_selected");
// if ($(".tab.active:visible")[0] == undefined) {
// bggroups[$("#"+tabId).parents(".group")[0].id].activetab = parseInt(tabId);
// if ($("#"+tabId).parents(".group")[0].id != active_group) {
// SetActiveGroup($("#"+tabId).parents(".group")[0].id, false, true);
// }
// chrome.runtime.sendMessage({command: "save_groups", groups: bggroups, windowId: CurrentWindowId});
// }
RefreshExpandStates(); RefreshExpandStates();
DragAndDrop.timeout = false; DragAndDrop.timeout = false;
RefreshGUI(); RefreshGUI();

View File

@ -5,7 +5,7 @@
// ********** GLOBAL VARIABLES FOR BACKGROUND, OPTIONS AND SIDEBAR *************** // ********** GLOBAL VARIABLES FOR BACKGROUND, OPTIONS AND SIDEBAR ***************
var hold = true; var running = false;
var schedule_save = 0; var schedule_save = 0;
var schedule_update_indexes = 0; var schedule_update_indexes = 0;
var schedule_rearrange_tabs = 0; var schedule_rearrange_tabs = 0;
@ -15,7 +15,7 @@ var tabs = {};
var MouseHoverOver = ""; var MouseHoverOver = "";
var DragAndDrop = {timeout: false, DragNode: undefined, DragNodeClass: "", Dropped: true, SelectedTabsIds: [], TabsIds: [], Parents: [], ComesFromWindowId: 0, Depth: 0}; var DragAndDrop = {timeout: false, DragNode: undefined, DragNodeClass: "", SelectedTabsIds: [], TabsIds: [], Parents: [], ComesFromWindowId: 0, Depth: 0};
var DropTargetsInFront = false; var DropTargetsInFront = false;
@ -85,20 +85,27 @@ var DefaultToolbar =
'<div class=button id=button_import_bak><div class=button_img></div></div>'+ '<div class=button id=button_import_bak><div class=button_img></div></div>'+
'<div class=button id=button_import_merge_bak><div class=button_img></div></div>'+ '<div class=button id=button_import_merge_bak><div class=button_img></div></div>'+
'<div class=button id=button_export_bak><div class=button_img></div></div>'+ '<div class=button id=button_export_bak><div class=button_img></div></div>'+
(browserId != "F" ?
'<div class=button id=button_load_bak1><div class=button_img></div></div>'+ '<div class=button id=button_load_bak1><div class=button_img></div></div>'+
'<div class=button id=button_load_bak2><div class=button_img></div></div>'+ '<div class=button id=button_load_bak2><div class=button_img></div></div>'+
'<div class=button id=button_load_bak3><div class=button_img></div></div>'+ '<div class=button id=button_load_bak3><div class=button_img></div></div>'
: '')+
'</div>'; '</div>';
// '<div class=toolbar_shelf id=toolbar_shelf_folders>'+ // '<div class=toolbar_shelf id=toolbar_shelf_folders>'+
// '</div>'+ // '</div>'+
var DefaultTheme = { "ToolbarShow": true, "ColorsSet": {}, "TabsSizeSetNumber": 2, "theme_name": "untitled", "theme_version": 2, "toolbar": DefaultToolbar, "unused_buttons": "" }; var DefaultTheme = { "ToolbarShow": true, "ColorsSet": {}, "TabsSizeSetNumber": 2, "theme_name": "untitled", "theme_version": 2, "toolbar": DefaultToolbar, "unused_buttons": "" };
var DefaultPreferences = { "skip_load": false, "new_open_below": false, "pin_list_multi_row": false, "close_with_MMB": true, "always_show_close": false, "allow_pin_close": false, "append_child_tab": "bottom", "append_child_tab_after_limit": "after", "append_orphan_tab": "bottom", "after_closing_active_tab": "below", "close_other_trees": false, "promote_children": true, "open_tree_on_hover": true, "max_tree_depth": -1, "max_tree_drag_drop": true, "never_show_close": false, "switch_with_scroll": false, "syncro_tabbar_tabs_order": true }; var DefaultPreferences = { "skip_load": false, "new_open_below": false, "pin_list_multi_row": false, "close_with_MMB": true, "always_show_close": false, "allow_pin_close": false, "append_child_tab": "bottom", "append_child_tab_after_limit": "after", "append_orphan_tab": "bottom", "after_closing_active_tab": "below", "close_other_trees": false, "promote_children": true, "promote_children_in_first_child": true, "open_tree_on_hover": true, "max_tree_depth": -1, "max_tree_drag_drop": true, "never_show_close": false, "switch_with_scroll": false, "syncro_tabbar_tabs_order": true, "show_counter_groups": true, "show_counter_tabs": true, "show_counter_tabs_hints": true, "groups_toolbar_default": true };
// ******************* GLOBAL FUNCTIONS ************************ // ******************* GLOBAL FUNCTIONS ************************
// function LoadData(KeyName, ExpectReturnDefaultType) {
// chrome.runtime.sendMessage({command: "load_data", K: KeyName, T: ExpectReturnDefaultType}, function(response) {
// return response;
// });
// }
function LoadData(KeyName, ExpectReturnDefaultType) { function LoadData(KeyName, ExpectReturnDefaultType) {
var data = ExpectReturnDefaultType; var data = ExpectReturnDefaultType;
try { try {
@ -180,7 +187,7 @@ function SavePreferences() {
localStorage["preferences"] = JSON.stringify(opt); localStorage["preferences"] = JSON.stringify(opt);
setTimeout(function() { setTimeout(function() {
chrome.runtime.sendMessage({command: "reload_options"}); chrome.runtime.sendMessage({command: "reload_options"});
},200); }, 200);
} }
function ShowOpenFileDialog(id, extension) { function ShowOpenFileDialog(id, extension) {
let body = document.getElementById("body"); let body = document.getElementById("body");

View File

@ -57,7 +57,7 @@ function GenerateNewGroupID(){
function AddNewGroup(p) { function AddNewGroup(p) {
var newId = GenerateNewGroupID(); var newId = GenerateNewGroupID();
bggroups[newId] = { id: newId, index: 0, activetab: 0, name: (p.name ? p.name : caption_noname_group), font: (p.font ? p.font : "") }; bggroups[newId] = { id: newId, index: 0, activetab: 0, activetab_ttid: "", name: (p.name ? p.name : caption_noname_group), font: (p.font ? p.font : "") };
AppendGroupToList(newId, bggroups[newId].name, bggroups[newId].font); AppendGroupToList(newId, bggroups[newId].name, bggroups[newId].font);
UpdateBgGroupsOrder(); UpdateBgGroupsOrder();
return newId; return newId;
@ -111,14 +111,13 @@ function SetActiveGroup(groupId, switch_to_active_in_group, scroll_to_active) {
active_group = groupId; active_group = groupId;
RefreshGUI(); RefreshGUI();
$("#group_edit").hide(); $("#group_edit").hide();
if (switch_to_active_in_group && $("#"+groupId+" .active")[0]){ if (switch_to_active_in_group && $("#"+groupId+" .active")[0]){
chrome.tabs.update(parseInt($("#"+groupId+" .active")[0].id), {active: true}); chrome.tabs.update(parseInt($("#"+groupId+" .active")[0].id), {active: true});
} }
if (scroll_to_active){ if (scroll_to_active && $("#"+groupId+" .active")[0]){
ScrollToTab($("#"+groupId+" .active")[0].id); ScrollToTab($("#"+groupId+" .active")[0].id);
} }
if (groupId == "tab_list" && $("#button_edit_group")[0]) { if (groupId == "tab_list") {
$("#button_remove_group, #button_edit_group").addClass("disabled"); $("#button_remove_group, #button_edit_group").addClass("disabled");
} else { } else {
$("#button_remove_group, #button_edit_group").removeClass("disabled"); $("#button_remove_group, #button_edit_group").removeClass("disabled");
@ -127,8 +126,11 @@ function SetActiveGroup(groupId, switch_to_active_in_group, scroll_to_active) {
} }
function SetActiveTabInActiveGroup(tabId) { function SetActiveTabInActiveGroup(tabId) {
if (bggroups[active_group] != undefined) { if ($("#"+tabId).parents(".group")[0] && bggroups[active_group] != undefined) {
bggroups[active_group].activetab = parseInt(tabId); bggroups[$("#"+tabId).parents(".group")[0].id].activetab = parseInt(tabId);
if ($("#"+tabId).parents(".group")[0].id != active_group) {
SetActiveGroup($("#"+tabId).parents(".group")[0].id, false, true);
}
chrome.runtime.sendMessage({command: "save_groups", groups: bggroups, windowId: CurrentWindowId}); chrome.runtime.sendMessage({command: "save_groups", groups: bggroups, windowId: CurrentWindowId});
} }
} }
@ -224,7 +226,6 @@ function SetGroupEvents() {
// show/hide groups toolbar // show/hide groups toolbar
$(document).on("mousedown", "#button_groups_toolbar_hide", function(event) { $(document).on("mousedown", "#button_groups_toolbar_hide", function(event) {
if (event.button == 0) { if (event.button == 0) {
// $("#toolbar_groups").toggleClass("hidden");
$("#toolbar_groups").toggleClass("hidden"); $("#toolbar_groups").toggleClass("hidden");
if ($("#toolbar_groups").is(".hidden")) { if ($("#toolbar_groups").is(".hidden")) {
$("#toolbar_groups").css({"width": "0px", "border-right": "none"}); $("#toolbar_groups").css({"width": "0px", "border-right": "none"});
@ -264,6 +265,16 @@ function SetGroupEvents() {
$("#"+PickColor).css({"background-color": $("#color_picker")[0].value}); $("#"+PickColor).css({"background-color": $("#color_picker")[0].value});
}); });
// edit group
$(document).on("dblclick", ".group_button:not(#_tab_list)", function(event) {
if (event.button == 0) {
ShowGroupEditWindow((this.id).substr(1));
}
});
// scroll groups // scroll groups
// $(document).on("mousedown", "#scroll_group_up, #scroll_group_down", function(event) { // $(document).on("mousedown", "#scroll_group_up, #scroll_group_down", function(event) {
// IOKeys.LMB = true; // IOKeys.LMB = true;

View File

@ -43,15 +43,20 @@ function RefreshGUI() {
$("#toolbar_groups").css({ "top": $("#toolbar").outerHeight() + $("#pin_list")[0].getBoundingClientRect().height, "height": $(window).height() - $("#toolbar").outerHeight() - $("#pin_list")[0].getBoundingClientRect().height}); $("#toolbar_groups").css({ "top": $("#toolbar").outerHeight() + $("#pin_list")[0].getBoundingClientRect().height, "height": $(window).height() - $("#toolbar").outerHeight() - $("#pin_list")[0].getBoundingClientRect().height});
$(".group_title").each(function(){ $(".group_title").each(function(){
$(this)[0].innerText = (bggroups[(this.id).substr(4)] ? bggroups[(this.id).substr(4)].name : caption_noname_group) + " (" + $("#" + (this.id).substr(4) ).children().length + ")"; $(this)[0].innerText = (bggroups[(this.id).substr(4)] ? bggroups[(this.id).substr(4)].name : caption_noname_group) + (opt.show_counter_groups ? " (" + $("#" + (this.id).substr(4) +" .tab").length + ")" : "");
}); });
$("#_gtetab_list")[0].innerText = caption_ungrouped_group + " (" + $("#tab_list").children().length + ")"; $("#_gtetab_list")[0].innerText = caption_ungrouped_group + (opt.show_counter_groups ? " (" + $("#tab_list .tab").length + ")" : "");
$(".group_button").each(function(){ $(".group_button").each(function(){
$(this).css({ "height": $(this).children(0).innerWidth() }); $(this).css({ "height": $(this).children(0).innerWidth() });
}); });
$("#groups").css({ "top": $("#toolbar")[0].getBoundingClientRect().height + $("#pin_list")[0].getBoundingClientRect().height, "left": $("#toolbar_groups").outerWidth(), "height": $(window).height() - $("#pin_list")[0].getBoundingClientRect().height - $("#toolbar").outerHeight(), "width": $(window).width() - $("#toolbar_groups").outerWidth() }); $("#groups").css({ "top": $("#toolbar")[0].getBoundingClientRect().height + $("#pin_list")[0].getBoundingClientRect().height, "left": $("#toolbar_groups").outerWidth(), "height": $(window).height() - $("#pin_list")[0].getBoundingClientRect().height - $("#toolbar").outerHeight(), "width": $(window).width() - $("#toolbar_groups").outerWidth() });
// $(".c, .o").each(function(){
// RefreshTabCounter(this.id);
// $("#tab_title" + this.id)[0].textContent = $("#tab_title" + this.id).attr( "title" ) + " ("+$("#ch"+this.id).children().length+")";
// });
} }
// set discarded class // set discarded class
@ -98,6 +103,7 @@ function RefreshMediaIcon(tabId) {
// Vivaldi does not have changeInfo.audible listener, this is my own implementation, hopefully this will not affect performance too much // Vivaldi does not have changeInfo.audible listener, this is my own implementation, hopefully this will not affect performance too much
function VivaldiRefreshMediaIcons() { function VivaldiRefreshMediaIcons() {
setInterval(function() {
chrome.tabs.query({currentWindow: true}, function(tabs) { chrome.tabs.query({currentWindow: true}, function(tabs) {
$(".audible, .muted").removeClass("audible").removeClass("muted"); $(".audible, .muted").removeClass("audible").removeClass("muted");
let tc = tabs.length; let tc = tabs.length;
@ -110,29 +116,27 @@ function VivaldiRefreshMediaIcons() {
} }
} }
}); });
setTimeout(function() {
VivaldiRefreshMediaIcons();
}, 1400); }, 1400);
} }
function GetFaviconAndTitle(tabId, addCounter) {
function GetFaviconAndTitle(tabId) {
if ($("#" + tabId)[0]) { if ($("#" + tabId)[0]) {
chrome.tabs.get(parseInt(tabId), function(tab) { chrome.tabs.get(parseInt(tabId), function(tab) {
if (tab){ if (tab){
var title = tab.title ? tab.title : tab.url; let title = tab.title ? tab.title : tab.url;
if (tab.status == "complete") { if (tab.status == "complete") {
$("#" + tabId).removeClass("loading"); $("#" + tabId).removeClass("loading");
// change title // change title
$("#tab_title" + tab.id)[0].textContent = title; $("#tab_title" + tab.id)[0].textContent = title;
$("#tab_header" + tab.id).attr("title", title); $("#tab_header" + tab.id).attr("title", title);
$("#"+tabId).data("title", title);
// compatibility with various Tab suspender extensions // compatibility with various Tab suspender extensions
if (tab.favIconUrl != undefined && tab.favIconUrl.match("data:image/png;base64") != null) { if (tab.favIconUrl != undefined && tab.favIconUrl.match("data:image/png;base64") != null) {
$("#tab_header" + tab.id).css({ "background-image": "url(" + tab.favIconUrl + ")" }); $("#tab_header" + tab.id).css({ "background-image": "url(" + tab.favIconUrl + ")" });
} else { } else {
// case for internal pages, favicons don't have access, but can be loaded from url // case for internal pages, favicons don't have access, but can be loaded from url
if (tab.url.match("opera://|vivaldi://|browser://|chrome://|chrome-extension://|about:") != null) { if (tab.url.match("opera://|vivaldi://|browser://|chrome://|chrome-extension://") != null) {
$("#tab_header" + tab.id).css({ "background-image": "url(chrome://favicon/" + tab.url + ")" }); $("#tab_header" + tab.id).css({ "background-image": "url(chrome://favicon/" + tab.url + ")" });
} else { } else {
// change favicon // change favicon
@ -142,7 +146,8 @@ function GetFaviconAndTitle(tabId) {
$("#tab_header" + tab.id).css({ "background-image": "url(" + tab.favIconUrl + ")" }); $("#tab_header" + tab.id).css({ "background-image": "url(" + tab.favIconUrl + ")" });
}; };
img.onerror = function() { img.onerror = function() {
$("#tab_header" + tab.id).css({ "background-image": "url(chrome://favicon/" + tab.url + ")" }); $("#tab_header" + tab.id).css({ "background-image": ((tab.url == "" || browserId == "F") ? "url(./theme/empty.svg)" : ("url(chrome://favicon/" + tab.url + ")")) });
// $("#tab_header" + tab.id).css({ "background-image": "url(" + tab.url + ")" });
} }
} }
} }
@ -153,10 +158,15 @@ function GetFaviconAndTitle(tabId) {
title = tab.title ? tab.title : caption_loading; title = tab.title ? tab.title : caption_loading;
$("#tab_title" + tab.id)[0].textContent = title; $("#tab_title" + tab.id)[0].textContent = title;
$("#tab_header" + tab.id).attr("title", title); $("#tab_header" + tab.id).attr("title", title);
$("#"+tabId).data("title", title);
setTimeout(function() { setTimeout(function() {
if ($("#" + tabId)[0]) GetFaviconAndTitle(tabId); if ($("#" + tabId)[0]) GetFaviconAndTitle(tabId, addCounter);
}, 1000); }, 1000);
} }
if (addCounter) {
RefreshTabCounter(tabId && (opt.show_counter_tabs || opt.show_counter_tabs_hints));
}
} }
}); });
} }
@ -170,8 +180,38 @@ function RefreshExpandStates() {
if ($(this).parent().is(":not(.o, .c)")) { if ($(this).parent().is(":not(.o, .c)")) {
$(this).parent().addClass("o"); $(this).parent().addClass("o");
} }
if ($("#tab_title"+$(this).parent()[0].id)[0]) {
if (opt.show_counter_tabs) {
$("#tab_title"+$(this).parent()[0].id)[0].textContent = $(this).parent().data("title") + " ("+$("#"+this.id+" .tab").length+")";
}
if (opt.show_counter_tabs_hints) {
$("#tab_header"+$(this).parent()[0].id).attr("title", $(this).parent().data("title") + " ("+$("#"+this.id+" .tab").length+")");
}
}
} else { } else {
$(this).parent().removeClass("o").removeClass("c").addClass("n"); $(this).parent().removeClass("o").removeClass("c").addClass("n");
if ($("#tab_title"+$(this).parent()[0].id)[0]) {
$("#tab_title"+$(this).parent()[0].id)[0].textContent = $(this).parent().data("title");
}
} }
}); });
} }
function RefreshTabCounter(tabId) {
if ($("#"+tabId).data("title")) {
if (opt.show_counter_tabs) {
if ($(".c#"+tabId+", .o#"+tabId)[0]) {
$("#tab_title"+tabId)[0].textContent = $("#"+tabId).data("title") + " ("+$("#ch"+tabId+" .tab").length+")";
} else {
$("#tab_title"+tabId)[0].textContent = $("#"+tabId).data("title");
}
}
if (opt.show_counter_tabs_hints) {
if ($(".c#"+tabId+", .o#"+tabId)[0]) {
$("#tab_header"+tabId).attr("title", $("#"+tabId).data("title") + " ("+$("#ch"+tabId+" .tab").length+")");
} else {
$("#tab_header"+tabId).attr("title", $("#"+tabId).data("title"));
}
}
}
}

View File

@ -5,7 +5,7 @@
// ********** TABS FUNCTIONS *************** // ********** TABS FUNCTIONS ***************
async function UpdateData() { async function UpdateData() {
setTimeout(function() { setInterval(function() {
if (schedule_update_data > 1) {schedule_update_data = 1;} if (schedule_update_data > 1) {schedule_update_data = 1;}
if (schedule_update_data > 0) { if (schedule_update_data > 0) {
$(".pin").each(function() { $(".pin").each(function() {
@ -32,13 +32,11 @@ async function UpdateData() {
}); });
schedule_update_data--; schedule_update_data--;
} }
UpdateData(); }, 1000);
},1000);
} }
function RearrangeBrowserTabsCheck() { function RearrangeBrowserTabsCheck() {
setTimeout(function() { setInterval(function() {
RearrangeBrowserTabsCheck();
if (opt.syncro_tabbar_tabs_order) { if (opt.syncro_tabbar_tabs_order) {
if (schedule_rearrange_tabs > 1) {schedule_rearrange_tabs = 1;} if (schedule_rearrange_tabs > 1) {schedule_rearrange_tabs = 1;}
if (schedule_rearrange_tabs > 0) { if (schedule_rearrange_tabs > 0) {
@ -47,7 +45,7 @@ function RearrangeBrowserTabsCheck() {
schedule_rearrange_tabs--; schedule_rearrange_tabs--;
} }
} }
},1000); }, 1000);
} }
async function RearrangeBrowserTabs(tabIds, tabIndex) { async function RearrangeBrowserTabs(tabIds, tabIndex) {
@ -56,7 +54,9 @@ async function RearrangeBrowserTabs(tabIds, tabIndex) {
if (tab && tabIndex != tab.index) { if (tab && tabIndex != tab.index) {
chrome.tabs.move(tabIds[tabIndex], {index: tabIndex}); chrome.tabs.move(tabIds[tabIndex], {index: tabIndex});
} }
setTimeout(function() {
RearrangeBrowserTabs( tabIds, (tabIndex-1) ); RearrangeBrowserTabs( tabIds, (tabIndex-1) );
}, 1);
}); });
} }
} }
@ -80,7 +80,7 @@ function RearrangeTreeTabs(tabs, bgtabs, first_run) {
// param.Append - if true Appends tab at the end of tree if false or prepends // param.Append - if true Appends tab at the end of tree if false or prepends
function AppendTab(param) { function AppendTab(param) {
if ($("#"+param.tab.id).length > 0) { if ($("#"+param.tab.id).length > 0) {
GetFaviconAndTitle(param.tab.id); GetFaviconAndTitle(param.tab.id, param.addCounter);
return; return;
} }
@ -142,9 +142,10 @@ function AppendTab(param) {
} }
} }
GetFaviconAndTitle(param.tab.id); GetFaviconAndTitle(param.tab.id, param.addCounter);
RefreshMediaIcon(param.tab.id); RefreshMediaIcon(param.tab.id);
if (param.tab.active && param.SkipSetActive == undefined) { if (param.tab.active && param.SkipSetActive == undefined) {
SetActiveTab(param.tab.id); SetActiveTab(param.tab.id);
} }
@ -187,7 +188,7 @@ function SetActiveTab(tabId) {
$(".active:visible").removeClass("active").removeClass("selected"); $(".active:visible").removeClass("active").removeClass("selected");
$(".pin, .tab:visible").removeClass("active").removeClass("selected").removeClass("selected_frozen").removeClass("selected_temporarly").removeClass("tab_header_hover"); $(".pin, .tab:visible").removeClass("active").removeClass("selected").removeClass("selected_frozen").removeClass("selected_temporarly").removeClass("tab_header_hover");
$(".highlighted_drop_target").removeClass("highlighted_drop_target"); $(".highlighted_drop_target").removeClass("highlighted_drop_target");
$("#"+tabId).removeClass("attention").addClass("active")/* .addClass("selected") */; $("#"+tabId).removeClass("attention").addClass("active");
ScrollToTab(tabId); ScrollToTab(tabId);
SetActiveTabInActiveGroup(tabId); SetActiveTabInActiveGroup(tabId);
} }
@ -270,7 +271,7 @@ function CloseTabs(tabsIds) {
}); });
setTimeout(function() { setTimeout(function() {
chrome.tabs.remove(tabsIds, null); chrome.tabs.remove(tabsIds, null);
},100); }, 100);
} }
@ -285,7 +286,7 @@ function DiscardTabs(tabsIds) {
if (tabsIds.length > 0) { if (tabsIds.length > 0) {
setTimeout(function() { setTimeout(function() {
DiscardTabs(tabsIds); DiscardTabs(tabsIds);
},delay); }, delay);
} }
} }
@ -294,9 +295,12 @@ function ActivateNextTab() {
if ($(".pin.active:visible")[0]) { if ($(".pin.active:visible")[0]) {
if ($(".pin.active").next(".pin")[0]) { if ($(".pin.active").next(".pin")[0]) {
chrome.tabs.update(parseInt($(".pin.active").next(".pin")[0].id), { active: true }); chrome.tabs.update(parseInt($(".pin.active").next(".pin")[0].id), { active: true });
} else {
if ($(".pin.active").prev(".pin")[0]) {
chrome.tabs.update(parseInt($(".pin.active").prev(".pin")[0].id), { active: true });
}
} }
} }
if ($(".tab.active:visible")[0]) { if ($(".tab.active:visible")[0]) {
if ($(".active:visible").children().last().children(".tab")[0]) { if ($(".active:visible").children().last().children(".tab")[0]) {
chrome.tabs.update(parseInt($(".active:visible").children().last().children(".tab")[0].id), { active: true }); chrome.tabs.update(parseInt($(".active:visible").children().last().children(".tab")[0].id), { active: true });
@ -309,6 +313,10 @@ function ActivateNextTab() {
} else { } else {
if ($(".active:visible").parents(".tab").last().next(".tab")[0]) { if ($(".active:visible").parents(".tab").last().next(".tab")[0]) {
chrome.tabs.update(parseInt($(".active:visible").parents(".tab").last().next(".tab")[0].id), { active: true }); chrome.tabs.update(parseInt($(".active:visible").parents(".tab").last().next(".tab")[0].id), { active: true });
} else {
if ($(".tab:visible").length > 1) {
ActivatePrevTab();
}
} }
} }
} }
@ -320,9 +328,12 @@ function ActivatePrevTab() {
if ($(".pin.active")[0]) { if ($(".pin.active")[0]) {
if ($(".pin.active").prev(".pin")[0]) { if ($(".pin.active").prev(".pin")[0]) {
chrome.tabs.update(parseInt($(".pin.active").prev(".pin")[0].id), { active: true }); chrome.tabs.update(parseInt($(".pin.active").prev(".pin")[0].id), { active: true });
} else {
if ($(".pin.active").next(".pin")[0]) {
chrome.tabs.update(parseInt($(".pin.active").next(".pin")[0].id), { active: true });
}
} }
} }
if ($(".tab.active:visible")[0]) { if ($(".tab.active:visible")[0]) {
if ($(".active:visible").prev().find(".tab").length > 0) { if ($(".active:visible").prev().find(".tab").length > 0) {
chrome.tabs.update(parseInt($(".active:visible").prev().find(".tab").last()[0].id), { active: true }); chrome.tabs.update(parseInt($(".active:visible").prev().find(".tab").last()[0].id), { active: true });
@ -332,6 +343,10 @@ function ActivatePrevTab() {
} else { } else {
if ($(".tab.active:visible").parent().is(".children") && $(".tab.active:visible").parent().parent(".tab")[0]) { if ($(".tab.active:visible").parent().is(".children") && $(".tab.active:visible").parent().parent(".tab")[0]) {
chrome.tabs.update(parseInt($(".tab.active:visible").parent().parent(".tab")[0].id), { active: true }); chrome.tabs.update(parseInt($(".tab.active:visible").parent().parent(".tab")[0].id), { active: true });
} else {
if ($(".tab:visible").length > 1) {
ActivateNextTab();
}
} }
} }
} }
@ -402,7 +417,7 @@ function SetTabEvents() {
// EXPAND BOX - EXPAND / COLLAPSE // EXPAND BOX - EXPAND / COLLAPSE
$(document).on("mousedown", ".expand", function(event) { $(document).on("mousedown", ".expand", function(event) {
event.stopPropagation(); // event.stopPropagation();
if (event.button == 0) { if (event.button == 0) {
if ($(this).parent().parent().is(".o")) { if ($(this).parent().parent().is(".o")) {
$(this).parent().parent().removeClass("o").addClass("c"); $(this).parent().parent().removeClass("o").addClass("c");
@ -426,17 +441,15 @@ function SetTabEvents() {
} }
}); });
// SELECT OR CLOSE TAB/PIN // SELECT TAB/PIN
$(document).on("mousedown", ".tab, .pin", function(event) { $(document).on("mousedown", ".tab, .pin", function(event) {
if ($(".menu").is(":visible")) { if ($(".menu").is(":visible")) {
return; return;
} }
event.stopPropagation(); event.stopPropagation();
if (event.button == 0) {
DropTargetsSendToBack(); DropTargetsSendToBack();
let tabId = parseInt(this.id); let tabId = parseInt(this.id);
if (event.button == 0) {
// SET SELECTION WITH SHIFT // SET SELECTION WITH SHIFT
if (event.shiftKey) { if (event.shiftKey) {
$(".pin, .tab:visible").removeClass("selected").removeClass("selected_frozen").removeClass("selected_temporarly"); $(".pin, .tab:visible").removeClass("selected").removeClass("selected_frozen").removeClass("selected_temporarly");
@ -446,7 +459,6 @@ function SetTabEvents() {
$(".active:visible").prevUntil($(this), ":visible").add($(".active:visible")).add($(this)).addClass("selected"); $(".active:visible").prevUntil($(this), ":visible").add($(".active:visible")).add($(this)).addClass("selected");
} }
} }
// TOGGLE SELECTION WITH CTRL // TOGGLE SELECTION WITH CTRL
if (event.ctrlKey) { if (event.ctrlKey) {
// if ($(".active:visible").is(":not(.selected)")) { // if ($(".active:visible").is(":not(.selected)")) {
@ -455,15 +467,17 @@ function SetTabEvents() {
$(this).toggleClass("selected"); $(this).toggleClass("selected");
} }
} }
});
// CLOSE TAB
if ( // CLOSE TAB/PIN
( $(document).on("mousedown", ".tab_header", function(event) {
($(this).is(".tab") && $(event.target).is(":not(.expand)")) && ((event.button == 1 && opt.close_with_MMB == true) if ($(".menu").is(":visible")) {
|| (event.button == 0 && $(event.target).is(".close, .close_img")))) return;
|| ($(this).is(".pin") && event.button == 1 && opt.close_with_MMB == true && opt.allow_pin_close == true) }
) { let tabId = parseInt($(this).parent()[0].id);
if ($(this).is(".active:visible") && opt.after_closing_active_tab != "browser") { if ((event.button == 1 && opt.close_with_MMB == true && $(this).parent().is(".tab")) || (event.button == 1 && opt.close_with_MMB == true && $(this).parent().is(".pin") && opt.allow_pin_close == true) || (event.button == 0 && $(event.target).is(".close, .close_img"))) {
if ($(this).parent().is(".active:visible") && opt.after_closing_active_tab != "browser") {
if (opt.after_closing_active_tab == "above") { if (opt.after_closing_active_tab == "above") {
ActivatePrevTab(); ActivatePrevTab();
} }
@ -471,30 +485,15 @@ function SetTabEvents() {
ActivateNextTab(); ActivateNextTab();
} }
} }
// hide pin before it will be closed by listener
// hide tab that will be closed $(".pin#"+tabId).css({ "width": "0px", "height": "0px", "border": "none", "overflow": "hidden" });
$("#"+tabId).css({ "width": "0px", "height": "0px", "border": "none", "overflow": "hidden" }); chrome.tabs.update(tabId, {pinned: false});
chrome.tabs.update(tabId, {muted:true, pinned: false});
// repeated what is in chrome events on tab_removed event, to avoid lag
if ($(this).is(".tab")) {
if (opt.promote_children) {
$("#ch"+tabId).children().insertAfter($(this));
} else {
$(this).find(".tab").each(function() {
chrome.tabs.remove(parseInt(this.id));
});
}
}
// delayed tab removal, so ActivatePrevTab() or ActivateNextTab() will not activate wrong tab
setTimeout(function() {
if ($("#"+tabId)[0]) chrome.tabs.remove(tabId); if ($("#"+tabId)[0]) chrome.tabs.remove(tabId);
}, 1000);
} }
}); });
// SINGLE CLICK TO ACTIVATE TAB // SINGLE CLICK TO ACTIVATE TAB
$(document).on("click", ".tab_header", function(event) { $(document).on("click", ".tab_header", function(event) {
if ($(".menu").is(":visible")) { if ($(".menu").is(":visible")) {

View File

@ -6,7 +6,7 @@
function RestoreToolbarSearchFilter() { function RestoreToolbarSearchFilterBAK() {
let filter_type = "url"; let filter_type = "url";
if (localStorage.getItem("filter_type") !== null) { if (localStorage.getItem("filter_type") !== null) {
filter_type = localStorage["filter_type"]; filter_type = localStorage["filter_type"];
@ -18,11 +18,26 @@ function RestoreToolbarSearchFilter() {
} }
} }
function RestoreToolbarSearchFilter() {
chrome.runtime.sendMessage({command: "get_search_filter", windowId: CurrentWindowId}, function(response) {
if (response == "url") {
$("#button_filter_type").addClass("url").removeClass("title");
} else {
$("#button_filter_type").addClass("title").removeClass("url");
}
});
}
function RestoreToolbarShelf() { function RestoreToolbarShelf() {
chrome.runtime.sendMessage({command: "get_active_shelf", windowId: CurrentWindowId}, function(response) { chrome.runtime.sendMessage({command: "get_active_shelf", windowId: CurrentWindowId}, function(response) {
$("#filter_box").attr("placeholder", caption_searchbox); $("#filter_box").attr("placeholder", caption_searchbox);
$("#filter_box").css({"opacity": 1}); $("#filter_box").css({"opacity": 1});
$(".on").removeClass("on"); $(".on").removeClass("on");
$(".toolbar_shelf").addClass("hidden"); $(".toolbar_shelf").addClass("hidden");
if (response == "search" && $("#button_search").length != 0) { if (response == "search" && $("#button_search").length != 0) {
@ -46,6 +61,7 @@ function RestoreToolbarShelf() {
$("#button_folders").addClass("on"); $("#button_folders").addClass("on");
} }
if (browserId != "F") {
let bak1 = LoadData("windows_BAK1", []); let bak1 = LoadData("windows_BAK1", []);
let bak2 = LoadData("windows_BAK2", []); let bak2 = LoadData("windows_BAK2", []);
let bak3 = LoadData("windows_BAK3", []); let bak3 = LoadData("windows_BAK3", []);
@ -67,6 +83,7 @@ function RestoreToolbarShelf() {
} else { } else {
$(".button#button_load_bak3").addClass("disabled"); $(".button#button_load_bak3").addClass("disabled");
} }
}
RefreshGUI(); RefreshGUI();
}); });
@ -139,9 +156,6 @@ function SetToolbarEvents() {
// new tab // new tab
$(document).on("mousedown", "#button_new", function(event) { $(document).on("mousedown", "#button_new", function(event) {
if (event.button == 0) {
chrome.tabs.create({});
}
if (event.button == 1 && $(".active:visible")[0]) { if (event.button == 1 && $(".active:visible")[0]) {
chrome.tabs.duplicate(parseInt($(".active:visible")[0].id), function(tab) { chrome.tabs.duplicate(parseInt($(".active:visible")[0].id), function(tab) {
setTimeout(function() { setTimeout(function() {
@ -155,6 +169,11 @@ function SetToolbarEvents() {
ScrollToTab($(".active:visible")[0].id); ScrollToTab($(".active:visible")[0].id);
} }
}); });
$(document).on("click", "#button_new", function(event) {
if (event.button == 0) {
chrome.tabs.create({});
}
});
// pin tab // pin tab
$(document).on("mousedown", "#button_pin", function(event) { $(document).on("mousedown", "#button_pin", function(event) {
if (event.button != 0) { if (event.button != 0) {
@ -218,7 +237,15 @@ function SetToolbarEvents() {
} }
$("#button_filter_type").toggleClass("url").toggleClass("title"); $("#button_filter_type").toggleClass("url").toggleClass("title");
FindTab($("#filter_box")[0].value); FindTab($("#filter_box")[0].value);
localStorage["filter_type"] = $(this).is(".url") ? "url" : "title";
chrome.runtime.sendMessage({command: "set_search_filter", search_filter: ($(this).is(".url") ? "url" : "title"), windowId: CurrentWindowId});
// localStorage["filter_type"] = $(this).is(".url") ? "url" : "title";
}); });
// clear filter button // clear filter button
$(document).on("mousedown", "#button_filter_clear", function(event) { $(document).on("mousedown", "#button_filter_clear", function(event) {
@ -330,7 +357,7 @@ function SetToolbarEvents() {
if (browserId != "F") {
// load backups // load backups
$(document).on("mousedown", "#button_load_bak1:not(.disabled), #button_load_bak2:not(.disabled), #button_load_bak3:not(.disabled)", function(event) { $(document).on("mousedown", "#button_load_bak1:not(.disabled), #button_load_bak2:not(.disabled), #button_load_bak3:not(.disabled)", function(event) {
if (event.button != 0) { if (event.button != 0) {
@ -352,6 +379,7 @@ function SetToolbarEvents() {
location.reload(); location.reload();
}); });
}
// import-export backups // import-export backups
$(document).on("mousedown", "#button_export_bak", function(event) { $(document).on("mousedown", "#button_export_bak", function(event) {

View File

@ -3,20 +3,15 @@
// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/
document.addEventListener("DOMContentLoaded", Run(), false); document.addEventListener("DOMContentLoaded", Run(), false);
function Loadi18n() { function Loadi18n() {
// toolbar labels // toolbar labels
$(".button").each(function() { $(".button").each(function() {
$(this).attr("title", chrome.i18n.getMessage(this.id)); $(this).attr("title", chrome.i18n.getMessage(this.id));
}); });
// menu labels // menu labels
$(".menu_item").each(function() { $(".menu_item").each(function() {
$(this).text(chrome.i18n.getMessage(this.id)); $(this).text(chrome.i18n.getMessage(this.id));
}); });
// edit group dialog labels // edit group dialog labels
$(".group_edit_button").each(function() { $(".group_edit_button").each(function() {
$(this)[0].textContent = chrome.i18n.getMessage(this.id); $(this)[0].textContent = chrome.i18n.getMessage(this.id);
@ -30,19 +25,20 @@ function RestorePinListRowSettings() {
} }
RefreshGUI(); RefreshGUI();
} }
function Run() { function Run() {
LoadPreferences(); LoadPreferences();
chrome.windows.getCurrent({populate: false}, function(window) { chrome.windows.getCurrent({populate: false}, function(window) {
CurrentWindowId = window.id; CurrentWindowId = window.id;
chrome.runtime.sendMessage({command: "is_bg_busy"}, function(response) { chrome.runtime.sendMessage({command: "is_bg_running"}, function(response) {
hold = response; running = response;
chrome.runtime.sendMessage({command: "get_browser_tabs"}, function(response) { chrome.runtime.sendMessage({command: "get_browser_tabs"}, function(response) {
bgtabs = Object.assign({}, response); bgtabs = Object.assign({}, response);
chrome.runtime.sendMessage({command: "get_groups", windowId: CurrentWindowId}, function(response) { chrome.runtime.sendMessage({command: "get_groups", windowId: CurrentWindowId}, function(response) {
bggroups = Object.assign({}, response); bggroups = Object.assign({}, response);
chrome.runtime.sendMessage({command: "get_theme", windowId: CurrentWindowId}, function(response) {
theme = response;
setTimeout(function() { setTimeout(function() {
if (opt != undefined && browserId != undefined && bgtabs != undefined && bggroups != undefined && hold == false) { if (opt != undefined && browserId != undefined && bgtabs != undefined && bggroups != undefined && running == true) {
Initialize(); Initialize();
} else { } else {
Run(); Run();
@ -52,51 +48,46 @@ function Run() {
}); });
}); });
}); });
});
} }
function Initialize() { function Initialize() {
// THEME
RestoreStateOfGroupsToolbar(); RestoreStateOfGroupsToolbar();
var theme = LoadData(("theme"+localStorage["current_theme"]), {"TabsSizeSetNumber": 2, "ToolbarShow": true, "toolbar": DefaultToolbar}); // var theme = LoadData(("theme"+localStorage["current_theme"]), {"TabsSizeSetNumber": 2, "ToolbarShow": true, "toolbar": DefaultToolbar});
if (browserId == "F") {
// I have no idea what is going on in latest build, but why top position for various things is different in firefox????? // I have no idea what is going on in latest build, but why top position for various things is different in firefox?????
if (browserId == "F") {
if (theme.TabsSizeSetNumber > 1) { if (theme.TabsSizeSetNumber > 1) {
document.styleSheets[document.styleSheets.length-1].insertRule(".tab_header>.tab_title { margin-top: -1px; }", document.styleSheets[document.styleSheets.length-1].cssRules.length); document.styleSheets[document.styleSheets.length-1].insertRule(".tab_header>.tab_title { margin-top: -1px; }", document.styleSheets[document.styleSheets.length-1].cssRules.length);
} }
} }
ApplySizeSet(theme["TabsSizeSetNumber"]); ApplySizeSet(theme["TabsSizeSetNumber"]);
ApplyColorsSet(theme["ColorsSet"]); ApplyColorsSet(theme["ColorsSet"]);
AppendAllGroups();
chrome.tabs.query({currentWindow: true}, function(tabs) {
// AddNewFolder();
// AddNewFolder();
// AddNewFolder();
// AddNewFolder();
if (theme.ToolbarShow) { if (theme.ToolbarShow) {
if (theme.theme_version == DefaultTheme.theme_version) { if (theme.theme_version == DefaultTheme.theme_version) {
$("#toolbar").html(theme.toolbar); $("#toolbar").html(theme.toolbar);
if (browserId == "F") {
$(".button#button_load_bak1, .button#button_load_bak2, .button#button_load_bak3").remove();
}
} else { } else {
$("#toolbar").html(DefaultToolbar); $("#toolbar").html(DefaultToolbar);
} }
} }
// APPEND GROUPS
AppendAllGroups();
chrome.tabs.query({currentWindow: true}, function(tabs) {
// AddNewFolder();AddNewFolder();AddNewFolder();AddNewFolder();AddNewFolder();
// APPEND TABS
let tc = tabs.length; let tc = tabs.length;
for (var ti = 0; ti < tc; ti++) { for (var ti = 0; ti < tc; ti++) {
AppendTab({tab: tabs[ti], Append: true, SkipSetActive: true}); AppendTab({tab: tabs[ti], Append: true, SkipSetActive: true});
} }
for (var ti = 0; ti < tc; ti++) { for (var ti = 0; ti < tc; ti++) {
if (bgtabs[tabs[ti].id] && !tabs[ti].pinned && $("#"+bgtabs[tabs[ti].id].parent)[0] && $("#"+bgtabs[tabs[ti].id].parent).is(".group")) { if (bgtabs[tabs[ti].id] && !tabs[ti].pinned && $("#"+bgtabs[tabs[ti].id].parent)[0] && $("#"+bgtabs[tabs[ti].id].parent).is(".group")) {
$("#"+bgtabs[tabs[ti].id].parent).append($("#"+tabs[ti].id)); $("#"+bgtabs[tabs[ti].id].parent).append($("#"+tabs[ti].id));
} }
} }
for (var ti = 0; ti < tc; ti++) { for (var ti = 0; ti < tc; ti++) {
if (bgtabs[tabs[ti].id] && !tabs[ti].pinned) { if (bgtabs[tabs[ti].id] && !tabs[ti].pinned) {
if ($("#"+bgtabs[tabs[ti].id].parent).length > 0 && $("#"+bgtabs[tabs[ti].id].parent).is(".tab") && $("#"+tabs[ti].id).find($("#ch"+bgtabs[tabs[ti].id].parent)).length == 0) { if ($("#"+bgtabs[tabs[ti].id].parent).length > 0 && $("#"+bgtabs[tabs[ti].id].parent).is(".tab") && $("#"+tabs[ti].id).find($("#ch"+bgtabs[tabs[ti].id].parent)).length == 0) {
@ -104,30 +95,24 @@ function Initialize() {
} }
} }
} }
for (var ti = 0; ti < tc; ti++) { for (var ti = 0; ti < tc; ti++) {
if (bgtabs[tabs[ti].id] && !tabs[ti].pinned) { if (bgtabs[tabs[ti].id] && !tabs[ti].pinned) {
$("#"+tabs[ti].id).addClass(bgtabs[tabs[ti].id].expand); $("#"+tabs[ti].id).addClass(bgtabs[tabs[ti].id].expand);
} }
} }
// SET ACTIVE IN EACH GROUP
for (var group in bggroups) { for (var group in bggroups) {
if ($("#"+group+" #"+bggroups[group].activetab)[0]) { if ($("#"+group+" #"+bggroups[group].activetab)[0]) {
$("#"+bggroups[group].activetab).addClass("active"); $("#"+bggroups[group].activetab).addClass("active");
} }
} }
chrome.runtime.sendMessage({command: "get_active_group", windowId: CurrentWindowId}, function(response) { chrome.runtime.sendMessage({command: "get_active_group", windowId: CurrentWindowId}, function(response) {
SetActiveGroup(response, true, true); SetActiveGroup(response, true, true);
}); });
RearrangeTreeTabs(tabs, bgtabs, true); RearrangeTreeTabs(tabs, bgtabs, true);
RefreshExpandStates();
RestoreToolbarShelf(); RestoreToolbarShelf();
RestoreToolbarSearchFilter(); RestoreToolbarSearchFilter();
SetToolbarShelfToggle("mousedown"); SetToolbarShelfToggle("mousedown");
StartChromeListeners(); StartChromeListeners();
SetIOEvents(); SetIOEvents();
SetToolbarEvents(); SetToolbarEvents();
@ -137,18 +122,17 @@ function Initialize() {
SetFolderEvents(); SetFolderEvents();
SetMenu(); SetMenu();
SetDragAndDropEvents(); SetDragAndDropEvents();
RearrangeBrowserTabsCheck(); RearrangeBrowserTabsCheck();
Loadi18n(); Loadi18n();
RestorePinListRowSettings(); RestorePinListRowSettings();
setTimeout(function() {
RefreshExpandStates();
}, 1000);
setTimeout(function() { setTimeout(function() {
UpdateData(); UpdateData();
delete bgtabs; delete bgtabs;
delete theme; delete theme;
},5000); }, 5000);
if ($(".active:visible").length == 0) { if ($(".active:visible").length == 0) {
chrome.tabs.query({currentWindow: true, active: true}, function(tabs) { chrome.tabs.query({currentWindow: true, active: true}, function(tabs) {
if (tabs[0]) { if (tabs[0]) {
@ -156,15 +140,11 @@ function Initialize() {
} }
}); });
} }
if (browserId == "V") { if (browserId == "V") {
VivaldiRefreshMediaIcons(); VivaldiRefreshMediaIcons();
} }
}); });
} }
function log(m) { function log(m) {
chrome.runtime.sendMessage({command: "console_log", m: m}); chrome.runtime.sendMessage({command: "console_log", m: m});
} }