2018-12-13 23:55:34 +01:00
function Manager _OpenManagerWindow ( ) {
DOM _HideRenameDialogs ( ) ;
if ( opt . debug ) Utils _log ( "f: Manager_OpenManagerWindow" ) ;
chrome . storage . local . get ( null , function ( storage ) {
DOM _SetStyle ( document . getElementById ( "manager_window" ) , { display : "block" , top : "" , left : "" } ) ;
let GroupList = document . getElementById ( "manager_window_groups_list" ) ;
while ( GroupList . hasChildNodes ( ) ) {
GroupList . removeChild ( GroupList . firstChild ) ;
}
let SessionsList = document . getElementById ( "manager_window_sessions_list" ) ;
while ( SessionsList . hasChildNodes ( ) ) {
SessionsList . removeChild ( SessionsList . firstChild ) ;
}
if ( storage . hibernated _groups != undefined ) {
for ( let hibernated _group of storage . hibernated _groups ) {
Manager _AddGroupToManagerList ( hibernated _group ) ;
}
}
if ( storage . saved _sessions != undefined ) {
for ( let saved _session of storage . saved _sessions ) {
Manager _AddSessionToManagerList ( saved _session ) ;
}
}
Manager _ReAddSessionAutomaticToManagerList ( storage ) ;
} ) ;
2018-05-22 02:11:29 +02:00
}
2018-12-13 23:55:34 +01:00
function Manager _AddGroupToManagerList ( hibernated _group ) {
let HibernatedGroupRow = DOM _New ( "li" , document . getElementById ( "manager_window_groups_list" ) , { className : "hibernated_group_row" } ) ;
let DeleteGroupIcon = DOM _New ( "div" , HibernatedGroupRow , { className : "manager_window_list_button delete_hibernated_group" , title : chrome . i18n . getMessage ( "manager_window_delete_icon" ) } ) ;
DeleteGroupIcon . onmousedown = function ( event ) {
if ( event . which == 1 ) {
let hib _group = this . parentNode ;
let HibernategGroupIndex = Array . from ( hib _group . parentNode . children ) . indexOf ( hib _group ) ;
chrome . storage . local . get ( null , function ( storage ) {
let hibernated _groups = storage . hibernated _groups ;
hibernated _groups . splice ( HibernategGroupIndex , 1 ) ;
chrome . storage . local . set ( { hibernated _groups : hibernated _groups } ) ;
hib _group . parentNode . removeChild ( hib _group ) ;
DOM _RefreshGUI ( ) ;
} ) ;
}
}
let ExportGroupIcon = DOM _New ( "div" , HibernatedGroupRow , { className : "manager_window_list_button export_hibernated_group" , title : chrome . i18n . getMessage ( "manager_window_savetofile_icon" ) } ) ;
ExportGroupIcon . onmousedown = function ( event ) {
if ( event . which == 1 ) {
let HibernategGroupIndex = Array . from ( this . parentNode . parentNode . children ) . indexOf ( this . parentNode ) ;
chrome . storage . local . get ( null , function ( storage ) {
let filename = storage . hibernated _groups [ HibernategGroupIndex ] . group . name == "" ? labels . noname _group : storage . hibernated _groups [ HibernategGroupIndex ] . group . name ;
File _SaveFile ( filename , "tt_group" , storage . hibernated _groups [ HibernategGroupIndex ] ) ;
} ) ;
}
}
let LoadGroupIcon = DOM _New ( "div" , HibernatedGroupRow , { className : "manager_window_list_button load_hibernated_group" , title : chrome . i18n . getMessage ( "manager_window_load_icon" ) } ) ;
LoadGroupIcon . onmousedown = function ( event ) {
if ( event . which == 1 ) {
let HibernategGroupIndex = Array . from ( this . parentNode . parentNode . children ) . indexOf ( this . parentNode ) ;
chrome . storage . local . get ( null , function ( storage ) {
Manager _RecreateGroup ( storage . hibernated _groups [ HibernategGroupIndex ] ) ;
} ) ;
}
}
let name = DOM _New ( "div" , HibernatedGroupRow , { className : "manager_window_group_name text_input" , contentEditable : true , textContent : hibernated _group . group . name } ) ;
name . onkeydown = function ( event ) {
return event . which != 13 ;
}
name . oninput = function ( event ) {
let hib _group _name = this . textContent ;
let hib _group = this . parentNode ;
let HibernategGroupIndex = Array . from ( hib _group . parentNode . children ) . indexOf ( hib _group ) ;
chrome . storage . local . get ( null , function ( storage ) {
let hibernated _groups = storage . hibernated _groups ;
hibernated _groups [ HibernategGroupIndex ] . group . name = hib _group _name ;
chrome . storage . local . set ( { hibernated _groups : hibernated _groups } ) ;
} ) ;
}
DOM _New ( "div" , HibernatedGroupRow , { className : "manager_window_group_name" , textContent : " - (" + hibernated _group . tabs . length + ")" } ) ;
DOM _RefreshGUI ( ) ;
2018-05-22 02:11:29 +02:00
}
2018-12-13 23:55:34 +01:00
function Manager _AddSessionToManagerList ( saved _session ) {
let SavedSessionRow = DOM _New ( "li" , document . getElementById ( "manager_window_sessions_list" ) , { className : "saved_session_row" } ) ;
let DeleteSessionIcon = DOM _New ( "div" , SavedSessionRow , { className : "manager_window_list_button delete_saved_session" , title : chrome . i18n . getMessage ( "manager_window_delete_icon" ) } ) ;
DeleteSessionIcon . onmousedown = function ( event ) {
if ( event . which == 1 ) {
let saved _session = this . parentNode ;
let SessionIndex = Array . from ( saved _session . parentNode . children ) . indexOf ( saved _session ) ;
chrome . storage . local . get ( null , function ( storage ) {
let S _Sessions = storage . saved _sessions ;
S _Sessions . splice ( SessionIndex , 1 ) ;
chrome . storage . local . set ( { saved _sessions : S _Sessions } ) ;
saved _session . parentNode . removeChild ( saved _session ) ;
DOM _RefreshGUI ( ) ;
} ) ;
}
}
let ExportSessionIcon = DOM _New ( "div" , SavedSessionRow , { className : "manager_window_list_button export_saved_session" , title : chrome . i18n . getMessage ( "manager_window_savetofile_icon" ) } ) ;
ExportSessionIcon . onmousedown = function ( event ) {
if ( event . which == 1 ) {
let saved _session = this . parentNode ;
let SessionIndex = Array . from ( saved _session . parentNode . children ) . indexOf ( saved _session ) ;
chrome . storage . local . get ( null , function ( storage ) {
let filename = storage . saved _sessions [ SessionIndex ] . name == "" ? labels . noname _group : storage . saved _sessions [ SessionIndex ] . name ;
File _SaveFile ( filename , "tt_session" , storage . saved _sessions [ SessionIndex ] . session ) ;
} ) ;
}
}
let LoadSessionIcon = DOM _New ( "div" , SavedSessionRow , { className : "manager_window_list_button load_saved_session" , title : chrome . i18n . getMessage ( "manager_window_load_icon" ) } ) ;
LoadSessionIcon . onmousedown = function ( event ) {
if ( event . which == 1 ) {
let saved _session = this . parentNode ;
let SessionIndex = Array . from ( saved _session . parentNode . children ) . indexOf ( saved _session ) ;
chrome . storage . local . get ( null , function ( storage ) {
let S _Sessions = storage . saved _sessions ;
Manager _RecreateSession ( S _Sessions [ SessionIndex ] . session ) ;
} ) ;
}
}
let MergeSessionIcon = DOM _New ( "div" , SavedSessionRow , { className : "manager_window_list_button merge_saved_session" , title : chrome . i18n . getMessage ( "manager_window_merge_icon" ) } ) ;
MergeSessionIcon . onmousedown = function ( event ) {
if ( event . which == 1 ) {
let saved _session = this . parentNode ;
let SessionIndex = Array . from ( saved _session . parentNode . children ) . indexOf ( saved _session ) ;
chrome . storage . local . get ( null , function ( storage ) {
let S _Sessions = storage . saved _sessions ;
Manager _ImportMergeTabs ( S _Sessions [ SessionIndex ] . session ) ;
} ) ;
}
}
let name = DOM _New ( "div" , SavedSessionRow , { className : "manager_window_session_name" , contentEditable : true , textContent : saved _session . name } ) ;
name . onkeydown = function ( event ) {
return event . which != 13 ;
}
name . oninput = function ( event ) {
let session _name = this . textContent ;
let s = this . parentNode ;
let SessionIndex = Array . from ( s . parentNode . children ) . indexOf ( s ) ;
chrome . storage . local . get ( null , function ( storage ) {
let S _Sessions = storage . saved _sessions ;
S _Sessions [ SessionIndex ] . name = session _name ;
chrome . storage . local . set ( { saved _sessions : S _Sessions } ) ;
} ) ;
}
DOM _RefreshGUI ( ) ;
2018-05-22 02:11:29 +02:00
}
2018-12-13 23:55:34 +01:00
function Manager _ReAddSessionAutomaticToManagerList ( storage ) {
let SessionsAutomaticList = document . getElementById ( "manager_window_autosessions_list" ) ;
while ( SessionsAutomaticList . hasChildNodes ( ) ) {
SessionsAutomaticList . removeChild ( SessionsAutomaticList . firstChild ) ;
}
if ( storage . saved _sessions _automatic != undefined ) {
for ( let saved _sessions _automatic of storage . saved _sessions _automatic ) {
Manager _AddSessionAutomaticToManagerList ( saved _sessions _automatic ) ;
}
}
DOM _RefreshGUI ( ) ;
2018-05-22 02:11:29 +02:00
}
2018-12-13 23:55:34 +01:00
function Manager _AddSessionAutomaticToManagerList ( saved _session ) {
let SavedSessionRow = DOM _New ( "li" , document . getElementById ( "manager_window_autosessions_list" ) , { className : "saved_session_row" } ) ;
let LoadSessionIcon = DOM _New ( "div" , SavedSessionRow , { className : "manager_window_list_button load_saved_session" , title : chrome . i18n . getMessage ( "manager_window_load_icon" ) } ) ;
LoadSessionIcon . onmousedown = function ( event ) {
if ( event . which == 1 ) {
let saved _session = this . parentNode ;
let SessionIndex = Array . from ( saved _session . parentNode . children ) . indexOf ( saved _session ) ;
chrome . storage . local . get ( null , function ( storage ) {
let S _Sessions = storage . saved _sessions _automatic ;
Manager _RecreateSession ( S _Sessions [ SessionIndex ] . session ) ;
} ) ;
}
}
let MergeSessionIcon = DOM _New ( "div" , SavedSessionRow , { className : "manager_window_list_button merge_saved_session" , title : chrome . i18n . getMessage ( "manager_window_merge_icon" ) } ) ;
MergeSessionIcon . onmousedown = function ( event ) {
if ( event . which == 1 ) {
let saved _session = this . parentNode ;
let SessionIndex = Array . from ( saved _session . parentNode . children ) . indexOf ( saved _session ) ;
chrome . storage . local . get ( null , function ( storage ) {
let S _Sessions = storage . saved _sessions _automatic ;
Manager _ImportMergeTabs ( S _Sessions [ SessionIndex ] . session ) ;
} ) ;
}
}
DOM _New ( "div" , SavedSessionRow , { className : "manager_window_session_name" , textContent : saved _session . name } ) ;
DOM _RefreshGUI ( ) ;
}
2018-05-22 02:11:29 +02:00
2018-12-13 23:55:34 +01:00
function Manager _SetManagerEvents ( ) {
document . getElementById ( "manager_window_close" ) . onmousedown = function ( event ) {
if ( event . which == 1 ) DOM _HideRenameDialogs ( ) ;
}
let query = document . querySelectorAll ( ".manager_window_toolbar_button" ) ;
for ( let s of query ) {
s . onmousedown = function ( event ) {
if ( event . which == 1 ) {
let window _panels = document . querySelectorAll ( ".manager_window_panel" ) ;
for ( let s of window _panels ) {
s . classList . remove ( "mw_pan_on" ) ;
}
document . getElementById ( ( this . id ) . replace ( "button" , "panel" ) ) . classList . add ( "mw_pan_on" ) ;
let panel _on = document . querySelectorAll ( ".mw_on" ) ;
for ( let s of panel _on ) {
s . classList . remove ( "mw_on" ) ;
}
this . classList . add ( "mw_on" ) ;
DOM _RefreshGUI ( ) ;
}
}
}
document . getElementById ( "manager_window_button_import_group" ) . onmousedown = function ( event ) {
if ( event . which == 1 ) {
let inputFile = File _ShowOpenFileDialog ( ".tt_group" ) ;
inputFile . onchange = function ( event ) {
Manager _ImportGroup ( false , true ) ;
}
}
}
document . getElementById ( "manager_window_button_hibernate_group" ) . onmousedown = function ( event ) {
if ( event . which == 1 ) {
Manager _ExportGroup ( tt . active _group , false , true ) ;
setTimeout ( function ( ) { Groups _GroupRemove ( tt . active _group , true ) ; } , 100 ) ;
setTimeout ( function ( ) { Manager _OpenManagerWindow ( ) ; } , 150 ) ;
}
}
document . getElementById ( "manager_window_button_save_current_session" ) . onmousedown = function ( event ) {
if ( event . which == 1 ) {
let d = new Date ( ) ;
Manager _ExportSession ( ( d . toLocaleString ( ) . replace ( /\//g , "." ) . replace ( /:/g , "꞉ " ) ) , false , true , false ) ;
}
}
document . getElementById ( "manager_window_button_import_session" ) . onmousedown = function ( event ) {
if ( event . which == 1 ) {
let inputFile = File _ShowOpenFileDialog ( ".tt_session" ) ;
inputFile . onchange = function ( event ) {
Manager _ImportSession ( false , true , false ) ;
}
}
}
let autosessions _save _max _to _keep = document . getElementById ( "manager_window_autosessions_maximum_saves" ) ;
autosessions _save _max _to _keep . value = opt . autosave _max _to _keep ;
autosessions _save _max _to _keep . oninput = function ( event ) {
opt . autosave _max _to _keep = parseInt ( this . value ) ;
Preferences _SavePreferences ( opt ) ;
}
let autosessions _save _timer = document . getElementById ( "manager_window_autosessions_save_timer" ) ;
autosessions _save _timer . value = opt . autosave _interval ;
autosessions _save _timer . oninput = function ( event ) {
opt . autosave _interval = parseInt ( this . value ) ;
Preferences _SavePreferences ( opt ) ;
clearInterval ( tt . AutoSaveSession ) ;
Manager _StartAutoSaveSession ( ) ;
}
}
2018-05-22 02:11:29 +02:00
2018-12-13 23:55:34 +01:00
function Manager _ExportGroup ( groupId , filename , save _to _manager ) {
let GroupToSave = { group : tt . groups [ groupId ] , folders : { } , tabs : [ ] , favicons : [ ] } ;
let query = document . querySelectorAll ( "#" + groupId + " .folder" ) ;
for ( let s of query ) {
if ( tt . folders [ s . id ] ) GroupToSave . folders [ s . id ] = tt . folders [ s . id ] ;
}
let Tabs = document . querySelectorAll ( "#" + groupId + " .tab" ) ;
if ( Tabs . length > 0 ) {
let lastId = parseInt ( Tabs [ Tabs . length - 1 ] . id ) ;
for ( let s of Tabs ) {
chrome . tabs . get ( parseInt ( s . id ) , async function ( tab ) {
if ( ( tab . url ) . startsWith ( "www" ) || ( tab . url ) . startsWith ( "http" ) || ( tab . url ) . startsWith ( "ftp" ) || ( tab . url ) . startsWith ( "file" ) ) {
let favicon = ( browserId == "F" ? await browser . sessions . getTabValue ( tab . id , "CachedFaviconUrl" ) : tab . favIconUrl ) ;
let favicon _index = GroupToSave . favicons . indexOf ( favicon ) ;
if ( favicon _index == - 1 ) {
GroupToSave . favicons . push ( favicon ) ;
favicon _index = GroupToSave . favicons . length ;
}
( GroupToSave . tabs ) . push ( { id : tab . id , parent : s . parentNode . parentNode . id , index : Array . from ( s . parentNode . children ) . indexOf ( s ) , expand : ( s . classList . contains ( "c" ) ? "c" : ( s . classList . contains ( "o" ) ? "o" : "" ) ) , url : tab . url , title : tab . title , favicon : favicon _index } ) ;
}
if ( tab . id == lastId ) {
if ( filename ) File _SaveFile ( filename , "tt_group" , GroupToSave ) ;
if ( save _to _manager ) Manager _AddGroupToStorage ( GroupToSave , true ) ;
if ( opt . debug ) Utils _log ( "f: ExportGroup, filename: " + filename + ", groupId: " + groupId + ", save_to_manager: " + save _to _manager ) ;
}
} ) ;
}
} else {
if ( filename ) File _SaveFile ( filename , "tt_group" , GroupToSave ) ;
if ( save _to _manager ) Manager _AddGroupToStorage ( GroupToSave , true ) ;
if ( opt . debug ) Utils _log ( "f: ExportGroup, filename: " + filename + ", groupId: " + groupId + ", save_to_manager: " + save _to _manager ) ;
}
}
2018-05-22 02:11:29 +02:00
2018-12-13 23:55:34 +01:00
function Manager _ImportGroup ( recreate _group , save _to _manager ) {
let file = document . getElementById ( "file_import" ) ;
let fr = new FileReader ( ) ;
if ( file . files [ 0 ] == undefined ) return ;
fr . readAsText ( file . files [ 0 ] ) ;
fr . onload = function ( ) {
let data = fr . result ;
let group = JSON . parse ( data ) ;
file . parentNode . removeChild ( file ) ;
if ( recreate _group ) Manager _RecreateGroup ( group ) ;
if ( save _to _manager ) Manager _AddGroupToStorage ( group , true ) ;
if ( opt . debug ) Utils _log ( "f: ImportGroup, recreate_group: " + recreate _group + ", save_to_manager: " + save _to _manager ) ;
}
}
2018-05-22 02:11:29 +02:00
2018-12-13 23:55:34 +01:00
function Manager _RecreateGroup ( LoadedGroup ) {
if ( opt . debug ) Utils _log ( "f: RecreateGroup" ) ;
let RefFolders = { } ;
let NewFolders = { } ;
let RefTabs = { } ;
let NewTabs = [ ] ;
let NewGroupId = Groups _AddNewGroup ( LoadedGroup . group . name , LoadedGroup . group . font ) ;
for ( var folder in LoadedGroup . folders ) {
let newId = Folders _AddNewFolder ( { parent : NewGroupId , name : LoadedGroup . folders [ folder ] . name , expand : LoadedGroup . folders [ folder ] . expand } ) ;
RefFolders [ folder ] = newId ;
NewFolders [ newId ] = { id : newId , parent : ( ( ( LoadedGroup . folders [ folder ] . parent ) . startsWith ( "g_" ) || ( LoadedGroup . folders [ folder ] . parent == "tab_list" ) ) ? NewGroupId : LoadedGroup . folders [ folder ] . parent ) , index : LoadedGroup . folders [ folder ] . index , name : LoadedGroup . folders [ folder ] . name , expand : LoadedGroup . folders [ folder ] . expand } ;
}
for ( var new _folder in NewFolders ) {
if ( ( NewFolders [ new _folder ] . parent ) . startsWith ( "f_" ) && RefFolders [ NewFolders [ new _folder ] . parent ] ) NewFolders [ new _folder ] . parent = RefFolders [ NewFolders [ new _folder ] . parent ] ;
}
( LoadedGroup . tabs ) . forEach ( function ( Tab ) {
let params ;
if ( browserId == "F" ) {
params = { active : false , windowId : tt . CurrentWindowId , url : Tab . url , discarded : true , title : Tab . title } ;
} else {
params = { active : false , windowId : tt . CurrentWindowId , url : Tab . url } ;
}
chrome . tabs . create ( params , function ( new _tab ) {
if ( browserId == "F" ) browser . sessions . setTabValue ( new _tab . id , "CachedFaviconUrl" , Tab . favicon ) ;
RefTabs [ Tab . id ] = new _tab . id ;
Tab . id = new _tab . id ;
if ( ( Tab . parent ) . startsWith ( "g_" ) || Tab . parent == "tab_list" ) Tab . parent = NewGroupId ;
if ( ( Tab . parent ) . startsWith ( "f_" ) && RefFolders [ Tab . parent ] ) Tab . parent = RefFolders [ Tab . parent ] ;
NewTabs . push ( Tab ) ;
if ( browserId != "O" && browserId != "F" ) chrome . runtime . sendMessage ( { command : "discard_tab" , tabId : new _tab . id } ) ;
if ( NewTabs . length == LoadedGroup . tabs . length - 1 ) {
NewTabs . forEach ( function ( LTab ) {
if ( RefTabs [ LTab . parent ] ) LTab . parent = RefTabs [ LTab . parent ] ;
} ) ;
let GiveUp = 3000 ; // gives up after: 300*3000/1000/60 = 15 minutes
let RecreateTreeS = setInterval ( function ( ) {
GiveUp -- ;
let LastTab = document . getElementById ( NewTabs [ NewTabs . length - 1 ] . id ) ;
if ( LastTab != null || GiveUp < 0 ) {
Manager _RecreateTreeStructure ( { } , NewFolders , NewTabs ) ;
clearInterval ( RecreateTreeS ) ;
}
} , 300 ) ;
}
} ) ;
} ) ;
2018-05-22 02:11:29 +02:00
}
2018-12-13 23:55:34 +01:00
function Manager _AddGroupToStorage ( group , add _to _manager ) {
chrome . storage . local . get ( null , function ( storage ) {
if ( storage [ "hibernated_groups" ] == undefined ) {
let hibernated _groups = [ ] ;
hibernated _groups . push ( group ) ;
chrome . storage . local . set ( { hibernated _groups : hibernated _groups } ) ;
if ( add _to _manager ) Manager _AddGroupToManagerList ( group ) ;
} else {
let hibernated _groups = storage [ "hibernated_groups" ] ;
hibernated _groups . push ( group ) ;
chrome . storage . local . set ( { hibernated _groups : hibernated _groups } ) ;
if ( add _to _manager ) Manager _AddGroupToManagerList ( group ) ;
}
if ( opt . debug ) Utils _log ( "f: AddGroupToStorage, add_to_manager: " + add _to _manager ) ;
} ) ;
}
2018-05-22 02:11:29 +02:00
2018-12-13 23:55:34 +01:00
function Manager _ExportSession ( name , save _to _file , save _to _manager , save _to _autosave _manager ) {
chrome . windows . getAll ( { windowTypes : [ 'normal' ] , populate : true } , function ( win ) {
chrome . runtime . sendMessage ( { command : "get_browser_tabs" } , function ( t ) {
let tabs = Object . assign ( { } , t ) ;
chrome . runtime . sendMessage ( { command : "get_windows" } , function ( w ) {
let windows = Object . assign ( { } , w ) ;
let ExportWindows = [ ] ;
win . forEach ( function ( CWin ) {
if ( CWin . tabs . length > 0 ) {
windows [ CWin . id ] [ "id" ] = CWin . id ;
windows [ CWin . id ] [ "tabs" ] = [ ] ;
windows [ CWin . id ] [ "favicons" ] = [ ] ;
CWin . tabs . forEach ( async function ( CTab ) {
if ( ( CTab . url ) . startsWith ( "www" ) || ( CTab . url ) . startsWith ( "http" ) || ( CTab . url ) . startsWith ( "ftp" ) ) {
let favicon = ( browserId == "F" ? await browser . sessions . getTabValue ( CTab . id , "CachedFaviconUrl" ) : CTab . favIconUrl ) ;
let favicon _index = windows [ CWin . id ] . favicons . indexOf ( favicon ) ;
if ( favicon _index == - 1 ) {
windows [ CWin . id ] . favicons . push ( favicon ) ;
favicon _index = windows [ CWin . id ] . favicons . length ;
}
windows [ CWin . id ] [ "tabs" ] . push ( { id : CTab . id , url : CTab . url , parent : tabs [ CTab . id ] . parent , index : tabs [ CTab . id ] . index , expand : tabs [ CTab . id ] . expand , title : CTab . title , favicon : favicon _index } ) ;
}
} ) ;
ExportWindows . push ( windows [ CWin . id ] ) ;
}
} ) ;
if ( save _to _file ) File _SaveFile ( name , "tt_session" , ExportWindows ) ;
if ( save _to _manager ) Manager _AddSessionToStorage ( ExportWindows , name , true ) ;
if ( save _to _autosave _manager ) Manager _AddAutosaveSessionToStorage ( ExportWindows , name ) ;
} ) ;
} ) ;
} ) ;
}
2018-05-22 02:11:29 +02:00
2018-12-13 23:55:34 +01:00
function Manager _ImportSession ( recreate _session , save _to _manager , merge _session ) {
let file = document . getElementById ( "file_import" ) ;
let fr = new FileReader ( ) ;
if ( file . files [ 0 ] == undefined ) return ;
fr . readAsText ( file . files [ file . files . length - 1 ] ) ;
fr . onload = function ( ) {
let data = fr . result ;
file . parentNode . removeChild ( file ) ;
let LoadedSession = JSON . parse ( data ) ;
if ( recreate _session ) Manager _RecreateSession ( LoadedSession ) ;
if ( merge _session ) Manager _ImportMergeTabs ( LoadedSession ) ;
if ( save _to _manager ) Manager _AddSessionToStorage ( LoadedSession , ( file . files [ file . files . length - 1 ] . name ) . replace ( ".tt_session" , "" ) , true ) ;
}
}
2018-05-22 02:11:29 +02:00
2018-12-13 23:55:34 +01:00
function Manager _AddSessionToStorage ( session , name , add _to _manager ) {
chrome . storage . local . get ( null , function ( storage ) {
if ( storage . saved _sessions == undefined ) {
let saved _sessions = [ ] ;
saved _sessions . push ( { name : name , session : session } ) ;
chrome . storage . local . set ( { saved _sessions : saved _sessions } ) ;
if ( add _to _manager ) Manager _AddSessionToManagerList ( saved _sessions [ saved _sessions . length - 1 ] ) ;
} else {
let saved _sessions = storage . saved _sessions ;
saved _sessions . push ( { name : name , session : session } ) ;
chrome . storage . local . set ( { saved _sessions : saved _sessions } ) ;
if ( add _to _manager ) Manager _AddSessionToManagerList ( saved _sessions [ saved _sessions . length - 1 ] ) ;
}
if ( opt . debug ) Utils _log ( "f: AddSessionToStorage, name: " + name + ", add_to_manager: " + add _to _manager ) ;
} ) ;
}
2018-05-22 02:11:29 +02:00
2018-12-13 23:55:34 +01:00
function Manager _AddAutosaveSessionToStorage ( session , name ) {
chrome . storage . local . get ( null , function ( storage ) {
if ( storage . saved _sessions _automatic == undefined ) {
let s = [ ] ;
s . push ( { name : name , session : session } ) ;
chrome . storage . local . set ( { saved _sessions _automatic : s } ) ;
} else {
let s = storage . saved _sessions _automatic ;
s . unshift ( { name : name , session : session } ) ;
if ( s [ opt . autosave _max _to _keep ] ) s . splice ( opt . autosave _max _to _keep , ( s . length - opt . autosave _max _to _keep ) ) ;
chrome . storage . local . set ( { saved _sessions _automatic : s } ) ;
}
if ( opt . debug ) Utils _log ( "f: AddAutosaveSessionToStorage, name: " + name ) ;
} ) ;
}
2018-05-22 02:11:29 +02:00
2018-12-13 23:55:34 +01:00
function Manager _RecreateSession ( LoadedWindows ) {
if ( opt . debug ) Utils _log ( "f: RecreateSession" ) ;
let RefTabs = { } ;
LoadedWindows . forEach ( function ( LWin ) {
let NewTabs = [ ] ;
let urls = [ ] ;
for ( let Tab of LWin . tabs ) {
urls . push ( Tab . url ) ;
NewTabs . push ( Tab ) ;
}
chrome . windows . create ( { url : urls [ 0 ] } , function ( new _window ) {
chrome . runtime . sendMessage ( { command : "save_groups" , windowId : new _window . id , groups : LWin . groups } ) ;
chrome . runtime . sendMessage ( { command : "save_folders" , windowId : new _window . id , folders : LWin . folders } ) ;
( LWin . tabs ) . forEach ( function ( Tab ) {
if ( Tab . id != LWin . tabs [ 0 ] . id ) { // skip first tab
let params ;
if ( browserId == "F" ) {
params = { active : false , windowId : new _window . id , url : Tab . url , discarded : true , title : Tab . title } ;
} else {
params = { active : false , windowId : new _window . id , url : Tab . url } ;
}
chrome . tabs . create ( params , function ( new _tab ) {
if ( browserId == "F" ) browser . sessions . setTabValue ( new _tab . id , "CachedFaviconUrl" , LWin . favicons [ Tab . favicon ] ) ;
if ( Tab . id == LWin . tabs [ LWin . tabs . length - 1 ] . id ) { // last tab
chrome . windows . get ( new _window . id , { populate : true } , function ( new _window _with _new _tabs ) {
for ( let tInd = 0 ; tInd < new _window _with _new _tabs . tabs . length ; tInd ++ ) {
RefTabs [ NewTabs [ tInd ] . id ] = new _window _with _new _tabs . tabs [ tInd ] . id ;
NewTabs [ tInd ] . id = new _window _with _new _tabs . tabs [ tInd ] . id ;
}
for ( let tInd = 0 ; tInd < new _window _with _new _tabs . tabs . length ; tInd ++ ) {
if ( RefTabs [ NewTabs [ tInd ] . parent ] != undefined ) NewTabs [ tInd ] . parent = RefTabs [ NewTabs [ tInd ] . parent ] ;
}
for ( let tInd = 0 ; tInd < new _window _with _new _tabs . tabs . length ; tInd ++ ) {
if ( NewTabs [ tInd ] . parent == "pin_list" ) chrome . tabs . update ( new _window _with _new _tabs . tabs [ tInd ] . id , { pinned : true } ) ;
chrome . runtime . sendMessage ( { command : "update_tab" , tabId : new _window _with _new _tabs . tabs [ tInd ] . id , tab : { index : NewTabs [ tInd ] . index , expand : NewTabs [ tInd ] . expand , parent : NewTabs [ tInd ] . parent } } ) ;
if ( browserId != "O" && browserId != "F" ) chrome . runtime . sendMessage ( { command : "discard_tab" , tabId : new _window _with _new _tabs . tabs [ tInd ] . id } ) ;
}
} ) ;
}
} ) ;
}
} ) ;
} ) ;
} ) ;
}
2018-05-22 02:11:29 +02:00
2018-12-13 23:55:34 +01:00
function Manager _ImportMergeTabs ( LoadedWindows ) {
if ( opt . debug ) Utils _log ( "f: ImportMergeTabs" ) ;
let RefTabs = { } ;
for ( let LWI = 0 ; LWI < LoadedWindows . length ; LWI ++ ) { // clear previous window ids
LoadedWindows [ LWI ] . id = "" ;
}
Manager _ShowStatusBar ( { show : true , spinner : true , message : chrome . i18n . getMessage ( "status_bar_loaded_tree_structure" ) } ) ;
chrome . windows . getAll ( { windowTypes : [ 'normal' ] , populate : true } , function ( cw ) {
for ( let CWI = 0 ; CWI < cw . length ; CWI ++ ) { // Current Windows
for ( let LWI = 0 ; LWI < LoadedWindows . length ; LWI ++ ) { // Loaded Windows
if ( LoadedWindows [ LWI ] . id == "" ) {
let tabsMatch = 0 ;
for ( let CTI = 0 ; CTI < cw [ CWI ] . tabs . length ; CTI ++ ) { // loop Tabs of CWI Window
for ( let LTI = 0 ; LTI < LoadedWindows [ LWI ] . tabs . length ; LTI ++ ) { // loop Tabs of Loaded Window
if ( cw [ CWI ] . tabs [ CTI ] . url == LoadedWindows [ LWI ] . tabs [ LTI ] . url ) {
RefTabs [ LoadedWindows [ LWI ] . tabs [ LTI ] . id ] = cw [ CWI ] . tabs [ CTI ] . id ;
LoadedWindows [ LWI ] . tabs [ LTI ] . id = cw [ CWI ] . tabs [ CTI ] . id ;
LoadedWindows [ LWI ] . tabs [ LTI ] . url = "" ;
tabsMatch ++ ;
break ;
}
}
}
if ( opt . debug ) Utils _log ( "f: ImportMergeTabs, tabsMatch: " + tabsMatch ) ;
if ( tabsMatch > LoadedWindows [ LWI ] . tabs . length * 0.6 ) {
LoadedWindows [ LWI ] . id = cw [ CWI ] . id ;
break ;
}
}
}
}
LoadedWindows . forEach ( function ( w ) {
if ( w . id == "" ) { // missing window, lets make one
if ( opt . debug ) Utils _log ( "f: ImportMergeTabs, missing window" ) ;
let NewTabs = [ ] ;
let urls = [ ] ;
( w . tabs ) . forEach ( function ( Tab ) {
urls . push ( Tab . url ) ;
NewTabs . push ( Tab ) ;
} ) ;
chrome . windows . create ( { url : urls [ 0 ] } , function ( new _window ) {
chrome . runtime . sendMessage ( { command : "save_groups" , windowId : new _window . id , groups : LWin . groups } ) ;
chrome . runtime . sendMessage ( { command : "save_folders" , windowId : new _window . id , folders : LWin . folders } ) ;
( w . tabs ) . forEach ( function ( Tab ) {
if ( Tab . id != LWin . tabs [ 0 ] . id ) { // skip first tab
let params ;
if ( browserId == "F" ) {
params = { active : false , windowId : new _window . id , url : Tab . url , discarded : true , title : Tab . title } ;
} else {
params = { active : false , windowId : new _window . id , url : Tab . url } ;
}
chrome . tabs . create ( params , function ( new _tab ) {
if ( browserId == "F" ) browser . sessions . setTabValue ( new _tab . id , "CachedFaviconUrl" , w . favicons [ Tab . favicon ] ) ;
if ( Tab . id == LWin . tabs [ LWin . tabs . length - 1 ] . id ) { // last tab
chrome . windows . get ( new _window . id , { populate : true } , function ( new _window _with _new _tabs ) {
for ( let tInd = 0 ; tInd < new _window _with _new _tabs . tabs . length ; tInd ++ ) {
RefTabs [ NewTabs [ tInd ] . id ] = new _window _with _new _tabs . tabs [ tInd ] . id ;
NewTabs [ tInd ] . id = new _window _with _new _tabs . tabs [ tInd ] . id ;
}
for ( let tInd = 0 ; tInd < new _window _with _new _tabs . tabs . length ; tInd ++ ) {
if ( RefTabs [ NewTabs [ tInd ] . parent ] != undefined ) NewTabs [ tInd ] . parent = RefTabs [ NewTabs [ tInd ] . parent ] ;
}
for ( let tInd = 0 ; tInd < new _window _with _new _tabs . tabs . length ; tInd ++ ) {
if ( NewTabs [ tInd ] . parent == "pin_list" ) chrome . tabs . update ( new _window _with _new _tabs . tabs [ tInd ] . id , { pinned : true } ) ;
chrome . runtime . sendMessage ( { command : "update_tab" , tabId : new _window _with _new _tabs . tabs [ tInd ] . id , tab : { index : NewTabs [ tInd ] . index , expand : NewTabs [ tInd ] . expand , parent : NewTabs [ tInd ] . parent } } ) ;
if ( browserId != "O" && browserId != "F" ) chrome . runtime . sendMessage ( { command : "discard_tab" , tabId : new _window _with _new _tabs . tabs [ tInd ] . id } ) ;
}
} ) ;
}
} ) ;
}
} ) ;
} ) ;
} else { // window exists, lets add missing tabs
let NewTabs = [ ] ;
let RefTabs = { } ;
chrome . runtime . sendMessage ( { command : "get_folders" , windowId : w . id } , function ( f ) {
chrome . runtime . sendMessage ( { command : "get_groups" , windowId : w . id } , function ( g ) {
if ( Object . keys ( w . groups ) . length > 0 ) {
for ( var group in w . groups ) {
if ( group != "" && group != "undefined" && w . groups [ group ] != undefined ) g [ w . groups [ group ] . id ] = Object . assign ( { } , w . groups [ group ] ) ;
}
}
if ( Object . keys ( w . folders ) . length > 0 ) {
for ( var folder in w . folders ) {
if ( folder != "" && folder != "undefined" && w . folders [ folder ] != undefined ) w . folders [ w . folders [ folder ] . id ] = Object . assign ( { } , w . folders [ folder ] ) ;
}
}
if ( Object . keys ( g ) . length > 0 ) {
for ( var groupId in g ) {
w . groups [ groupId ] = Object . assign ( { } , g [ groupId ] ) ;
}
}
if ( Object . keys ( f ) . length > 0 ) {
for ( var folderId in f ) {
w . folders [ folderId ] = Object . assign ( { } , f [ folderId ] ) ;
}
}
chrome . runtime . sendMessage ( { command : "save_groups" , windowId : w . id , groups : g } ) ;
chrome . runtime . sendMessage ( { command : "save_folders" , windowId : w . id , folders : f } ) ;
chrome . runtime . sendMessage ( { command : "remote_update" , groups : w . groups , folders : w . folders , tabs : [ ] , windowId : w . id } ) ;
if ( w . id == tt . CurrentWindowId ) Manager _RecreateTreeStructure ( w . groups , w . folders , [ ] ) ;
( w . tabs ) . forEach ( function ( Tab ) {
// let LastTabId = w.tabs[w.tabs.length - 1].id;
// let OriginalTabId = Tab.id;
if ( Tab . url != "" ) { // missing tab, lets make one
let params ;
if ( browserId == "F" ) {
params = { active : false , windowId : w . id , url : Tab . url , discarded : true , title : Tab . title } ;
} else {
params = { active : false , windowId : w . id , url : Tab . url } ;
}
chrome . tabs . create ( params , function ( tab ) {
if ( browserId == "F" ) browser . sessions . setTabValue ( tab . id , "CachedFaviconUrl" , w . favicons [ Tab . favicon ] ) ;
if ( Tab . parent == "pin_list" ) chrome . tabs . update ( tab . id , { pinned : true } ) ;
RefTabs [ Tab . id ] = tab . id ;
Tab . id = tab . id ;
NewTabs . push ( Tab ) ;
chrome . runtime . sendMessage ( { command : "update_tab" , tabId : tab . id , tab : { index : Tab . index , expand : Tab . expand , parent : Tab . parent } } ) ;
} ) ;
} else {
NewTabs . push ( Tab ) ;
}
// if (OriginalTabId == LastTabId) { // loop is on last tab
// setTimeout(function() {
// Manager_ShowStatusBar({show: true, spinner: true, message: chrome.i18n.getMessage("status_bar_finding_ref_tabs")});
// for (let tInd = 0; tInd < NewTabs.length; tInd++) {
// if (RefTabs[NewTabs[tInd].parent] != undefined) {
// NewTabs[tInd].parent = RefTabs[NewTabs[tInd].parent];
// }
// }
// }, 1000);
// }
} ) ;
setTimeout ( function ( ) {
Manager _ShowStatusBar ( { show : true , spinner : true , message : chrome . i18n . getMessage ( "status_bar_finding_ref_tabs" ) } ) ;
for ( let tInd = 0 ; tInd < NewTabs . length ; tInd ++ ) {
if ( RefTabs [ NewTabs [ tInd ] . parent ] != undefined ) NewTabs [ tInd ] . parent = RefTabs [ NewTabs [ tInd ] . parent ] ;
}
} , 2000 ) ;
setTimeout ( function ( ) {
for ( let NewTab of NewTabs ) {
chrome . runtime . sendMessage ( { command : "update_tab" , tabId : NewTab . id , tab : { index : NewTab . index , expand : NewTab . expand , parent : NewTab . parent } } ) ;
}
Manager _ShowStatusBar ( { show : true , spinner : true , message : chrome . i18n . getMessage ( "status_bar_finding_other_windows" ) } ) ;
if ( w . id == tt . CurrentWindowId ) {
Manager _RecreateTreeStructure ( w . groups , w . folders , NewTabs ) ;
} else {
chrome . runtime . sendMessage ( { command : "remote_update" , groups : w . groups , folders : w . folders , tabs : NewTabs , windowId : w . id } ) ;
}
Manager _ShowStatusBar ( { show : true , spinner : false , message : chrome . i18n . getMessage ( "status_bar_all_done" ) , hideTimeout : 2000 } ) ;
} , 6000 ) ;
} ) ;
} ) ;
}
} ) ;
} ) ;
}
2018-05-22 02:11:29 +02:00
2018-12-13 23:55:34 +01:00
function Manager _StartAutoSaveSession ( ) {
if ( opt . autosave _interval > 0 && opt . autosave _max _to _keep > 0 ) {
tt . AutoSaveSession = setInterval ( function ( ) {
if ( opt . debug ) Utils _log ( "f: AutoSaveSession, loop time is: " + opt . autosave _interval ) ;
let d = new Date ( ) ;
let newName = d . toLocaleString ( ) . replace ( /\//g , "." ) . replace ( /:/g , "꞉ " ) ;
Manager _ExportSession ( newName , false , false , true ) ;
Manager _ShowStatusBar ( { show : true , spinner : false , message : chrome . i18n . getMessage ( "status_bar_autosave" ) + newName , hideTimeout : 1500 } ) ;
if ( document . getElementById ( "manager_window" ) . style . top != "-500px" ) chrome . storage . local . get ( null , function ( storage ) { Manager _ReAddSessionAutomaticToManagerList ( storage ) ; } ) ;
} , opt . autosave _interval * 60000 ) ;
}
}
2018-05-22 02:11:29 +02:00
2018-12-13 23:55:34 +01:00
function Manager _RecreateTreeStructure ( groups , folders , tabs ) { // groups and folders are in object, just like tt.groups and tt.folders, but tabs are in array of treetabs objects
if ( opt . debug ) Utils _log ( "f: RecreateTreeStructure" ) ;
Manager _ShowStatusBar ( { show : true , spinner : true , message : chrome . i18n . getMessage ( "status_bar_quick_check_recreate_structure" ) , hideTimeout : 3000 } ) ;
if ( groups && Object . keys ( groups ) . length > 0 ) {
for ( var group in groups ) {
tt . groups [ groups [ group ] . id ] = Object . assign ( { } , groups [ group ] ) ;
}
Groups _AppendGroups ( tt . groups ) ;
}
if ( folders && Object . keys ( folders ) . length > 0 ) {
for ( var folder in folders ) {
tt . folders [ folders [ folder ] . id ] = Object . assign ( { } , folders [ folder ] ) ;
}
Folders _PreAppendFolders ( tt . folders ) ;
Folders _AppendFolders ( tt . folders ) ;
}
let ttTabs = { } ;
tabs . forEach ( function ( Tab ) {
if ( Tab . parent == "pin_list" ) chrome . tabs . update ( Tab . id , { pinned : true } ) ;
if ( Tab . parent != "" ) {
let AttemptNr = 20 ;
var Attempt = setInterval ( function ( ) {
AttemptNr -- ;
let tb = document . getElementById ( Tab . id ) ;
let tbp = document . getElementById ( "°" + Tab . parent ) ;
if ( tb != null && tbp != null ) {
tbp . appendChild ( tb ) ;
if ( Tab . expand != "" ) tb . classList . add ( Tab . expand ) ;
ttTabs [ Tab . id ] = { index : Tab . index , parent : Tab . parent , expand : Tab . expand } ;
}
if ( AttemptNr < 0 || ( tb != null && tbp != null ) ) clearInterval ( Attempt ) ;
} , 500 ) ;
}
} ) ;
let SortAttemptNr = 20 ;
var SortAttempt = setInterval ( function ( ) {
SortAttemptNr -- ;
if ( SortAttemptNr < 0 || Object . keys ( ttTabs ) . length == tabs . length || tabs . length == 0 ) {
Tabs _RearrangeTree ( ttTabs , folders , false ) ;
clearInterval ( SortAttempt ) ;
Groups _UpdateBgGroupsOrder ( ) ;
setTimeout ( function ( ) {
DOM _RefreshExpandStates ( ) ;
DOM _RefreshCounters ( ) ;
tt . schedule _update _data ++ ;
Folders _SaveFolders ( ) ;
} , 3000 ) ;
}
} , 500 ) ;
2018-05-22 02:11:29 +02:00
}
2018-12-13 23:55:34 +01:00
function Manager _ShowStatusBar ( p ) { // show, spinner, message
let status _bar = document . getElementById ( "status_bar" ) ;
let busy _spinner = document . getElementById ( "busy_spinner" ) ;
let status _message = document . getElementById ( "status_message" ) ;
if ( p . show ) {
status _bar . style . display = "block" ;
status _message . textContent = p . message ;
if ( p . spinner ) {
busy _spinner . style . opacity = "1" ;
} else {
busy _spinner . style . opacity = "0" ;
}
} else {
busy _spinner . style . opacity = "0" ;
status _message . textContent = "" ;
status _bar . style . display = "none" ;
}
if ( p . hideTimeout ) {
setTimeout ( function ( ) {
busy _spinner . style . opacity = "0" ;
status _message . textContent = "" ;
status _bar . style . display = "none" ;
} , p . hideTimeout ) ;
}
}