2017-11-12 22:00:40 +01:00
// 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 ExportGroup ( filename ) {
2018-01-01 19:50:56 +01:00
let GroupToSave = { group : bggroups [ active _group ] , folders : { } , tabs : [ ] } ;
2017-11-12 22:00:40 +01:00
let lastId = parseInt ( $ ( "#" + active _group + " .tab" ) . last ( ) [ 0 ] . id ) ;
2018-01-01 19:50:56 +01:00
$ ( "#" + active _group + " .folder" ) . each ( function ( ) {
if ( bgfolders [ this . id ] ) {
GroupToSave . folders [ this . id ] = bgfolders [ this . id ] ;
}
} )
2017-11-12 22:00:40 +01:00
$ ( "#" + active _group + " .tab" ) . each ( function ( ) {
chrome . tabs . get ( parseInt ( this . id ) , function ( tab ) {
2018-01-01 19:50:56 +01:00
if ( ( tab . url ) . startsWith ( "www" ) || ( tab . url ) . startsWith ( "http" ) || ( tab . url ) . startsWith ( "ftp" ) ) {
( GroupToSave . tabs ) . push (
{
id : tab . id ,
parent : $ ( "#" + tab . id ) . parent ( ) . parent ( ) [ 0 ] . id ,
index : $ ( "#" + tab . id ) . index ( ) ,
expand : ( $ ( "#" + tab . id ) . is ( ".n" ) ? "n" : ( $ ( "#" + tab . id ) . is ( ".c" ) ? "c" : "o" ) ) ,
url : tab . url
}
) ;
}
2017-11-12 22:00:40 +01:00
if ( tab . id == lastId ) {
SaveFile ( filename , GroupToSave ) ;
}
} ) ;
} )
}
function ImportGroup ( ) {
let file = document . getElementById ( "file_import_group" ) ;
let fr = new FileReader ( ) ;
if ( file . files [ 0 ] == undefined ) return ;
fr . readAsText ( file . files [ 0 ] ) ;
fr . onload = function ( ) {
let data = fr . result ;
file . remove ( ) ;
let LoadedGroup = JSON . parse ( data ) ;
2018-01-01 19:50:56 +01:00
let NewFolders = { } ;
2017-11-12 22:00:40 +01:00
let RefsTabs = { } ;
2018-01-01 19:50:56 +01:00
let NewTabs = [ ] ;
let NewGroupId = AddNewGroup ( { name : LoadedGroup . group . name , font : LoadedGroup . group . font } ) ;
2017-11-12 22:00:40 +01:00
SetActiveGroup ( NewGroupId , false , false ) ;
2018-01-01 19:50:56 +01:00
for ( var folder in LoadedGroup . folders ) {
let newId = GenerateNewFolderID ( ) ;
NewFolders [ folder ] = { id : newId , parent : NewGroupId , index : ( LoadedGroup . folders [ folder ] . index ) , name : ( LoadedGroup . folders [ folder ] . name ) , expand : ( LoadedGroup . folders [ folder ] . expand ) } ;
}
for ( var folder in NewFolders ) {
if ( NewFolders [ LoadedGroup . folders [ folder ] . parent ] ) {
NewFolders [ folder ] . parent = NewFolders [ LoadedGroup . folders [ folder ] . parent ] . id ;
}
}
( LoadedGroup . tabs ) . forEach ( function ( Tab ) {
chrome . tabs . create ( { url : Tab . url , active : false } , function ( new _tab ) {
if ( new _tab ) {
RefsTabs [ Tab . id ] = new _tab . id ;
Tab . id = new _tab . id ;
NewTabs . push ( Tab ) ;
}
if ( NewTabs . length == LoadedGroup . tabs . length - 1 ) {
2017-11-12 22:00:40 +01:00
setTimeout ( function ( ) {
2018-01-01 19:50:56 +01:00
NewTabs . forEach ( function ( LTab ) {
if ( LTab . parent == LoadedGroup . group . id ) {
LTab . parent = NewGroupId ;
}
if ( NewFolders [ LTab . parent ] ) {
LTab . parent = NewFolders [ LTab . parent ] . id ;
}
if ( RefsTabs [ LTab . parent ] ) {
LTab . parent = RefsTabs [ LTab . parent ] ;
2017-11-12 22:00:40 +01:00
}
} ) ;
2018-01-01 19:50:56 +01:00
RearrangeTreeStructure ( { } , NewFolders , NewTabs ) ;
} , 2000 ) ;
}
2017-11-12 22:00:40 +01:00
} ) ;
} ) ;
}
}
2018-01-01 19:50:56 +01:00
function ExportSession ( filename ) {
2017-11-12 22:00:40 +01:00
chrome . windows . getAll ( { windowTypes : [ 'normal' ] , populate : true } , function ( w ) {
chrome . runtime . sendMessage ( { command : "get_browser_tabs" } , function ( response ) {
let tabs = Object . assign ( { } , response ) ;
chrome . runtime . sendMessage ( { command : "get_windows" } , function ( response ) {
let windows = Object . assign ( { } , response ) ;
2018-01-01 19:50:56 +01:00
let warn = true ;
let ExportWindows = [ ] ;
w . forEach ( function ( CWin ) {
if ( CWin . tabs . length > 0 ) {
if ( CWin . tabs . length > 100 && warn ) {
alert ( chrome . i18n . getMessage ( "warning_exporting_big_amount_of_tabs" ) ) ;
warn = false ;
2017-11-12 22:00:40 +01:00
}
2018-01-01 19:50:56 +01:00
windows [ CWin . id ] [ "id" ] = CWin . id ;
windows [ CWin . id ] [ "tabs" ] = [ ] ;
CWin . tabs . forEach ( function ( CTab ) {
if ( ( CTab . url ) . startsWith ( "www" ) || ( CTab . url ) . startsWith ( "http" ) || ( CTab . url ) . startsWith ( "ftp" ) ) {
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 } ) ;
}
} ) ;
ExportWindows . push ( windows [ CWin . id ] ) ;
}
2017-11-12 22:00:40 +01:00
} ) ;
2018-01-01 19:50:56 +01:00
SaveFile ( filename , ExportWindows ) ;
2017-11-12 22:00:40 +01:00
} ) ;
} ) ;
} ) ;
}
2018-01-01 19:50:56 +01:00
function ImportSession ( ) {
2017-11-12 22:00:40 +01:00
let file = document . getElementById ( "file_import_backup" ) ;
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 . remove ( ) ;
2018-01-01 19:50:56 +01:00
let LoadedWindows = JSON . parse ( data ) ;
let RefsTabs = { } ;
log ( LoadedWindows ) ;
LoadedWindows . forEach ( function ( LWin ) {
let NewTabs = [ ] ;
let urls = [ ] ;
( LWin . tabs ) . forEach ( function ( Tab ) {
urls . push ( Tab . url ) ;
NewTabs . push ( Tab ) ;
2017-11-12 22:00:40 +01:00
} ) ;
2018-01-01 19:50:56 +01:00
chrome . windows . create ( { url : urls } , function ( new _window ) {
for ( let tInd = 0 ; tInd < new _window . tabs . length ; tInd ++ ) {
RefsTabs [ NewTabs [ tInd ] . id ] = new _window . tabs [ tInd ] . id ;
NewTabs [ tInd ] . id = new _window . tabs [ tInd ] . id ;
}
for ( let tInd = 0 ; tInd < new _window . tabs . length ; tInd ++ ) {
if ( RefsTabs [ NewTabs [ tInd ] . parent ] != undefined ) {
NewTabs [ tInd ] . parent = RefsTabs [ NewTabs [ tInd ] . parent ] ;
}
}
let HaveResponse ;
let GiveUp = 0 ;
var Append = setInterval ( function ( ) {
chrome . runtime . sendMessage ( { command : "remote_update" , groups : LWin . groups , folders : LWin . folders , tabs : NewTabs , windowId : new _window . id } , function ( response ) {
HaveResponse = response ;
2017-11-12 22:00:40 +01:00
} ) ;
2018-01-01 19:50:56 +01:00
if ( HaveResponse || GiveUp > 900 ) {
clearInterval ( Append ) ;
}
GiveUp ++ ;
} , 2000 ) ;
2017-11-12 22:00:40 +01:00
} ) ;
} ) ;
}
}
2018-01-01 19:50:56 +01:00
function RearrangeTreeStructure ( groups , folders , tabs ) { // groups and folders are in object, just like bggroups and bgfolders, but tabs are in array of bgtreetabs objects
log ( "function: RearrangeTreeStructure" ) ;
chrome . tabs . query ( { currentWindow : true } , function ( ChromeTabs ) {
if ( Object . keys ( groups ) . length > 0 ) {
for ( var group in groups ) {
bggroups [ groups [ group ] . id ] = Object . assign ( { } , groups [ group ] ) ;
}
AppendGroups ( bggroups ) ;
}
if ( Object . keys ( folders ) . length > 0 ) {
for ( var folder in folders ) {
bgfolders [ folders [ folder ] . id ] = Object . assign ( { } , folders [ folder ] ) ;
}
AppendFolders ( bgfolders ) ;
}
let bgtabs = { } ;
tabs . forEach ( function ( Tab ) {
if ( Tab . parent == "pin_list" ) {
chrome . tabs . update ( Tab . id , { pinned : true } ) ;
}
if ( $ ( "#" + Tab . id ) [ 0 ] && $ ( "#ch" + Tab . parent ) [ 0 ] ) {
$ ( "#ch" + Tab . parent ) . append ( $ ( "#" + Tab . id ) ) ;
$ ( "#" + Tab . id ) . addClass ( Tab . expand ) ;
}
bgtabs [ Tab . id ] = { index : Tab . index , parent : Tab . parent , expand : Tab . expand } ;
} ) ;
RearrangeTreeTabs ( ChromeTabs , bgtabs , true ) ;
RearrangeFolders ( true ) ;
UpdateBgGroupsOrder ( ) ;
setTimeout ( function ( ) {
RefreshExpandStates ( ) ;
RefreshCounters ( ) ;
schedule _update _data ++ ;
SaveFolders ( ) ;
} , 1000 ) ;
} ) ;
}
2017-11-12 22:00:40 +01:00
function ImportMergeTabs ( ) {
2018-01-01 19:50:56 +01:00
log ( "function: ImportMergeTabs" ) ;
2017-11-12 22:00:40 +01:00
let file = document . getElementById ( "file_import_merge_backup" ) ;
let fr = new FileReader ( ) ;
if ( file . files [ 0 ] == undefined ) return ;
fr . readAsText ( file . files [ 0 ] ) ;
fr . onload = function ( ) {
let data = fr . result ;
file . remove ( ) ;
2018-01-01 19:50:56 +01:00
let lw = JSON . parse ( data ) ;
let RefsWins = { } ;
let RefsTabs = { } ;
for ( let LWI = 0 ; LWI < lw . length ; LWI ++ ) { // clear previous window ids
lw [ LWI ] . id = "" ;
}
log ( lw ) ;
chrome . windows . getAll ( { windowTypes : [ 'normal' ] , populate : true } , function ( cw ) {
for ( let CWI = 0 ; CWI < cw . length ; CWI ++ ) { // loop Windows
for ( let LWI = 0 ; LWI < lw . length ; LWI ++ ) { // loop Loaded Windows
let tabsMatch = 0 ;
for ( let CTI = 0 ; CTI < cw [ CWI ] . tabs . length ; CTI ++ ) { // loop Tabs of each Current Window
for ( let LTI = 0 ; LTI < lw [ LWI ] . tabs . length ; LTI ++ ) { // loop Tabs of each Loaded Window
if ( cw [ CWI ] . tabs [ CTI ] . url == lw [ LWI ] . tabs [ LTI ] . url ) {
RefsTabs [ lw [ LWI ] . tabs [ LTI ] . id ] = cw [ CWI ] . tabs [ CTI ] . id ;
lw [ LWI ] . tabs [ LTI ] . id = cw [ CWI ] . tabs [ CTI ] . id ;
lw [ LWI ] . tabs [ LTI ] . url = "" ;
tabsMatch ++ ;
2017-11-12 22:00:40 +01:00
break ;
}
}
}
2018-01-01 19:50:56 +01:00
log ( tabsMatch ) ;
if ( tabsMatch > lw [ LWI ] . tabs . length * 0.8 ) {
lw [ LWI ] . id = cw [ CWI ] . id ;
break ;
}
}
}
log ( lw ) ;
lw . forEach ( function ( w ) {
if ( w . id == "" ) { // missing window, lets make one
log ( "missing window" ) ;
let NewTabs = [ ] ;
let urls = [ ] ;
( w . tabs ) . forEach ( function ( Tab ) {
urls . push ( Tab . url ) ;
NewTabs . push ( Tab ) ;
} ) ;
chrome . windows . create ( { url : urls } , function ( new _window ) {
for ( let tInd = 0 ; tInd < new _window . tabs . length ; tInd ++ ) {
RefsTabs [ NewTabs [ tInd ] . id ] = new _window . tabs [ tInd ] . id ;
NewTabs [ tInd ] . id = new _window . tabs [ tInd ] . id ;
}
for ( let tInd = 0 ; tInd < new _window . tabs . length ; tInd ++ ) {
if ( RefsTabs [ NewTabs [ tInd ] . parent ] != undefined ) {
NewTabs [ tInd ] . parent = RefsTabs [ NewTabs [ tInd ] . parent ] ;
}
}
let HaveResponse ;
let GiveUp = 0 ;
var Append = setInterval ( function ( ) {
chrome . runtime . sendMessage ( { command : "remote_update" , groups : w . groups , folders : w . folders , tabs : NewTabs , windowId : new _window . id } , function ( response ) {
HaveResponse = response ;
} ) ;
if ( HaveResponse || GiveUp > 900 ) {
clearInterval ( Append ) ;
2017-11-12 22:00:40 +01:00
}
2018-01-01 19:50:56 +01:00
GiveUp ++ ;
} , 2000 ) ;
2017-11-12 22:00:40 +01:00
} ) ;
2018-01-01 19:50:56 +01:00
}
else
{ // window exists, lets add missing tabs
log ( "window exists" ) ;
let NewTabs = [ ] ;
( w . tabs ) . forEach ( function ( Tab ) {
if ( Tab . url != "" ) { // missing tab, lets make one
chrome . tabs . create ( { url : Tab . url , windowId : w . id } , function ( tab ) {
Tab . id = tab . id ;
RefsTabs [ tab . id ] = tab . id ;
NewTabs . push ( Tab ) ;
2017-11-12 22:00:40 +01:00
} ) ;
2018-01-01 19:50:56 +01:00
} else {
NewTabs . push ( Tab ) ;
2017-11-12 22:00:40 +01:00
}
} ) ;
2018-01-01 19:50:56 +01:00
setTimeout ( function ( ) {
for ( let tInd = 0 ; tInd < NewTabs . length ; tInd ++ ) {
if ( RefsTabs [ NewTabs [ tInd ] . parent ] != undefined ) {
NewTabs [ tInd ] . parent = RefsTabs [ NewTabs [ tInd ] . parent ] ;
}
}
} , 4000 ) ;
setTimeout ( function ( ) {
if ( w . id == CurrentWindowId ) {
RearrangeTreeStructure ( w . groups , w . folders , NewTabs ) ;
} else {
let HaveResponse ;
let GiveUp = 0 ;
var Append = setInterval ( function ( ) {
chrome . runtime . sendMessage ( { command : "remote_update" , groups : w . groups , folders : w . folders , tabs : NewTabs , windowId : w . id } , function ( response ) {
HaveResponse = response ;
} ) ;
if ( HaveResponse || GiveUp > 900 ) {
clearInterval ( Append ) ;
}
GiveUp ++ ;
} , 2000 ) ;
}
} , 6000 ) ;
2017-11-12 22:00:40 +01:00
}
} ) ;
} ) ;
}
}