From 50ee84f780cfdfd0d3811e08da12d2f2ea0129b7 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 15 Oct 2020 13:55:12 +0200 Subject: [PATCH] debt - btoa/atob is not core --- build/lib/layersChecker.ts | 4 ++-- src/vs/base/browser/dom.ts | 21 +++++++++++++++++++ src/vs/base/common/strings.ts | 21 ------------------- src/vs/base/test/browser/dom.test.ts | 5 +++++ src/vs/base/test/common/strings.test.ts | 5 ----- .../api/browser/mainThreadCustomEditors.ts | 4 ++-- .../browser/parts/editor/textDiffEditor.ts | 2 +- 7 files changed, 31 insertions(+), 31 deletions(-) diff --git a/build/lib/layersChecker.ts b/build/lib/layersChecker.ts index cd3b1d3b1cb..1c7579206af 100644 --- a/build/lib/layersChecker.ts +++ b/build/lib/layersChecker.ts @@ -25,8 +25,8 @@ import { match } from 'minimatch'; // Feel free to add more core types as you see needed if present in node.js and browsers const CORE_TYPES = [ 'require', // from our AMD loader - 'atob', - 'btoa', + // 'atob', + // 'btoa', 'setTimeout', 'clearTimeout', 'setInterval', diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index d1c7ae19b5a..d48b71f2376 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -1362,3 +1362,24 @@ export function safeInnerHtml(node: HTMLElement, value: string): void { const html = _ttpSafeInnerHtml?.createHTML(value, options) ?? insane(value, options); node.innerHTML = html as unknown as string; } + +/** + * Convert a Unicode string to a string in which each 16-bit unit occupies only one byte + * + * From https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa + */ +function toBinary(str: string): string { + const codeUnits = new Uint16Array(str.length); + for (let i = 0; i < codeUnits.length; i++) { + codeUnits[i] = str.charCodeAt(i); + } + return String.fromCharCode(...new Uint8Array(codeUnits.buffer)); +} + +/** + * Version of the global `btoa` function that handles multi-byte characters instead + * of throwing an exception. + */ +export function multibyteAwareBtoa(str: string): string { + return btoa(toBinary(str)); +} diff --git a/src/vs/base/common/strings.ts b/src/vs/base/common/strings.ts index e44e219015c..06322c3e0b4 100644 --- a/src/vs/base/common/strings.ts +++ b/src/vs/base/common/strings.ts @@ -537,27 +537,6 @@ export function getCharContainingOffset(str: string, offset: number): [number, n return _getCharContainingOffset(str, offset); } -/** - * Convert a Unicode string to a string in which each 16-bit unit occupies only one byte - * - * From https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa - */ -function toBinary(str: string): string { - const codeUnits = new Uint16Array(str.length); - for (let i = 0; i < codeUnits.length; i++) { - codeUnits[i] = str.charCodeAt(i); - } - return String.fromCharCode(...new Uint8Array(codeUnits.buffer)); -} - -/** - * Version of the global `btoa` function that handles multi-byte characters instead - * of throwing an exception. - */ -export function multibyteAwareBtoa(str: string): string { - return btoa(toBinary(str)); -} - /** * A manual encoding of `str` to UTF8. * Use only in environments which do not offer native conversion methods! diff --git a/src/vs/base/test/browser/dom.test.ts b/src/vs/base/test/browser/dom.test.ts index 0c0cd4b6dfb..99b4f1b90fc 100644 --- a/src/vs/base/test/browser/dom.test.ts +++ b/src/vs/base/test/browser/dom.test.ts @@ -72,6 +72,11 @@ suite('dom', () => { assert(!element.classList.contains('bar')); }); + test('multibyteAwareBtoa', () => { + assert.equal(dom.multibyteAwareBtoa('hello world'), dom.multibyteAwareBtoa('hello world')); + assert.ok(dom.multibyteAwareBtoa('平仮名')); + }); + suite('$', () => { test('should build simple nodes', () => { const div = $('div'); diff --git a/src/vs/base/test/common/strings.test.ts b/src/vs/base/test/common/strings.test.ts index 7ea2b3ca10c..543cb460bf2 100644 --- a/src/vs/base/test/common/strings.test.ts +++ b/src/vs/base/test/common/strings.test.ts @@ -417,9 +417,4 @@ suite('Strings', () => { test('getGraphemeBreakType', () => { assert.equal(strings.getGraphemeBreakType(0xBC1), strings.GraphemeBreakType.SpacingMark); }); - - test('multibyteAwareBtoa', () => { - assert.equal(strings.multibyteAwareBtoa('hello world'), strings.multibyteAwareBtoa('hello world')); - assert.ok(strings.multibyteAwareBtoa('平仮名')); - }); }); diff --git a/src/vs/workbench/api/browser/mainThreadCustomEditors.ts b/src/vs/workbench/api/browser/mainThreadCustomEditors.ts index 6e8fbff540e..26d98c78511 100644 --- a/src/vs/workbench/api/browser/mainThreadCustomEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadCustomEditors.ts @@ -11,7 +11,7 @@ import { Disposable, DisposableStore, IDisposable, IReference } from 'vs/base/co import { Schemas } from 'vs/base/common/network'; import { basename } from 'vs/base/common/path'; import { isEqual, isEqualOrParent, toLocalResource } from 'vs/base/common/resources'; -import { multibyteAwareBtoa } from 'vs/base/common/strings'; +import { multibyteAwareBtoa } from 'vs/base/browser/dom'; import { URI, UriComponents } from 'vs/base/common/uri'; import * as modes from 'vs/editor/common/modes'; import { localize } from 'vs/nls'; @@ -348,7 +348,7 @@ class MainThreadCustomEditorModel extends Disposable implements ICustomEditorMod private static toWorkingCopyResource(viewType: string, resource: URI) { const authority = viewType.replace(/[^a-z0-9\-_]/gi, '-'); - const path = '/' + multibyteAwareBtoa(resource.with({ query: null, fragment: null }).toString(true)); + const path = `/${multibyteAwareBtoa(resource.with({ query: null, fragment: null }).toString(true))}`; return URI.from({ scheme: Schemas.vscodeCustomEditor, authority: authority, diff --git a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts index bd7e7189263..115d6ee98d4 100644 --- a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts @@ -31,7 +31,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { EditorActivation, IEditorOptions } from 'vs/platform/editor/common/editor'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { isEqual } from 'vs/base/common/resources'; -import { multibyteAwareBtoa } from 'vs/base/common/strings'; +import { multibyteAwareBtoa } from 'vs/base/browser/dom'; /** * The text editor that leverages the diff text editor for the editing experience.