From 2a5f7e3fecc98debea2b3408662d402a1e1681a0 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Mon, 28 Feb 2022 01:13:06 +0100 Subject: feat: Handle service load failures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- packages/main/src/stores/Service.ts | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'packages/main/src/stores/Service.ts') 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) return self.currentUrl ?? self.settings.url; }, get shouldBeLoaded(): boolean { - return self.state !== 'crashed'; + return !self.crashed; + }, + get shouldBeVisible(): boolean { + return this.shouldBeLoaded && !self.failed; }, })) .volatile( @@ -67,17 +70,20 @@ const Service = defineServiceModel(ServiceSettings) setTitle(title: string): void { self.title = title; }, - startedLoading(): void { - self.state = 'loading'; + startLoading(): void { + self.state = { type: 'loading' }; }, - finishedLoading(): void { - if (self.state === 'loading') { + finishLoading(): void { + if (self.loading) { // Do not overwrite crashed state if the service haven't been reloaded yet. - self.state = 'loaded'; + self.state = { type: 'loaded' }; } }, - crashed(): void { - self.state = 'crashed'; + setFailed(errorCode: number, errorDesc: string): void { + self.state = { type: 'failed', errorCode, errorDesc }; + }, + setCrashed(reason: string, exitCode: number): void { + self.state = { type: 'crashed', reason, exitCode }; }, setUnreadCount({ direct, indirect }: UnreadCount): void { if (direct !== undefined) { @@ -98,7 +104,7 @@ const Service = defineServiceModel(ServiceSettings) }, reload(ignoreCache = false): void { if (self.serviceView === undefined) { - this.startedLoading(); + self.state = { type: 'initializing' }; } else { self.serviceView?.reload(ignoreCache); } @@ -109,12 +115,9 @@ const Service = defineServiceModel(ServiceSettings) go(url: string): void { if (self.serviceView === undefined) { self.currentUrl = url; - this.startedLoading(); + self.state = { type: 'initializing' }; } else { - self.serviceView?.loadURL(url).catch((error) => { - log.warn('Error while loading', url, error); - this.crashed(); - }); + self.serviceView?.loadURL(url); } }, goHome(): void { -- cgit v1.2.3-70-g09d2