tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

await-ns-define-own-property.js (7088B)


      1 // |reftest| async
      2 // This file was procedurally generated from the following sources:
      3 // - src/dynamic-import/ns-define-own-property.case
      4 // - src/dynamic-import/namespace/await.template
      5 /*---
      6 description: The [[DefineOwnProperty]] internal method returns `true` if no change is requested, and `false` otherwise. (value from await resolving)
      7 esid: sec-finishdynamicimport
      8 features: [Symbol.iterator, Reflect, Symbol, Symbol.toStringTag, dynamic-import]
      9 flags: [generated, async]
     10 info: |
     11    Runtime Semantics: FinishDynamicImport ( referencingScriptOrModule, specifier, promiseCapability, completion )
     12 
     13        1. If completion is an abrupt completion, ...
     14        2. Otherwise,
     15            ...
     16            d. Let namespace be GetModuleNamespace(moduleRecord).
     17            e. If namespace is an abrupt completion, perform ! Call(promiseCapability.[[Reject]], undefined, « namespace.[[Value]] »).
     18            f. Otherwise, perform ! Call(promiseCapability.[[Resolve]], undefined, « namespace.[[Value]] »).
     19 
     20    Runtime Semantics: GetModuleNamespace ( module )
     21 
     22        ...
     23        3. Let namespace be module.[[Namespace]].
     24        4. If namespace is undefined, then
     25            a. Let exportedNames be ? module.GetExportedNames(« »).
     26            b. Let unambiguousNames be a new empty List.
     27            c. For each name that is an element of exportedNames, do
     28                i. Let resolution be ? module.ResolveExport(name, « »).
     29                ii. If resolution is a ResolvedBinding Record, append name to unambiguousNames.
     30            d. Set namespace to ModuleNamespaceCreate(module, unambiguousNames).
     31        5. Return namespace.
     32 
     33    ModuleNamespaceCreate ( module, exports )
     34 
     35        ...
     36        4. Let M be a newly created object.
     37        5. Set M's essential internal methods to the definitions specified in 9.4.6.
     38        7. Let sortedExports be a new List containing the same values as the list exports where the
     39        values are ordered as if an Array of the same values had been sorted using Array.prototype.sort
     40        using undefined as comparefn.
     41        8. Set M.[[Exports]] to sortedExports.
     42        9. Create own properties of M corresponding to the definitions in 26.3.
     43        10. Set module.[[Namespace]] to M.
     44        11. Return M.
     45 
     46    26.3 Module Namespace Objects
     47 
     48        A Module Namespace Object is a module namespace exotic object that provides runtime
     49        property-based access to a module's exported bindings. There is no constructor function for
     50        Module Namespace Objects. Instead, such an object is created for each module that is imported
     51        by an ImportDeclaration that includes a NameSpaceImport.
     52 
     53        In addition to the properties specified in 9.4.6 each Module Namespace Object has the
     54        following own property:
     55 
     56    26.3.1 @@toStringTag
     57 
     58        The initial value of the @@toStringTag property is the String value "Module".
     59 
     60        This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
     61 
     62    Module Namespace Exotic Objects
     63 
     64        A module namespace object is an exotic object that exposes the bindings exported from an
     65        ECMAScript Module (See 15.2.3). There is a one-to-one correspondence between the String-keyed
     66        own properties of a module namespace exotic object and the binding names exported by the
     67        Module. The exported bindings include any bindings that are indirectly exported using export *
     68        export items. Each String-valued own property key is the StringValue of the corresponding
     69        exported binding name. These are the only String-keyed properties of a module namespace exotic
     70        object. Each such property has the attributes { [[Writable]]: true, [[Enumerable]]: true,
     71        [[Configurable]]: false }. Module namespace objects are not extensible.
     72 
     73 ---*/
     74 var sym = Symbol('test262');
     75 
     76 const exported = ['local1', 'renamed', 'indirect'];
     77 
     78 
     79 async function fn() {
     80    const ns = await import('./define-own-property_FIXTURE.js');
     81 
     82    // Non-existant properties.
     83 
     84    for (const key of ['local2', 0, sym, Symbol.iterator]) {
     85      assert.sameValue(
     86        Reflect.defineProperty(ns, key, {}),
     87        false,
     88        'Reflect.defineProperty: ' + key.toString()
     89      );
     90      assert.throws(TypeError, function() {
     91        Object.defineProperty(ns, key, {});
     92      }, 'Object.defineProperty: ' + key.toString());
     93    }
     94 
     95    // Own properties. No change requested.
     96 
     97    for (const key of ([...exported, Symbol.toStringTag])) {
     98      assert.sameValue(
     99        Reflect.defineProperty(ns, key, {}),
    100        true,
    101        `No change requested, Reflect.defineProperty: ${key.toString()}`
    102      );
    103      assert.sameValue(
    104        Object.defineProperty(ns, key, {}),
    105        ns,
    106        `No change requested, Object.defineProperty: ${key.toString()}`
    107      );
    108 
    109    }
    110 
    111    assert.sameValue(
    112      Reflect.defineProperty(ns, 'indirect',
    113          {writable: true, enumerable: true, configurable: false}),
    114      true,
    115      'Reflect.defineProperty: indirect'
    116    );
    117    assert.sameValue(
    118      Object.defineProperty(ns, 'indirect',
    119          {writable: true, enumerable: true, configurable: false}),
    120      ns,
    121      'Object.defineProperty: indirect'
    122    );
    123 
    124    assert.sameValue(
    125      Reflect.defineProperty(ns, Symbol.toStringTag,
    126          {value: "Module", writable: false, enumerable: false,
    127           configurable: false}),
    128      true,
    129      'Reflect.defineProperty: Symbol.toStringTag'
    130    );
    131    assert.sameValue(
    132      Object.defineProperty(ns, Symbol.toStringTag,
    133          {value: "Module", writable: false, enumerable: false,
    134           configurable: false}),
    135      ns,
    136      'Object.defineProperty: Symbol.toStringTag'
    137    );
    138 
    139 
    140    // Own properties. Change requested.
    141 
    142    for (const key of ([...exported, Symbol.toStringTag])) {
    143      assert.sameValue(
    144        Reflect.defineProperty(ns, key, {value: 123}),
    145        false,
    146        `Change requested, Reflect.defineProperty: ${key.toString()}`
    147      );
    148      assert.throws(TypeError, function() {
    149        Object.defineProperty(ns, key, {value: 123});
    150      }, `Change requested, Object.defineProperty: ${key.toString()}`);
    151    }
    152 
    153    assert.sameValue(
    154      Reflect.defineProperty(ns, 'indirect',
    155          {writable: true, enumerable: true, configurable: true}),
    156      false,
    157      'Reflect.defineProperty: indirect'
    158    );
    159    assert.throws(TypeError, function() {
    160      Object.defineProperty(ns, 'indirect',
    161          {writable: true, enumerable: true, configurable: true});
    162    }, 'Object.defineProperty: indirect');
    163 
    164    assert.sameValue(
    165      Reflect.defineProperty(ns, Symbol.toStringTag,
    166          {value: "module", writable: false, enumerable: false,
    167           configurable: false}),
    168      false,
    169      'Reflect.defineProperty: Symbol.toStringTag'
    170    );
    171    assert.throws(TypeError, function() {
    172      Object.defineProperty(ns, Symbol.toStringTag,
    173          {value: "module", writable: false, enumerable: false,
    174           configurable: false});
    175    }, 'Object.defineProperty: Symbol.toStringTag');
    176 }
    177 
    178 fn().then($DONE, $DONE).catch($DONE);