add quote to string escape (#1838)

This commit is contained in:
Anthony Dresser
2018-07-03 16:37:44 -07:00
committed by GitHub
parent fd4d6abb4d
commit f0a556f004
3 changed files with 29 additions and 7 deletions

View File

@@ -0,0 +1,21 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
/**
* Converts HTML characters inside the string to use entities instead. Makes the string safe from
* being used e.g. in HTMLElement.innerHTML.
*/
export function escape(html: string): string {
return html.replace(/[<|>|&|"]/g, function (match) {
switch (match) {
case '<': return '&lt;';
case '>': return '&gt;';
case '&': return '&amp;';
case '"': return '&quot;';
default: return match;
}
});
}

View File

@@ -3,7 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information. * Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import * as Strings from 'vs/base/common/strings'; import { escape } from 'sql/base/common/strings';
export class DBCellValue { export class DBCellValue {
displayValue: string; displayValue: string;
@@ -25,7 +25,7 @@ export function hyperLinkFormatter(row: number, cell: any, value: any, columnDef
valueToDisplay = 'NULL'; valueToDisplay = 'NULL';
if (!value.isNull) { if (!value.isNull) {
cellClasses += ' xmlLink'; cellClasses += ' xmlLink';
valueToDisplay = Strings.escape(value.displayValue); valueToDisplay = escape(value.displayValue);
return `<a class="${cellClasses}" href="#" >${valueToDisplay}</a>`; return `<a class="${cellClasses}" href="#" >${valueToDisplay}</a>`;
} else { } else {
cellClasses += ' missing-value'; cellClasses += ' missing-value';
@@ -44,12 +44,12 @@ export function textFormatter(row: number, cell: any, value: any, columnDef: any
if (DBCellValue.isDBCellValue(value)) { if (DBCellValue.isDBCellValue(value)) {
valueToDisplay = 'NULL'; valueToDisplay = 'NULL';
if (!value.isNull) { if (!value.isNull) {
valueToDisplay = Strings.escape(value.displayValue.replace(/(\r\n|\n|\r)/g, ' ')); valueToDisplay = escape(value.displayValue.replace(/(\r\n|\n|\r)/g, ' '));
} else { } else {
cellClasses += ' missing-value'; cellClasses += ' missing-value';
} }
} else if (typeof value === 'string') { } else if (typeof value === 'string') {
valueToDisplay = Strings.escape(value); valueToDisplay = escape(value);
} }
return `<span title="${valueToDisplay}" class="${cellClasses}">${valueToDisplay}</span>`; return `<span title="${valueToDisplay}" class="${cellClasses}">${valueToDisplay}</span>`;

View File

@@ -27,8 +27,9 @@ import { error } from 'sql/base/common/log';
import { TabChild } from 'sql/base/browser/ui/panel/tab.component'; import { TabChild } from 'sql/base/browser/ui/panel/tab.component';
import { clone, mixin } from 'sql/base/common/objects'; import { clone, mixin } from 'sql/base/common/objects';
import { IQueryEditorService } from 'sql/parts/query/common/queryEditorService'; import { IQueryEditorService } from 'sql/parts/query/common/queryEditorService';
import { escape } from 'sql/base/common/strings';
import * as strings from 'vs/base/common/strings'; import { format } from 'vs/base/common/strings';
import * as DOM from 'vs/base/browser/dom'; import * as DOM from 'vs/base/browser/dom';
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
import { KeyCode } from 'vs/base/common/keyCodes'; import { KeyCode } from 'vs/base/common/keyCodes';
@@ -60,7 +61,7 @@ export class QueryComponent extends GridParentComponent implements OnInit, OnDes
// create a function alias to use inside query.component // create a function alias to use inside query.component
// tslint:disable-next-line:no-unused-variable // tslint:disable-next-line:no-unused-variable
private stringsFormat: any = strings.format; private stringsFormat: any = format;
// tslint:disable-next-line:no-unused-variable // tslint:disable-next-line:no-unused-variable
private dataIcons: IGridIcon[] = [ private dataIcons: IGridIcon[] = [
@@ -302,7 +303,7 @@ export class QueryComponent extends GridParentComponent implements OnInit, OnDes
// Push row values onto end of gridData for slickgrid // Push row values onto end of gridData for slickgrid
gridData.push({ gridData.push({
values: rows.rows[row].map(c => { values: rows.rows[row].map(c => {
return mixin({ ariaLabel: c.displayValue }, c); return mixin({ ariaLabel: escape(c.displayValue) }, c);
}) })
}); });
} }