Skip to content

Commit dd1cfba

Browse files
committed
fix order of arguments validation in String.prototype.{ padStart, padEnd } polyfills
1 parent b952c5f commit dd1cfba

6 files changed

Lines changed: 23 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
- Fixed iterator closing in `Set.prototype.{ isDisjointFrom, isSupersetOf }` polyfill
2626
- Fixed (updated following the final spec) one more case `Set.prototype.difference` polyfill with updating `this`
2727
- Fixed `DataView.prototype.setFloat16` polyfill in (0, 1) range
28+
- Fixed order of arguments validation in `String.prototype.{ padStart, padEnd }` polyfills
2829
- Fixed order of arguments validation in `String.prototype.{ startsWith, endsWith }` polyfills
2930
- Fixed some cases of `Infinity` handling in `String.prototype.substr` polyfill
3031
- Fixed `String.prototype.repeat` polyfill with a counter exceeding 2 ** 32

packages/core-js/internals/string-pad.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ var createMethod = function (IS_END) {
1515
var S = toString(requireObjectCoercible($this));
1616
var intMaxLength = toLength(maxLength);
1717
var stringLength = S.length;
18+
if (intMaxLength <= stringLength) return S;
1819
var fillStr = fillString === undefined ? ' ' : toString(fillString);
1920
var fillLen, stringFiller;
20-
if (intMaxLength <= stringLength || fillStr === '') return S;
21+
if (fillStr === '') return S;
2122
fillLen = intMaxLength - stringLength;
2223
stringFiller = repeat(fillStr, ceil(fillLen / fillStr.length));
2324
if (stringFiller.length > fillLen) stringFiller = stringSlice(stringFiller, 0, fillLen);

tests/unit-global/es.string.pad-end.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,14 @@ QUnit.test('String#padEnd', assert => {
1515
assert.same('foo'.padEnd(1), 'foo');
1616
assert.same('foo'.padEnd(5, ''), 'foo');
1717

18+
const thrower = { toString() { throw new Error('oops'); } };
19+
assert.throws(() => 'a'.padEnd(10, thrower), 'throws on thrower argument conversion');
20+
assert.same('abc'.padEnd(2, thrower), 'abc', 'does not throw on thrower argument when no padding needed');
21+
1822
const symbol = Symbol('padEnd test');
1923
assert.throws(() => padEnd.call(symbol, 10, 'a'), 'throws on symbol context');
2024
assert.throws(() => padEnd.call('a', 10, symbol), 'throws on symbol argument');
25+
assert.same('abc'.padEnd(2, symbol), 'abc', 'does not throw on symbol fillString when no padding needed');
2126

2227
if (STRICT) {
2328
assert.throws(() => padEnd.call(null, 0), TypeError);

tests/unit-global/es.string.pad-start.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,14 @@ QUnit.test('String#padStart', assert => {
1515
assert.same('foo'.padStart(1), 'foo');
1616
assert.same('foo'.padStart(5, ''), 'foo');
1717

18+
const thrower = { toString() { throw new Error('oops'); } };
19+
assert.throws(() => 'a'.padStart(10, thrower), 'throws on thrower argument conversion');
20+
assert.same('abc'.padStart(2, thrower), 'abc', 'does not throw on thrower argument when no padding needed');
21+
1822
const symbol = Symbol('padStart test');
1923
assert.throws(() => padStart.call(symbol, 10, 'a'), 'throws on symbol context');
2024
assert.throws(() => padStart.call('a', 10, symbol), 'throws on symbol argument');
25+
assert.same('abc'.padStart(2, symbol), 'abc', 'does not throw on symbol fillString when no padding needed');
2126

2227
if (STRICT) {
2328
assert.throws(() => padStart.call(null, 0), TypeError);

tests/unit-pure/es.string.pad-end.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,14 @@ QUnit.test('String#padEnd', assert => {
1313
assert.same(padEnd('foo', 1), 'foo');
1414
assert.same(padEnd('foo', 5, ''), 'foo');
1515

16+
const thrower = { toString() { throw new Error('oops'); } };
17+
assert.throws(() => padEnd('a', 10, thrower), 'throws on thrower argument conversion');
18+
assert.same(padEnd('abc', 2, thrower), 'abc', 'does not throw on thrower argument when no padding needed');
19+
1620
const symbol = Symbol('padEnd test');
1721
assert.throws(() => padEnd(symbol, 10, 'a'), 'throws on symbol context');
1822
assert.throws(() => padEnd('a', 10, symbol), 'throws on symbol argument');
23+
assert.same(padEnd('abc', 2, symbol), 'abc', 'does not throw on symbol fillString when no padding needed');
1924

2025
if (STRICT) {
2126
assert.throws(() => padEnd(null, 0), TypeError);

tests/unit-pure/es.string.pad-start.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,14 @@ QUnit.test('String#padStart', assert => {
1313
assert.same(padStart('foo', 1), 'foo');
1414
assert.same(padStart('foo', 5, ''), 'foo');
1515

16+
const thrower = { toString() { throw new Error('oops'); } };
17+
assert.throws(() => padStart('a', 10, thrower), 'throws on thrower argument conversion');
18+
assert.same(padStart('abc', 2, thrower), 'abc', 'does not throw on thrower argument when no padding needed');
19+
1620
const symbol = Symbol('padStart test');
1721
assert.throws(() => padStart(symbol, 10, 'a'), 'throws on symbol context');
1822
assert.throws(() => padStart('a', 10, symbol), 'throws on symbol argument');
23+
assert.same(padStart('abc', 2, symbol), 'abc', 'does not throw on symbol fillString when no padding needed');
1924

2025
if (STRICT) {
2126
assert.throws(() => padStart(null, 0), TypeError);

0 commit comments

Comments
 (0)