From e1bc56d5c3111d9f86df76d64008c589e942da09 Mon Sep 17 00:00:00 2001 From: David Wilson Date: Tue, 20 Jun 2017 12:09:13 -0700 Subject: [PATCH 1/2] Add PSES.VSCode module to the editor session This change adds the new PowerShellEditorServices.VSCode module to be loaded in the editor session so that VS Code-specific extension APIs will be present. --- scripts/Start-EditorServices.ps1 | 150 +------------------------------ src/session.ts | 1 + 2 files changed, 5 insertions(+), 146 deletions(-) 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/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 "; From 1987b8349e22b722846ab0c6faf1aa7b71089081 Mon Sep 17 00:00:00 2001 From: David Wilson Date: Mon, 12 Jun 2017 10:13:09 -0700 Subject: [PATCH 2/2] Add custom HTML content views This change adds new custom HTML content views which are driven by the new HtmlContentView APIs in the PowerShellEditorServices.VSCode module. These views allow the user to show a custom view with rendered HTML content that can either be set or appended to using PowerShell cmdlets. Resolves #191 --- src/features/CustomViews.ts | 243 ++++++++++++++++++++++++++++++++++++ src/main.ts | 4 +- 2 files changed, 246 insertions(+), 1 deletion(-) create mode 100644 src/features/CustomViews.ts 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);