From 6c6464e77216f1911018589d91e042f971e1832c Mon Sep 17 00:00:00 2001 From: Cheena Malhotra <13396919+cheenamalhotra@users.noreply.github.com> Date: Wed, 23 Aug 2023 12:46:09 -0700 Subject: [PATCH] Part 2 - Make Model view components disposable + dispose all emitters (#24097) --- extensions/admin-tool-ext-win/package.json | 2 +- extensions/admin-tool-ext-win/yarn.lock | 8 +- extensions/agent/package.json | 2 +- extensions/agent/yarn.lock | 8 +- extensions/arc/package.json | 13 +- extensions/arc/yarn.lock | 8 +- extensions/azcli/package.json | 2 +- extensions/azcli/yarn.lock | 8 +- extensions/azurecore/package.json | 29 +++- extensions/azurecore/yarn.lock | 8 +- extensions/cms/package.json | 2 +- extensions/cms/yarn.lock | 8 +- extensions/dacpac/package.json | 2 +- extensions/dacpac/src/test/testContext.ts | 4 +- extensions/dacpac/yarn.lock | 8 +- extensions/data-workspace/package.json | 2 +- extensions/data-workspace/yarn.lock | 8 +- extensions/datavirtualization/package.json | 2 +- .../datavirtualization/src/test/stubs.ts | 141 +++++++++++++++++- extensions/datavirtualization/yarn.lock | 8 +- extensions/import/package.json | 2 +- extensions/import/yarn.lock | 8 +- extensions/integration-tests/package.json | 2 +- extensions/integration-tests/yarn.lock | 8 +- extensions/machine-learning/package.json | 2 +- .../machine-learning/src/test/views/utils.ts | 15 +- extensions/machine-learning/yarn.lock | 8 +- extensions/mssql/package.json | 2 +- extensions/mssql/src/ui/dialogBase.ts | 1 + extensions/mssql/yarn.lock | 8 +- extensions/notebook/package.json | 2 +- extensions/notebook/src/test/common.ts | 2 + .../managePackagesDialog.test.ts | 4 +- extensions/notebook/yarn.lock | 8 +- extensions/query-history/package.json | 4 +- extensions/query-history/yarn.lock | 8 +- extensions/query-store/package.json | 11 +- extensions/query-store/src/test/testUtils.ts | 4 +- extensions/query-store/yarn.lock | 8 +- extensions/resource-deployment/package.json | 2 +- extensions/resource-deployment/yarn.lock | 8 +- extensions/schema-compare/package.json | 2 +- .../schema-compare/src/test/testContext.ts | 4 +- extensions/schema-compare/yarn.lock | 8 +- extensions/sql-bindings/package.json | 2 +- extensions/sql-bindings/yarn.lock | 8 +- extensions/sql-database-projects/package.json | 2 +- extensions/sql-database-projects/yarn.lock | 8 +- src/sql/azdata.d.ts | 3 + src/sql/azdata.proposed.d.ts | 18 ++- .../workbench/api/common/extHostModelView.ts | 83 ++++++----- .../api/common/extHostModelViewDialog.ts | 67 ++++++--- .../api/test/browser/extHostModelView.test.ts | 8 + .../browser/modelComponents/componentBase.ts | 5 + .../modelViewContent.component.ts | 4 +- .../modelComponents/table.component.ts | 4 +- .../modelComponents/treeComponentRenderer.ts | 10 +- .../browser/modelComponents/viewBase.ts | 4 +- 58 files changed, 435 insertions(+), 195 deletions(-) diff --git a/extensions/admin-tool-ext-win/package.json b/extensions/admin-tool-ext-win/package.json index cd0504d744..cfab1f242b 100644 --- a/extensions/admin-tool-ext-win/package.json +++ b/extensions/admin-tool-ext-win/package.json @@ -117,7 +117,7 @@ "mocha": "^7.1.1", "should": "^13.2.3", "@microsoft/vscodetestcover": "^1.2.2", - "@microsoft/azdata-test": "^3.0.1" + "@microsoft/azdata-test": "^3.0.3" }, "__metadata": { "id": "41", diff --git a/extensions/admin-tool-ext-win/yarn.lock b/extensions/admin-tool-ext-win/yarn.lock index 8adbdca38d..e8f2bee102 100644 --- a/extensions/admin-tool-ext-win/yarn.lock +++ b/extensions/admin-tool-ext-win/yarn.lock @@ -203,10 +203,10 @@ tmp "^0.0.33" yauzl "^2.10.0" -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/agent/package.json b/extensions/agent/package.json index 4802dc4eeb..c4aa1fb349 100644 --- a/extensions/agent/package.json +++ b/extensions/agent/package.json @@ -94,7 +94,7 @@ "should": "^13.2.1", "typemoq": "^2.1.0", "@microsoft/vscodetestcover": "^1.2.2", - "@microsoft/azdata-test": "^3.0.1" + "@microsoft/azdata-test": "^3.0.3" }, "__metadata": { "id": "10", diff --git a/extensions/agent/yarn.lock b/extensions/agent/yarn.lock index 8ebb5876fa..f5fc8bcbeb 100644 --- a/extensions/agent/yarn.lock +++ b/extensions/agent/yarn.lock @@ -182,10 +182,10 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/arc/package.json b/extensions/arc/package.json index 45c7e6d1fa..45a79391a3 100644 --- a/extensions/arc/package.json +++ b/extensions/arc/package.json @@ -886,8 +886,7 @@ "defaultValue": "2", "optionsType": "radio" }, - "dynamicOptions": - { + "dynamicOptions": { "target": "AZDATA_NB_VAR_SQL_REPLICAS", "alternates": [ { @@ -949,8 +948,7 @@ "defaultValue": "-1", "optionsType": "radio" }, - "dynamicOptions": - { + "dynamicOptions": { "target": "AZDATA_NB_VAR_SQL_REPLICAS", "alternates": [ { @@ -1414,7 +1412,10 @@ "type": "options", "required": true, "options": { - "values": ["NodePort", "LoadBalancer"], + "values": [ + "NodePort", + "LoadBalancer" + ], "defaultValue": "NodePort", "optionsType": "radio" } @@ -1599,7 +1600,7 @@ "@types/sinon": "^9.0.4", "@types/uuid": "^8.3.0", "@types/yamljs": "^0.2.31", - "@microsoft/azdata-test": "^3.0.1", + "@microsoft/azdata-test": "^3.0.3", "mocha": "^7.1.1", "should": "^13.2.3", "sinon": "^9.0.2", diff --git a/extensions/arc/yarn.lock b/extensions/arc/yarn.lock index 60a4ac65fd..1e371cb1b9 100644 --- a/extensions/arc/yarn.lock +++ b/extensions/arc/yarn.lock @@ -182,10 +182,10 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/azcli/package.json b/extensions/azcli/package.json index 9c097348d8..d72d48ec21 100644 --- a/extensions/azcli/package.json +++ b/extensions/azcli/package.json @@ -107,7 +107,7 @@ "sinon": "^9.0.2", "typemoq": "^2.1.0", "@microsoft/vscodetestcover": "^1.2.2", - "@microsoft/azdata-test": "^3.0.1" + "@microsoft/azdata-test": "^3.0.3" }, "__metadata": { "id": "84", diff --git a/extensions/azcli/yarn.lock b/extensions/azcli/yarn.lock index f37e465e6d..4b0dc4ff26 100644 --- a/extensions/azcli/yarn.lock +++ b/extensions/azcli/yarn.lock @@ -181,10 +181,10 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/azurecore/package.json b/extensions/azurecore/package.json index 4f5b877acc..1b5608cfe0 100644 --- a/extensions/azurecore/package.json +++ b/extensions/azurecore/package.json @@ -122,8 +122,11 @@ "items": { "type": "object", "description": "%config.providerSettingsTitle%", - "required": ["name", "settings"], - "properties":{ + "required": [ + "name", + "settings" + ], + "properties": { "name": { "type": "string", "default": "Azure Public", @@ -132,11 +135,16 @@ "settings": { "type": "object", "description": "%config.providerSettingsDescription%", - "required": ["metadata"], + "required": [ + "metadata" + ], "properties": { "metadata": { "type": "object", - "required": ["displayName", "id"], + "required": [ + "displayName", + "id" + ], "properties": { "displayName": { "type": "string", @@ -150,7 +158,16 @@ }, "endpoints": { "type": "object", - "required": ["host", "clientId", "scopes", "sqlResource", "microsoftResource", "armResource", "graphResource", "azureStorageResource"], + "required": [ + "host", + "clientId", + "scopes", + "sqlResource", + "microsoftResource", + "armResource", + "graphResource", + "azureStorageResource" + ], "properties": { "type": "object", "host": { @@ -516,8 +533,8 @@ "ws": "^7.4.6" }, "devDependencies": { - "@microsoft/azdata-test": "^3.0.1", "@microsoft/vscodetestcover": "^1.2.2", + "@microsoft/azdata-test": "^3.0.3", "@types/keytar": "4.4.0", "@types/lockfile": "^1.0.2", "@types/mocha": "^7.0.2", diff --git a/extensions/azurecore/yarn.lock b/extensions/azurecore/yarn.lock index 623b1eae1c..8ed0b0859a 100644 --- a/extensions/azurecore/yarn.lock +++ b/extensions/azurecore/yarn.lock @@ -334,10 +334,10 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/cms/package.json b/extensions/cms/package.json index 8d3773781c..7984cf5e67 100644 --- a/extensions/cms/package.json +++ b/extensions/cms/package.json @@ -787,7 +787,7 @@ "should": "^13.2.1", "@microsoft/vscodetestcover": "^1.2.2", "typemoq": "^2.1.0", - "@microsoft/azdata-test": "^3.0.1" + "@microsoft/azdata-test": "^3.0.3" }, "__metadata": { "id": "40", diff --git a/extensions/cms/yarn.lock b/extensions/cms/yarn.lock index 8ad2005e79..51cad108a1 100644 --- a/extensions/cms/yarn.lock +++ b/extensions/cms/yarn.lock @@ -182,10 +182,10 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/dacpac/package.json b/extensions/dacpac/package.json index 2299a4d243..df27affc29 100644 --- a/extensions/dacpac/package.json +++ b/extensions/dacpac/package.json @@ -97,8 +97,8 @@ "vscode-nls": "^4.0.0" }, "devDependencies": { - "@microsoft/azdata-test": "^3.0.1", "@microsoft/vscodetestcover": "^1.2.2", + "@microsoft/azdata-test": "^3.0.3", "@types/htmlparser2": "^3.10.1", "@types/mocha": "^7.0.2", "@types/node": "^12.11.7", diff --git a/extensions/dacpac/src/test/testContext.ts b/extensions/dacpac/src/test/testContext.ts index da464cd964..8a23ecada8 100644 --- a/extensions/dacpac/src/test/testContext.ts +++ b/extensions/dacpac/src/test/testContext.ts @@ -82,7 +82,8 @@ export function createViewContext(): ViewTestContext { onValidityChanged: undefined!, valid: true, validate: undefined!, - focus: () => Promise.resolve() + focus: () => Promise.resolve(), + dispose() { } }; let button: azdata.ButtonComponent = Object.assign({}, componentBase, { onDidClick: onClick.event @@ -283,6 +284,7 @@ export function createViewContext(): ViewTestContext { onValidityChanged: undefined!, validate: undefined!, initializeModel: () => { return Promise.resolve(); }, + dispose() { }, modelBuilder: { listView: undefined!, radioCardGroup: undefined!, diff --git a/extensions/dacpac/yarn.lock b/extensions/dacpac/yarn.lock index 9bf610ccd4..801141fcae 100644 --- a/extensions/dacpac/yarn.lock +++ b/extensions/dacpac/yarn.lock @@ -189,10 +189,10 @@ dependencies: "@vscode/extension-telemetry" "0.6.1" -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/data-workspace/package.json b/extensions/data-workspace/package.json index 1e910e1e6c..ef4f6bb677 100644 --- a/extensions/data-workspace/package.json +++ b/extensions/data-workspace/package.json @@ -190,6 +190,6 @@ "sinon": "^9.0.2", "typemoq": "^2.1.0", "@microsoft/vscodetestcover": "^1.2.2", - "@microsoft/azdata-test": "^3.0.1" + "@microsoft/azdata-test": "^3.0.3" } } diff --git a/extensions/data-workspace/yarn.lock b/extensions/data-workspace/yarn.lock index e45b6df206..c9b42a7645 100644 --- a/extensions/data-workspace/yarn.lock +++ b/extensions/data-workspace/yarn.lock @@ -189,10 +189,10 @@ dependencies: "@vscode/extension-telemetry" "0.6.1" -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/datavirtualization/package.json b/extensions/datavirtualization/package.json index 95e0434fbe..d5b9618999 100644 --- a/extensions/datavirtualization/package.json +++ b/extensions/datavirtualization/package.json @@ -111,8 +111,8 @@ "vscode-nls": "^5.2.0" }, "devDependencies": { - "@microsoft/azdata-test": "^3.0.2", "@microsoft/vscodetestcover": "^1.2.2", + "@microsoft/azdata-test": "^3.0.3", "should": "^13.2.1", "typemoq": "^2.1.0" } diff --git a/extensions/datavirtualization/src/test/stubs.ts b/extensions/datavirtualization/src/test/stubs.ts index 7447b52350..7c21926151 100644 --- a/extensions/datavirtualization/src/test/stubs.ts +++ b/extensions/datavirtualization/src/test/stubs.ts @@ -115,7 +115,7 @@ export class MockWizardPage implements azdata.window.WizardPage { modelView: azdata.ModelView; valid: boolean; onValidityChanged: vscode.Event; - + dispose() { } registerContent(handler: (view: azdata.ModelView) => void): void { throw new Error('Method not implemented.'); } @@ -221,6 +221,18 @@ export class MockDataSourceService implements DataSourceWizardService { } export class MockUIComponent implements azdata.Component { + height?: string | number; + width?: string | number; + position?: azdata.PositionType; + display?: azdata.DisplayType; + ariaLabel?: string; + ariaRole?: string; + ariaSelected?: boolean; + ariaHidden?: boolean; + CSSStyles?: azdata.CssStyles; + dispose() { + throw new Error('Method not implemented.'); + } id: string; enabled: boolean; onValidityChanged: vscode.Event; @@ -245,6 +257,17 @@ export class MockUIComponent implements azdata.Component { } export class MockInputBoxComponent extends MockUIComponent implements azdata.InputBoxComponent { + display?: azdata.DisplayType; + ariaRole?: string; + ariaSelected?: boolean; + ariaHidden?: boolean; + dispose() { + throw new Error('Method not implemented.'); + } + validationErrorMessage?: string; + readOnly?: boolean; + title?: string; + maxLength?: number; onEnterKeyPressed: vscode.Event; value?: string; ariaLabel?: string; @@ -266,6 +289,25 @@ export class MockInputBoxComponent extends MockUIComponent implements azdata.Inp } export class MockDropdownComponent extends MockUIComponent implements azdata.DropDownComponent { + position?: azdata.PositionType; + display?: azdata.DisplayType; + ariaLabel?: string; + ariaRole?: string; + ariaSelected?: boolean; + ariaHidden?: boolean; + CSSStyles?: azdata.CssStyles; + dispose() { + throw new Error('Method not implemented.'); + } + fireOnTextChange?: boolean; + required?: boolean; + placeholder?: string; + validationErrorMessages?: string[]; + strictSelection?: boolean; + loading?: boolean; + showText?: boolean; + loadingText?: string; + loadingCompletedText?: string; onValueChanged: vscode.Event; value: string | azdata.CategoryValue; values: string[] | azdata.CategoryValue[]; @@ -275,6 +317,9 @@ export class MockDropdownComponent extends MockUIComponent implements azdata.Dro } export class MockTableComponent extends MockUIComponent implements azdata.TableComponent { + dispose() { + throw new Error('Method not implemented.'); + } display?: azdata.DisplayType; ariaLabel?: string; ariaSelected?: boolean; @@ -307,6 +352,9 @@ export class MockTableComponent extends MockUIComponent implements azdata.TableC } export class MockDeclarativeTableComponent extends MockUIComponent implements azdata.DeclarativeTableComponent { + dispose() { + throw new Error('Method not implemented.'); + } enableRowSelection?: boolean; selectedRow?: number; onRowSelected: vscode.Event; @@ -333,6 +381,16 @@ export class MockDeclarativeTableComponent extends MockUIComponent implements az } export class MockTreeComponent extends MockUIComponent implements azdata.TreeComponent { + position?: azdata.PositionType; + display?: azdata.DisplayType; + ariaLabel?: string; + ariaRole?: string; + ariaSelected?: boolean; + ariaHidden?: boolean; + CSSStyles?: azdata.CssStyles; + dispose() { + throw new Error('Method not implemented.'); + } withCheckbox: boolean; height?: number | string; width?: number | string; @@ -349,6 +407,25 @@ export class MockTreeComponentView extends vscode.Disposable implements azdata.T } export class MockTextComponent extends MockUIComponent implements azdata.TextComponent { + height?: string | number; + width?: string | number; + position?: azdata.PositionType; + display?: azdata.DisplayType; + ariaLabel?: string; + ariaRole?: string; + ariaSelected?: boolean; + ariaHidden?: boolean; + CSSStyles?: azdata.CssStyles; + dispose() { + throw new Error('Method not implemented.'); + } + links?: azdata.LinkArea[]; + description?: string; + requiredIndicator?: boolean; + headingLevel?: azdata.HeadingLevel; + textType?: azdata.TextType; + ariaLive?: azdata.AriaLiveValue; + title?: string; value: string; id: string; enabled: boolean; @@ -358,6 +435,9 @@ export class MockTextComponent extends MockUIComponent implements azdata.TextCom } export class MockContainer extends MockUIComponent implements azdata.Container { + dispose() { + throw new Error('Method not implemented.'); + } setItemLayout(component: azdata.Component, layout: TItemLayout): void { throw new Error('Method not implemented.'); } @@ -391,6 +471,9 @@ export class MockContainer extends MockUIComponent impleme } } export class MockToolbarContainer extends MockContainer implements azdata.ToolbarContainer { + dispose() { + throw new Error('Method not implemented.'); + } setItemLayout(component: azdata.Component, layout: any): void { throw new Error('Method not implemented.'); } @@ -406,6 +489,10 @@ export class MockToolbarContainer extends MockContainer implements azd } export class MockDivContainer extends MockContainer implements azdata.DivContainer { + dispose() { + throw new Error('Method not implemented.'); + } + ariaLive?: azdata.AriaLiveValue; setItemLayout(component: azdata.Component, layout: azdata.DivItemLayout): void { throw new Error('Method not implemented.'); } @@ -425,6 +512,9 @@ export class MockDivContainer extends MockContainer implements azdata.FlexContainer { + dispose() { + throw new Error('Method not implemented.'); + } setItemLayout(component: azdata.Component, layout: azdata.FlexItemLayout): void { throw new Error('Method not implemented.'); } @@ -440,6 +530,9 @@ export class MockFlexContainer extends MockContainer implements azdata.FormContainer { + dispose() { + throw new Error('Method not implemented.'); + } setItemLayout(component: azdata.Component, layout: azdata.FormItemLayout): void { throw new Error('Method not implemented.'); } @@ -455,6 +548,21 @@ export class MockFormContainer extends MockContainer void; saveHandler: () => Thenable; openEditor(position?: vscode.ViewColumn): Thenable { @@ -606,6 +717,9 @@ export class MockModelViewEditor implements azdata.workspace.ModelViewEditor { } export class MockModelView implements azdata.ModelView { + dispose() { + throw new Error('Method not implemented.'); + } private onClosedEmitter = new vscode.EventEmitter(); public get onClosed(): vscode.Event { return this.onClosedEmitter.event; @@ -634,6 +748,20 @@ export class MockModelView implements azdata.ModelView { } export class MockButtonComponent extends MockUIComponent implements azdata.ButtonComponent { + position?: azdata.PositionType; + display?: azdata.DisplayType; + ariaLabel?: string; + ariaRole?: string; + ariaSelected?: boolean; + ariaHidden?: boolean; + CSSStyles?: azdata.CssStyles; + dispose() { + throw new Error('Method not implemented.'); + } + buttonType?: azdata.ButtonType; + description?: string; + secondary?: boolean; + fileType?: string; label: string; title: string; iconPath: string | vscode.Uri | { light: string | vscode.Uri; dark: string | vscode.Uri; }; @@ -650,6 +778,17 @@ export class MockButtonComponent extends MockUIComponent implements azdata.Butto } export class MockEditorComponent extends MockUIComponent implements azdata.EditorComponent { + height?: string | number; + width?: string | number; + position?: azdata.PositionType; + display?: azdata.DisplayType; + ariaLabel?: string; + ariaRole?: string; + ariaSelected?: boolean; + ariaHidden?: boolean; + dispose() { + throw new Error('Method not implemented.'); + } content: string; languageMode: string; editorUri: string; diff --git a/extensions/datavirtualization/yarn.lock b/extensions/datavirtualization/yarn.lock index a5c80fdfd4..d2ef836789 100644 --- a/extensions/datavirtualization/yarn.lock +++ b/extensions/datavirtualization/yarn.lock @@ -227,10 +227,10 @@ tmp "^0.0.33" yauzl "^2.10.0" -"@microsoft/azdata-test@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.2.tgz#71cfbbc2ee9c1805311f3a5828b50679a5e6d73c" - integrity sha512-NMoSKp/Zgs+1ZIe07w+FeKhqMaxgViLGmLTQHPfYN7RRTFErJBd8JgskxYoLZbgcctfVsV+Yw+zQEn1+g2mPKg== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/import/package.json b/extensions/import/package.json index adb604e4cd..2e1cbbc05e 100644 --- a/extensions/import/package.json +++ b/extensions/import/package.json @@ -92,7 +92,7 @@ "sinon": "^9.0.2", "typemoq": "^2.1.0", "@microsoft/vscodetestcover": "^1.2.2", - "@microsoft/azdata-test": "^3.0.1" + "@microsoft/azdata-test": "^3.0.3" }, "__metadata": { "id": "23", diff --git a/extensions/import/yarn.lock b/extensions/import/yarn.lock index 67bba495cb..b030ad68a0 100644 --- a/extensions/import/yarn.lock +++ b/extensions/import/yarn.lock @@ -203,10 +203,10 @@ tmp "^0.0.33" yauzl "^2.10.0" -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/integration-tests/package.json b/extensions/integration-tests/package.json index 08945b6275..9b884e1684 100644 --- a/extensions/integration-tests/package.json +++ b/extensions/integration-tests/package.json @@ -42,7 +42,7 @@ "chai": "3.5.0", "mocha": "^7.1.1", "@microsoft/vscodetestcover": "^1.2.2", - "@microsoft/azdata-test": "^3.0.1" + "@microsoft/azdata-test": "^3.0.3" }, "resolutions": { "jsonwebtoken": "9.0.0" diff --git a/extensions/integration-tests/yarn.lock b/extensions/integration-tests/yarn.lock index 4eae3453ff..b2bf06a0c6 100644 --- a/extensions/integration-tests/yarn.lock +++ b/extensions/integration-tests/yarn.lock @@ -354,10 +354,10 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/machine-learning/package.json b/extensions/machine-learning/package.json index c16b33d293..fe970b6abd 100644 --- a/extensions/machine-learning/package.json +++ b/extensions/machine-learning/package.json @@ -153,7 +153,7 @@ "should": "^13.2.1", "typemoq": "^2.1.0", "lodash": "^4.17.21", - "@microsoft/azdata-test": "^3.0.1" + "@microsoft/azdata-test": "^3.0.3" }, "__metadata": { "id": "65", diff --git a/extensions/machine-learning/src/test/views/utils.ts b/extensions/machine-learning/src/test/views/utils.ts index e32a3c7b38..662172593a 100644 --- a/extensions/machine-learning/src/test/views/utils.ts +++ b/extensions/machine-learning/src/test/views/utils.ts @@ -27,7 +27,8 @@ export function createViewContext(): ViewTestContext { onValidityChanged: undefined!, valid: true, validate: undefined!, - focus: undefined! + focus: undefined!, + dispose() { } }; let button: azdata.ButtonComponent = Object.assign({}, componentBase, { onDidClick: onClick.event @@ -266,7 +267,8 @@ export function createViewContext(): ViewTestContext { infoBox: undefined!, slider: undefined!, executionPlan: undefined!, - } + }, + dispose() { } }; let tab: azdata.window.DialogTab = { title: '', @@ -280,7 +282,8 @@ export function createViewContext(): ViewTestContext { }, onValidityChanged: undefined!, valid: true, - modelView: undefined! + modelView: undefined!, + dispose() { } }; let dialogButton: azdata.window.Button = { @@ -310,7 +313,8 @@ export function createViewContext(): ViewTestContext { valid: true, loading: false, loadingText: '', - loadingCompletedText: '' + loadingCompletedText: '', + dispose() { } }; let wizard: azdata.window.Wizard = { title: '', @@ -351,7 +355,8 @@ export function createViewContext(): ViewTestContext { } }, modelView: undefined!, - valid: true + valid: true, + dispose() { } }; apiWrapper.setup(x => x.createButton(TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => dialogButton); apiWrapper.setup(x => x.createTab(TypeMoq.It.isAny())).returns(() => tab); diff --git a/extensions/machine-learning/yarn.lock b/extensions/machine-learning/yarn.lock index edb268b5d8..1fd91d32d6 100644 --- a/extensions/machine-learning/yarn.lock +++ b/extensions/machine-learning/yarn.lock @@ -230,10 +230,10 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/mssql/package.json b/extensions/mssql/package.json index 364248597b..9b6b89fa67 100644 --- a/extensions/mssql/package.json +++ b/extensions/mssql/package.json @@ -1566,7 +1566,7 @@ "devDependencies": { "@types/mocha": "^7.0.2", "@microsoft/vscodetestcover": "^1.2.2", - "@microsoft/azdata-test": "^3.0.1", + "@microsoft/azdata-test": "^3.0.3", "mocha": "^7.1.1", "should": "^13.2.3", "typemoq": "^2.1.0" diff --git a/extensions/mssql/src/ui/dialogBase.ts b/extensions/mssql/src/ui/dialogBase.ts index af3577e772..b618d17c64 100644 --- a/extensions/mssql/src/ui/dialogBase.ts +++ b/extensions/mssql/src/ui/dialogBase.ts @@ -81,6 +81,7 @@ export abstract class DialogBase { this.dialogObject.registerContent(async view => { this._modelView = view; this._formContainer = this.createFormContainer([]); + this.disposables.push(this._formContainer); this._loadingComponent = view.modelBuilder.loadingComponent().withItem(this._formContainer).withProps({ loading: true, loadingText: uiLoc.LoadingDialogText, diff --git a/extensions/mssql/yarn.lock b/extensions/mssql/yarn.lock index cc95bf4af9..8146e7452f 100644 --- a/extensions/mssql/yarn.lock +++ b/extensions/mssql/yarn.lock @@ -203,10 +203,10 @@ tmp "^0.0.33" yauzl "^2.10.0" -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/notebook/package.json b/extensions/notebook/package.json index b45f9687ca..58fe73f396 100644 --- a/extensions/notebook/package.json +++ b/extensions/notebook/package.json @@ -700,7 +700,7 @@ "sinon": "^9.0.2", "typemoq": "^2.1.0", "@microsoft/vscodetestcover": "^1.2.2", - "@microsoft/azdata-test": "^3.0.1" + "@microsoft/azdata-test": "^3.0.3" }, "resolutions": { "url-parse": "^1.5.8", diff --git a/extensions/notebook/src/test/common.ts b/extensions/notebook/src/test/common.ts index e778bfb0f3..6694366829 100644 --- a/extensions/notebook/src/test/common.ts +++ b/extensions/notebook/src/test/common.ts @@ -335,6 +335,7 @@ class TestComponentBase implements azdata.Component { focus(): Thenable { return Promise.resolve(); } + dispose() { } } export class TestDropdownComponent extends TestComponentBase implements azdata.DropDownComponent { @@ -528,6 +529,7 @@ export function createViewContext(): TestContext { onValidityChanged: undefined!, validate: undefined!, initializeModel: () => { return Promise.resolve(); }, + dispose() { }, modelBuilder: { radioButton: () => radioButtonBuilder, text: () => textBuilder, diff --git a/extensions/notebook/src/test/managePackages/managePackagesDialog.test.ts b/extensions/notebook/src/test/managePackages/managePackagesDialog.test.ts index f0774d5b22..cdb462b4ed 100644 --- a/extensions/notebook/src/test/managePackages/managePackagesDialog.test.ts +++ b/extensions/notebook/src/test/managePackages/managePackagesDialog.test.ts @@ -127,7 +127,8 @@ describe('Manage Package Dialog', () => { onValidityChanged: undefined!, valid: true, validate: undefined!, - focus: undefined! + focus: undefined!, + dispose() { } }; let button: azdata.ButtonComponent = Object.assign({}, componentBase, { onDidClick: onClick.event @@ -269,6 +270,7 @@ describe('Manage Package Dialog', () => { onValidityChanged: undefined!, validate: undefined!, initializeModel: () => { return Promise.resolve(); }, + dispose() { }, modelBuilder: { listView: undefined!, radioCardGroup: undefined!, diff --git a/extensions/notebook/yarn.lock b/extensions/notebook/yarn.lock index b95620f5ed..4c3815820e 100644 --- a/extensions/notebook/yarn.lock +++ b/extensions/notebook/yarn.lock @@ -228,10 +228,10 @@ dependencies: "@vscode/extension-telemetry" "0.6.1" -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/query-history/package.json b/extensions/query-history/package.json index 86b78cf40a..737d502356 100644 --- a/extensions/query-history/package.json +++ b/extensions/query-history/package.json @@ -25,7 +25,7 @@ "supported": true } }, - "extensionDependencies": [ ], + "extensionDependencies": [], "contributes": { "configuration": [ { @@ -212,8 +212,8 @@ "vscode-nls": "^4.1.2" }, "devDependencies": { - "@microsoft/azdata-test": "^3.0.1", "@microsoft/vscodetestcover": "^1.2.2", + "@microsoft/azdata-test": "^3.0.3", "@types/mocha": "^7.0.2", "@types/node": "^12.11.7", "should": "^13.2.3", diff --git a/extensions/query-history/yarn.lock b/extensions/query-history/yarn.lock index ef79f37925..8bfe78cddb 100644 --- a/extensions/query-history/yarn.lock +++ b/extensions/query-history/yarn.lock @@ -235,10 +235,10 @@ dependencies: "@vscode/extension-telemetry" "0.6.1" -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/query-store/package.json b/extensions/query-store/package.json index 4e527d4da5..9455e7a053 100644 --- a/extensions/query-store/package.json +++ b/extensions/query-store/package.json @@ -44,20 +44,17 @@ } ], "menus": { - "objectExplorer/item/context": [ - ], - "dataExplorer/context": [ - ], - "commandPalette": [ - ] + "objectExplorer/item/context": [], + "dataExplorer/context": [], + "commandPalette": [] } }, "dependencies": { "vscode-nls": "^4.0.0" }, "devDependencies": { - "@microsoft/azdata-test": "^3.0.1", "@microsoft/vscodetestcover": "^1.2.2", + "@microsoft/azdata-test": "^3.0.3", "@types/mocha": "^7.0.2", "should": "^13.2.1", "typemoq": "^2.1.0" diff --git a/extensions/query-store/src/test/testUtils.ts b/extensions/query-store/src/test/testUtils.ts index 70f557690b..8f6a0c67b1 100644 --- a/extensions/query-store/src/test/testUtils.ts +++ b/extensions/query-store/src/test/testUtils.ts @@ -19,7 +19,8 @@ export function createViewContext(): TestContext { onValidityChanged: undefined!, valid: true, validate: undefined!, - focus: undefined! + focus: undefined!, + dispose() { } }; const components: azdata.Component[] = []; @@ -67,6 +68,7 @@ export function createViewContext(): TestContext { onValidityChanged: undefined!, validate: undefined!, initializeModel: () => { return Promise.resolve(); }, + dispose() { }, modelBuilder: { listView: undefined!, radioCardGroup: undefined!, diff --git a/extensions/query-store/yarn.lock b/extensions/query-store/yarn.lock index ea1c86697f..13d65e0450 100644 --- a/extensions/query-store/yarn.lock +++ b/extensions/query-store/yarn.lock @@ -233,10 +233,10 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@microsoft/azdata-test@^3.0.1": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.2.tgz#71cfbbc2ee9c1805311f3a5828b50679a5e6d73c" - integrity sha512-NMoSKp/Zgs+1ZIe07w+FeKhqMaxgViLGmLTQHPfYN7RRTFErJBd8JgskxYoLZbgcctfVsV+Yw+zQEn1+g2mPKg== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/resource-deployment/package.json b/extensions/resource-deployment/package.json index 37c8186240..e6f4d04190 100644 --- a/extensions/resource-deployment/package.json +++ b/extensions/resource-deployment/package.json @@ -538,7 +538,7 @@ "@types/semver": "^7.3.1", "@types/sinon": "^9.0.8", "@types/yamljs": "0.2.30", - "@microsoft/azdata-test": "^3.0.2", + "@microsoft/azdata-test": "^3.0.3", "mocha": "^7.1.1", "should": "^13.2.3", "sinon": "^9.2.0", diff --git a/extensions/resource-deployment/yarn.lock b/extensions/resource-deployment/yarn.lock index 5f001458b5..7a646b7da8 100644 --- a/extensions/resource-deployment/yarn.lock +++ b/extensions/resource-deployment/yarn.lock @@ -196,10 +196,10 @@ dependencies: "@vscode/extension-telemetry" "0.6.1" -"@microsoft/azdata-test@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.2.tgz#71cfbbc2ee9c1805311f3a5828b50679a5e6d73c" - integrity sha512-NMoSKp/Zgs+1ZIe07w+FeKhqMaxgViLGmLTQHPfYN7RRTFErJBd8JgskxYoLZbgcctfVsV+Yw+zQEn1+g2mPKg== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/schema-compare/package.json b/extensions/schema-compare/package.json index e1f93ff370..4b48abbaf4 100644 --- a/extensions/schema-compare/package.json +++ b/extensions/schema-compare/package.json @@ -115,8 +115,8 @@ "vscode-nls": "^4.0.0" }, "devDependencies": { - "@microsoft/azdata-test": "^3.0.1", "@microsoft/vscodetestcover": "^1.2.2", + "@microsoft/azdata-test": "^3.0.3", "@types/mocha": "^7.0.2", "@types/node": "^12.11.7", "@types/sinon": "^9.0.4", diff --git a/extensions/schema-compare/src/test/testContext.ts b/extensions/schema-compare/src/test/testContext.ts index 33fb23bc51..e30e4fb9a9 100644 --- a/extensions/schema-compare/src/test/testContext.ts +++ b/extensions/schema-compare/src/test/testContext.ts @@ -81,7 +81,8 @@ export function createViewContext(): ViewTestContext { onValidityChanged: undefined!, valid: true, validate: undefined!, - focus: () => Promise.resolve() + focus: () => Promise.resolve(), + dispose() { } }; let container = { @@ -325,6 +326,7 @@ export function createViewContext(): ViewTestContext { onValidityChanged: undefined!, validate: undefined!, initializeModel: () => { return Promise.resolve(); }, + dispose() { }, modelBuilder: { listView: undefined!, radioCardGroup: undefined!, diff --git a/extensions/schema-compare/yarn.lock b/extensions/schema-compare/yarn.lock index b47282143a..e4927ee4ca 100644 --- a/extensions/schema-compare/yarn.lock +++ b/extensions/schema-compare/yarn.lock @@ -189,10 +189,10 @@ dependencies: "@vscode/extension-telemetry" "0.6.1" -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/sql-bindings/package.json b/extensions/sql-bindings/package.json index c3ec974a76..446e7e87db 100644 --- a/extensions/sql-bindings/package.json +++ b/extensions/sql-bindings/package.json @@ -79,6 +79,6 @@ "typemoq": "^2.1.0", "@microsoft/vscodetestcover": "^1.2.2", "mocha": "^7.1.1", - "@microsoft/azdata-test": "^3.0.1" + "@microsoft/azdata-test": "^3.0.3" } } diff --git a/extensions/sql-bindings/yarn.lock b/extensions/sql-bindings/yarn.lock index 577bc6580d..09150c01e9 100644 --- a/extensions/sql-bindings/yarn.lock +++ b/extensions/sql-bindings/yarn.lock @@ -229,10 +229,10 @@ dependencies: "@vscode/extension-telemetry" "0.6.1" -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/extensions/sql-database-projects/package.json b/extensions/sql-database-projects/package.json index a9ab232bd2..d7b19a1c44 100644 --- a/extensions/sql-database-projects/package.json +++ b/extensions/sql-database-projects/package.json @@ -542,8 +542,8 @@ "xml-formatter": "2.1.0" }, "devDependencies": { - "@microsoft/azdata-test": "^3.0.1", "@microsoft/vscodetestcover": "^1.2.2", + "@microsoft/azdata-test": "^3.0.3", "@types/fs-extra": "^5.0.0", "@types/mocha": "^7.0.2", "@types/request": "^2.48.8", diff --git a/extensions/sql-database-projects/yarn.lock b/extensions/sql-database-projects/yarn.lock index 32880d0c3b..fbe02bc1a9 100644 --- a/extensions/sql-database-projects/yarn.lock +++ b/extensions/sql-database-projects/yarn.lock @@ -229,10 +229,10 @@ dependencies: "@vscode/extension-telemetry" "0.6.1" -"@microsoft/azdata-test@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.1.tgz#a8b89a12de42f277d33aae71c277d0c8efcfbee0" - integrity sha512-Zrctm/zKufwIRF9jfw8TOBzr5woLdKXAGNTlbAQl0IGLzVoIGULj9Gqdc1Ikhrov3rM0NkbAF/PY6j6BHiW8Tw== +"@microsoft/azdata-test@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/azdata-test/-/azdata-test-3.0.3.tgz#a1b5bbead5412ac7925129e6199d724bfc8117ee" + integrity sha512-Whit8+MpNN/Kkx3R9CGT26FhYNzkjNyOb6dsaqkMq1scpO3JCeNJqhcSqTTsSbkRVdAKoYrJcpLZdoO9D1X/yw== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" diff --git a/src/sql/azdata.d.ts b/src/sql/azdata.d.ts index 4126859f8f..056b030ae8 100644 --- a/src/sql/azdata.d.ts +++ b/src/sql/azdata.d.ts @@ -4895,6 +4895,9 @@ declare module 'azdata' { /** * Register model view content for the dialog. * Doesn't do anything if model view is already registered + * + * IMPORTANT: Model View is a disposable, all components created in the model view + * MUST be registered for disposal using the 'vscode.Disposable._register' API on ModelView. */ registerContent(handler: (view: ModelView) => Thenable): void; diff --git a/src/sql/azdata.proposed.d.ts b/src/sql/azdata.proposed.d.ts index 07d3bbcf39..4f4928ede4 100644 --- a/src/sql/azdata.proposed.d.ts +++ b/src/sql/azdata.proposed.d.ts @@ -661,6 +661,8 @@ declare module 'azdata' { type?: ExtensionNodeType; } + export interface Component extends vscode.Disposable { } + export namespace workspace { /** * Creates and enters a workspace at the specified location @@ -1971,12 +1973,18 @@ declare module 'azdata' { NotEndsWith = 13 } - export namespace window { - export interface Wizard extends LoadingComponentBase { - } + export interface ModelView extends vscode.Disposable { } - export interface Dialog extends LoadingComponentBase { - } + export interface DeclarativeTableMenuCellValue extends vscode.Disposable { } + + export namespace window { + export interface Wizard extends LoadingComponentBase { } + + export interface Dialog extends LoadingComponentBase, vscode.Disposable { } + + export interface ModelViewPanel extends vscode.Disposable { } + + export interface ModelViewDashboard extends vscode.Disposable { } /** * Opens the error dialog with customization options provided. diff --git a/src/sql/workbench/api/common/extHostModelView.ts b/src/sql/workbench/api/common/extHostModelView.ts index fa47f3b749..42a49ccb8d 100644 --- a/src/sql/workbench/api/common/extHostModelView.ts +++ b/src/sql/workbench/api/common/extHostModelView.ts @@ -20,6 +20,7 @@ import { IExtensionDescription } from 'vs/platform/extensions/common/extensions' import { ILogService } from 'vs/platform/log/common/log'; import { onUnexpectedError } from 'vs/base/common/errors'; import { SqlMainContext } from 'vs/workbench/api/common/extHost.protocol'; +import { Disposable } from 'vs/base/common/lifecycle'; class ModelBuilderImpl implements azdata.ModelBuilder { private nextComponentId: number; @@ -594,16 +595,16 @@ class InternalItemConfig { } } -class ComponentWrapper implements azdata.Component { +class ComponentWrapper extends Disposable implements azdata.Component { public properties: { [key: string]: any } = {}; public layout: any; public itemConfigs: InternalItemConfig[]; public customValidations: ((component: ThisType) => boolean | Thenable)[] = []; private _valid: boolean = true; - private _onValidityChangedEmitter = new Emitter(); + private _onValidityChangedEmitter = this._register(new Emitter()); public readonly onValidityChanged = this._onValidityChangedEmitter.event; - private _onErrorEmitter = new Emitter(); + private _onErrorEmitter = this._register(new Emitter()); public readonly onError: vscode.Event = this._onErrorEmitter.event; protected _emitterMap = new Map>(); @@ -613,10 +614,17 @@ class ComponentWrapper implements azdata.Component { protected _id: string, protected _logService: ILogService ) { + super(); this.properties = {}; this.itemConfigs = []; } + public getRegisteredEmitter(): Emitter { + let emitter = new Emitter(); + this._register(emitter); + return emitter; + } + public get id(): string { return this._id; } @@ -729,6 +737,7 @@ class ComponentWrapper implements azdata.Component { this._logService.warn(`Trying to add duplicate component ${item.id} to container ${this.id}`); return false; } + this._register(item); return true; }); if (items.length === 0) { @@ -769,6 +778,7 @@ class ComponentWrapper implements azdata.Component { this._logService.warn(`Trying to add duplicate component ${item.id} to container ${this.id}`); return; } + this._register(item); const config = this.createAndAddItemConfig(item, itemLayout, index); this._proxy.$addToContainer(this._handle, this.id, [{ itemConfig: config.toIItemConfig(), index }]).then(undefined, (err) => this.handleError(err)); } @@ -784,6 +794,7 @@ class ComponentWrapper implements azdata.Component { if (!itemImpl) { throw new Error(nls.localize('unknownComponentType', "Unknown component type. Must use ModelBuilder to create objects")); } + this._register(itemImpl); const config = new InternalItemConfig(itemImpl, itemLayout); if (index !== undefined && index >= 0 && index <= this.items.length) { this.itemConfigs.splice(index, 0, config); @@ -932,7 +943,7 @@ class CardWrapper extends ComponentWrapper implements azdata.CardComponent { constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.Card, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidClick, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidClick, this.getRegisteredEmitter()); } public get label(): string { @@ -1001,8 +1012,8 @@ class InputBoxWrapper extends ComponentWrapper implements azdata.InputBoxCompone constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.InputBox, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidChange, new Emitter()); - this._emitterMap.set(ComponentEventType.onEnterKeyPressed, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidChange, this.getRegisteredEmitter()); + this._emitterMap.set(ComponentEventType.onEnterKeyPressed, this.getRegisteredEmitter()); } public get value(): string { @@ -1113,7 +1124,7 @@ class CheckBoxWrapper extends ComponentWrapper implements azdata.CheckBoxCompone constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.CheckBox, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidChange, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidChange, this.getRegisteredEmitter()); } public get checked(): boolean { @@ -1142,7 +1153,7 @@ class WebViewWrapper extends ComponentWrapper implements azdata.WebViewComponent this.properties = { 'extensionLocation': this._extensionLocation }; - this._emitterMap.set(ComponentEventType.onMessage, new Emitter()); + this._emitterMap.set(ComponentEventType.onMessage, this.getRegisteredEmitter()); } public get message(): any { @@ -1176,8 +1187,8 @@ class EditorWrapper extends ComponentWrapper implements azdata.EditorComponent { constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.Editor, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidChange, new Emitter()); - this._emitterMap.set(ComponentEventType.onComponentCreated, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidChange, this.getRegisteredEmitter()); + this._emitterMap.set(ComponentEventType.onComponentCreated, this.getRegisteredEmitter()); } public get content(): string { @@ -1229,8 +1240,8 @@ class DiffEditorWrapper extends ComponentWrapper implements azdata.DiffEditorCom constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.DiffEditor, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidChange, new Emitter()); - this._emitterMap.set(ComponentEventType.onComponentCreated, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidChange, this.getRegisteredEmitter()); + this._emitterMap.set(ComponentEventType.onComponentCreated, this.getRegisteredEmitter()); } public get contentLeft(): string { @@ -1316,8 +1327,8 @@ class RadioButtonWrapper extends ComponentWrapper implements azdata.RadioButtonC constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.RadioButton, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidClick, new Emitter()); - this._emitterMap.set(ComponentEventType.onDidChange, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidClick, this.getRegisteredEmitter()); + this._emitterMap.set(ComponentEventType.onDidChange, this.getRegisteredEmitter()); } public get name(): string { @@ -1422,8 +1433,8 @@ class TableComponentWrapper extends ComponentWrapper implements azdata.TableComp constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.Table, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onSelectedRowChanged, new Emitter()); - this._emitterMap.set(ComponentEventType.onCellAction, new Emitter()); + this._emitterMap.set(ComponentEventType.onSelectedRowChanged, this.getRegisteredEmitter()); + this._emitterMap.set(ComponentEventType.onCellAction, this.getRegisteredEmitter()); } public get data(): any[][] { @@ -1522,7 +1533,7 @@ class DropDownWrapper extends ComponentWrapper implements azdata.DropDownCompone constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.DropDown, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidChange, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidChange, this.getRegisteredEmitter()); } public get value(): string | azdata.CategoryValue { @@ -1600,8 +1611,8 @@ class DeclarativeTableWrapper extends ComponentWrapper implements azdata.Declara constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.DeclarativeTable, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidChange, new Emitter()); - this._emitterMap.set(ComponentEventType.onSelectedRowChanged, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidChange, this.getRegisteredEmitter()); + this._emitterMap.set(ComponentEventType.onSelectedRowChanged, this.getRegisteredEmitter()); } @@ -1736,7 +1747,7 @@ class ListBoxWrapper extends ComponentWrapper implements azdata.ListBoxComponent constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.ListBox, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onSelectedRowChanged, new Emitter()); + this._emitterMap.set(ComponentEventType.onSelectedRowChanged, this.getRegisteredEmitter()); } public get selectedRow(): number { @@ -1764,7 +1775,7 @@ class ButtonWrapper extends ComponentWithIconWrapper implements azdata.ButtonCom constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.Button, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidClick, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidClick, this.getRegisteredEmitter()); } public get label(): string { @@ -1841,7 +1852,7 @@ class FileBrowserTreeComponentWrapper extends ComponentWrapper implements azdata constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.FileBrowserTree, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidChange, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidChange, this.getRegisteredEmitter()); } public get ownerUri(): string { @@ -1868,7 +1879,7 @@ class DivContainerWrapper extends ComponentWrapper implements azdata.DivContaine constructor(proxy: MainThreadModelViewShape, handle: number, type: ModelComponentTypes, id: string, logService: ILogService) { super(proxy, handle, type, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidClick, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidClick, this.getRegisteredEmitter()); } public get overflowY(): string { @@ -1920,7 +1931,7 @@ class HyperlinkComponentWrapper extends ComponentWrapper implements azdata.Hyper constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.Hyperlink, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidClick, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidClick, this.getRegisteredEmitter()); } public get label(): string { @@ -1948,8 +1959,8 @@ class RadioCardGroupComponentWrapper extends ComponentWrapper implements azdata. super(proxy, handle, ModelComponentTypes.RadioCardGroup, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidChange, new Emitter()); - this._emitterMap.set(ComponentEventType.onDidClick, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidChange, this.getRegisteredEmitter()); + this._emitterMap.set(ComponentEventType.onDidClick, this.getRegisteredEmitter()); } public get iconWidth(): string | undefined { @@ -2023,7 +2034,7 @@ class ListViewComponentWrapper extends ComponentWrapper implements azdata.ListVi super(proxy, handle, ModelComponentTypes.ListView, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidClick, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidClick, this.getRegisteredEmitter()); } public get title(): azdata.ListViewTitle { @@ -2059,7 +2070,7 @@ class TabbedPanelComponentWrapper extends ComponentWrapper implements azdata.Tab constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.TabbedPanel, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidChange, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidChange, this.getRegisteredEmitter()); } updateTabs(tabs: (azdata.Tab | azdata.TabGroup)[]): void { @@ -2112,8 +2123,8 @@ class InfoBoxComponentWrapper extends ComponentWrapper implements azdata.InfoBox constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.InfoBox, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidClick, new Emitter()); - this._emitterMap.set(ComponentEventType.onChildClick, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidClick, this.getRegisteredEmitter()); + this._emitterMap.set(ComponentEventType.onChildClick, this.getRegisteredEmitter()); } public get style(): azdata.InfoBoxStyle { @@ -2179,8 +2190,8 @@ class SliderComponentWrapper extends ComponentWrapper implements azdata.SliderCo constructor(proxy: MainThreadModelViewShape, handle: number, id: string, logService: ILogService) { super(proxy, handle, ModelComponentTypes.Slider, id, logService); this.properties = {}; - this._emitterMap.set(ComponentEventType.onDidChange, new Emitter()); - this._emitterMap.set(ComponentEventType.onInput, new Emitter()); + this._emitterMap.set(ComponentEventType.onDidChange, this.getRegisteredEmitter()); + this._emitterMap.set(ComponentEventType.onInput, this.getRegisteredEmitter()); } public get min(): number | undefined { @@ -2262,10 +2273,10 @@ class GroupContainerComponentWrapper extends ComponentWrapper implements azdata. } } -class ModelViewImpl implements azdata.ModelView { +class ModelViewImpl extends Disposable implements azdata.ModelView { - public onClosedEmitter = new Emitter(); - private _onValidityChangedEmitter = new Emitter(); + public onClosedEmitter = this._register(new Emitter()); + private _onValidityChangedEmitter = this._register(new Emitter()); public readonly onValidityChanged = this._onValidityChangedEmitter.event; private _modelBuilder: ModelBuilderImpl; @@ -2280,6 +2291,7 @@ class ModelViewImpl implements azdata.ModelView { _extension: IExtensionDescription, logService: ILogService ) { + super(); this._modelBuilder = new ModelBuilderImpl(this._proxy, this._handle, this._extHostModelViewTree, _extension, logService); } @@ -2328,7 +2340,6 @@ class ModelViewImpl implements azdata.ModelView { export class ExtHostModelView implements ExtHostModelViewShape { private readonly _proxy: MainThreadModelViewShape; - private readonly _modelViews = new Map(); private readonly _handlers = new Map void>(); private readonly _handlerToExtension = new Map(); diff --git a/src/sql/workbench/api/common/extHostModelViewDialog.ts b/src/sql/workbench/api/common/extHostModelViewDialog.ts index e93cd9106a..1c8af8fb9e 100644 --- a/src/sql/workbench/api/common/extHostModelViewDialog.ts +++ b/src/sql/workbench/api/common/extHostModelViewDialog.ts @@ -15,6 +15,9 @@ import { ExtHostModelViewDialogShape, MainThreadModelViewDialogShape, ExtHostMod import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { TabOrientation, DialogWidth, DialogStyle, DialogPosition, IDialogProperties } from 'sql/workbench/api/common/sqlExtHostTypes'; import { SqlMainContext } from 'vs/workbench/api/common/extHost.protocol'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { DashboardTab } from 'azdata'; +import { DashboardTabGroup } from 'azdata'; const DONE_LABEL = nls.localize('dialogDoneLabel', "Done"); const CANCEL_LABEL = nls.localize('dialogCancelLabel', "Cancel"); @@ -22,7 +25,7 @@ const GENERATE_SCRIPT_LABEL = nls.localize('generateScriptLabel', "Generate scri const NEXT_LABEL = nls.localize('dialogNextLabel', "Next"); const PREVIOUS_LABEL = nls.localize('dialogPreviousLabel', "Previous"); -class ModelViewPanelImpl implements azdata.window.ModelViewPanel { +class ModelViewPanelImpl extends Disposable implements azdata.window.ModelViewPanel { private _modelView: azdata.ModelView; public handle: number; protected _modelViewId: string; @@ -33,6 +36,7 @@ class ModelViewPanelImpl implements azdata.window.ModelViewPanel { protected _extHostModelViewDialog: ExtHostModelViewDialog, protected _extHostModelView: ExtHostModelViewShape, protected _extension: IExtensionDescription) { + super(); this._onValidityChanged = this._extHostModelViewDialog.getValidityChangedEvent(this); this._onValidityChanged(valid => this._valid = valid); } @@ -43,6 +47,7 @@ class ModelViewPanelImpl implements azdata.window.ModelViewPanel { this.setModelViewId(viewId); this._extHostModelView.$registerProvider(viewId, modelView => { this._modelView = modelView; + this._register(this._modelView); handler(modelView); }, this._extension); } @@ -460,6 +465,10 @@ export interface WizardPageEventInfo { pages?: azdata.window.WizardPage[]; } +interface DisposableTab extends azdata.Tab, vscode.Disposable { } + +interface DisposableTabGroup extends azdata.TabGroup, vscode.Disposable { } + class WizardImpl implements azdata.window.Wizard { private _currentPage: number = undefined; public pages: azdata.window.WizardPage[] = []; @@ -600,7 +609,7 @@ class WizardImpl implements azdata.window.Wizard { } } -class ModelViewDashboardImpl implements azdata.window.ModelViewDashboard { +class ModelViewDashboardImpl extends Disposable implements azdata.window.ModelViewDashboard { private _tabbedPanel: azdata.TabbedPanelComponent; private _view: azdata.ModelView; @@ -608,9 +617,11 @@ class ModelViewDashboardImpl implements azdata.window.ModelViewDashboard { private _editor: ModelViewEditorImpl, private _options?: azdata.ModelViewDashboardOptions ) { + super(); + this._register(this._editor); } - updateTabs(tabs: (azdata.DashboardTab | azdata.DashboardTabGroup)[]): void { + updateTabs(tabs: (DashboardTab | DashboardTabGroup)[]): void { if (this._tabbedPanel === undefined || this._view === undefined) { throw new Error(nls.localize('dashboardNotInitialized', "Tabs are not initialized")); } @@ -618,7 +629,7 @@ class ModelViewDashboardImpl implements azdata.window.ModelViewDashboard { this._tabbedPanel.updateTabs(this.createTabs(tabs, this._view)); } - registerTabs(handler: (view: azdata.ModelView) => Thenable<(azdata.DashboardTab | azdata.DashboardTabGroup)[]>): void { + registerTabs(handler: (view: azdata.ModelView) => Thenable<(DashboardTab | DashboardTabGroup)[]>): void { this._editor.registerContent(async (view) => { this._view = view; const dashboardTabs = await handler(view); @@ -628,6 +639,7 @@ class ModelViewDashboardImpl implements azdata.window.ModelViewDashboard { showIcon: this._options?.showIcon ?? true, alwaysShowTabs: this._options?.alwaysShowTabs ?? false }).component(); + this._register(this._tabbedPanel); return view.initializeModel(this._tabbedPanel); }); } @@ -640,31 +652,46 @@ class ModelViewDashboardImpl implements azdata.window.ModelViewDashboard { return this._editor.closeEditor(); } - createTab(tab: azdata.DashboardTab, view: azdata.ModelView): azdata.Tab { - if (tab.toolbar) { + createTab(dashboardTab: DashboardTab, view: azdata.ModelView): DisposableTab { + let tab: DisposableTab; + if (dashboardTab.toolbar) { const flexContainer = view.modelBuilder.flexContainer().withLayout({ flexFlow: 'column' }).component(); - flexContainer.addItem(tab.toolbar, { flex: '0 0 auto' }); - flexContainer.addItem(tab.content, { flex: '1 1 auto' }); - return { - title: tab.title, - id: tab.id, + flexContainer.addItem(dashboardTab.toolbar, { flex: '0 0 auto' }); + flexContainer.addItem(dashboardTab.content, { flex: '1 1 auto' }); + tab = { + title: dashboardTab.title, + id: dashboardTab.id, content: flexContainer, - icon: tab.icon + icon: dashboardTab.icon, + dispose: () => flexContainer.dispose(), }; } else { - return tab; + let content = dashboardTab.content; + tab = { + content: content, + id: dashboardTab.id, + title: dashboardTab.title, + icon: dashboardTab.icon, + dispose: () => content.dispose() + } } + this._register(tab); + return tab; } - createTabs(dashboardTabs: (azdata.DashboardTab | azdata.DashboardTabGroup)[], view: azdata.ModelView): (azdata.TabGroup | azdata.Tab)[] { - const tabs: (azdata.TabGroup | azdata.Tab)[] = []; - dashboardTabs.forEach((item: azdata.DashboardTab | azdata.DashboardTabGroup) => { + createTabs(dashboardTabs: (DashboardTab | DashboardTabGroup)[], view: azdata.ModelView): (DisposableTabGroup | DisposableTab)[] { + const tabs: (DisposableTabGroup | DisposableTab)[] = []; + dashboardTabs.forEach((item: DashboardTab | DashboardTabGroup) => { if ('tabs' in item) { - tabs.push({ + let disposableTabs = item.tabs.map(tab => { + return this.createTab(tab, view); + }); + tabs.push({ title: item.title, - tabs: item.tabs.map(tab => { - return this.createTab(tab, view); - }) + tabs: disposableTabs, + dispose: () => { + disposableTabs.forEach(t => t.dispose()); + }, }); } else { tabs.push(this.createTab(item, view)); diff --git a/src/sql/workbench/api/test/browser/extHostModelView.test.ts b/src/sql/workbench/api/test/browser/extHostModelView.test.ts index 333c00f526..0dca630cd6 100644 --- a/src/sql/workbench/api/test/browser/extHostModelView.test.ts +++ b/src/sql/workbench/api/test/browser/extHostModelView.test.ts @@ -387,6 +387,8 @@ suite('ExtHostModelView Validation Tests', () => { rootComponent.properties.data && rootComponent.properties.data.length === 0; })), Times.once()); + + declarativeTable.dispose(); }); test('initialized with string data has correct properties', async () => { @@ -401,6 +403,8 @@ suite('ExtHostModelView Validation Tests', () => { rootComponent.properties.data && rootComponent.properties.data[0][0] === testData; })), Times.once()); + + declarativeTable.dispose(); }); test('initialized with component data converts to id', async () => { @@ -416,6 +420,8 @@ suite('ExtHostModelView Validation Tests', () => { rootComponent.properties.data && rootComponent.properties.data[0][0] === button.id; })), Times.once()); + + declarativeTable.dispose(); }); test('when added to container with component data converts to id', async () => { @@ -442,6 +448,8 @@ suite('ExtHostModelView Validation Tests', () => { item.componentShape.properties.data && item.componentShape.properties.data[0][0] === button.id; })), Times.once()); + + declarativeTable.dispose(); }); }); }); diff --git a/src/sql/workbench/browser/modelComponents/componentBase.ts b/src/sql/workbench/browser/modelComponents/componentBase.ts index 959ae4fe03..9941be42cd 100644 --- a/src/sql/workbench/browser/modelComponents/componentBase.ts +++ b/src/sql/workbench/browser/modelComponents/componentBase.ts @@ -81,6 +81,11 @@ export abstract class ComponentBase(); + private _onResize = this._register(new Emitter()); public readonly onResize: Event = this._onResize.event; - private _onMessage = new Emitter(); + private _onMessage = this._register(new Emitter()); public readonly onMessage: Event = this._onMessage.event; constructor( diff --git a/src/sql/workbench/browser/modelComponents/table.component.ts b/src/sql/workbench/browser/modelComponents/table.component.ts index 25840b26d1..522ba831d2 100644 --- a/src/sql/workbench/browser/modelComponents/table.component.ts +++ b/src/sql/workbench/browser/modelComponents/table.component.ts @@ -77,8 +77,8 @@ export default class TableComponent extends ComponentBase[] = []; private _pluginsRegisterStatus: boolean[] = []; private _filterPlugin: HeaderFilter; - private _onCheckBoxChanged = new Emitter(); - private _onButtonClicked = new Emitter>(); + private _onCheckBoxChanged = this._register(new Emitter()); + private _onButtonClicked = this._register(new Emitter>()); public readonly onCheckBoxChanged: vsEvent = this._onCheckBoxChanged.event; public readonly onButtonClicked: vsEvent> = this._onButtonClicked.event; private _iconCssMap: { [iconKey: string]: string } = {}; diff --git a/src/sql/workbench/browser/modelComponents/treeComponentRenderer.ts b/src/sql/workbench/browser/modelComponents/treeComponentRenderer.ts index d583562746..f811a2f7fc 100644 --- a/src/sql/workbench/browser/modelComponents/treeComponentRenderer.ts +++ b/src/sql/workbench/browser/modelComponents/treeComponentRenderer.ts @@ -25,7 +25,7 @@ export class TreeDataTemplate extends Disposable { icon: HTMLElement; private _checkbox: HTMLInputElement; model: ITreeComponentItem; - private _onChange = new Emitter(); + private _onChange = this._register(new Emitter()); public readonly onChange: Event = this._onChange.event; @@ -47,6 +47,14 @@ export class TreeDataTemplate extends Disposable { } } + public override dispose(): void { + super.dispose(); + this._checkbox.remove(); + this.root.remove(); + this.label.remove(); + this.icon.remove(); + } + public set checkboxState(value: TreeCheckboxState) { if (this.checkboxState !== value) { switch (value) { diff --git a/src/sql/workbench/browser/modelComponents/viewBase.ts b/src/sql/workbench/browser/modelComponents/viewBase.ts index 480dc67bfd..7a65fd6a36 100644 --- a/src/sql/workbench/browser/modelComponents/viewBase.ts +++ b/src/sql/workbench/browser/modelComponents/viewBase.ts @@ -26,7 +26,7 @@ const componentRegistry = Registry.as(Extensions.ComponentCo export abstract class ViewBase extends AngularDisposable implements IModelView { protected readonly modelStore: IModelStore; protected rootDescriptor: IComponentDescriptor; - protected _onDestroy = new Emitter(); + protected _onDestroy = this._register(new Emitter()); public readonly onDestroy = this._onDestroy.event; constructor(protected changeRef: ChangeDetectorRef, protected logService: ILogService) { super(); @@ -37,7 +37,7 @@ export abstract class ViewBase extends AngularDisposable implements IModelView { abstract id: string; abstract connection: azdata.connection.Connection; abstract serverInfo: azdata.ServerInfo; - private _onEventEmitter = new Emitter(); + private _onEventEmitter = this._register(new Emitter()); initializeModel(rootComponent: IComponentShape, validationCallback: (componentId: string) => Thenable): void { let descriptor = this.defineComponent(rootComponent);