Skip to content

Commit 036575a

Browse files
committed
add self
1 parent 4604f5b commit 036575a

File tree

12 files changed

+98
-0
lines changed

12 files changed

+98
-0
lines changed

packages/core-js-compat/src/data.mjs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2520,6 +2520,15 @@ export const data = {
25202520
node: '12.0', // '11.0',
25212521
safari: '12.1',
25222522
},
2523+
'web.self': {
2524+
chrome: '86',
2525+
// https://github.com/denoland/deno/issues/15765
2526+
// deno: false,
2527+
// fails in early Chrome-based Edge
2528+
// edge: '12',
2529+
firefox: '31',
2530+
safari: '10',
2531+
},
25232532
'web.set-immediate': {
25242533
bun: '0.1.7',
25252534
ie: '10',

packages/core-js-compat/src/modules-by-versions.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,5 +160,6 @@ export default {
160160
3.26: [
161161
'esnext.string.is-well-formed',
162162
'esnext.string.to-well-formed',
163+
'web.self',
163164
],
164165
};
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
var $ = require('../internals/export');
2+
var global = require('../internals/global');
3+
4+
// `self` getter
5+
// https://html.spec.whatwg.org/multipage/window-object.html#dom-self
6+
$({ global: true, forced: global.self !== global }, {
7+
self: global
8+
});

packages/core-js/actual/self.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
var parent = require('../stable/self');
2+
3+
module.exports = parent;

packages/core-js/full/self.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
var parent = require('../actual/self');
2+
3+
module.exports = parent;

packages/core-js/modules/web.self.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
'use strict';
2+
var $ = require('../internals/export');
3+
var global = require('../internals/global');
4+
var defineBuiltInAccessor = require('../internals/define-built-in-accessor');
5+
var DESCRIPTORS = require('../internals/descriptors');
6+
7+
var $TypeError = TypeError;
8+
// eslint-disable-next-line es/no-object-defineproperty -- safe
9+
var defineProperty = Object.defineProperty;
10+
var INCORRECT_VALUE = global.self !== global;
11+
12+
// `self` getter
13+
// https://html.spec.whatwg.org/multipage/window-object.html#dom-self
14+
try {
15+
if (DESCRIPTORS) {
16+
// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
17+
var descriptor = Object.getOwnPropertyDescriptor(global, 'self');
18+
// some engines have `self`, but with incorrect descriptor
19+
// https://github.com/denoland/deno/issues/15765
20+
if (INCORRECT_VALUE || !descriptor || !descriptor.get || !descriptor.enumerable) {
21+
defineBuiltInAccessor(global, 'self', {
22+
get: function self() {
23+
return global;
24+
},
25+
set: function self(value) {
26+
if (this !== global) throw $TypeError('Illegal invocation');
27+
defineProperty(global, 'self', {
28+
value: value,
29+
writable: true,
30+
configurable: true,
31+
enumerable: true
32+
});
33+
},
34+
configurable: true,
35+
enumerable: true
36+
});
37+
}
38+
} else $({ global: true, simple: true, forced: INCORRECT_VALUE }, {
39+
self: global
40+
});
41+
} catch (error) { /* empty */ }

packages/core-js/stable/self.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
require('../modules/web.self');
2+
var path = require('../internals/path');
3+
4+
module.exports = path.self;

packages/core-js/web/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ require('../modules/web.dom-exception.stack');
77
require('../modules/web.dom-exception.to-string-tag');
88
require('../modules/web.immediate');
99
require('../modules/web.queue-microtask');
10+
require('../modules/web.self');
1011
require('../modules/web.structured-clone');
1112
require('../modules/web.timers');
1213
require('../modules/web.url');

tests/commonjs.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,7 @@ for (PATH of ['core-js-pure', 'core-js']) {
584584
ok(typeof load(NS, 'dom-collections').iterator == 'function');
585585
ok(typeof load(NS, 'dom-collections/for-each') == 'function');
586586
ok(typeof load(NS, 'dom-collections/iterator') == 'function');
587+
ok(load(NS, 'self').Math === Math);
587588
ok(typeof load(NS, 'set-timeout') == 'function');
588589
ok(typeof load(NS, 'set-interval') == 'function');
589590
ok(typeof load(NS, 'set-immediate') == 'function');

tests/compat/tests.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1853,6 +1853,13 @@ GLOBAL.tests = {
18531853
'web.queue-microtask': function () {
18541854
return Object.getOwnPropertyDescriptor(GLOBAL, 'queueMicrotask').value;
18551855
},
1856+
'web.self': function () {
1857+
// eslint-disable-next-line no-restricted-globals -- safe
1858+
if (self !== GLOBAL) return false;
1859+
if (!DESCRIPTORS_SUPPORT) return true;
1860+
var descriptor = Object.getOwnPropertyDescriptor(GLOBAL, 'self');
1861+
return descriptor.get && descriptor.enumerable;
1862+
},
18561863
'web.set-immediate': IMMEDIATE,
18571864
'web.set-interval': TIMERS,
18581865
'web.set-timeout': TIMERS,

tests/pure/web.self.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import self from 'core-js-pure/stable/self';
2+
3+
QUnit.test('self', assert => {
4+
assert.same(self, Object(self), 'is object');
5+
assert.same(self.Math, Math, 'contains globals');
6+
});

tests/tests/web.self.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/* eslint-disable no-restricted-globals -- safe */
2+
import { DESCRIPTORS } from '../helpers/constants';
3+
4+
QUnit.test('self', assert => {
5+
assert.same(self, Object(self), 'is object');
6+
assert.same(self.Math, Math, 'contains globals');
7+
if (DESCRIPTORS) {
8+
const descriptor = Object.getOwnPropertyDescriptor(self, 'self');
9+
// can't be properly defined (non-configurable) in some ancient engines like PhantomJS
10+
// assert.isFunction(descriptor.get, 'a getter');
11+
// assert.true(descriptor.configurable, 'configurable');
12+
assert.true(descriptor.enumerable, 'enumerable');
13+
}
14+
});

0 commit comments

Comments
 (0)