mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
Replace the implementation of escapeTextContentForBrowser with escape-html (#6862)
* Replacing the implementation of escapeTextContentForBrowser with escape-html for performance
* Addressing @spicyj's code review comment here: https://github.com/facebook/react/pull/6862#issuecomment-223102868 . Pulled the code of escape-html in to react and changed the encoding of single quote to '.
* Addressing code review comment https://github.com/facebook/react/pull/6862#discussion_r65462074 to make code more inlinable for v8. Thanks, @spicyj.
(cherry picked from commit d6e70586b7)
This commit is contained in:
committed by
Paul O’Shannessy
parent
cb10a45ded
commit
58634bda69
@@ -1,29 +1,105 @@
|
||||
/**
|
||||
* Copyright 2013-present, Facebook, Inc.
|
||||
* Copyright 2016-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* Based on the escape-html library, which is used under the MIT License below:
|
||||
*
|
||||
* Copyright (c) 2012-2013 TJ Holowaychuk
|
||||
* Copyright (c) 2015 Andreas Lubbe
|
||||
* Copyright (c) 2015 Tiancheng "Timothy" Gu
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* @providesModule escapeTextContentForBrowser
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ESCAPE_LOOKUP = {
|
||||
'&': '&',
|
||||
'>': '>',
|
||||
'<': '<',
|
||||
'"': '"',
|
||||
'\'': ''',
|
||||
};
|
||||
// code copied and modified from escape-html
|
||||
/**
|
||||
* Module variables.
|
||||
* @private
|
||||
*/
|
||||
|
||||
var ESCAPE_REGEX = /[&><"']/g;
|
||||
var matchHtmlRegExp = /["'&<>]/;
|
||||
|
||||
function escaper(match) {
|
||||
return ESCAPE_LOOKUP[match];
|
||||
/**
|
||||
* Escape special characters in the given string of html.
|
||||
*
|
||||
* @param {string} string The string to escape for inserting into HTML
|
||||
* @return {string}
|
||||
* @public
|
||||
*/
|
||||
|
||||
function escapeHtml(string) {
|
||||
var str = '' + string;
|
||||
var match = matchHtmlRegExp.exec(str);
|
||||
|
||||
if (!match) {
|
||||
return str;
|
||||
}
|
||||
|
||||
var escape;
|
||||
var html = '';
|
||||
var index = 0;
|
||||
var lastIndex = 0;
|
||||
|
||||
for (index = match.index; index < str.length; index++) {
|
||||
switch (str.charCodeAt(index)) {
|
||||
case 34: // "
|
||||
escape = '"';
|
||||
break;
|
||||
case 38: // &
|
||||
escape = '&';
|
||||
break;
|
||||
case 39: // '
|
||||
escape = '''; // modified from escape-html; used to be '''
|
||||
break;
|
||||
case 60: // <
|
||||
escape = '<';
|
||||
break;
|
||||
case 62: // >
|
||||
escape = '>';
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
||||
if (lastIndex !== index) {
|
||||
html += str.substring(lastIndex, index);
|
||||
}
|
||||
|
||||
lastIndex = index + 1;
|
||||
html += escape;
|
||||
}
|
||||
|
||||
return lastIndex !== index
|
||||
? html + str.substring(lastIndex, index)
|
||||
: html;
|
||||
}
|
||||
// end code copied and modified from escape-html
|
||||
|
||||
|
||||
/**
|
||||
* Escapes text to prevent scripting attacks.
|
||||
@@ -32,7 +108,13 @@ function escaper(match) {
|
||||
* @return {string} An escaped string.
|
||||
*/
|
||||
function escapeTextContentForBrowser(text) {
|
||||
return ('' + text).replace(ESCAPE_REGEX, escaper);
|
||||
if (typeof text === 'boolean' || typeof text === 'number') {
|
||||
// this shortcircuit helps perf for types that we know will never have
|
||||
// special characters, especially given that this function is used often
|
||||
// for numeric dom ids.
|
||||
return '' + text;
|
||||
}
|
||||
return escapeHtml(text);
|
||||
}
|
||||
|
||||
module.exports = escapeTextContentForBrowser;
|
||||
|
||||
Reference in New Issue
Block a user