diff options
author | 2022-02-28 01:13:06 +0100 | |
---|---|---|
committer | 2022-03-06 18:56:49 +0100 | |
commit | 2a5f7e3fecc98debea2b3408662d402a1e1681a0 (patch) | |
tree | 39b363cd8453007a8b6537e01813e0c8e61fe46c /packages/main/src/stores/Service.ts | |
parent | fix(service-preload): Browser view canvas background (diff) | |
download | sophie-2a5f7e3fecc98debea2b3408662d402a1e1681a0.tar.gz sophie-2a5f7e3fecc98debea2b3408662d402a1e1681a0.tar.zst sophie-2a5f7e3fecc98debea2b3408662d402a1e1681a0.zip |
feat: Handle service load failures
Adds a "failed" state for services where the BrowserView and WebContents
should be left around to keep history and allow people to navigate back.
Access to the browser history otherwise doesn't seem possible
(see https://github.com/electron/electron/issues/26727
and https://github.com/electron/electron/issues/7186),
so destroying BrowserView and managing our own history is not possible.
Also keep https://github.com/electron/electron/issues/24113 in mind.
Signed-off-by: Kristóf Marussy <kristof@marussy.com>
Diffstat (limited to 'packages/main/src/stores/Service.ts')
-rw-r--r-- | packages/main/src/stores/Service.ts | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/packages/main/src/stores/Service.ts b/packages/main/src/stores/Service.ts index cbd8662..d98e52e 100644 --- a/packages/main/src/stores/Service.ts +++ b/packages/main/src/stores/Service.ts | |||
@@ -40,7 +40,10 @@ const Service = defineServiceModel(ServiceSettings) | |||
40 | return self.currentUrl ?? self.settings.url; | 40 | return self.currentUrl ?? self.settings.url; |
41 | }, | 41 | }, |
42 | get shouldBeLoaded(): boolean { | 42 | get shouldBeLoaded(): boolean { |
43 | return self.state !== 'crashed'; | 43 | return !self.crashed; |
44 | }, | ||
45 | get shouldBeVisible(): boolean { | ||
46 | return this.shouldBeLoaded && !self.failed; | ||
44 | }, | 47 | }, |
45 | })) | 48 | })) |
46 | .volatile( | 49 | .volatile( |
@@ -67,17 +70,20 @@ const Service = defineServiceModel(ServiceSettings) | |||
67 | setTitle(title: string): void { | 70 | setTitle(title: string): void { |
68 | self.title = title; | 71 | self.title = title; |
69 | }, | 72 | }, |
70 | startedLoading(): void { | 73 | startLoading(): void { |
71 | self.state = 'loading'; | 74 | self.state = { type: 'loading' }; |
72 | }, | 75 | }, |
73 | finishedLoading(): void { | 76 | finishLoading(): void { |
74 | if (self.state === 'loading') { | 77 | if (self.loading) { |
75 | // Do not overwrite crashed state if the service haven't been reloaded yet. | 78 | // Do not overwrite crashed state if the service haven't been reloaded yet. |
76 | self.state = 'loaded'; | 79 | self.state = { type: 'loaded' }; |
77 | } | 80 | } |
78 | }, | 81 | }, |
79 | crashed(): void { | 82 | setFailed(errorCode: number, errorDesc: string): void { |
80 | self.state = 'crashed'; | 83 | self.state = { type: 'failed', errorCode, errorDesc }; |
84 | }, | ||
85 | setCrashed(reason: string, exitCode: number): void { | ||
86 | self.state = { type: 'crashed', reason, exitCode }; | ||
81 | }, | 87 | }, |
82 | setUnreadCount({ direct, indirect }: UnreadCount): void { | 88 | setUnreadCount({ direct, indirect }: UnreadCount): void { |
83 | if (direct !== undefined) { | 89 | if (direct !== undefined) { |
@@ -98,7 +104,7 @@ const Service = defineServiceModel(ServiceSettings) | |||
98 | }, | 104 | }, |
99 | reload(ignoreCache = false): void { | 105 | reload(ignoreCache = false): void { |
100 | if (self.serviceView === undefined) { | 106 | if (self.serviceView === undefined) { |
101 | this.startedLoading(); | 107 | self.state = { type: 'initializing' }; |
102 | } else { | 108 | } else { |
103 | self.serviceView?.reload(ignoreCache); | 109 | self.serviceView?.reload(ignoreCache); |
104 | } | 110 | } |
@@ -109,12 +115,9 @@ const Service = defineServiceModel(ServiceSettings) | |||
109 | go(url: string): void { | 115 | go(url: string): void { |
110 | if (self.serviceView === undefined) { | 116 | if (self.serviceView === undefined) { |
111 | self.currentUrl = url; | 117 | self.currentUrl = url; |
112 | this.startedLoading(); | 118 | self.state = { type: 'initializing' }; |
113 | } else { | 119 | } else { |
114 | self.serviceView?.loadURL(url).catch((error) => { | 120 | self.serviceView?.loadURL(url); |
115 | log.warn('Error while loading', url, error); | ||
116 | this.crashed(); | ||
117 | }); | ||
118 | } | 121 | } |
119 | }, | 122 | }, |
120 | goHome(): void { | 123 | goHome(): void { |