diff --git a/scripts/Start-EditorServices.ps1 b/scripts/Start-EditorServices.ps1 index 16c730e062..6368c9dc51 100644 --- a/scripts/Start-EditorServices.ps1 +++ b/scripts/Start-EditorServices.ps1 @@ -58,6 +58,9 @@ param( [string] $DebugServiceOnly, + [string[]] + $AdditionalModules, + [string[]] $FeatureFlags, @@ -228,6 +231,7 @@ try { -HostVersion $HostVersion ` -LogPath $LogPath ` -LogLevel $LogLevel ` + -AdditionalModules $AdditionalModules ` -LanguageServicePort $languageServicePort ` -DebugServicePort $debugServicePort ` -BundledModulesPath $BundledModulesPath ` @@ -272,149 +276,3 @@ catch [System.Exception] { $e = $e.InnerException; } } - -# SIG # Begin signature block -# MIIasAYJKoZIhvcNAQcCoIIaoTCCGp0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB -# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR -# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUpu7oVqr4fTIiTHDYLqwN5cNP -# 7VOgghWDMIIEwzCCA6ugAwIBAgITMwAAALfuAa/68MeouwAAAAAAtzANBgkqhkiG -# 9w0BAQUFADB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G -# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEw -# HwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EwHhcNMTYwOTA3MTc1ODQ1 -# WhcNMTgwOTA3MTc1ODQ1WjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp -# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw -# b3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNO -# OkJCRUMtMzBDQS0yREJFMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBT -# ZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuCMjQSw3ep1m -# SndFRK0xgVRgm9wSl3i2llRtDdxzAWN9gQtYAE3hJP0/pV/7HHkshYPfMIRf7Pm/ -# dxSsAN+7ATnNUk+wpe46rfe0FDNxoE6CYaiMSNjKcMXH55bGXNnwrrcsMaZrVXzS -# IQcmAhUQw1jdLntbdTyCAwJ2UqF/XmVtWV/U466G8JP8VGLddeaucY0YKhgYwMnt -# Sp9ElCkVDcUP01L9pgn9JmKUfD3yFt2p1iZ9VKCrlla10JQwe7aNW7xjzXxvcvlV -# IXeA4QSabo4dq8HUh7JoYMqh3ufr2yNgTs/rSxG6D5ITcI0PZkH4PYjO2GbGIcOF -# RVOf5RxVrwIDAQABo4IBCTCCAQUwHQYDVR0OBBYEFJZnqouaH5kw+n1zGHTDXjCT -# 5OMAMB8GA1UdIwQYMBaAFCM0+NlSRnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEsw -# SaBHoEWGQ2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3Rz -# L01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsG -# AQUFBzAChjxodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jv -# c29mdFRpbWVTdGFtcFBDQS5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZI -# hvcNAQEFBQADggEBAG7J+Fdd7DgxG6awnA8opmQfW5DHnNDC/JPLof1sA8Nqczym -# cnWIHmlWhqA7TUy4q02lKenO+R/vbmHna1BrC/KkczAyhOzkI2WFU3PeYubv8EjK -# fYPmrNvS8fCsHJXj3N6fuFwXkHmCVBjTchK93auG09ckBYx5Mt4zW0TUbbw4/QAZ -# X64rbut6Aw/C1bpxqBb8vvMssBB9Hw2m8ApFTApaEVOE/sKemVlq0VIo0fCXqRST -# Lb6/QOav3S8S+N34RBNx/aKKOFzBDy6Ni45QvtRfBoNX3f4/mm4TFdNs+SeLQA+0 -# oBs7UgdoxGSpX6vsWaH8dtlBw3NZK7SFi9bBMI4wggTtMIID1aADAgECAhMzAAAB -# QJap7nBW/swHAAEAAAFAMA0GCSqGSIb3DQEBBQUAMHkxCzAJBgNVBAYTAlVTMRMw -# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN -# aWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNp -# Z25pbmcgUENBMB4XDTE2MDgxODIwMTcxN1oXDTE3MTEwMjIwMTcxN1owgYMxCzAJ -# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k -# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNVBAsTBE1PUFIx -# HjAcBgNVBAMTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjCCASIwDQYJKoZIhvcNAQEB -# BQADggEPADCCAQoCggEBANtLi+kDal/IG10KBTnk1Q6S0MThi+ikDQUZWMA81ynd -# ibdobkuffryavVSGOanxODUW5h2s+65r3Akw77ge32z4SppVl0jII4mzWSc0vZUx -# R5wPzkA1Mjf+6fNPpBqks3m8gJs/JJjE0W/Vf+dDjeTc8tLmrmbtBDohlKZX3APb -# LMYb/ys5qF2/Vf7dSd9UBZSrM9+kfTGmTb1WzxYxaD+Eaxxt8+7VMIruZRuetwgc -# KX6TvfJ9QnY4ItR7fPS4uXGew5T0goY1gqZ0vQIz+lSGhaMlvqqJXuI5XyZBmBre -# ueZGhXi7UTICR+zk+R+9BFF15hKbduuFlxQiCqET92ECAwEAAaOCAWEwggFdMBMG -# A1UdJQQMMAoGCCsGAQUFBwMDMB0GA1UdDgQWBBSc5ehtgleuNyTe6l6pxF+QHc7Z -# ezBSBgNVHREESzBJpEcwRTENMAsGA1UECxMETU9QUjE0MDIGA1UEBRMrMjI5ODAz -# K2Y3ODViMWMwLTVkOWYtNDMxNi04ZDZhLTc0YWU2NDJkZGUxYzAfBgNVHSMEGDAW -# gBTLEejK0rQWWAHJNy4zFha5TJoKHzBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8v -# Y3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNDb2RTaWdQQ0Ff -# MDgtMzEtMjAxMC5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRw -# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY0NvZFNpZ1BDQV8wOC0z -# MS0yMDEwLmNydDANBgkqhkiG9w0BAQUFAAOCAQEAa+RW49cTHSBA+W3p3k7bXR7G -# bCaj9+UJgAz/V+G01Nn5XEjhBn/CpFS4lnr1jcmDEwxxv/j8uy7MFXPzAGtOJar0 -# xApylFKfd00pkygIMRbZ3250q8ToThWxmQVEThpJSSysee6/hU+EbkfvvtjSi0lp -# DimD9aW9oxshraKlPpAgnPWfEj16WXVk79qjhYQyEgICamR3AaY5mLPuoihJbKwk -# Mig+qItmLPsC2IMvI5KR91dl/6TV6VEIlPbW/cDVwCBF/UNJT3nuZBl/YE7ixMpT -# Th/7WpENW80kg3xz6MlCdxJfMSbJsM5TimFU98KNcpnxxbYdfqqQhAQ6l3mtYDCC -# BbwwggOkoAMCAQICCmEzJhoAAAAAADEwDQYJKoZIhvcNAQEFBQAwXzETMBEGCgmS -# JomT8ixkARkWA2NvbTEZMBcGCgmSJomT8ixkARkWCW1pY3Jvc29mdDEtMCsGA1UE -# AxMkTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTEwMDgz -# MTIyMTkzMloXDTIwMDgzMTIyMjkzMloweTELMAkGA1UEBhMCVVMxEzARBgNVBAgT -# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m -# dCBDb3Jwb3JhdGlvbjEjMCEGA1UEAxMaTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQ -# Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCycllcGTBkvx2aYCAg -# Qpl2U2w+G9ZvzMvx6mv+lxYQ4N86dIMaty+gMuz/3sJCTiPVcgDbNVcKicquIEn0 -# 8GisTUuNpb15S3GbRwfa/SXfnXWIz6pzRH/XgdvzvfI2pMlcRdyvrT3gKGiXGqel -# cnNW8ReU5P01lHKg1nZfHndFg4U4FtBzWwW6Z1KNpbJpL9oZC/6SdCnidi9U3RQw -# WfjSjWL9y8lfRjFQuScT5EAwz3IpECgixzdOPaAyPZDNoTgGhVxOVoIoKgUyt0vX -# T2Pn0i1i8UU956wIAPZGoZ7RW4wmU+h6qkryRs83PDietHdcpReejcsRj1Y8wawJ -# XwPTAgMBAAGjggFeMIIBWjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTLEejK -# 0rQWWAHJNy4zFha5TJoKHzALBgNVHQ8EBAMCAYYwEgYJKwYBBAGCNxUBBAUCAwEA -# ATAjBgkrBgEEAYI3FQIEFgQU/dExTtMmipXhmGA7qDFvpjy82C0wGQYJKwYBBAGC -# NxQCBAweCgBTAHUAYgBDAEEwHwYDVR0jBBgwFoAUDqyCYEBWJ5flJRP8KuEKU5VZ -# 5KQwUAYDVR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3Br -# aS9jcmwvcHJvZHVjdHMvbWljcm9zb2Z0cm9vdGNlcnQuY3JsMFQGCCsGAQUFBwEB -# BEgwRjBEBggrBgEFBQcwAoY4aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9j -# ZXJ0cy9NaWNyb3NvZnRSb290Q2VydC5jcnQwDQYJKoZIhvcNAQEFBQADggIBAFk5 -# Pn8mRq/rb0CxMrVq6w4vbqhJ9+tfde1MOy3XQ60L/svpLTGjI8x8UJiAIV2sPS9M -# uqKoVpzjcLu4tPh5tUly9z7qQX/K4QwXaculnCAt+gtQxFbNLeNK0rxw56gNogOl -# VuC4iktX8pVCnPHz7+7jhh80PLhWmvBTI4UqpIIck+KUBx3y4k74jKHK6BOlkU7I -# G9KPcpUqcW2bGvgc8FPWZ8wi/1wdzaKMvSeyeWNWRKJRzfnpo1hW3ZsCRUQvX/Ta -# rtSCMm78pJUT5Otp56miLL7IKxAOZY6Z2/Wi+hImCWU4lPF6H0q70eFW6NB4lhhc -# yTUWX92THUmOLb6tNEQc7hAVGgBd3TVbIc6YxwnuhQ6MT20OE049fClInHLR82zK -# wexwo1eSV32UjaAbSANa98+jZwp0pTbtLS8XyOZyNxL0b7E8Z4L5UrKNMxZlHg6K -# 3RDeZPRvzkbU0xfpecQEtNP7LN8fip6sCvsTJ0Ct5PnhqX9GuwdgR2VgQE6wQuxO -# 7bN2edgKNAltHIAxH+IOVN3lofvlRxCtZJj/UBYufL8FIXrilUEnacOTj5XJjdib -# Ia4NXJzwoq6GaIMMai27dmsAHZat8hZ79haDJLmIz2qoRzEvmtzjcT3XAH5iR9HO -# iMm4GPoOco3Boz2vAkBq/2mbluIQqBC0N1AI1sM9MIIGBzCCA++gAwIBAgIKYRZo -# NAAAAAAAHDANBgkqhkiG9w0BAQUFADBfMRMwEQYKCZImiZPyLGQBGRYDY29tMRkw -# FwYKCZImiZPyLGQBGRYJbWljcm9zb2Z0MS0wKwYDVQQDEyRNaWNyb3NvZnQgUm9v -# dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcwNDAzMTI1MzA5WhcNMjEwNDAz -# MTMwMzA5WjB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G -# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEw -# HwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EwggEiMA0GCSqGSIb3DQEB -# AQUAA4IBDwAwggEKAoIBAQCfoWyx39tIkip8ay4Z4b3i48WZUSNQrc7dGE4kD+7R -# p9FMrXQwIBHrB9VUlRVJlBtCkq6YXDAm2gBr6Hu97IkHD/cOBJjwicwfyzMkh53y -# 9GccLPx754gd6udOo6HBI1PKjfpFzwnQXq/QsEIEovmmbJNn1yjcRlOwhtDlKEYu -# J6yGT1VSDOQDLPtqkJAwbofzWTCd+n7Wl7PoIZd++NIT8wi3U21StEWQn0gASkdm -# EScpZqiX5NMGgUqi+YSnEUcUCYKfhO1VeP4Bmh1QCIUAEDBG7bfeI0a7xC1Un68e -# eEExd8yb3zuDk6FhArUdDbH895uyAc4iS1T/+QXDwiALAgMBAAGjggGrMIIBpzAP -# BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQjNPjZUkZwCu1A+3b7syuwwzWzDzAL -# BgNVHQ8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwgZgGA1UdIwSBkDCBjYAUDqyC -# YEBWJ5flJRP8KuEKU5VZ5KShY6RhMF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAX -# BgoJkiaJk/IsZAEZFgltaWNyb3NvZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290 -# IENlcnRpZmljYXRlIEF1dGhvcml0eYIQea0WoUqgpa1Mc1j0BxMuZTBQBgNVHR8E -# STBHMEWgQ6BBhj9odHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9k -# dWN0cy9taWNyb3NvZnRyb290Y2VydC5jcmwwVAYIKwYBBQUHAQEESDBGMEQGCCsG -# AQUFBzAChjhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jv -# c29mdFJvb3RDZXJ0LmNydDATBgNVHSUEDDAKBggrBgEFBQcDCDANBgkqhkiG9w0B -# AQUFAAOCAgEAEJeKw1wDRDbd6bStd9vOeVFNAbEudHFbbQwTq86+e4+4LtQSooxt -# YrhXAstOIBNQmd16QOJXu69YmhzhHQGGrLt48ovQ7DsB7uK+jwoFyI1I4vBTFd1P -# q5Lk541q1YDB5pTyBi+FA+mRKiQicPv2/OR4mS4N9wficLwYTp2OawpylbihOZxn -# LcVRDupiXD8WmIsgP+IHGjL5zDFKdjE9K3ILyOpwPf+FChPfwgphjvDXuBfrTot/ -# xTUrXqO/67x9C0J71FNyIe4wyrt4ZVxbARcKFA7S2hSY9Ty5ZlizLS/n+YWGzFFW -# 6J1wlGysOUzU9nm/qhh6YinvopspNAZ3GmLJPR5tH4LwC8csu89Ds+X57H2146So -# dDW4TsVxIxImdgs8UoxxWkZDFLyzs7BNZ8ifQv+AeSGAnhUwZuhCEl4ayJ4iIdBD -# 6Svpu/RIzCzU2DKATCYqSCRfWupW76bemZ3KOm+9gSd0BhHudiG/m4LBJ1S2sWo9 -# iaF2YbRuoROmv6pH8BJv/YoybLL+31HIjCPJZr2dHYcSZAI9La9Zj7jkIeW1sMpj -# tHhUBdRBLlCslLCleKuzoJZ1GtmShxN1Ii8yqAhuoFuMJb+g74TKIdbrHk/Jmu5J -# 4PcBZW+JC33Iacjmbuqnl84xKf8OxVtc2E0bodj6L54/LlUWa8kTo/0xggSXMIIE -# kwIBATCBkDB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G -# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSMw -# IQYDVQQDExpNaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQQITMwAAAUCWqe5wVv7M -# BwABAAABQDAJBgUrDgMCGgUAoIGwMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEE -# MBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBS8 -# KIP6mqmI5yRH4/Q0YZBi9PUzkTBQBgorBgEEAYI3AgEMMUIwQKAWgBQAUABvAHcA -# ZQByAFMAaABlAGwAbKEmgCRodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vUG93ZXJT -# aGVsbCAwDQYJKoZIhvcNAQEBBQAEggEApgnmifY0Y0687wiB9NKVNHqDyVSS9Vta -# DsqlUd4H1bL++kacnkCtiNg5onEes1wCcp7UBxcW8pSzOG8kIICn4PmdzcZx+m1Y -# dsL8gQNNYH0GtZk+a4DX6yFuUd/NuLLDOOxHegEVnQ66ifiBxQUNGYmfap112ceQ -# 5VXSxaU9EBBu2b7UGin9+N+9l1YIROMxmlZ6UYzW7ocMhv7fXJrcAoUW5aV0dLB+ -# 3JrpwXZwqCUooAr1UytM6ITFiXNV46MLSnZWhUn6Uzj3F0Z8gURkuuuspC5/Kf0D -# VKCqeXa46wORQNavwJEENDINdvewn+bzL1ysPr5aeMprOp6QMC8G6aGCAigwggIk -# BgkqhkiG9w0BCQYxggIVMIICEQIBATCBjjB3MQswCQYDVQQGEwJVUzETMBEGA1UE -# CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z -# b2Z0IENvcnBvcmF0aW9uMSEwHwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQ -# Q0ECEzMAAAC37gGv+vDHqLsAAAAAALcwCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJ -# AzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE3MDYxMjE3MzkzN1owIwYJ -# KoZIhvcNAQkEMRYEFJMMhJyhJug1xntbhJw9SZ0rSyjRMA0GCSqGSIb3DQEBBQUA -# BIIBADOP1R9GuWCN8gG5VsAAcJ8slYPiA/SxqGlQJ4OqHl7qkgxkSzftzlPrLpJW -# X/GDqGMxcCbQ/JBjEqIc0Ty4TracExlXw8kFl6CD7n9Hh04Wrhurai9aSj8xxN1Y -# DvoZ7KNpLUr8Jo1dxfaO+i8Aem3bQCNNwISlxBN7V4hvByAjP1YxXlhiIV7Ibr9d -# 7PVBSLIDRpNX6nptuEOkiexTFfJEOI1OSuZs50RAqXarAr3wAEZqn8mDAJMi9WpZ -# 14iT6OJYqWpPQxixFAoED1oSpiebV6qhNw+ryw/ilSkm5lWtL4gcjk5+kaiEw1k8 -# jYFdXvc6mNe793BfInuWAbo8sZY= -# SIG # End signature block diff --git a/src/features/CustomViews.ts b/src/features/CustomViews.ts new file mode 100644 index 0000000000..35f5b3a0a7 --- /dev/null +++ b/src/features/CustomViews.ts @@ -0,0 +1,243 @@ +/*--------------------------------------------------------- + * Copyright (C) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------*/ + +import vscode = require('vscode'); +import { IFeature } from '../feature'; +import { LanguageClient, RequestType, NotificationType } from 'vscode-languageclient'; + +export class CustomViewsFeature implements IFeature { + + private commands: vscode.Disposable[] = []; + private languageClient: LanguageClient; + private contentProvider: PowerShellContentProvider; + + constructor() { + this.contentProvider = new PowerShellContentProvider(); + this.commands.push( + vscode.workspace.registerTextDocumentContentProvider( + "powershell", + this.contentProvider)); + } + + public setLanguageClient(languageClient: LanguageClient) { + + languageClient.onRequest( + NewCustomViewRequest.type, + args => { + this.contentProvider.createView( + args.id, + args.title, + args.viewType); + }); + + languageClient.onRequest( + ShowCustomViewRequest.type, + args => { + this.contentProvider.showView( + args.id, + args.viewColumn); + }); + + languageClient.onRequest( + CloseCustomViewRequest.type, + args => { + this.contentProvider.closeView(args.id); + }); + + languageClient.onRequest( + SetHtmlContentViewRequest.type, + args => { + this.contentProvider.setHtmlContentView( + args.id, + args.htmlBodyContent); + }); + + languageClient.onRequest( + AppendHtmlOutputViewRequest.type, + args => { + this.contentProvider.appendHtmlOutputView( + args.id, + args.appendedHtmlBodyContent); + }); + + this.languageClient = languageClient; + } + + public dispose() { + this.commands.forEach(d => d.dispose()); + } +} + +class PowerShellContentProvider implements vscode.TextDocumentContentProvider { + + private count: number = 1; + private viewIndex: { [id: string]: CustomView } = {}; + private didChangeEvent: vscode.EventEmitter = new vscode.EventEmitter(); + + public provideTextDocumentContent(uri: vscode.Uri): string { + return this.viewIndex[uri.toString()].getContent(); + } + + public createView(id: string, title: string, viewType: CustomViewType) { + let view = undefined; + switch (viewType) { + case CustomViewType.HtmlContent: + view = new HtmlContentView(id, title); + }; + + this.viewIndex[this.getUri(view.id)] = view; + } + + public showView(id: string, viewColumn: vscode.ViewColumn) { + let uriString = this.getUri(id); + let view: CustomView = this.viewIndex[uriString]; + + vscode.commands.executeCommand( + "vscode.previewHtml", + uriString, + viewColumn, + view.title); + } + + public closeView(id: string) { + let uriString = this.getUri(id); + let view: CustomView = this.viewIndex[uriString]; + + vscode.workspace.textDocuments.some( + doc => { + if (doc.uri.toString() === uriString) { + vscode.window + .showTextDocument(doc) + .then(editor => vscode.commands.executeCommand("workbench.action.closeActiveEditor")) + + return true; + } + + return false; + } + ) + } + + public setHtmlContentView(id: string, content: string) { + let uriString = this.getUri(id); + let view: CustomView = this.viewIndex[uriString]; + + if (view.viewType === CustomViewType.HtmlContent) { + (view).setContent(content); + this.didChangeEvent.fire(vscode.Uri.parse(uriString)); + } + } + + public appendHtmlOutputView(id: string, content: string) { + let uriString = this.getUri(id); + let view: CustomView = this.viewIndex[uriString]; + + if (view.viewType === CustomViewType.HtmlContent) { + (view).appendContent(content); + this.didChangeEvent.fire(vscode.Uri.parse(uriString)); + } + } + + private getUri(id: string) { + return `powershell://views/${id}`; + } + + public onDidChange: vscode.Event = this.didChangeEvent.event; +} + +abstract class CustomView { + + constructor( + public id: string, + public title: string, + public viewType: CustomViewType) + { + } + + abstract getContent(): string; +} + +class HtmlContentView extends CustomView { + + private htmlContent: string = ""; + + constructor( + id: string, + title: string) + { + super(id, title, CustomViewType.HtmlContent); + } + + setContent(htmlContent: string) { + this.htmlContent = htmlContent; + } + + appendContent(content: string) { + this.htmlContent += content; + } + + getContent(): string { + // Return an HTML page which disables JavaScript in content by default + return `${this.htmlContent}`; + } +} + +enum CustomViewType { + HtmlContent = 1, +} + +namespace NewCustomViewRequest { + export const type = + new RequestType( + 'powerShell/newCustomView'); +} + +interface NewCustomViewRequestArguments { + id: string; + title: string; + viewType: CustomViewType; +} + +namespace ShowCustomViewRequest { + export const type = + new RequestType( + 'powerShell/showCustomView'); +} + +interface ShowCustomViewRequestArguments { + id: string; + viewColumn: vscode.ViewColumn; +} + +namespace CloseCustomViewRequest { + export const type = + new RequestType( + 'powerShell/closeCustomView'); +} + +interface CloseCustomViewRequestArguments { + id: string; +} + +namespace SetHtmlContentViewRequest { + export const type = + new RequestType( + 'powerShell/setHtmlViewContent'); +} + +interface SetHtmlContentViewRequestArguments { + id: string; + htmlBodyContent: string; +} + +namespace AppendHtmlOutputViewRequest { + export const type = + new RequestType( + 'powerShell/appendHtmlViewContent'); +} + +interface AppendHtmlOutputViewRequestArguments { + id: string; + appendedHtmlBodyContent: string; +} diff --git a/src/main.ts b/src/main.ts index 08dd6d0f38..f92759aa5f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -15,6 +15,7 @@ import { PowerShellLanguageId } from './utils'; import { ConsoleFeature } from './features/Console'; import { ExamplesFeature } from './features/Examples'; import { OpenInISEFeature } from './features/OpenInISE'; +import { CustomViewsFeature } from './features/CustomViews'; import { ExpandAliasFeature } from './features/ExpandAlias'; import { ShowHelpFeature } from './features/ShowOnlineHelp'; import { CodeActionsFeature } from './features/CodeActions'; @@ -121,7 +122,8 @@ export function activate(context: vscode.ExtensionContext): void { new DebugSessionFeature(sessionManager), new PickPSHostProcessFeature(), new SpecifyScriptArgsFeature(context), - new HelpCompletionFeature() + new HelpCompletionFeature(), + new CustomViewsFeature() ]; sessionManager.setExtensionFeatures(extensionFeatures); diff --git a/src/session.ts b/src/session.ts index 321700f086..76a13b35cc 100644 --- a/src/session.ts +++ b/src/session.ts @@ -149,6 +149,7 @@ export class SessionManager implements Middleware { "-HostName 'Visual Studio Code Host' " + "-HostProfileId 'Microsoft.VSCode' " + "-HostVersion '" + this.hostVersion + "' " + + "-AdditionalModules @('PowerShellEditorServices.VSCode') " + "-BundledModulesPath '" + bundledModulesPath + "' " + "-EnableConsoleRepl ";