@@ -2,18 +2,25 @@ import { createState, type Stateful } from "dreamland/core";
22import { ThemeVars , type Theme } from "./theme" ;
33import { Tabs } from "./components/TabStrip" ;
44import { Omnibox } from "./components/Omnibox" ;
5- import { scramjet } from "./main" ;
5+ import { browser , scramjet } from "./main" ;
66import iconAdd from "@ktibow/iconset-ion/add" ;
77import { Shell } from "./components/Shell" ;
88import { createMenu } from "./components/Menu" ;
99import { StatefulClass } from "./StatefulClass" ;
10- import { Tab } from "./Tab" ;
10+ import { Tab , type SerializedTab } from "./Tab" ;
1111import { createDelegate } from "dreamland/core" ;
1212
1313export const pushTab = createDelegate < Tab > ( ) ;
1414export const popTab = createDelegate < Tab > ( ) ;
1515export const forceScreenshot = createDelegate < Tab > ( ) ;
1616
17+ export const saveBrowserState = createDelegate < void > ( ) ;
18+
19+ export type SerializedBrowser = {
20+ tabs : SerializedTab [ ] ;
21+ activetab : number ;
22+ } ;
23+
1724export class Browser extends StatefulClass {
1825 built : boolean = false ;
1926
@@ -49,6 +56,23 @@ export class Browser extends StatefulClass {
4956 } ;
5057 }
5158
59+ serialize ( ) : SerializedBrowser {
60+ return {
61+ tabs : this . tabs . map ( ( t ) => t . serialize ( ) ) ,
62+ activetab : this . activetab . id ,
63+ } ;
64+ }
65+ deserialize ( de : SerializedBrowser ) {
66+ this . tabs = [ ] ;
67+ for ( let detab of de . tabs ) {
68+ let tab = this . newTab ( ) ;
69+ console . log ( tab ) ;
70+ tab . deserialize ( detab ) ;
71+ }
72+ this . activetab = this . tabs . find ( ( t ) => t . id == de . activetab ) ! ;
73+ console . log ( this . activetab , this . activetab . url ) ;
74+ }
75+
5276 newTab ( ) {
5377 let tab = new Tab ( ) ;
5478 pushTab ( tab ) ;
@@ -69,8 +93,10 @@ export class Browser extends StatefulClass {
6993 build ( ) : HTMLElement {
7094 let shell = < Shell tabs = { use ( this . tabs ) } activetab = { use ( this . activetab ) } /> ;
7195
72- let tab = this . newTab ( ) ;
73- this . activetab = tab ;
96+ if ( ! this . activetab ) {
97+ let tab = this . newTab ( ) ;
98+ this . activetab = tab ;
99+ }
74100 if ( this . built ) throw new Error ( "already built" ) ;
75101 this . built = true ;
76102
@@ -115,5 +141,16 @@ export class Browser extends StatefulClass {
115141export function createBrowser ( ) : Browser {
116142 let browser = new Browser ( createState ( { } ) ) ;
117143 Object . setPrototypeOf ( browser , Browser . prototype ) ;
144+ let de = localStorage [ "browserstate" ] ;
145+ if ( de ) {
146+ browser . deserialize ( JSON . parse ( de ) ) ;
147+ }
148+
118149 return browser ;
119150}
151+
152+ saveBrowserState . listen ( ( ) => {
153+ let ser = browser . serialize ( ) ;
154+ localStorage [ "browserstate" ] = JSON . stringify ( ser ) ;
155+ } ) ;
156+ setInterval ( saveBrowserState , 1000 ) ;
0 commit comments