mirror of https://github.com/nodejs/node.git
120 lines
3.6 KiB
JavaScript
120 lines
3.6 KiB
JavaScript
// Flags: --expose-internals
|
|
'use strict';
|
|
|
|
const { mustNotCall } = require('../common');
|
|
const assert = require('assert');
|
|
|
|
const {
|
|
RegExpPrototypeSymbolReplace,
|
|
RegExpPrototypeSymbolSearch,
|
|
RegExpPrototypeSymbolSplit,
|
|
SafeStringPrototypeSearch,
|
|
hardenRegExp,
|
|
} = require('internal/test/binding').primordials;
|
|
|
|
|
|
Object.defineProperties(RegExp.prototype, {
|
|
[Symbol.match]: {
|
|
get: mustNotCall('get %RegExp.prototype%[@@match]'),
|
|
set: mustNotCall('set %RegExp.prototype%[@@match]'),
|
|
},
|
|
[Symbol.matchAll]: {
|
|
get: mustNotCall('get %RegExp.prototype%[@@matchAll]'),
|
|
set: mustNotCall('set %RegExp.prototype%[@@matchAll]'),
|
|
},
|
|
[Symbol.replace]: {
|
|
get: mustNotCall('get %RegExp.prototype%[@@replace]'),
|
|
set: mustNotCall('set %RegExp.prototype%[@@replace]'),
|
|
},
|
|
[Symbol.search]: {
|
|
get: mustNotCall('get %RegExp.prototype%[@@search]'),
|
|
set: mustNotCall('set %RegExp.prototype%[@@search]'),
|
|
},
|
|
[Symbol.split]: {
|
|
get: mustNotCall('get %RegExp.prototype%[@@split]'),
|
|
set: mustNotCall('set %RegExp.prototype%[@@split]'),
|
|
},
|
|
dotAll: {
|
|
get: mustNotCall('get %RegExp.prototype%.dotAll'),
|
|
set: mustNotCall('set %RegExp.prototype%.dotAll'),
|
|
},
|
|
exec: {
|
|
get: mustNotCall('get %RegExp.prototype%.exec'),
|
|
set: mustNotCall('set %RegExp.prototype%.exec'),
|
|
},
|
|
flags: {
|
|
get: mustNotCall('get %RegExp.prototype%.flags'),
|
|
set: mustNotCall('set %RegExp.prototype%.flags'),
|
|
},
|
|
global: {
|
|
get: mustNotCall('get %RegExp.prototype%.global'),
|
|
set: mustNotCall('set %RegExp.prototype%.global'),
|
|
},
|
|
hasIndices: {
|
|
get: mustNotCall('get %RegExp.prototype%.hasIndices'),
|
|
set: mustNotCall('set %RegExp.prototype%.hasIndices'),
|
|
},
|
|
ignoreCase: {
|
|
get: mustNotCall('get %RegExp.prototype%.ignoreCase'),
|
|
set: mustNotCall('set %RegExp.prototype%.ignoreCase'),
|
|
},
|
|
multiline: {
|
|
get: mustNotCall('get %RegExp.prototype%.multiline'),
|
|
set: mustNotCall('set %RegExp.prototype%.multiline'),
|
|
},
|
|
source: {
|
|
get: mustNotCall('get %RegExp.prototype%.source'),
|
|
set: mustNotCall('set %RegExp.prototype%.source'),
|
|
},
|
|
sticky: {
|
|
get: mustNotCall('get %RegExp.prototype%.sticky'),
|
|
set: mustNotCall('set %RegExp.prototype%.sticky'),
|
|
},
|
|
test: {
|
|
get: mustNotCall('get %RegExp.prototype%.test'),
|
|
set: mustNotCall('set %RegExp.prototype%.test'),
|
|
},
|
|
toString: {
|
|
get: mustNotCall('get %RegExp.prototype%.toString'),
|
|
set: mustNotCall('set %RegExp.prototype%.toString'),
|
|
},
|
|
unicode: {
|
|
get: mustNotCall('get %RegExp.prototype%.unicode'),
|
|
set: mustNotCall('set %RegExp.prototype%.unicode'),
|
|
},
|
|
});
|
|
|
|
hardenRegExp(hardenRegExp(/1/));
|
|
|
|
// IMO there are no valid use cases in node core to use RegExpPrototypeSymbolMatch
|
|
// or RegExpPrototypeSymbolMatchAll, they are inherently unsafe.
|
|
|
|
{
|
|
const myRegex = hardenRegExp(/a/);
|
|
assert.strictEqual(RegExpPrototypeSymbolReplace(myRegex, 'baar', 'e'), 'bear');
|
|
}
|
|
{
|
|
const myRegex = hardenRegExp(/a/g);
|
|
assert.strictEqual(RegExpPrototypeSymbolReplace(myRegex, 'baar', 'e'), 'beer');
|
|
}
|
|
{
|
|
const myRegex = hardenRegExp(/a/);
|
|
assert.strictEqual(RegExpPrototypeSymbolSearch(myRegex, 'baar'), 1);
|
|
}
|
|
{
|
|
const myRegex = /a/;
|
|
assert.strictEqual(SafeStringPrototypeSearch('baar', myRegex), 1);
|
|
}
|
|
{
|
|
const myRegex = hardenRegExp(/a/);
|
|
assert.deepStrictEqual(RegExpPrototypeSymbolSplit(myRegex, 'baar', 0), []);
|
|
}
|
|
{
|
|
const myRegex = hardenRegExp(/a/);
|
|
assert.deepStrictEqual(RegExpPrototypeSymbolSplit(myRegex, 'baar', 1), ['b']);
|
|
}
|
|
{
|
|
const myRegex = hardenRegExp(/a/);
|
|
assert.deepStrictEqual(RegExpPrototypeSymbolSplit(myRegex, 'baar'), ['b', '', 'r']);
|
|
}
|