From 0fcc36535918c9a4bb464a746c657af96922eeb5 Mon Sep 17 00:00:00 2001 From: Don Jayamanne Date: Mon, 20 Apr 2020 11:47:51 -0700 Subject: [PATCH 1/2] Add error for timeout --- .../ipywidgets/ipywidgetHandler.ts | 3 ++- src/client/telemetry/index.ts | 8 +++++++- .../redux/reducers/types.ts | 1 + src/datascience-ui/ipywidgets/container.tsx | 19 +++++++++++++++---- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/client/datascience/ipywidgets/ipywidgetHandler.ts b/src/client/datascience/ipywidgets/ipywidgetHandler.ts index 77cfca280c09..306c0a11a553 100644 --- a/src/client/datascience/ipywidgets/ipywidgetHandler.ts +++ b/src/client/datascience/ipywidgets/ipywidgetHandler.ts @@ -98,7 +98,8 @@ export class IPyWidgetHandler implements IInteractiveWindowListener { sendTelemetryEvent(Telemetry.IPyWidgetLoadFailure, 0, { isOnline: payload.isOnline, moduleHash: this.hash(payload.moduleName), - moduleVersion: payload.moduleVersion + moduleVersion: payload.moduleVersion, + timedout: payload.timedout }); } catch { // do nothing on failure diff --git a/src/client/telemetry/index.ts b/src/client/telemetry/index.ts index ad86f3f75790..f2b30279104c 100644 --- a/src/client/telemetry/index.ts +++ b/src/client/telemetry/index.ts @@ -1963,7 +1963,13 @@ export interface IEventNamePropertyMapping { /** * Telemetry event sent when an ipywidget module fails to load. Module name is hashed. */ - [Telemetry.IPyWidgetLoadFailure]: { isOnline: boolean; moduleHash: string; moduleVersion: string }; + [Telemetry.IPyWidgetLoadFailure]: { + isOnline: boolean; + moduleHash: string; + moduleVersion: string; + // Whether we timedout getting the source of the script (fetching script source in extension code). + timedout: boolean; + }; /** * Telemetry event sent when an loading of 3rd party ipywidget JS scripts from 3rd party source has been disabled. */ diff --git a/src/datascience-ui/interactive-common/redux/reducers/types.ts b/src/datascience-ui/interactive-common/redux/reducers/types.ts index de03f9c46a68..84c11e2edd98 100644 --- a/src/datascience-ui/interactive-common/redux/reducers/types.ts +++ b/src/datascience-ui/interactive-common/redux/reducers/types.ts @@ -220,6 +220,7 @@ export interface ILoadIPyWidgetClassFailureAction { isOnline: boolean; // tslint:disable-next-line: no-any error: any; + timedout: boolean; } export type LoadIPyWidgetClassDisabledAction = { className: string; diff --git a/src/datascience-ui/ipywidgets/container.tsx b/src/datascience-ui/ipywidgets/container.tsx index 4b8780349c47..70399bc3d4d1 100644 --- a/src/datascience-ui/ipywidgets/container.tsx +++ b/src/datascience-ui/ipywidgets/container.tsx @@ -137,7 +137,8 @@ export class WidgetManagerComponent extends React.Component { moduleVersion: string, isOnline: boolean, // tslint:disable-next-line: no-any - error: any + error: any, + timedout: boolean ): CommonAction { return { type: CommonActionType.LOAD_IPYWIDGET_CLASS_FAILURE, @@ -148,16 +149,25 @@ export class WidgetManagerComponent extends React.Component { moduleName, moduleVersion, isOnline, + timedout, error, cdnsUsed: this.widgetsCanLoadFromCDN } } }; } - // tslint:disable-next-line: no-any - private async handleLoadError(className: string, moduleName: string, moduleVersion: string, error: any) { + private async handleLoadError( + className: string, + moduleName: string, + moduleVersion: string, + // tslint:disable-next-line: no-any + error: any, + timedout: boolean = false + ) { const isOnline = await isonline.default({ timeout: 1000 }); - this.props.store.dispatch(this.createLoadErrorAction(className, moduleName, moduleVersion, isOnline, error)); + this.props.store.dispatch( + this.createLoadErrorAction(className, moduleName, moduleVersion, isOnline, error, timedout) + ); } /** @@ -188,6 +198,7 @@ export class WidgetManagerComponent extends React.Component { setTimeout(() => { // tslint:disable-next-line: no-console console.error(`Timeout waiting to get widget source for ${moduleName}, ${moduleVersion}`); + this.handleLoadError('', moduleName, moduleVersion, new Error('Timeout'), true).ignoreErrors(); if (deferred) { deferred.resolve(); } From d202422b54633d7af928680d86a2f2909c4f016f Mon Sep 17 00:00:00 2001 From: Don Jayamanne Date: Mon, 20 Apr 2020 11:51:20 -0700 Subject: [PATCH 2/2] Add imports --- src/datascience-ui/ipywidgets/container.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/datascience-ui/ipywidgets/container.tsx b/src/datascience-ui/ipywidgets/container.tsx index 70399bc3d4d1..85e85c732b58 100644 --- a/src/datascience-ui/ipywidgets/container.tsx +++ b/src/datascience-ui/ipywidgets/container.tsx @@ -6,6 +6,7 @@ import * as isonline from 'is-online'; import * as React from 'react'; import { Store } from 'redux'; +import '../../client/common/extensions'; import { createDeferred, Deferred } from '../../client/common/utils/async'; import { IInteractiveWindowMapping,