From 4c0f0748e892c6d134589ebc0ce519d538b35b6a Mon Sep 17 00:00:00 2001
From: David Gatti <github@gatti.pl>
Date: Fri, 12 Jan 2018 14:31:11 +0100
Subject: [PATCH] Added support for CSP

---
 gulpfile.js                |  3 ++-
 src/csp.ts                 | 47 ++++++++++++++++++++++++++++++++++++++
 src/monaco.contribution.ts |  7 ++++++
 test/csp.test.ts           | 10 ++++++++
 4 files changed, 66 insertions(+), 1 deletion(-)
 create mode 100644 src/csp.ts
 create mode 100644 test/csp.test.ts

diff --git a/gulpfile.js b/gulpfile.js
index eb068c65..12d7511e 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -81,7 +81,8 @@ gulp.task('release', ['clean-release','compile'], function() {
 			bundleOne('src/mysql'),
 			bundleOne('src/redshift'),
 			bundleOne('src/pgsql'),
-			bundleOne('src/redis')
+			bundleOne('src/redis'),
+			bundleOne('src/csp')
 		)
 		.pipe(uglify({
 			output: {
diff --git a/src/csp.ts b/src/csp.ts
new file mode 100644
index 00000000..d20787a2
--- /dev/null
+++ b/src/csp.ts
@@ -0,0 +1,47 @@
+// Create your own language definition here
+// You can safely look at other samples without losing modifications.
+// Modifications are not saved on browser refresh/close though -- copy often!
+return {
+  // Set defaultToken to invalid to see what you do not tokenize yet
+  // defaultToken: 'invalid',
+  keywords: [],
+  typeKeywords: [],
+  operators: [],
+  symbols:  /[=><!~?:&|+\-*\/\^%]+/,
+  escapes: /\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,
+  tokenizer: {
+    root: [
+      [/child-src/,                   'string.quote'],
+      [/connect-src/,                 'string.quote'],
+      [/default-src/,                 'string.quote'],
+      [/font-src/,                    'string.quote'],
+      [/frame-src/,                   'string.quote'],
+      [/img-src/,                     'string.quote'],
+      [/manifest-src/,                'string.quote'],
+      [/media-src/,                   'string.quote'],
+      [/object-src/,                  'string.quote'],
+      [/script-src/,                  'string.quote'],
+      [/style-src/,                   'string.quote'],
+      [/worker-src/,                  'string.quote'],
+      [/base-uri/,                    'string.quote'],
+      [/plugin-types/,                'string.quote'],
+      [/sandbox/,                     'string.quote'],
+      [/disown-opener/,               'string.quote'],
+      [/form-action/,                 'string.quote'],
+      [/frame-ancestors/,             'string.quote'],
+      [/report-uri/,                  'string.quote'],
+      [/report-to/,                   'string.quote'],
+      [/upgrade-insecure-requests/,   'string.quote'],
+      [/block-all-mixed-content/,     'string.quote'],
+      [/require-sri-for/,             'string.quote'],
+      [/reflected-xss/,               'string.quote'],
+      [/referrer/,                    'string.quote'],
+      [/policy-uri/,                  'string.quote'],
+      [/'self'/,                      'string.quote'],
+      [/'unsafe-inline'/,             'string.quote'],
+      [/'unsafe-eval'/,               'string.quote'],
+      [/'strict-dynamic'/,            'string.quote'],
+      [/'unsafe-hashed-attributes'/,  'string.quote']
+    ]
+  }
+};
diff --git a/src/monaco.contribution.ts b/src/monaco.contribution.ts
index 8aafcc9a..a74e2e1f 100644
--- a/src/monaco.contribution.ts
+++ b/src/monaco.contribution.ts
@@ -300,3 +300,10 @@ registerLanguage({
 	aliases: ['redis'],
 	module: './redis'
 });
+
+registerLanguage({
+	id: 'csp',
+	extensions: [],
+	aliases: ['CSP', 'csp'],
+	module: './csp'
+});
\ No newline at end of file
diff --git a/test/csp.test.ts b/test/csp.test.ts
new file mode 100644
index 00000000..cfcd8219
--- /dev/null
+++ b/test/csp.test.ts
@@ -0,0 +1,10 @@
+/*---------------------------------------------------------------------------------------------
+ *  Copyright (c) Microsoft Corporation. All rights reserved.
+ *  Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+'use strict';
+
+import { testTokenization } from './testRunner';
+
+testTokenization('csp', []);