index.html 99 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088
  1. <!doctype html>
  2. <head><meta charset="utf-8">
  3. <title>Metadata Proposal - ECMAScript</title>
  4. <link rel="stylesheet" href="ecmarkup.css">
  5. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.4/styles/github.min.css">
  6. <script src="ecmarkup.js"></script>
  7. <script>
  8. if (location.hostname === 'rbuckton.github.io' && location.protocol !== 'https:') {
  9. location.protocol = 'https:';
  10. }
  11. </script>
  12. <script type="application/json" id="menu-search-biblio">[{"type":"clause","id":"introduction","aoid":null,"title":"Metadata Proposal - ECMAScript","titleHTML":"Metadata Proposal - ECMAScript","number":"","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Metadata Proposal - ECMAScript"},{"type":"clause","id":"syntax","aoid":null,"title":"Syntax","titleHTML":"Syntax","number":"1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Syntax"},{"type":"op","aoid":"GetOrCreateMetadataMap","refId":"getorcreatemetadatamap","location":"","referencingIds":[],"key":"GetOrCreateMetadataMap"},{"type":"clause","id":"getorcreatemetadatamap","aoid":"GetOrCreateMetadataMap","title":"GetOrCreateMetadataMap ( O, P, Create )","titleHTML":"GetOrCreateMetadataMap ( O, P, Create )","number":"2.1.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_8","_ref_17","_ref_22","_ref_42","_ref_52"],"key":"GetOrCreateMetadataMap ( O, P, Create )"},{"type":"clause","id":"operations-on-objects","aoid":null,"title":"Operations on Objects","titleHTML":"Operations on Objects","number":"2.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Operations on Objects"},{"type":"clause","id":"abstract-operations","aoid":null,"title":"Abstract Operations","titleHTML":"Abstract Operations","number":"2","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Abstract Operations"},{"type":"op","aoid":"OrdinaryHasMetadata","refId":"ordinaryhasmetadata","location":"","referencingIds":[],"key":"OrdinaryHasMetadata"},{"type":"clause","id":"ordinaryhasmetadata","aoid":"OrdinaryHasMetadata","title":"OrdinaryHasMetadata ( MetadataKey, O, P )","titleHTML":"OrdinaryHasMetadata ( MetadataKey, O, P )","number":"3.1.1.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_3"],"key":"OrdinaryHasMetadata ( MetadataKey, O, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-hasmetadata","aoid":null,"title":"[[HasMetadata]] ( MetadataKey, P )","titleHTML":"[[HasMetadata]] ( MetadataKey, P )","number":"3.1.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[HasMetadata]] ( MetadataKey, P )"},{"type":"op","aoid":"OrdinaryHasOwnMetadata","refId":"ordinaryhasownmetadata","location":"","referencingIds":[],"key":"OrdinaryHasOwnMetadata"},{"type":"clause","id":"ordinaryhasownmetadata","aoid":"OrdinaryHasOwnMetadata","title":"OrdinaryHasOwnMetadata ( MetadataKey, O, P )","titleHTML":"OrdinaryHasOwnMetadata ( MetadataKey, O, P )","number":"3.1.2.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_5","_ref_6","_ref_13"],"key":"OrdinaryHasOwnMetadata ( MetadataKey, O, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-hasownmetadata","aoid":null,"title":"[[HasOwnMetadata]] ( MetadataKey, P )","titleHTML":"[[HasOwnMetadata]] ( MetadataKey, P )","number":"3.1.2","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[HasOwnMetadata]] ( MetadataKey, P )"},{"type":"op","aoid":"OrdinaryGetMetadata","refId":"ordinarygetmetadata","location":"","referencingIds":[],"key":"OrdinaryGetMetadata"},{"type":"clause","id":"ordinarygetmetadata","aoid":"OrdinaryGetMetadata","title":"OrdinaryGetMetadata ( MetadataKey, O, P )","titleHTML":"OrdinaryGetMetadata ( MetadataKey, O, P )","number":"3.1.3.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_11"],"key":"OrdinaryGetMetadata ( MetadataKey, O, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-getmetadata","aoid":null,"title":"[[GetMetadata]] ( MetadataKey, P )","titleHTML":"[[GetMetadata]] ( MetadataKey, P )","number":"3.1.3","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[GetMetadata]] ( MetadataKey, P )"},{"type":"op","aoid":"OrdinaryGetOwnMetadata","refId":"ordinarygetownmetadata","location":"","referencingIds":[],"key":"OrdinaryGetOwnMetadata"},{"type":"clause","id":"ordinarygetownmetadata","aoid":"OrdinaryGetOwnMetadata","title":"OrdinaryGetOwnMetadata ( MetadataKey, O, P )","titleHTML":"OrdinaryGetOwnMetadata ( MetadataKey, O, P )","number":"3.1.4.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_14","_ref_15"],"key":"OrdinaryGetOwnMetadata ( MetadataKey, O, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-getownmetadata","aoid":null,"title":"[[GetOwnMetadata]] ( MetadataKey, P, ParamIndex )","titleHTML":"[[GetOwnMetadata]] ( MetadataKey, P, ParamIndex )","number":"3.1.4","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[GetOwnMetadata]] ( MetadataKey, P, ParamIndex )"},{"type":"op","aoid":"OrdinaryDefineOwnMetadata","refId":"ordinarydefineownmetadata","location":"","referencingIds":[],"key":"OrdinaryDefineOwnMetadata"},{"type":"clause","id":"ordinarydefineownmetadata","aoid":"OrdinaryDefineOwnMetadata","title":"OrdinaryDefineOwnMetadata ( MetadataKey, MetadataValue, O, P )","titleHTML":"OrdinaryDefineOwnMetadata ( MetadataKey, MetadataValue, O, P )","number":"3.1.5.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_19"],"key":"OrdinaryDefineOwnMetadata ( MetadataKey, MetadataValue, O, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-defineownmetadata","aoid":null,"title":"[[DefineOwnMetadata]] ( MetadataKey, MetadataValue, P )","titleHTML":"[[DefineOwnMetadata]] ( MetadataKey, MetadataValue, P )","number":"3.1.5","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[DefineOwnMetadata]] ( MetadataKey, MetadataValue, P )"},{"type":"op","aoid":"OrdinaryMetadataKeys","refId":"ordinarymetadatakeys","location":"","referencingIds":[],"key":"OrdinaryMetadataKeys"},{"type":"clause","id":"ordinarymetadatakeys","aoid":"OrdinaryMetadataKeys","title":"OrdinaryMetadataKeys ( O, P )","titleHTML":"OrdinaryMetadataKeys ( O, P )","number":"3.1.6.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_24"],"key":"OrdinaryMetadataKeys ( O, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-metadatakeys","aoid":null,"title":"[[MetadataKeys]] ( P )","titleHTML":"[[MetadataKeys]] ( P )","number":"3.1.6","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[MetadataKeys]] ( P )"},{"type":"op","aoid":"OrdinaryOwnMetadataKeys","refId":"ordinaryownmetadatakeys","location":"","referencingIds":[],"key":"OrdinaryOwnMetadataKeys"},{"type":"clause","id":"ordinaryownmetadatakeys","aoid":"OrdinaryOwnMetadataKeys","title":"OrdinaryOwnMetadataKeys ( O, P )","titleHTML":"OrdinaryOwnMetadataKeys ( O, P )","number":"3.1.7.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_26","_ref_39"],"key":"OrdinaryOwnMetadataKeys ( O, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-ownmetadatakeys","aoid":null,"title":"[[OwnMetadataKeys]] ( P )","titleHTML":"[[OwnMetadataKeys]] ( P )","number":"3.1.7","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[OwnMetadataKeys]] ( P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-deletemetadata","aoid":null,"title":"[[DeleteMetadata]]( MetadataKey, P )","titleHTML":"[[DeleteMetadata]]( MetadataKey, P )","number":"3.1.8","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[DeleteMetadata]]( MetadataKey, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots","aoid":null,"title":"Ordinary Object Internal Methods and Internal Slots","titleHTML":"Ordinary Object Internal Methods and Internal Slots","number":"3.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Ordinary Object Internal Methods and Internal Slots"},{"type":"clause","id":"ordinary-and-exotic-objects-behaviors","aoid":null,"title":"Ordinary and Exotic Objects Behaviors","titleHTML":"Ordinary and Exotic Objects Behaviors","number":"3","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Ordinary and Exotic Objects Behaviors"},{"type":"clause","id":"reflect-metadatadecoratorfunctions","aoid":null,"title":"Metadata Decorator Functions","titleHTML":"Metadata Decorator Functions","number":"4.1.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Metadata Decorator Functions"},{"type":"clause","id":"reflect.metadata","aoid":null,"title":"Reflect.metadata ( metadataKey, metadataValue )","titleHTML":"Reflect.metadata ( metadataKey, metadataValue )","number":"4.1.2","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.metadata ( metadataKey, metadataValue )"},{"type":"clause","id":"reflect.definemetadata","aoid":null,"title":"Reflect.defineMetadata ( metadataKey, metadataValue, target [, propertyKey] )","titleHTML":"Reflect.defineMetadata ( metadataKey, metadataValue, target [, propertyKey] )","number":"4.1.3","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.defineMetadata ( metadataKey, metadataValue, target [, propertyKey] )"},{"type":"clause","id":"reflect.hasmetadata","aoid":null,"title":"Reflect.hasMetadata ( metadataKey, target [, propertyKey] )","titleHTML":"Reflect.hasMetadata ( metadataKey, target [, propertyKey] )","number":"4.1.4","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.hasMetadata ( metadataKey, target [, propertyKey] )"},{"type":"clause","id":"reflect.hasownmetadata","aoid":null,"title":"Reflect.hasOwnMetadata ( metadataKey, target [, propertyKey] )","titleHTML":"Reflect.hasOwnMetadata ( metadataKey, target [, propertyKey] )","number":"4.1.5","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.hasOwnMetadata ( metadataKey, target [, propertyKey] )"},{"type":"clause","id":"reflect.getmetadata","aoid":null,"title":"Reflect.getMetadata ( metadataKey, target [, propertyKey] )","titleHTML":"Reflect.getMetadata ( metadataKey, target [, propertyKey] )","number":"4.1.6","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.getMetadata ( metadataKey, target [, propertyKey] )"},{"type":"clause","id":"reflect.getownmetadata","aoid":null,"title":"Reflect.getOwnMetadata ( metadataKey, target [, propertyKey] )","titleHTML":"Reflect.getOwnMetadata ( metadataKey, target [, propertyKey] )","number":"4.1.7","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.getOwnMetadata ( metadataKey, target [, propertyKey] )"},{"type":"clause","id":"reflect.getmetadatakeys","aoid":null,"title":"Reflect.getMetadataKeys ( target [, propertyKey] )","titleHTML":"Reflect.getMetadataKeys ( target [, propertyKey] )","number":"4.1.8","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.getMetadataKeys ( target [, propertyKey] )"},{"type":"clause","id":"reflect.getownmetadatakeys","aoid":null,"title":"Reflect.getOwnMetadataKeys ( target [, propertyKey] )","titleHTML":"Reflect.getOwnMetadataKeys ( target [, propertyKey] )","number":"4.1.9","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.getOwnMetadataKeys ( target [, propertyKey] )"},{"type":"clause","id":"reflect.deletemetadata","aoid":null,"title":"Reflect.deleteMetadata ( metadataKey, target [, propertyKey] )","titleHTML":"Reflect.deleteMetadata ( metadataKey, target [, propertyKey] )","number":"4.1.10","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.deleteMetadata ( metadataKey, target [, propertyKey] )"},{"type":"clause","id":"reflect","aoid":null,"title":"The Reflect Object","titleHTML":"The Reflect Object","number":"4.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"The Reflect Object"},{"type":"clause","id":"reflection","aoid":null,"title":"Reflection","titleHTML":"Reflection","number":"4","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflection"}]</script><script>"use strict";
  13. function Search(menu) {
  14. this.menu = menu;
  15. this.$search = document.getElementById('menu-search');
  16. this.$searchBox = document.getElementById('menu-search-box');
  17. this.$searchResults = document.getElementById('menu-search-results');
  18. this.loadBiblio();
  19. document.addEventListener('keydown', this.documentKeydown.bind(this));
  20. this.$searchBox.addEventListener('keydown', debounce(this.searchBoxKeydown.bind(this), { stopPropagation: true }));
  21. this.$searchBox.addEventListener('keyup', debounce(this.searchBoxKeyup.bind(this), { stopPropagation: true }));
  22. }
  23. Search.prototype.loadBiblio = function () {
  24. var $biblio = document.getElementById('menu-search-biblio');
  25. if (!$biblio) {
  26. this.biblio = [];
  27. } else {
  28. this.biblio = JSON.parse($biblio.textContent);
  29. this.biblio.clauses = this.biblio.filter(function (e) { return e.type === 'clause' });
  30. this.biblio.byId = this.biblio.reduce(function (map, entry) {
  31. map[entry.id] = entry;
  32. return map;
  33. }, {});
  34. }
  35. }
  36. Search.prototype.documentKeydown = function (e) {
  37. if (e.keyCode === 191) {
  38. e.preventDefault();
  39. e.stopPropagation();
  40. this.triggerSearch();
  41. }
  42. }
  43. Search.prototype.searchBoxKeydown = function (e) {
  44. e.stopPropagation();
  45. e.preventDefault();
  46. if (e.keyCode === 191 && e.target.value.length === 0) {
  47. e.preventDefault();
  48. } else if (e.keyCode === 13) {
  49. e.preventDefault();
  50. this.selectResult();
  51. }
  52. }
  53. Search.prototype.searchBoxKeyup = function (e) {
  54. if (e.keyCode === 13 || e.keyCode === 9) {
  55. return;
  56. }
  57. this.search(e.target.value);
  58. }
  59. Search.prototype.triggerSearch = function (e) {
  60. if (this.menu.isVisible()) {
  61. this._closeAfterSearch = false;
  62. } else {
  63. this._closeAfterSearch = true;
  64. this.menu.show();
  65. }
  66. this.$searchBox.focus();
  67. this.$searchBox.select();
  68. }
  69. // bit 12 - Set if the result starts with searchString
  70. // bits 8-11: 8 - number of chunks multiplied by 2 if cases match, otherwise 1.
  71. // bits 1-7: 127 - length of the entry
  72. // General scheme: prefer case sensitive matches with fewer chunks, and otherwise
  73. // prefer shorter matches.
  74. function relevance(result, searchString) {
  75. var relevance = 0;
  76. relevance = Math.max(0, 8 - result.match.chunks) << 7;
  77. if (result.match.caseMatch) {
  78. relevance *= 2;
  79. }
  80. if (result.match.prefix) {
  81. relevance += 2048
  82. }
  83. relevance += Math.max(0, 255 - result.entry.key.length);
  84. return relevance;
  85. }
  86. Search.prototype.search = function (searchString) {
  87. var s = Date.now();
  88. if (searchString === '') {
  89. this.displayResults([]);
  90. this.hideSearch();
  91. return;
  92. } else {
  93. this.showSearch();
  94. }
  95. if (searchString.length === 1) {
  96. this.displayResults([]);
  97. return;
  98. }
  99. var results;
  100. if (/^[\d\.]*$/.test(searchString)) {
  101. results = this.biblio.clauses.filter(function (clause) {
  102. return clause.number.substring(0, searchString.length) === searchString;
  103. }).map(function (clause) {
  104. return { entry: clause };
  105. });
  106. } else {
  107. results = [];
  108. for (var i = 0; i < this.biblio.length; i++) {
  109. var entry = this.biblio[i];
  110. if (!entry.key) {
  111. // biblio entries without a key aren't searchable
  112. continue;
  113. }
  114. var match = fuzzysearch(searchString, entry.key);
  115. if (match) {
  116. results.push({ entry: entry, match: match });
  117. }
  118. }
  119. results.forEach(function (result) {
  120. result.relevance = relevance(result, searchString);
  121. });
  122. results = results.sort(function (a, b) { return b.relevance - a.relevance });
  123. }
  124. if (results.length > 50) {
  125. results = results.slice(0, 50);
  126. }
  127. this.displayResults(results);
  128. }
  129. Search.prototype.hideSearch = function () {
  130. this.$search.classList.remove('active');
  131. }
  132. Search.prototype.showSearch = function () {
  133. this.$search.classList.add('active');
  134. }
  135. Search.prototype.selectResult = function () {
  136. var $first = this.$searchResults.querySelector('li:first-child a');
  137. if ($first) {
  138. document.location = $first.getAttribute('href');
  139. }
  140. this.$searchBox.value = '';
  141. this.$searchBox.blur();
  142. this.displayResults([]);
  143. this.hideSearch();
  144. if (this._closeAfterSearch) {
  145. this.menu.hide();
  146. }
  147. }
  148. Search.prototype.displayResults = function (results) {
  149. if (results.length > 0) {
  150. this.$searchResults.classList.remove('no-results');
  151. var html = '<ul>';
  152. results.forEach(function (result) {
  153. var entry = result.entry;
  154. var id = entry.id;
  155. var cssClass = '';
  156. var text = '';
  157. if (entry.type === 'clause') {
  158. var number = entry.number ? entry.number + ' ' : '';
  159. text = number + entry.key;
  160. cssClass = 'clause';
  161. id = entry.id;
  162. } else if (entry.type === 'production') {
  163. text = entry.key;
  164. cssClass = 'prod';
  165. id = entry.id;
  166. } else if (entry.type === 'op') {
  167. text = entry.key;
  168. cssClass = 'op';
  169. id = entry.id || entry.refId;
  170. } else if (entry.type === 'term') {
  171. text = entry.key;
  172. cssClass = 'term';
  173. id = entry.id || entry.refId;
  174. }
  175. if (text) {
  176. html += '<li class=menu-search-result-' + cssClass + '><a href="#' + id + '">' + text + '</a></li>'
  177. }
  178. });
  179. html += '</ul>'
  180. this.$searchResults.innerHTML = html;
  181. } else {
  182. this.$searchResults.innerHTML = '';
  183. this.$searchResults.classList.add('no-results');
  184. }
  185. }
  186. function Menu() {
  187. this.$toggle = document.getElementById('menu-toggle');
  188. this.$menu = document.getElementById('menu');
  189. this.$toc = document.querySelector('menu-toc > ol');
  190. this.$pins = document.querySelector('#menu-pins');
  191. this.$pinList = document.getElementById('menu-pins-list');
  192. this.$toc = document.querySelector('#menu-toc > ol');
  193. this.$specContainer = document.getElementById('spec-container');
  194. this.search = new Search(this);
  195. this._pinnedIds = {};
  196. this.loadPinEntries();
  197. // toggle menu
  198. this.$toggle.addEventListener('click', this.toggle.bind(this));
  199. // keydown events for pinned clauses
  200. document.addEventListener('keydown', this.documentKeydown.bind(this));
  201. // toc expansion
  202. var tocItems = this.$menu.querySelectorAll('#menu-toc li');
  203. for (var i = 0; i < tocItems.length; i++) {
  204. var $item = tocItems[i];
  205. $item.addEventListener('click', function($item, event) {
  206. $item.classList.toggle('active');
  207. event.stopPropagation();
  208. }.bind(null, $item));
  209. }
  210. // close toc on toc item selection
  211. var tocLinks = this.$menu.querySelectorAll('#menu-toc li > a');
  212. for (var i = 0; i < tocLinks.length; i++) {
  213. var $link = tocLinks[i];
  214. $link.addEventListener('click', function(event) {
  215. this.toggle();
  216. event.stopPropagation();
  217. }.bind(this));
  218. }
  219. // update active clause on scroll
  220. window.addEventListener('scroll', debounce(this.updateActiveClause.bind(this)));
  221. this.updateActiveClause();
  222. // prevent menu scrolling from scrolling the body
  223. this.$toc.addEventListener('wheel', function (e) {
  224. var target = e.currentTarget;
  225. var offTop = e.deltaY < 0 && target.scrollTop === 0;
  226. if (offTop) {
  227. e.preventDefault();
  228. }
  229. var offBottom = e.deltaY > 0
  230. && target.offsetHeight + target.scrollTop >= target.scrollHeight;
  231. if (offBottom) {
  232. e.preventDefault();
  233. }
  234. })
  235. }
  236. Menu.prototype.documentKeydown = function (e) {
  237. e.stopPropagation();
  238. if (e.keyCode === 80) {
  239. this.togglePinEntry();
  240. } else if (e.keyCode > 48 && e.keyCode < 58) {
  241. this.selectPin(e.keyCode - 49);
  242. }
  243. }
  244. Menu.prototype.updateActiveClause = function () {
  245. this.setActiveClause(findActiveClause(this.$specContainer))
  246. }
  247. Menu.prototype.setActiveClause = function (clause) {
  248. this.$activeClause = clause;
  249. this.revealInToc(this.$activeClause);
  250. }
  251. Menu.prototype.revealInToc = function (path) {
  252. var current = this.$toc.querySelectorAll('li.revealed');
  253. for (var i = 0; i < current.length; i++) {
  254. current[i].classList.remove('revealed');
  255. current[i].classList.remove('revealed-leaf');
  256. }
  257. var current = this.$toc;
  258. var index = 0;
  259. while (index < path.length) {
  260. var children = current.children;
  261. for (var i = 0; i < children.length; i++) {
  262. if ('#' + path[index].id === children[i].children[1].getAttribute('href') ) {
  263. children[i].classList.add('revealed');
  264. if (index === path.length - 1) {
  265. children[i].classList.add('revealed-leaf');
  266. var rect = children[i].getBoundingClientRect();
  267. this.$toc.getBoundingClientRect().top
  268. var tocRect = this.$toc.getBoundingClientRect();
  269. if (rect.top + 10 > tocRect.bottom) {
  270. this.$toc.scrollTop = this.$toc.scrollTop + (rect.top - tocRect.bottom) + (rect.bottom - rect.top);
  271. } else if (rect.top < tocRect.top) {
  272. this.$toc.scrollTop = this.$toc.scrollTop - (tocRect.top - rect.top);
  273. }
  274. }
  275. current = children[i].querySelector('ol');
  276. index++;
  277. break;
  278. }
  279. }
  280. }
  281. }
  282. function findActiveClause(root, path) {
  283. var clauses = new ClauseWalker(root);
  284. var $clause;
  285. var found = false;
  286. var path = path || [];
  287. while ($clause = clauses.nextNode()) {
  288. var rect = $clause.getBoundingClientRect();
  289. var $header = $clause.children[0];
  290. var marginTop = parseInt(getComputedStyle($header)["margin-top"]);
  291. if ((rect.top - marginTop) <= 0 && rect.bottom > 0) {
  292. found = true;
  293. return findActiveClause($clause, path.concat($clause)) || path;
  294. }
  295. }
  296. return path;
  297. }
  298. function ClauseWalker(root) {
  299. var previous;
  300. var treeWalker = document.createTreeWalker(
  301. root,
  302. NodeFilter.SHOW_ELEMENT,
  303. {
  304. acceptNode: function (node) {
  305. if (previous === node.parentNode) {
  306. return NodeFilter.FILTER_REJECT;
  307. } else {
  308. previous = node;
  309. }
  310. if (node.nodeName === 'EMU-CLAUSE' || node.nodeName === 'EMU-INTRO' || node.nodeName === 'EMU-ANNEX') {
  311. return NodeFilter.FILTER_ACCEPT;
  312. } else {
  313. return NodeFilter.FILTER_SKIP;
  314. }
  315. }
  316. },
  317. false
  318. );
  319. return treeWalker;
  320. }
  321. Menu.prototype.toggle = function () {
  322. this.$menu.classList.toggle('active');
  323. }
  324. Menu.prototype.show = function () {
  325. this.$menu.classList.add('active');
  326. }
  327. Menu.prototype.hide = function () {
  328. this.$menu.classList.remove('active');
  329. }
  330. Menu.prototype.isVisible = function() {
  331. return this.$menu.classList.contains('active');
  332. }
  333. Menu.prototype.showPins = function () {
  334. this.$pins.classList.add('active');
  335. }
  336. Menu.prototype.hidePins = function () {
  337. this.$pins.classList.remove('active');
  338. }
  339. Menu.prototype.addPinEntry = function (id) {
  340. var entry = this.search.biblio.byId[id];
  341. if (!entry) {
  342. // id was deleted after pin (or something) so remove it
  343. delete this._pinnedIds[id];
  344. this.persistPinEntries();
  345. return;
  346. }
  347. if (entry.type === 'clause') {
  348. var prefix;
  349. if (entry.number) {
  350. prefix = entry.number + ' ';
  351. } else {
  352. prefix = '';
  353. }
  354. this.$pinList.innerHTML += '<li><a href="#' + entry.id + '">' + prefix + entry.titleHTML + '</a></li>';
  355. } else {
  356. this.$pinList.innerHTML += '<li><a href="#' + entry.id + '">' + entry.key + '</a></li>';
  357. }
  358. if (Object.keys(this._pinnedIds).length === 0) {
  359. this.showPins();
  360. }
  361. this._pinnedIds[id] = true;
  362. this.persistPinEntries();
  363. }
  364. Menu.prototype.removePinEntry = function (id) {
  365. var item = this.$pinList.querySelector('a[href="#' + id + '"]').parentNode;
  366. this.$pinList.removeChild(item);
  367. delete this._pinnedIds[id];
  368. if (Object.keys(this._pinnedIds).length === 0) {
  369. this.hidePins();
  370. }
  371. this.persistPinEntries();
  372. }
  373. Menu.prototype.persistPinEntries = function () {
  374. try {
  375. if (!window.localStorage) return;
  376. } catch (e) {
  377. return;
  378. }
  379. localStorage.pinEntries = JSON.stringify(Object.keys(this._pinnedIds));
  380. }
  381. Menu.prototype.loadPinEntries = function () {
  382. try {
  383. if (!window.localStorage) return;
  384. } catch (e) {
  385. return;
  386. }
  387. var pinsString = window.localStorage.pinEntries;
  388. if (!pinsString) return;
  389. var pins = JSON.parse(pinsString);
  390. for(var i = 0; i < pins.length; i++) {
  391. this.addPinEntry(pins[i]);
  392. }
  393. }
  394. Menu.prototype.togglePinEntry = function (id) {
  395. if (!id) {
  396. id = this.$activeClause[this.$activeClause.length - 1].id;
  397. }
  398. if (this._pinnedIds[id]) {
  399. this.removePinEntry(id);
  400. } else {
  401. this.addPinEntry(id);
  402. }
  403. }
  404. Menu.prototype.selectPin = function (num) {
  405. document.location = this.$pinList.children[num].children[0].href;
  406. }
  407. var menu;
  408. function init() {
  409. menu = new Menu();
  410. var $container = document.getElementById('spec-container');
  411. $container.addEventListener('mouseover', debounce(function (e) {
  412. Toolbox.activateIfMouseOver(e);
  413. }));
  414. }
  415. document.addEventListener('DOMContentLoaded', init);
  416. function debounce(fn, opts) {
  417. opts = opts || {};
  418. var timeout;
  419. return function(e) {
  420. if (opts.stopPropagation) {
  421. e.stopPropagation();
  422. }
  423. var args = arguments;
  424. if (timeout) {
  425. clearTimeout(timeout);
  426. }
  427. timeout = setTimeout(function() {
  428. timeout = null;
  429. fn.apply(this, args);
  430. }.bind(this), 150);
  431. }
  432. }
  433. var CLAUSE_NODES = ['EMU-CLAUSE', 'EMU-INTRO', 'EMU-ANNEX'];
  434. function findLocalReferences ($elem) {
  435. var name = $elem.innerHTML;
  436. var references = [];
  437. var parentClause = $elem.parentNode;
  438. while (parentClause && CLAUSE_NODES.indexOf(parentClause.nodeName) === -1) {
  439. parentClause = parentClause.parentNode;
  440. }
  441. if(!parentClause) return;
  442. var vars = parentClause.querySelectorAll('var');
  443. for (var i = 0; i < vars.length; i++) {
  444. var $var = vars[i];
  445. if ($var.innerHTML === name) {
  446. references.push($var);
  447. }
  448. }
  449. return references;
  450. }
  451. function toggleFindLocalReferences($elem) {
  452. var references = findLocalReferences($elem);
  453. if ($elem.classList.contains('referenced')) {
  454. references.forEach(function ($reference) {
  455. $reference.classList.remove('referenced');
  456. });
  457. } else {
  458. references.forEach(function ($reference) {
  459. $reference.classList.add('referenced');
  460. });
  461. }
  462. }
  463. function installFindLocalReferences () {
  464. document.addEventListener('click', function (e) {
  465. if (e.target.nodeName === 'VAR') {
  466. toggleFindLocalReferences(e.target);
  467. }
  468. });
  469. }
  470. document.addEventListener('DOMContentLoaded', installFindLocalReferences);
  471. // The following license applies to the fuzzysearch function
  472. // The MIT License (MIT)
  473. // Copyright © 2015 Nicolas Bevacqua
  474. // Copyright © 2016 Brian Terlson
  475. // Permission is hereby granted, free of charge, to any person obtaining a copy of
  476. // this software and associated documentation files (the "Software"), to deal in
  477. // the Software without restriction, including without limitation the rights to
  478. // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  479. // the Software, and to permit persons to whom the Software is furnished to do so,
  480. // subject to the following conditions:
  481. // The above copyright notice and this permission notice shall be included in all
  482. // copies or substantial portions of the Software.
  483. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  484. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  485. // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  486. // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  487. // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  488. // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  489. function fuzzysearch (searchString, haystack, caseInsensitive) {
  490. var tlen = haystack.length;
  491. var qlen = searchString.length;
  492. var chunks = 1;
  493. var finding = false;
  494. var prefix = true;
  495. if (qlen > tlen) {
  496. return false;
  497. }
  498. if (qlen === tlen) {
  499. if (searchString === haystack) {
  500. return { caseMatch: true, chunks: 1, prefix: true };
  501. } else if (searchString.toLowerCase() === haystack.toLowerCase()) {
  502. return { caseMatch: false, chunks: 1, prefix: true };
  503. } else {
  504. return false;
  505. }
  506. }
  507. outer: for (var i = 0, j = 0; i < qlen; i++) {
  508. var nch = searchString[i];
  509. while (j < tlen) {
  510. var targetChar = haystack[j++];
  511. if (targetChar === nch) {
  512. finding = true;
  513. continue outer;
  514. }
  515. if (finding) {
  516. chunks++;
  517. finding = false;
  518. }
  519. }
  520. if (caseInsensitive) { return false }
  521. return fuzzysearch(searchString.toLowerCase(), haystack.toLowerCase(), true);
  522. }
  523. return { caseMatch: !caseInsensitive, chunks: chunks, prefix: j <= qlen };
  524. }
  525. var Toolbox = {
  526. init: function () {
  527. this.$container = document.createElement('div');
  528. this.$container.classList.add('toolbox');
  529. this.$permalink = document.createElement('a');
  530. this.$permalink.textContent = 'Permalink';
  531. this.$pinLink = document.createElement('a');
  532. this.$pinLink.textContent = 'Pin';
  533. this.$pinLink.setAttribute('href', '#');
  534. this.$pinLink.addEventListener('click', function (e) {
  535. e.preventDefault();
  536. e.stopPropagation();
  537. menu.togglePinEntry(this.entry.id);
  538. }.bind(this));
  539. this.$refsLink = document.createElement('a');
  540. this.$refsLink.setAttribute('href', '#');
  541. this.$refsLink.addEventListener('click', function (e) {
  542. e.preventDefault();
  543. e.stopPropagation();
  544. referencePane.showReferencesFor(this.entry);
  545. }.bind(this));
  546. this.$container.appendChild(this.$permalink);
  547. this.$container.appendChild(this.$pinLink);
  548. this.$container.appendChild(this.$refsLink);
  549. document.body.appendChild(this.$container);
  550. },
  551. activate: function (el, entry, target) {
  552. if (el === this._activeEl) return;
  553. this.active = true;
  554. this.entry = entry;
  555. this.$container.classList.add('active');
  556. this.top = el.offsetTop - this.$container.offsetHeight - 10;
  557. this.left = el.offsetLeft;
  558. this.$container.setAttribute('style', 'left: ' + this.left + 'px; top: ' + this.top + 'px');
  559. this.updatePermalink();
  560. this.updateReferences();
  561. this._activeEl = el;
  562. if (this.top < document.body.scrollTop && el === target) {
  563. // don't scroll unless it's a small thing (< 200px)
  564. this.$container.scrollIntoView();
  565. }
  566. },
  567. updatePermalink: function () {
  568. this.$permalink.setAttribute('href', '#' + this.entry.id);
  569. },
  570. updateReferences: function () {
  571. this.$refsLink.textContent = 'References (' + this.entry.referencingIds.length + ')';
  572. },
  573. activateIfMouseOver: function (e) {
  574. var ref = this.findReferenceUnder(e.target);
  575. if (ref && (!this.active || e.pageY > this._activeEl.offsetTop)) {
  576. var entry = menu.search.biblio.byId[ref.id];
  577. this.activate(ref.element, entry, e.target);
  578. } else if (this.active && ((e.pageY < this.top) || e.pageY > (this._activeEl.offsetTop + this._activeEl.offsetHeight))) {
  579. this.deactivate();
  580. }
  581. },
  582. findReferenceUnder: function (el) {
  583. while (el) {
  584. var parent = el.parentNode;
  585. if (el.nodeName === 'H1' && parent.nodeName.match(/EMU-CLAUSE|EMU-ANNEX|EMU-INTRO/) && parent.id) {
  586. return { element: el, id: parent.id };
  587. } else if (el.nodeName.match(/EMU-(?!CLAUSE|XREF|ANNEX|INTRO)|DFN/) &&
  588. el.id && el.id[0] !== '_') {
  589. if (el.nodeName === 'EMU-FIGURE' || el.nodeName === 'EMU-TABLE' || el.nodeName === 'EMU-EXAMPLE') {
  590. // return the figcaption element
  591. return { element: el.children[0].children[0], id: el.id };
  592. } else if (el.nodeName === 'EMU-PRODUCTION') {
  593. // return the LHS non-terminal element
  594. return { element: el.children[0], id: el.id };
  595. } else {
  596. return { element: el, id: el.id };
  597. }
  598. }
  599. el = parent;
  600. }
  601. },
  602. deactivate: function () {
  603. this.$container.classList.remove('active');
  604. this._activeEl = null;
  605. this.activeElBounds = null;
  606. this.active = false;
  607. }
  608. }
  609. var referencePane = {
  610. init: function() {
  611. this.$container = document.createElement('div');
  612. this.$container.setAttribute('id', 'references-pane-container');
  613. var $spacer = document.createElement('div');
  614. $spacer.setAttribute('id', 'references-pane-spacer');
  615. this.$pane = document.createElement('div');
  616. this.$pane.setAttribute('id', 'references-pane');
  617. this.$container.appendChild($spacer);
  618. this.$container.appendChild(this.$pane);
  619. this.$header = document.createElement('div');
  620. this.$header.classList.add('menu-pane-header');
  621. this.$header.textContent = 'References to ';
  622. this.$headerRefId = document.createElement('a');
  623. this.$header.appendChild(this.$headerRefId);
  624. this.$closeButton = document.createElement('span');
  625. this.$closeButton.setAttribute('id', 'references-pane-close');
  626. this.$closeButton.addEventListener('click', function (e) {
  627. this.deactivate();
  628. }.bind(this));
  629. this.$header.appendChild(this.$closeButton);
  630. this.$pane.appendChild(this.$header);
  631. var tableContainer = document.createElement('div');
  632. tableContainer.setAttribute('id', 'references-pane-table-container');
  633. this.$table = document.createElement('table');
  634. this.$table.setAttribute('id', 'references-pane-table');
  635. this.$tableBody = this.$table.createTBody();
  636. tableContainer.appendChild(this.$table);
  637. this.$pane.appendChild(tableContainer);
  638. menu.$specContainer.appendChild(this.$container);
  639. },
  640. activate: function () {
  641. this.$container.classList.add('active');
  642. },
  643. deactivate: function () {
  644. this.$container.classList.remove('active');
  645. },
  646. showReferencesFor(entry) {
  647. this.activate();
  648. var newBody = document.createElement('tbody');
  649. var previousId;
  650. var previousCell;
  651. var dupCount = 0;
  652. this.$headerRefId.textContent = '#' + entry.id;
  653. this.$headerRefId.setAttribute('href', '#' + entry.id);
  654. entry.referencingIds.map(function (id) {
  655. var target = document.getElementById(id);
  656. var cid = findParentClauseId(target);
  657. var clause = menu.search.biblio.byId[cid];
  658. var dupCount = 0;
  659. return { id: id, clause: clause }
  660. }).sort(function (a, b) {
  661. return sortByClauseNumber(a.clause, b.clause);
  662. }).forEach(function (record, i) {
  663. if (previousId === record.clause.id) {
  664. previousCell.innerHTML += ' (<a href="#' + record.id + '">' + (dupCount + 2) + '</a>)';
  665. dupCount++;
  666. } else {
  667. var row = newBody.insertRow();
  668. var cell = row.insertCell();
  669. cell.innerHTML = record.clause.number;
  670. cell = row.insertCell();
  671. cell.innerHTML = '<a href="#' + record.id + '">' + record.clause.titleHTML + '</a>';
  672. previousCell = cell;
  673. previousId = record.clause.id;
  674. dupCount = 0;
  675. }
  676. }, this);
  677. this.$table.removeChild(this.$tableBody);
  678. this.$tableBody = newBody;
  679. this.$table.appendChild(this.$tableBody);
  680. }
  681. }
  682. function findParentClauseId(node) {
  683. while (node && node.nodeName !== 'EMU-CLAUSE' && node.nodeName !== 'EMU-INTRO' && node.nodeName !== 'EMU-ANNEX') {
  684. node = node.parentNode;
  685. }
  686. if (!node) return null;
  687. return node.getAttribute('id');
  688. }
  689. function sortByClauseNumber(c1, c2) {
  690. var c1c = c1.number.split('.');
  691. var c2c = c2.number.split('.');
  692. for (var i = 0; i < c1c.length; i++) {
  693. if (i >= c2c.length) {
  694. return 1;
  695. }
  696. var c1 = c1c[i];
  697. var c2 = c2c[i];
  698. var c1cn = Number(c1);
  699. var c2cn = Number(c2);
  700. if (Number.isNaN(c1cn) && Number.isNaN(c2cn)) {
  701. if (c1 > c2) {
  702. return 1;
  703. } else if (c1 < c2) {
  704. return -1;
  705. }
  706. } else if (!Number.isNaN(c1cn) && Number.isNaN(c2cn)) {
  707. return -1;
  708. } else if (Number.isNaN(c1cn) && !Number.isNaN(c2cn)) {
  709. return 1;
  710. } else if(c1cn > c2cn) {
  711. return 1;
  712. } else if (c1cn < c2cn) {
  713. return -1;
  714. }
  715. }
  716. if (c1c.length === c2c.length) {
  717. return 0;
  718. }
  719. return -1;
  720. }
  721. document.addEventListener('DOMContentLoaded', function () {
  722. Toolbox.init();
  723. referencePane.init();
  724. })
  725. var CLAUSE_NODES = ['EMU-CLAUSE', 'EMU-INTRO', 'EMU-ANNEX'];
  726. function findLocalReferences ($elem) {
  727. var name = $elem.innerHTML;
  728. var references = [];
  729. var parentClause = $elem.parentNode;
  730. while (parentClause && CLAUSE_NODES.indexOf(parentClause.nodeName) === -1) {
  731. parentClause = parentClause.parentNode;
  732. }
  733. if(!parentClause) return;
  734. var vars = parentClause.querySelectorAll('var');
  735. for (var i = 0; i < vars.length; i++) {
  736. var $var = vars[i];
  737. if ($var.innerHTML === name) {
  738. references.push($var);
  739. }
  740. }
  741. return references;
  742. }
  743. function toggleFindLocalReferences($elem) {
  744. var references = findLocalReferences($elem);
  745. if ($elem.classList.contains('referenced')) {
  746. references.forEach(function ($reference) {
  747. $reference.classList.remove('referenced');
  748. });
  749. } else {
  750. references.forEach(function ($reference) {
  751. $reference.classList.add('referenced');
  752. });
  753. }
  754. }
  755. function installFindLocalReferences () {
  756. document.addEventListener('click', function (e) {
  757. if (e.target.nodeName === 'VAR') {
  758. toggleFindLocalReferences(e.target);
  759. }
  760. });
  761. }
  762. document.addEventListener('DOMContentLoaded', installFindLocalReferences);
  763. </script><style>body {
  764. display: flex;
  765. font-size: 18px;
  766. line-height: 1.5;
  767. font-family: Cambria, Palatino Linotype, Palatino, Liberation Serif, serif;
  768. padding: 0;
  769. margin: 0;
  770. color: #111;
  771. }
  772. #spec-container {
  773. padding: 0 20px;
  774. flex-grow: 1;
  775. flex-basis: 66%;
  776. box-sizing: border-box;
  777. overflow: hidden;
  778. }
  779. body.oldtoc {
  780. margin: 0 auto;
  781. }
  782. a {
  783. text-decoration: none;
  784. color: #206ca7;
  785. }
  786. a:visited {
  787. color: #206ca7;
  788. }
  789. a:hover {
  790. text-decoration: underline;
  791. color: #239dee;
  792. }
  793. code {
  794. font-weight: bold;
  795. font-family: Consolas, Monaco, monospace;
  796. white-space: pre;
  797. }
  798. pre code {
  799. font-weight: inherit;
  800. }
  801. pre code.hljs {
  802. background-color: #fff;
  803. margin: 0;
  804. padding: 0;
  805. }
  806. ol.toc {
  807. list-style: none;
  808. padding-left: 0;
  809. }
  810. ol.toc ol.toc {
  811. padding-left: 2ex;
  812. list-style: none;
  813. }
  814. var {
  815. color: #2aa198;
  816. transition: background-color 0.25s ease;
  817. cursor: pointer;
  818. }
  819. var.referenced {
  820. background-color: #ffff33;
  821. }
  822. emu-const {
  823. font-family: sans-serif;
  824. }
  825. emu-val {
  826. font-weight: bold;
  827. }
  828. emu-alg ol, emu-alg ol ol ol ol {
  829. list-style-type: decimal;
  830. }
  831. emu-alg ol ol, emu-alg ol ol ol ol ol {
  832. list-style-type: lower-alpha;
  833. }
  834. emu-alg ol ol ol, ol ol ol ol ol ol {
  835. list-style-type: lower-roman;
  836. }
  837. emu-eqn {
  838. display: block;
  839. margin-left: 4em;
  840. }
  841. emu-eqn.inline {
  842. display: inline;
  843. margin: 0;
  844. }
  845. emu-eqn div:first-child {
  846. margin-left: -2em;
  847. }
  848. emu-note {
  849. margin: 1em 0;
  850. color: #666;
  851. border-left: 5px solid #ccc;
  852. display: flex;
  853. flex-direction: row;
  854. }
  855. emu-note > span.note {
  856. flex-basis: 100px;
  857. min-width: 100px;
  858. flex-grow: 0;
  859. flex-shrink: 1;
  860. text-transform: uppercase;
  861. padding-left: 5px;
  862. }
  863. emu-note[type=editor] {
  864. border-left-color: #faa;
  865. }
  866. emu-note > div.note-contents {
  867. flex-grow: 1;
  868. flex-shrink: 1;
  869. }
  870. emu-note > div.note-contents > p:first-of-type {
  871. margin-top: 0;
  872. }
  873. emu-note > div.note-contents > p:last-of-type {
  874. margin-bottom: 0;
  875. }
  876. emu-figure {
  877. display: block;
  878. }
  879. emu-example {
  880. display: block;
  881. margin: 1em 3em;
  882. }
  883. emu-example figure figcaption {
  884. margin-top: 0.5em;
  885. text-align: left;
  886. }
  887. emu-figure figure,
  888. emu-example figure,
  889. emu-table figure {
  890. display: flex;
  891. flex-direction: column;
  892. align-items: center;
  893. }
  894. emu-production {
  895. display: block;
  896. margin-top: 1em;
  897. margin-bottom: 1em;
  898. margin-left: 5ex;
  899. }
  900. emu-grammar.inline, emu-production.inline,
  901. emu-grammar.inline emu-production emu-rhs, emu-production.inline emu-rhs,
  902. emu-grammar[collapsed] emu-production emu-rhs, emu-production[collapsed] emu-rhs {
  903. display: inline;
  904. padding-left: 1ex;
  905. margin-left: 0;
  906. }
  907. emu-grammar[collapsed] emu-production, emu-production[collapsed] {
  908. margin: 0;
  909. }
  910. emu-constraints {
  911. font-size: .75em;
  912. margin-right: 1ex;
  913. }
  914. emu-gann {
  915. margin-right: 1ex;
  916. }
  917. emu-gann emu-t:last-child,
  918. emu-gann emu-nt:last-child {
  919. margin-right: 0;
  920. }
  921. emu-geq {
  922. margin-left: 1ex;
  923. font-weight: bold;
  924. }
  925. emu-oneof {
  926. font-weight: bold;
  927. margin-left: 1ex;
  928. }
  929. emu-nt {
  930. display: inline-block;
  931. font-style: italic;
  932. white-space: nowrap;
  933. text-indent: 0;
  934. }
  935. emu-nt a, emu-nt a:visited {
  936. color: #333;
  937. }
  938. emu-rhs emu-nt {
  939. margin-right: 1ex;
  940. }
  941. emu-t {
  942. display: inline-block;
  943. font-family: monospace;
  944. font-weight: bold;
  945. white-space: nowrap;
  946. text-indent: 0;
  947. }
  948. emu-production emu-t {
  949. margin-right: 1ex;
  950. }
  951. emu-rhs {
  952. display: block;
  953. padding-left: 75px;
  954. text-indent: -25px;
  955. }
  956. emu-mods {
  957. font-size: .85em;
  958. vertical-align: sub;
  959. font-style: normal;
  960. font-weight: normal;
  961. }
  962. emu-production[collapsed] emu-mods {
  963. display: none;
  964. }
  965. emu-params, emu-opt {
  966. margin-right: 1ex;
  967. font-family: monospace;
  968. }
  969. emu-params, emu-constraints {
  970. color: #2aa198;
  971. }
  972. emu-opt {
  973. color: #b58900;
  974. }
  975. emu-gprose {
  976. font-size: 0.9em;
  977. font-family: Helvetica, Arial, sans-serif;
  978. }
  979. h1.shortname {
  980. color: #f60;
  981. font-size: 1.5em;
  982. margin: 0;
  983. }
  984. h1.version {
  985. color: #f60;
  986. font-size: 1.5em;
  987. margin: 0;
  988. }
  989. h1.title {
  990. margin-top: 0;
  991. color: #f60;
  992. }
  993. h1.first {
  994. margin-top: 0;
  995. }
  996. h1, h2, h3, h4, h5, h6 {
  997. position: relative;
  998. }
  999. h1 .secnum {
  1000. text-decoration: none;
  1001. margin-right: 10px;
  1002. }
  1003. h1 span.title {
  1004. order: 2;
  1005. }
  1006. h1 { font-size: 2.67em; margin-top: 2em; margin-bottom: 0; line-height: 1em;}
  1007. h2 { font-size: 2em; }
  1008. h3 { font-size: 1.56em; }
  1009. h4 { font-size: 1.25em; }
  1010. h5 { font-size: 1.11em; }
  1011. h6 { font-size: 1em; }
  1012. h1:hover span.utils {
  1013. display: block;
  1014. }
  1015. span.utils {
  1016. font-size: 18px;
  1017. line-height: 18px;
  1018. display: none;
  1019. position: absolute;
  1020. top: 100%;
  1021. left: 0;
  1022. right: 0;
  1023. font-weight: normal;
  1024. }
  1025. span.utils:before {
  1026. content: "⤷";
  1027. display: inline-block;
  1028. padding: 0 5px;
  1029. }
  1030. span.utils > * {
  1031. display: inline-block;
  1032. margin-right: 20px;
  1033. }
  1034. h1 span.utils span.anchor a,
  1035. h2 span.utils span.anchor a,
  1036. h3 span.utils span.anchor a,
  1037. h4 span.utils span.anchor a,
  1038. h5 span.utils span.anchor a,
  1039. h6 span.utils span.anchor a {
  1040. text-decoration: none;
  1041. font-variant: small-caps;
  1042. }
  1043. h1 span.utils span.anchor a:hover,
  1044. h2 span.utils span.anchor a:hover,
  1045. h3 span.utils span.anchor a:hover,
  1046. h4 span.utils span.anchor a:hover,
  1047. h5 span.utils span.anchor a:hover,
  1048. h6 span.utils span.anchor a:hover {
  1049. color: #333;
  1050. }
  1051. emu-intro h1, emu-clause h1, emu-annex h1 { font-size: 2em; }
  1052. emu-intro h2, emu-clause h2, emu-annex h2 { font-size: 1.56em; }
  1053. emu-intro h3, emu-clause h3, emu-annex h3 { font-size: 1.25em; }
  1054. emu-intro h4, emu-clause h4, emu-annex h4 { font-size: 1.11em; }
  1055. emu-intro h5, emu-clause h5, emu-annex h5 { font-size: 1em; }
  1056. emu-intro h6, emu-clause h6, emu-annex h6 { font-size: 0.9em; }
  1057. emu-intro emu-intro h1, emu-clause emu-clause h1, emu-annex emu-annex h1 { font-size: 1.56em; }
  1058. emu-intro emu-intro h2, emu-clause emu-clause h2, emu-annex emu-annex h2 { font-size: 1.25em; }
  1059. emu-intro emu-intro h3, emu-clause emu-clause h3, emu-annex emu-annex h3 { font-size: 1.11em; }
  1060. emu-intro emu-intro h4, emu-clause emu-clause h4, emu-annex emu-annex h4 { font-size: 1em; }
  1061. emu-intro emu-intro h5, emu-clause emu-clause h5, emu-annex emu-annex h5 { font-size: 0.9em; }
  1062. emu-intro emu-intro emu-intro h1, emu-clause emu-clause emu-clause h1, emu-annex emu-annex emu-annex h1 { font-size: 1.25em; }
  1063. emu-intro emu-intro emu-intro h2, emu-clause emu-clause emu-clause h2, emu-annex emu-annex emu-annex h2 { font-size: 1.11em; }
  1064. emu-intro emu-intro emu-intro h3, emu-clause emu-clause emu-clause h3, emu-annex emu-annex emu-annex h3 { font-size: 1em; }
  1065. emu-intro emu-intro emu-intro h4, emu-clause emu-clause emu-clause h4, emu-annex emu-annex emu-annex h4 { font-size: 0.9em; }
  1066. emu-intro emu-intro emu-intro emu-intro h1, emu-clause emu-clause emu-clause emu-clause h1, emu-annex emu-annex emu-annex emu-annex h1 { font-size: 1.11em; }
  1067. emu-intro emu-intro emu-intro emu-intro h2, emu-clause emu-clause emu-clause emu-clause h2, emu-annex emu-annex emu-annex emu-annex h2 { font-size: 1em; }
  1068. emu-intro emu-intro emu-intro emu-intro h3, emu-clause emu-clause emu-clause emu-clause h3, emu-annex emu-annex emu-annex emu-annex h3 { font-size: 0.9em; }
  1069. emu-intro emu-intro emu-intro emu-intro emu-intro h1, emu-clause emu-clause emu-clause emu-clause emu-clause h1, emu-annex emu-annex emu-annex emu-annex emu-annex h1 { font-size: 1em; }
  1070. emu-intro emu-intro emu-intro emu-intro emu-intro h2, emu-clause emu-clause emu-clause emu-clause emu-clause h2, emu-annex emu-annex emu-annex emu-annex emu-annex h2 { font-size: 0.9em; }
  1071. emu-intro emu-intro emu-intro emu-intro emu-intro emu-intro h1, emu-clause emu-clause emu-clause emu-clause emu-clause emu-clause h1, emu-annex emu-annex emu-annex emu-annex emu-annex emu-annex h1 { font-size: 0.9em }
  1072. emu-clause, emu-intro, emu-annex {
  1073. display: block;
  1074. }
  1075. /* Figures and tables */
  1076. figure { display: block; margin: 1em 0 3em 0; }
  1077. figure object { display: block; margin: 0 auto; }
  1078. figure table.real-table { margin: 0 auto; }
  1079. figure figcaption {
  1080. display: block;
  1081. color: #555555;
  1082. font-weight: bold;
  1083. text-align: center;
  1084. }
  1085. emu-table table {
  1086. margin: 0 auto;
  1087. }
  1088. emu-table table, table.real-table {
  1089. border-collapse: collapse;
  1090. }
  1091. emu-table td, emu-table th, table.real-table td, table.real-table th {
  1092. border: 1px solid black;
  1093. padding: 0.4em;
  1094. vertical-align: baseline;
  1095. }
  1096. emu-table th, emu-table thead td, table.real-table th {
  1097. background-color: #eeeeee;
  1098. }
  1099. /* Note: the left content edges of table.lightweight-table >tbody >tr >td
  1100. and div.display line up. */
  1101. table.lightweight-table {
  1102. border-collapse: collapse;
  1103. margin: 0 0 0 1.5em;
  1104. }
  1105. table.lightweight-table td, table.lightweight-table th {
  1106. border: none;
  1107. padding: 0 0.5em;
  1108. vertical-align: baseline;
  1109. }
  1110. /* diff styles */
  1111. ins {
  1112. background-color: #e0f8e0;
  1113. text-decoration: none;
  1114. border-bottom: 1px solid #396;
  1115. }
  1116. del {
  1117. background-color: #fee;
  1118. }
  1119. ins.block, del.block,
  1120. emu-production > ins, emu-production > del,
  1121. emu-grammar > ins, emu-grammar > del {
  1122. display: block;
  1123. }
  1124. emu-rhs > ins, emu-rhs > del {
  1125. display: inline;
  1126. }
  1127. tr.ins > td > ins {
  1128. border-bottom: none;
  1129. }
  1130. tr.ins > td {
  1131. background-color: #e0f8e0;
  1132. }
  1133. tr.del > td {
  1134. background-color: #fee;
  1135. }
  1136. /* Menu Styles */
  1137. #menu-toggle {
  1138. font-size: 2em;
  1139. position: fixed;
  1140. top: 0;
  1141. left: 0;
  1142. width: 1.5em;
  1143. height: 1.5em;
  1144. z-index: 3;
  1145. visibility: hidden;
  1146. color: #1567a2;
  1147. background-color: #fff;
  1148. line-height: 1.5em;
  1149. text-align: center;
  1150. -webkit-touch-callout: none;
  1151. -webkit-user-select: none;
  1152. -khtml-user-select: none;
  1153. -moz-user-select: none;
  1154. -ms-user-select: none;
  1155. user-select: none;;
  1156. cursor: pointer;
  1157. }
  1158. #menu {
  1159. display: flex;
  1160. flex-direction: column;
  1161. width: 33%; height: 100vh;
  1162. max-width: 500px;
  1163. box-sizing: border-box;
  1164. background-color: #ddd;
  1165. overflow: hidden;
  1166. transition: opacity 0.1s linear;
  1167. padding: 0 5px;
  1168. position: fixed;
  1169. left: 0; top: 0;
  1170. border-right: 2px solid #bbb;
  1171. z-index: 2;
  1172. }
  1173. #menu-spacer {
  1174. flex-basis: 33%;
  1175. max-width: 500px;
  1176. flex-grow: 0;
  1177. flex-shrink: 0;
  1178. }
  1179. #menu a {
  1180. color: #1567a2;
  1181. }
  1182. #menu.active {
  1183. display: flex;
  1184. opacity: 1;
  1185. z-index: 2;
  1186. }
  1187. #menu-pins {
  1188. flex-grow: 1;
  1189. display: none;
  1190. }
  1191. #menu-pins.active {
  1192. display: block;
  1193. }
  1194. #menu-pins-list {
  1195. margin: 0;
  1196. padding: 0;
  1197. counter-reset: pins-counter;
  1198. }
  1199. #menu-pins-list > li:before {
  1200. content: counter(pins-counter);
  1201. counter-increment: pins-counter;
  1202. display: inline-block;
  1203. width: 25px;
  1204. text-align: center;
  1205. border: 1px solid #bbb;
  1206. padding: 2px;
  1207. margin: 4px;
  1208. box-sizing: border-box;
  1209. line-height: 1em;
  1210. background-color: #ccc;
  1211. border-radius: 4px;
  1212. }
  1213. #menu-toc > ol {
  1214. padding: 0;
  1215. flex-grow: 1;
  1216. }
  1217. #menu-toc > ol li {
  1218. padding: 0;
  1219. }
  1220. #menu-toc > ol , #menu-toc > ol ol {
  1221. list-style-type: none;
  1222. margin: 0;
  1223. padding: 0;
  1224. }
  1225. #menu-toc > ol ol {
  1226. padding-left: 0.75em;
  1227. }
  1228. #menu-toc li {
  1229. text-overflow: ellipsis;
  1230. overflow: hidden;
  1231. white-space: nowrap;
  1232. }
  1233. #menu-toc .item-toggle {
  1234. display: inline-block;
  1235. transform: rotate(-45deg) translate(-5px, -5px);
  1236. transition: transform 0.1s ease;
  1237. text-align: center;
  1238. width: 20px;
  1239. color: #aab;
  1240. -webkit-touch-callout: none;
  1241. -webkit-user-select: none;
  1242. -khtml-user-select: none;
  1243. -moz-user-select: none;
  1244. -ms-user-select: none;
  1245. user-select: none;;
  1246. cursor: pointer;
  1247. }
  1248. #menu-toc .item-toggle-none {
  1249. display: inline-block;
  1250. width: 20px;
  1251. }
  1252. #menu-toc li.active > .item-toggle {
  1253. transform: rotate(45deg) translate(-5px, -5px);
  1254. }
  1255. #menu-toc li > ol {
  1256. display: none;
  1257. }
  1258. #menu-toc li.active > ol {
  1259. display: block;
  1260. }
  1261. #menu-toc li.revealed > a {
  1262. background-color: #bbb;
  1263. font-weight: bold;
  1264. /*
  1265. background-color: #222;
  1266. color: #c6d8e4;
  1267. */
  1268. }
  1269. #menu-toc li.revealed-leaf> a {
  1270. color: #206ca7;
  1271. /*
  1272. background-color: #222;
  1273. color: #c6d8e4;
  1274. */
  1275. }
  1276. #menu-toc li.revealed > .item-toggle {
  1277. transform: rotate(45deg) translate(-5px, -5px);
  1278. }
  1279. #menu-toc li.revealed > ol {
  1280. display: block;
  1281. }
  1282. #menu-toc li > a {
  1283. padding: 2px 5px;
  1284. }
  1285. #menu > * {
  1286. margin-bottom: 5px;
  1287. }
  1288. .menu-pane-header {
  1289. padding: 0 5px;
  1290. text-transform: uppercase;
  1291. background-color: #aaa;
  1292. color: #335;
  1293. font-weight: bold;
  1294. letter-spacing: 2px;
  1295. flex-grow: 0;
  1296. flex-shrink: 0;
  1297. font-size: 0.8em;
  1298. }
  1299. #menu-toc {
  1300. display: flex;
  1301. flex-direction: column;
  1302. width: 100%;
  1303. overflow: hidden;
  1304. flex-grow: 1;
  1305. }
  1306. #menu-toc ol.toc {
  1307. overflow-x: hidden;
  1308. overflow-y: auto;
  1309. }
  1310. #menu-search {
  1311. position: relative;
  1312. flex-grow: 0;
  1313. flex-shrink: 0;
  1314. width: 100%;
  1315. display: flex;
  1316. flex-direction: column;
  1317. max-height: 300px;
  1318. }
  1319. #menu-trace-list {
  1320. display: none;
  1321. }
  1322. #menu-search-box {
  1323. box-sizing: border-box;
  1324. display: block;
  1325. width: 100%;
  1326. margin: 5px 0 0 0;
  1327. font-size: 1em;
  1328. padding: 2px;
  1329. background-color: #bbb;
  1330. border: 1px solid #999;
  1331. }
  1332. #menu-search-results {
  1333. overflow-x: hidden;
  1334. overflow-y: auto;
  1335. }
  1336. li.menu-search-result-clause:before {
  1337. content: 'clause';
  1338. width: 40px;
  1339. display: inline-block;
  1340. text-align: right;
  1341. padding-right: 1ex;
  1342. color: #666;
  1343. font-size: 75%;
  1344. }
  1345. li.menu-search-result-op:before {
  1346. content: 'op';
  1347. width: 40px;
  1348. display: inline-block;
  1349. text-align: right;
  1350. padding-right: 1ex;
  1351. color: #666;
  1352. font-size: 75%;
  1353. }
  1354. li.menu-search-result-prod:before {
  1355. content: 'prod';
  1356. width: 40px;
  1357. display: inline-block;
  1358. text-align: right;
  1359. padding-right: 1ex;
  1360. color: #666;
  1361. font-size: 75%
  1362. }
  1363. li.menu-search-result-term:before {
  1364. content: 'term';
  1365. width: 40px;
  1366. display: inline-block;
  1367. text-align: right;
  1368. padding-right: 1ex;
  1369. color: #666;
  1370. font-size: 75%
  1371. }
  1372. #menu-search-results ul {
  1373. padding: 0 5px;
  1374. margin: 0;
  1375. }
  1376. #menu-search-results li {
  1377. white-space: nowrap;
  1378. text-overflow: ellipsis;
  1379. }
  1380. #menu-trace-list {
  1381. counter-reset: item;
  1382. margin: 0 0 0 20px;
  1383. padding: 0;
  1384. }
  1385. #menu-trace-list li {
  1386. display: block;
  1387. white-space: nowrap;
  1388. }
  1389. #menu-trace-list li .secnum:after {
  1390. content: " ";
  1391. }
  1392. #menu-trace-list li:before {
  1393. content: counter(item) " ";
  1394. background-color: #222;
  1395. counter-increment: item;
  1396. color: #999;
  1397. width: 20px;
  1398. height: 20px;
  1399. line-height: 20px;
  1400. display: inline-block;
  1401. text-align: center;
  1402. margin: 2px 4px 2px 0;
  1403. }
  1404. @media (max-width: 1000px) {
  1405. body {
  1406. margin: 0;
  1407. display: block;
  1408. }
  1409. #menu {
  1410. display: none;
  1411. padding-top: 3em;
  1412. width: 450px;
  1413. }
  1414. #menu.active {
  1415. position: fixed;
  1416. height: 100%;
  1417. left: 0;
  1418. top: 0;
  1419. right: 300px;
  1420. }
  1421. #menu-toggle {
  1422. visibility: visible;
  1423. }
  1424. #spec-container {
  1425. padding: 0 5px;
  1426. }
  1427. #references-pane-spacer {
  1428. display: none;
  1429. }
  1430. }
  1431. @media only screen and (max-width: 800px) {
  1432. #menu {
  1433. width: 100%;
  1434. }
  1435. h1 .secnum:empty {
  1436. margin: 0; padding: 0;
  1437. }
  1438. }
  1439. /* Toolbox */
  1440. .toolbox {
  1441. position: absolute;
  1442. background: #ddd;
  1443. border: 1px solid #aaa;
  1444. display: none;
  1445. color: #eee;
  1446. padding: 5px;
  1447. border-radius: 3px;
  1448. }
  1449. .toolbox.active {
  1450. display: inline-block;
  1451. }
  1452. .toolbox a {
  1453. text-decoration: none;
  1454. padding: 0 5px;
  1455. }
  1456. .toolbox a:hover {
  1457. text-decoration: underline;
  1458. }
  1459. .toolbox:after, .toolbox:before {
  1460. top: 100%;
  1461. left: 15px;
  1462. border: solid transparent;
  1463. content: " ";
  1464. height: 0;
  1465. width: 0;
  1466. position: absolute;
  1467. pointer-events: none;
  1468. }
  1469. .toolbox:after {
  1470. border-color: rgba(0, 0, 0, 0);
  1471. border-top-color: #ddd;
  1472. border-width: 10px;
  1473. margin-left: -10px;
  1474. }
  1475. .toolbox:before {
  1476. border-color: rgba(204, 204, 204, 0);
  1477. border-top-color: #aaa;
  1478. border-width: 12px;
  1479. margin-left: -12px;
  1480. }
  1481. #references-pane-container {
  1482. position: fixed;
  1483. bottom: 0;
  1484. left: 0;
  1485. right: 0;
  1486. height: 250px;
  1487. display: none;
  1488. background-color: #ddd;
  1489. z-index: 1;
  1490. }
  1491. #references-pane-table-container {
  1492. overflow-x: hidden;
  1493. overflow-y: auto;
  1494. }
  1495. #references-pane-spacer {
  1496. flex-basis: 33%;
  1497. max-width: 500px;
  1498. }
  1499. #references-pane {
  1500. flex-grow: 1;
  1501. overflow: hidden;
  1502. display: flex;
  1503. flex-direction: column;
  1504. }
  1505. #references-pane-container.active {
  1506. display: flex;
  1507. }
  1508. #references-pane-close:after {
  1509. content: '✖';
  1510. float: right;
  1511. cursor: pointer;
  1512. }
  1513. #references-pane table tr td:first-child {
  1514. text-align: right;
  1515. padding-right: 5px;
  1516. }
  1517. @media print {
  1518. #menu-toggle {
  1519. display: none;
  1520. }
  1521. }
  1522. </style></head><body><div id="menu-toggle">☰</div><div id="menu-spacer"></div><div id="menu"><div id="menu-search"><input type="text" id="menu-search-box" placeholder="Search..."><div id="menu-search-results" class="inactive"></div></div><div id="menu-pins"><div class="menu-pane-header">Pins</div><ul id="menu-pins-list"></ul></div><div class="menu-pane-header">Table of Contents</div><div id="menu-toc"><ol class="toc"><li><span class="item-toggle-none"></span><a href="#introduction" title="Metadata Proposal - ECMAScript">Metadata Proposal - ECMAScript</a></li><li><span class="item-toggle-none"></span><a href="#syntax" title="Syntax"><span class="secnum">1</span> Syntax</a></li><li><span class="item-toggle">◢</span><a href="#abstract-operations" title="Abstract Operations"><span class="secnum">2</span> Abstract Operations</a><ol class="toc"><li><span class="item-toggle">◢</span><a href="#operations-on-objects" title="Operations on Objects"><span class="secnum">2.1</span> Operations on Objects</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#getorcreatemetadatamap" title="GetOrCreateMetadataMap ( O, P, Create )"><span class="secnum">2.1.1</span> GetOrCreateMetadataMap ( O, P, Create )</a></li></ol></li></ol></li><li><span class="item-toggle">◢</span><a href="#ordinary-and-exotic-objects-behaviors" title="Ordinary and Exotic Objects Behaviors"><span class="secnum">3</span> Ordinary and Exotic Objects Behaviors</a><ol class="toc"><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots" title="Ordinary Object Internal Methods and Internal Slots"><span class="secnum">3.1</span> Ordinary Object Internal Methods and Internal Slots</a><ol class="toc"><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots-hasmetadata" title="[[HasMetadata]] ( MetadataKey, P )"><span class="secnum">3.1.1</span> [[HasMetadata]] ( MetadataKey, P )</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#ordinaryhasmetadata" title="OrdinaryHasMetadata ( MetadataKey, O, P )"><span class="secnum">3.1.1.1</span> OrdinaryHasMetadata ( MetadataKey, O, P )</a></li></ol></li><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots-hasownmetadata" title="[[HasOwnMetadata]] ( MetadataKey, P )"><span class="secnum">3.1.2</span> [[HasOwnMetadata]] ( MetadataKey, P )</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#ordinaryhasownmetadata" title="OrdinaryHasOwnMetadata ( MetadataKey, O, P )"><span class="secnum">3.1.2.1</span> OrdinaryHasOwnMetadata ( MetadataKey, O, P )</a></li></ol></li><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots-getmetadata" title="[[GetMetadata]] ( MetadataKey, P )"><span class="secnum">3.1.3</span> [[GetMetadata]] ( MetadataKey, P )</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#ordinarygetmetadata" title="OrdinaryGetMetadata ( MetadataKey, O, P )"><span class="secnum">3.1.3.1</span> OrdinaryGetMetadata ( MetadataKey, O, P )</a></li></ol></li><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots-getownmetadata" title="[[GetOwnMetadata]] ( MetadataKey, P, ParamIndex )"><span class="secnum">3.1.4</span> [[GetOwnMetadata]] ( MetadataKey, P, ParamIndex )</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#ordinarygetownmetadata" title="OrdinaryGetOwnMetadata ( MetadataKey, O, P )"><span class="secnum">3.1.4.1</span> OrdinaryGetOwnMetadata ( MetadataKey, O, P )</a></li></ol></li><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots-defineownmetadata" title="[[DefineOwnMetadata]] ( MetadataKey, MetadataValue, P )"><span class="secnum">3.1.5</span> [[DefineOwnMetadata]] ( MetadataKey, MetadataValue, P )</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#ordinarydefineownmetadata" title="OrdinaryDefineOwnMetadata ( MetadataKey, MetadataValue, O, P )"><span class="secnum">3.1.5.1</span> OrdinaryDefineOwnMetadata ( MetadataKey, MetadataValue, O, P )</a></li></ol></li><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots-metadatakeys" title="[[MetadataKeys]] ( P )"><span class="secnum">3.1.6</span> [[MetadataKeys]] ( P )</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#ordinarymetadatakeys" title="OrdinaryMetadataKeys ( O, P )"><span class="secnum">3.1.6.1</span> OrdinaryMetadataKeys ( O, P )</a></li></ol></li><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots-ownmetadatakeys" title="[[OwnMetadataKeys]] ( P )"><span class="secnum">3.1.7</span> [[OwnMetadataKeys]] ( P )</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#ordinaryownmetadatakeys" title="OrdinaryOwnMetadataKeys ( O, P )"><span class="secnum">3.1.7.1</span> OrdinaryOwnMetadataKeys ( O, P )</a></li></ol></li><li><span class="item-toggle-none"></span><a href="#ordinary-object-internal-methods-and-internal-slots-deletemetadata" title="[[DeleteMetadata]]( MetadataKey, P )"><span class="secnum">3.1.8</span> [[DeleteMetadata]]( MetadataKey, P )</a></li></ol></li></ol></li><li><span class="item-toggle">◢</span><a href="#reflection" title="Reflection"><span class="secnum">4</span> Reflection</a><ol class="toc"><li><span class="item-toggle">◢</span><a href="#reflect" title="The Reflect Object"><span class="secnum">4.1</span> The Reflect Object</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#reflect-metadatadecoratorfunctions" title="Metadata Decorator Functions"><span class="secnum">4.1.1</span> Metadata Decorator Functions</a></li><li><span class="item-toggle-none"></span><a href="#reflect.metadata" title="Reflect.metadata ( metadataKey, metadataValue )"><span class="secnum">4.1.2</span> Reflect.metadata ( metadataKey, metadataValue )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.definemetadata" title="Reflect.defineMetadata ( metadataKey, metadataValue, target [, propertyKey] )"><span class="secnum">4.1.3</span> Reflect.defineMetadata ( metadataKey, metadataValue, target [, propertyKey] )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.hasmetadata" title="Reflect.hasMetadata ( metadataKey, target [, propertyKey] )"><span class="secnum">4.1.4</span> Reflect.hasMetadata ( metadataKey, target [, propertyKey] )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.hasownmetadata" title="Reflect.hasOwnMetadata ( metadataKey, target [, propertyKey] )"><span class="secnum">4.1.5</span> Reflect.hasOwnMetadata ( metadataKey, target [, propertyKey] )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.getmetadata" title="Reflect.getMetadata ( metadataKey, target [, propertyKey] )"><span class="secnum">4.1.6</span> Reflect.getMetadata ( metadataKey, target [, propertyKey] )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.getownmetadata" title="Reflect.getOwnMetadata ( metadataKey, target [, propertyKey] )"><span class="secnum">4.1.7</span> Reflect.getOwnMetadata ( metadataKey, target [, propertyKey] )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.getmetadatakeys" title="Reflect.getMetadataKeys ( target [, propertyKey] )"><span class="secnum">4.1.8</span> Reflect.getMetadataKeys ( target [, propertyKey] )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.getownmetadatakeys" title="Reflect.getOwnMetadataKeys ( target [, propertyKey] )"><span class="secnum">4.1.9</span> Reflect.getOwnMetadataKeys ( target [, propertyKey] )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.deletemetadata" title="Reflect.deleteMetadata ( metadataKey, target [, propertyKey] )"><span class="secnum">4.1.10</span> Reflect.deleteMetadata ( metadataKey, target [, propertyKey] )</a></li></ol></li></ol></li></ol></div></div><div id="spec-container">
  1523. <emu-intro id="introduction">
  1524. <h1 class="first">Metadata Proposal - ECMAScript</h1>
  1525. <emu-note><span class="note">Note</span><div class="note-contents">A shim for this API can be found here: <a href="https://github.com/rbuckton/ReflectDecorators">https://github.com/rbuckton/ReflectDecorators</a></div></emu-note>
  1526. <p>Proposal to add Metadata to ECMAScript.</p>
  1527. </emu-intro>
  1528. <emu-clause id="syntax">
  1529. <h1><span class="secnum">1</span>Syntax</h1>
  1530. <emu-note><span class="note">Note</span><div class="note-contents">This section is non-normative.</div></emu-note>
  1531. <pre><code class="javascript hljs"><span class="hljs-comment">// define metadata on an object or property</span>
  1532. <span class="hljs-built_in">Reflect</span>.defineMetadata(metadataKey, metadataValue, target);
  1533. <span class="hljs-built_in">Reflect</span>.defineMetadata(metadataKey, metadataValue, target, propertyKey);
  1534. <span class="hljs-comment">// check for presence of a metadata key on the prototype chain of an object or property</span>
  1535. <span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.hasMetadata(metadataKey, target);
  1536. <span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.hasMetadata(metadataKey, target, propertyKey);
  1537. <span class="hljs-comment">// check for presence of an own metadata key of an object or property</span>
  1538. <span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.hasOwnMetadata(metadataKey, target);
  1539. <span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.hasOwnMetadata(metadataKey, target, propertyKey);
  1540. <span class="hljs-comment">// get metadata value of a metadata key on the prototype chain of an object or property</span>
  1541. <span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getMetadata(metadataKey, target);
  1542. <span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getMetadata(metadataKey, target, propertyKey);
  1543. <span class="hljs-comment">// get metadata value of an own metadata key of an object or property</span>
  1544. <span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getOwnMetadata(metadataKey, target);
  1545. <span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getOwnMetadata(metadataKey, target, propertyKey);
  1546. <span class="hljs-comment">// get all metadata keys on the prototype chain of an object or property</span>
  1547. <span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getMetadataKeys(target);
  1548. <span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getMetadataKeys(target, propertyKey);
  1549. <span class="hljs-comment">// get all own metadata keys of an object or property</span>
  1550. <span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getOwnMetadataKeys(target);
  1551. <span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getOwnMetadataKeys(target, propertyKey);
  1552. <span class="hljs-comment">// delete metadata from an object or property</span>
  1553. <span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.deleteMetadata(metadataKey, target);
  1554. <span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.deleteMetadata(metadataKey, target, propertyKey);
  1555. <span class="hljs-comment">// apply metadata via a decorator to a constructor</span>
  1556. @<span class="hljs-built_in">Reflect</span>.metadata(metadataKey, metadataValue)
  1557. <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">C</span> </span>{
  1558. <span class="hljs-comment">// apply metadata via a decorator to a method (property)</span>
  1559. @<span class="hljs-built_in">Reflect</span>.metadata(metadataKey, metadataValue)
  1560. method() {
  1561. }
  1562. }
  1563. <span class="hljs-comment">// Design-time type annotations</span>
  1564. <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Type</span>(<span class="hljs-params">type</span>) </span>{ <span class="hljs-keyword">return</span> <span class="hljs-built_in">Reflect</span>.metadata(<span class="hljs-string">"design:type"</span>, type); }
  1565. <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">ParamTypes</span>(<span class="hljs-params">...types</span>) </span>{ <span class="hljs-keyword">return</span> <span class="hljs-built_in">Reflect</span>.metadata(<span class="hljs-string">"design:paramtypes"</span>, types); }
  1566. <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">ReturnType</span>(<span class="hljs-params">type</span>) </span>{ <span class="hljs-keyword">return</span> <span class="hljs-built_in">Reflect</span>.metadata(<span class="hljs-string">"design:returntype"</span>, type); }
  1567. <span class="hljs-comment">// Decorator application</span>
  1568. @ParamTypes(<span class="hljs-built_in">String</span>, <span class="hljs-built_in">Number</span>)
  1569. <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">C</span> </span>{
  1570. <span class="hljs-keyword">constructor</span>(text, i) {
  1571. }
  1572. @Type(<span class="hljs-built_in">String</span>)
  1573. get name() { <span class="hljs-keyword">return</span> <span class="hljs-string">"text"</span>; }
  1574. @Type(<span class="hljs-built_in">Function</span>)
  1575. @ParamTypes(<span class="hljs-built_in">Number</span>, <span class="hljs-built_in">Number</span>)
  1576. @ReturnType(<span class="hljs-built_in">Number</span>)
  1577. add(x, y) {
  1578. <span class="hljs-keyword">return</span> x + y;
  1579. }
  1580. }
  1581. <span class="hljs-comment">// Metadata introspection</span>
  1582. <span class="hljs-keyword">let</span> obj = <span class="hljs-keyword">new</span> C(<span class="hljs-string">"a"</span>, <span class="hljs-number">1</span>);
  1583. <span class="hljs-keyword">let</span> paramTypes = <span class="hljs-built_in">Reflect</span>.getMetadata(<span class="hljs-string">"design:paramtypes"</span>, inst, <span class="hljs-string">"add"</span>); <span class="hljs-comment">// [Number, Number]</span></code></pre>
  1584. </emu-clause>
  1585. <emu-clause id="abstract-operations">
  1586. <h1><span class="secnum">2</span>Abstract Operations</h1>
  1587. <emu-clause id="operations-on-objects">
  1588. <h1><span class="secnum">2.1</span>Operations on Objects</h1>
  1589. <emu-clause id="getorcreatemetadatamap" aoid="GetOrCreateMetadataMap">
  1590. <h1><span class="secnum">2.1.1</span>GetOrCreateMetadataMap ( O, P, Create )</h1>
  1591. <p>When the abstract operation GetOrCreateMetadataMap is called with Object <var>O</var>, property key <var>P</var>, and Boolean <var>Create</var> the following steps are taken:</p>
  1592. <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_0"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>targetMetadata</var> be the value of <var>O</var>'s [[Metadata]] internal slot.</li><li>If <var>targetMetadata</var> is <emu-val>undefined</emu-val>, then<ol><li>If <var>Create</var> is <emu-val>false</emu-val>, return <emu-val>undefined</emu-val>.</li><li>Set <var>targetMetadata</var> to be a newly created <emu-val>Map</emu-val> object.</li><li>Set the [[Metadata]] internal slot of <var>O</var> to <var>targetMetadata</var>.</li></ol></li><li>Let <var>metadataMap</var> be ?&nbsp;<emu-xref aoid="Invoke" id="_ref_1"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>targetMetadata</var>, <code>"get"</code>, <var>P</var>).</li><li>If <var>metadataMap</var> is <emu-val>undefined</emu-val>, then<ol><li>If <var>Create</var> is <emu-val>false</emu-val>, return <emu-val>undefined</emu-val>.</li><li>Set <var>metadataMap</var> to be a newly created <emu-val>Map</emu-val> object.</li><li>Perform ?&nbsp;<emu-xref aoid="Invoke" id="_ref_2"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>targetMetadata</var>, <code>"set"</code>, <var>P</var>, <var>metadataMap</var>).</li></ol></li><li>Return <var>metadataMap</var>.
  1593. </li></ol></emu-alg>
  1594. </emu-clause>
  1595. </emu-clause>
  1596. </emu-clause>
  1597. <emu-clause id="ordinary-and-exotic-objects-behaviors">
  1598. <h1><span class="secnum">3</span>Ordinary and Exotic Objects Behaviors</h1>
  1599. <emu-clause id="ordinary-object-internal-methods-and-internal-slots">
  1600. <h1><span class="secnum">3.1</span>Ordinary Object Internal Methods and Internal Slots</h1>
  1601. <p>All ordinary objects have an internal slot called [[Metadata]]. The value of this internal slot is either <emu-val>null</emu-val> or a <emu-val>Map</emu-val> object and is used for storing metadata for an object.</p>
  1602. <emu-clause id="ordinary-object-internal-methods-and-internal-slots-hasmetadata">
  1603. <h1><span class="secnum">3.1.1</span>[[HasMetadata]] ( MetadataKey, P )</h1>
  1604. <p>When the [[HasMetadata]] internal method of <var>O</var> is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var> and property key <var>P</var>, the following steps are taken:</p>
  1605. <emu-alg><ol><li>Return ?&nbsp;<emu-xref aoid="OrdinaryHasMetadata" id="_ref_3"><a href="#ordinaryhasmetadata">OrdinaryHasMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>O</var>, <var>P</var>).
  1606. </li></ol></emu-alg>
  1607. <emu-clause id="ordinaryhasmetadata" aoid="OrdinaryHasMetadata">
  1608. <h1><span class="secnum">3.1.1.1</span>OrdinaryHasMetadata ( MetadataKey, O, P )</h1>
  1609. <p>When the abstract operation OrdinaryHasMetadata is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var>, Object <var>O</var>, and property key <var>P</var>, the following steps are taken:</p>
  1610. <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_4"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>hasOwn</var> be ?&nbsp;<emu-xref aoid="OrdinaryHasOwnMetadata" id="_ref_5"><a href="#ordinaryhasownmetadata">OrdinaryHasOwnMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>O</var>, <var>P</var>).</li><li>If <var>hasOwn</var> is <emu-val>true</emu-val>, return <emu-val>true</emu-val>.</li><li>Let <var>parent</var> be ? <var>O</var>.[[GetPrototypeOf]]().</li><li>If <var>parent</var> is not <emu-val>null</emu-val>, Return ? <var>parent</var>.[[HasMetadata]](<var>MetadataKey</var>, <var>P</var>).</li><li>Return <emu-val>false</emu-val>.
  1611. </li></ol></emu-alg>
  1612. </emu-clause>
  1613. </emu-clause>
  1614. <emu-clause id="ordinary-object-internal-methods-and-internal-slots-hasownmetadata">
  1615. <h1><span class="secnum">3.1.2</span>[[HasOwnMetadata]] ( MetadataKey, P )</h1>
  1616. <p>When the [[HasOwnMetadata]] internal method of <var>O</var> is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var> and property key <var>P</var>, the following steps are taken:</p>
  1617. <emu-alg><ol><li>Return ?&nbsp;<emu-xref aoid="OrdinaryHasOwnMetadata" id="_ref_6"><a href="#ordinaryhasownmetadata">OrdinaryHasOwnMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>O</var>, <var>P</var>).
  1618. </li></ol></emu-alg>
  1619. <emu-clause id="ordinaryhasownmetadata" aoid="OrdinaryHasOwnMetadata">
  1620. <h1><span class="secnum">3.1.2.1</span>OrdinaryHasOwnMetadata ( MetadataKey, O, P )</h1>
  1621. <p>When the abstract operation OrdinaryHasOwnMetadata is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var>, Object <var>O</var>, and property key <var>P</var>, the following steps are taken:</p>
  1622. <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_7"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>metadataMap</var> be ?&nbsp;<emu-xref aoid="GetOrCreateMetadataMap" id="_ref_8"><a href="#getorcreatemetadatamap">GetOrCreateMetadataMap</a></emu-xref>(<var>O</var>, <var>P</var>, <emu-val>false</emu-val>).</li><li>If <var>metadataMap</var> is <emu-val>undefined</emu-val>, return <emu-val>false</emu-val>.</li><li>Return ?&nbsp;<emu-xref aoid="ToBoolean" id="_ref_9"><a href="https://tc39.github.io/ecma262/#sec-toboolean">ToBoolean</a></emu-xref>(? <emu-xref aoid="Invoke" id="_ref_10"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>metadataMap</var>, <code>"has"</code>, <var>MetadataKey</var>)).
  1623. </li></ol></emu-alg>
  1624. </emu-clause>
  1625. </emu-clause>
  1626. <emu-clause id="ordinary-object-internal-methods-and-internal-slots-getmetadata">
  1627. <h1><span class="secnum">3.1.3</span>[[GetMetadata]] ( MetadataKey, P )</h1>
  1628. <p>When the [[GetMatadata]] internal method of <var>O</var> is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var> and property key <var>P</var>, the following steps are taken:</p>
  1629. <emu-alg><ol><li>Return ?&nbsp;<emu-xref aoid="OrdinaryGetMetadata" id="_ref_11"><a href="#ordinarygetmetadata">OrdinaryGetMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>O</var>, <var>P</var>).
  1630. </li></ol></emu-alg>
  1631. <emu-clause id="ordinarygetmetadata" aoid="OrdinaryGetMetadata">
  1632. <h1><span class="secnum">3.1.3.1</span>OrdinaryGetMetadata ( MetadataKey, O, P )</h1>
  1633. <p>When the abstract operation OrdinaryGetMetadata is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var>, Object <var>O</var>, and property key <var>P</var>, the following steps are taken:</p>
  1634. <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_12"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>hasOwn</var> be ?&nbsp;<emu-xref aoid="OrdinaryHasOwnMetadata" id="_ref_13"><a href="#ordinaryhasownmetadata">OrdinaryHasOwnMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>O</var>, <var>P</var>).</li><li>If <var>hasOwn</var> is <emu-val>true</emu-val>, return ?&nbsp;<emu-xref aoid="OrdinaryGetOwnMetadata" id="_ref_14"><a href="#ordinarygetownmetadata">OrdinaryGetOwnMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>O</var>, <var>P</var>).</li><li>Let <var>parent</var> be ? <var>O</var>.[[GetPrototypeOf]]().</li><li>If <var>parent</var> is not <emu-val>null</emu-val>, return ? <var>parent</var>.[[GetMetadata]](<var>MetadataKey</var>, <var>P</var>).</li><li>Return <emu-val>undefined</emu-val>.
  1635. </li></ol></emu-alg>
  1636. </emu-clause>
  1637. </emu-clause>
  1638. <emu-clause id="ordinary-object-internal-methods-and-internal-slots-getownmetadata">
  1639. <h1><span class="secnum">3.1.4</span>[[GetOwnMetadata]] ( MetadataKey, P, ParamIndex )</h1>
  1640. <p>When the [[GetOwnMetadata]] internal method of <var>O</var> is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var> and property key <var>P</var>, the following steps are taken:</p>
  1641. <emu-alg><ol><li>Return ?&nbsp;<emu-xref aoid="OrdinaryGetOwnMetadata" id="_ref_15"><a href="#ordinarygetownmetadata">OrdinaryGetOwnMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>O</var>, <var>P</var>).
  1642. </li></ol></emu-alg>
  1643. <emu-clause id="ordinarygetownmetadata" aoid="OrdinaryGetOwnMetadata">
  1644. <h1><span class="secnum">3.1.4.1</span>OrdinaryGetOwnMetadata ( MetadataKey, O, P )</h1>
  1645. <p>When the abstract operation OrdinaryGetOwnMetadata is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var>, Object <var>O</var>, and property key <var>P</var>, the following steps are taken:</p>
  1646. <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_16"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>metadataMap</var> be ?&nbsp;<emu-xref aoid="GetOrCreateMetadataMap" id="_ref_17"><a href="#getorcreatemetadatamap">GetOrCreateMetadataMap</a></emu-xref>(<var>O</var>, <var>P</var>, <emu-val>false</emu-val>).</li><li>If <var>metadataMap</var> is <emu-val>undefined</emu-val>, return <emu-val>undefined</emu-val>.</li><li>Return ?&nbsp;<emu-xref aoid="Invoke" id="_ref_18"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>metadataMap</var>, <code>"get"</code>, <var>MetadataKey</var>).
  1647. </li></ol></emu-alg>
  1648. </emu-clause>
  1649. </emu-clause>
  1650. <emu-clause id="ordinary-object-internal-methods-and-internal-slots-defineownmetadata">
  1651. <h1><span class="secnum">3.1.5</span>[[DefineOwnMetadata]] ( MetadataKey, MetadataValue, P )</h1>
  1652. <p>When the [[DefineOwnMetadata]] internal method of <var>O</var> is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var>, <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataValue</var>, and property key <var>P</var>, the following steps are taken:</p>
  1653. <emu-alg><ol><li>Return ?&nbsp;<emu-xref aoid="OrdinaryDefineOwnMetadata" id="_ref_19"><a href="#ordinarydefineownmetadata">OrdinaryDefineOwnMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>MetadataValue</var>, <var>O</var>, <var>P</var>)
  1654. </li></ol></emu-alg>
  1655. <emu-clause id="ordinarydefineownmetadata" aoid="OrdinaryDefineOwnMetadata">
  1656. <h1><span class="secnum">3.1.5.1</span>OrdinaryDefineOwnMetadata ( MetadataKey, MetadataValue, O, P )</h1>
  1657. <p>When the abstract operation <emu-xref aoid="OrdinaryDefineOwnProperty" id="_ref_20"><a href="https://tc39.github.io/ecma262/#sec-ordinarydefineownproperty">OrdinaryDefineOwnProperty</a></emu-xref> is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var>, <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataValue</var>, Object <var>O</var>, and property key <var>P</var>, the following steps are taken:</p>
  1658. <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_21"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>metadataMap</var> be ?&nbsp;<emu-xref aoid="GetOrCreateMetadataMap" id="_ref_22"><a href="#getorcreatemetadatamap">GetOrCreateMetadataMap</a></emu-xref>(<var>O</var>, <var>P</var>, <emu-val>true</emu-val>).</li><li>Return ?&nbsp;<emu-xref aoid="Invoke" id="_ref_23"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>metadataMap</var>, <code>"set"</code>, <var>MetadataKey</var>, <var>MetadataValue</var>).
  1659. </li></ol></emu-alg>
  1660. </emu-clause>
  1661. </emu-clause>
  1662. <emu-clause id="ordinary-object-internal-methods-and-internal-slots-metadatakeys">
  1663. <h1><span class="secnum">3.1.6</span>[[MetadataKeys]] ( P )</h1>
  1664. <p>When the [[MetadataKeys]] internal method of <var>O</var> is called with property key <var>P</var> the following steps are taken:</p>
  1665. <emu-alg><ol><li>Return ?&nbsp;<emu-xref aoid="OrdinaryMetadataKeys" id="_ref_24"><a href="#ordinarymetadatakeys">OrdinaryMetadataKeys</a></emu-xref>(<var>O</var>, <var>P</var>).
  1666. </li></ol></emu-alg>
  1667. <emu-clause id="ordinarymetadatakeys" aoid="OrdinaryMetadataKeys">
  1668. <h1><span class="secnum">3.1.6.1</span>OrdinaryMetadataKeys ( O, P )</h1>
  1669. <p>When the abstract operation OrdinaryMetadataKeys is called with Object <var>O</var> and property key <var>P</var> the following steps are taken:</p>
  1670. <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_25"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>ownKeys</var> be ?&nbsp;<emu-xref aoid="OrdinaryOwnMetadataKeys" id="_ref_26"><a href="#ordinaryownmetadatakeys">OrdinaryOwnMetadataKeys</a></emu-xref>(<var>O</var>, <var>P</var>).</li><li>Let <var>parent</var> be ? <var>O</var>.[[GetPrototypeOf]]().</li><li>If <var>parent</var> is <emu-val>null</emu-val>, then return <var>ownKeys</var>.</li><li>Let <var>parentKeys</var> be ? <var>O</var>.[[OrdinaryMetadataKeys]](<var>P</var>).</li><li>Let <var>ownKeysLen</var> = ?&nbsp;<emu-xref aoid="Get" id="_ref_27"><a href="https://tc39.github.io/ecma262/#sec-get-o-p">Get</a></emu-xref>(<var>ownKeys</var>, "length").</li><li>If <var>ownKeysLen</var> is <emu-val>0</emu-val>, return <var>parentKeys</var>.</li><li>Let <var>parentKeysLen</var> = ?&nbsp;<emu-xref aoid="Get" id="_ref_28"><a href="https://tc39.github.io/ecma262/#sec-get-o-p">Get</a></emu-xref>(<var>parentKeys</var>, "length").</li><li>If <var>parentKeysLen</var> is <emu-val>0</emu-val>, return <var>ownKeys</var>.</li><li>Let <var>set</var> be a newly created <emu-val>Set</emu-val> object.</li><li>Let <var>keys</var> be ?&nbsp;<emu-xref aoid="ArrayCreate" id="_ref_29"><a href="https://tc39.github.io/ecma262/#sec-arraycreate">ArrayCreate</a></emu-xref>(0).</li><li>Let <var>k</var> be <emu-val>0</emu-val>.</li><li>For each element <var>key</var> of <var>ownKeys</var><ol><li>Let <var>hasKey</var> be ?&nbsp;<emu-xref aoid="Invoke" id="_ref_30"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>set</var>, <code>"has"</code>, <var>key</var>).</li><li>If <var>hasKey</var> is <emu-val>false</emu-val>, then<ol><li>Let <var>Pk</var> be !&nbsp;<emu-xref aoid="ToString" id="_ref_31"><a href="https://tc39.github.io/ecma262/#sec-tostring">ToString</a></emu-xref>(<var>k</var>).</li><li>Perform ?&nbsp;<emu-xref aoid="Invoke" id="_ref_32"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>set</var>, "add", <var>key</var>).</li><li>Let <var>defineStatus</var> be <emu-xref aoid="CreateDataProperty" id="_ref_33"><a href="https://tc39.github.io/ecma262/#sec-createdataproperty">CreateDataProperty</a></emu-xref>(<var>keys</var>, <var>Pk</var>, <var>key</var>).</li><li>Assert: <var>defineStatus</var> is <emu-val>true</emu-val>.</li><li>Increase <var>k</var> by <emu-val>1</emu-val>.</li></ol></li></ol></li><li>For each element <var>key</var> of <var>parentKeys</var><ol><li>Let <var>hasKey</var> be ?&nbsp;<emu-xref aoid="Invoke" id="_ref_34"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>set</var>, <code>"has"</code>, <var>key</var>).</li><li>If <var>hasKey</var> is <emu-val>false</emu-val>, then<ol><li>Let <var>Pk</var> be !&nbsp;<emu-xref aoid="ToString" id="_ref_35"><a href="https://tc39.github.io/ecma262/#sec-tostring">ToString</a></emu-xref>(<var>k</var>).</li><li>Perform ?&nbsp;<emu-xref aoid="Invoke" id="_ref_36"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>set</var>, <code>"add"</code>, <var>key</var>).</li><li>Let <var>defineStatus</var> be <emu-xref aoid="CreateDataProperty" id="_ref_37"><a href="https://tc39.github.io/ecma262/#sec-createdataproperty">CreateDataProperty</a></emu-xref>(<var>keys</var>, <var>Pk</var>, <var>key</var>).</li><li>Assert: <var>defineStatus</var> is <emu-val>true</emu-val>.</li><li>Increase <var>k</var> by <emu-val>1</emu-val>.</li></ol></li></ol></li><li>Perform ?&nbsp;<emu-xref aoid="Set" id="_ref_38"><a href="https://tc39.github.io/ecma262/#sec-set-o-p-v-throw">Set</a></emu-xref>(<var>keys</var>, <code>"length"</code>, <var>k</var>).</li><li>return <var>keys</var>.
  1671. </li></ol></emu-alg>
  1672. </emu-clause>
  1673. </emu-clause>
  1674. <emu-clause id="ordinary-object-internal-methods-and-internal-slots-ownmetadatakeys">
  1675. <h1><span class="secnum">3.1.7</span>[[OwnMetadataKeys]] ( P )</h1>
  1676. <p>When the [[OwnMetadataKeys]] internal method of <var>O</var> is called with property key <var>P</var> the following steps are taken:</p>
  1677. <emu-alg><ol><li>Return <emu-xref aoid="OrdinaryOwnMetadataKeys" id="_ref_39"><a href="#ordinaryownmetadatakeys">OrdinaryOwnMetadataKeys</a></emu-xref>(<var>O</var>, <var>P</var>).
  1678. </li></ol></emu-alg>
  1679. <emu-clause id="ordinaryownmetadatakeys" aoid="OrdinaryOwnMetadataKeys">
  1680. <h1><span class="secnum">3.1.7.1</span>OrdinaryOwnMetadataKeys ( O, P )</h1>
  1681. <p>When the abstract operation OrdinaryOwnMetadataKeys is called with Object <var>O</var> and property key <var>P</var> the following steps are taken:</p>
  1682. <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_40"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>keys</var> be ?&nbsp;<emu-xref aoid="ArrayCreate" id="_ref_41"><a href="https://tc39.github.io/ecma262/#sec-arraycreate">ArrayCreate</a></emu-xref>(0).</li><li>Let <var>metadataMap</var> be ?&nbsp;<emu-xref aoid="GetOrCreateMetadataMap" id="_ref_42"><a href="#getorcreatemetadatamap">GetOrCreateMetadataMap</a></emu-xref>(<var>O</var>, <var>P</var>, <emu-val>false</emu-val>).</li><li>If <var>metadataMap</var> is <emu-val>undefined</emu-val>, return <var>keys</var>.</li><li>Let <var>keysObj</var> be ?&nbsp;<emu-xref aoid="Invoke" id="_ref_43"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>metadataMap</var>, <code>"keys"</code>).</li><li>Let <var>iterator</var> be ?&nbsp;<emu-xref aoid="GetIterator" id="_ref_44"><a href="https://tc39.github.io/ecma262/#sec-getiterator">GetIterator</a></emu-xref>(<var>keysObj</var>).</li><li>Let <var>k</var> be <emu-val>0</emu-val>.</li><li>Repeat<ol><li>Let <var>Pk</var> be !&nbsp;<emu-xref aoid="ToString" id="_ref_45"><a href="https://tc39.github.io/ecma262/#sec-tostring">ToString</a></emu-xref>(<var>k</var>).</li><li>Let <var>next</var> be ?&nbsp;<emu-xref aoid="IteratorStep" id="_ref_46"><a href="https://tc39.github.io/ecma262/#sec-iteratorstep">IteratorStep</a></emu-xref>(<var>iterator</var>).</li><li>If <var>next</var> is <emu-val>false</emu-val>, then<ol><li>Let <var>setStatus</var> be ?&nbsp;<emu-xref aoid="Set" id="_ref_47"><a href="https://tc39.github.io/ecma262/#sec-set-o-p-v-throw">Set</a></emu-xref>(<var>keys</var>, <code>"length"</code>, <var>k</var>, <var>true</var>).</li><li>Assert: <var>setStatus</var> is <emu-val>true</emu-val>.</li><li>Return <var>keys</var>.</li></ol></li><li>Let <var>nextValue</var> be ?&nbsp;<emu-xref aoid="IteratorValue" id="_ref_48"><a href="https://tc39.github.io/ecma262/#sec-iteratorvalue">IteratorValue</a></emu-xref>(<var>next</var>).</li><li>Let <var>defineStatus</var> be <emu-xref aoid="CreateDataPropertyOrThrow" id="_ref_49"><a href="https://tc39.github.io/ecma262/#sec-createdatapropertyorthrow">CreateDataPropertyOrThrow</a></emu-xref>(<var>keys</var>, <var>Pk</var>, <var>nextValue</var>).</li><li>If <var>defineStatus</var> is an <emu-xref href="#sec-completion-record-specification-type"><a href="https://tc39.github.io/ecma262/#sec-completion-record-specification-type">abrupt completion</a></emu-xref>, return ?&nbsp;<emu-xref aoid="IteratorClose" id="_ref_50"><a href="https://tc39.github.io/ecma262/#sec-iteratorclose">IteratorClose</a></emu-xref>(<var>iterator</var>, <var>defineStatus</var>).</li><li>Increase <var>k</var> by <emu-val>1</emu-val>.
  1683. </li></ol></li></ol></emu-alg>
  1684. </emu-clause>
  1685. </emu-clause>
  1686. <emu-clause id="ordinary-object-internal-methods-and-internal-slots-deletemetadata">
  1687. <h1><span class="secnum">3.1.8</span>[[DeleteMetadata]]( MetadataKey, P )</h1>
  1688. <p>When the [[DeleteMetadata]] internal method of <var>O</var> is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var> and property key <var>P</var> the following steps are taken:</p>
  1689. <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_51"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>metadataMap</var> be ?&nbsp;<emu-xref aoid="GetOrCreateMetadataMap" id="_ref_52"><a href="#getorcreatemetadatamap">GetOrCreateMetadataMap</a></emu-xref>(<var>O</var>, <var>P</var>, <emu-val>false</emu-val>).</li><li>If <var>metadataMap</var> is <emu-val>undefined</emu-val>, return <emu-val>false</emu-val>.</li><li>Return ?&nbsp;<emu-xref aoid="Invoke" id="_ref_53"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>metadataMap</var>, <code>"delete"</code>, <var>MetadataKey</var>).
  1690. </li></ol></emu-alg>
  1691. </emu-clause>
  1692. </emu-clause>
  1693. </emu-clause>
  1694. <emu-clause id="reflection">
  1695. <h1><span class="secnum">4</span>Reflection</h1>
  1696. <emu-clause id="reflect">
  1697. <h1><span class="secnum">4.1</span>The Reflect Object</h1>
  1698. <p>This section contains amendments to the Reflect object.</p>
  1699. <emu-clause id="reflect-metadatadecoratorfunctions">
  1700. <h1><span class="secnum">4.1.1</span>Metadata Decorator Functions</h1>
  1701. <p>A metadata decorator function is an anonymous built-in function that has [[MetadataKey]] and [[MetadataValue]] internal slots.</p>
  1702. <p>When a metadata decorator function <var>F</var> is called with arguments <var>target</var> and <var>key</var>, the following steps are taken:</p>
  1703. <emu-alg><ol><li>Assert: <var>F</var> has a [[MetadataKey]] internal slot whose value is an <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref>, or <emu-val>undefined</emu-val>.</li><li>Assert: <var>F</var> has a [[MetadataValue]] internal slot whose value is an <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref>, or <emu-val>undefined</emu-val>.</li><li>If <emu-xref aoid="Type" id="_ref_54"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>If <var>key</var> is not <emu-val>undefined</emu-val> and <emu-xref aoid="IsPropertyKey" id="_ref_55"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>key</var>) is <emu-val>false</emu-val>, throw a <emu-val>TypeError</emu-val> exception.</li><li>Let <var>metadataKey</var> be the value of <var>F</var>'s [[MetadataKey]] internal slot.</li><li>Let <var>metadataValue</var> be the value of <var>F</var>'s [[MetadataValue]] internal slot.</li><li>Perform ? <var>target</var>.[[DefineMetadata]](<var>metadataKey</var>, <var>metadataValue</var>, <var>target</var>, <var>key</var>).</li><li>Return <emu-val>undefined</emu-val>.
  1704. </li></ol></emu-alg>
  1705. </emu-clause>
  1706. <emu-clause id="reflect.metadata">
  1707. <h1><span class="secnum">4.1.2</span>Reflect.metadata ( metadataKey, metadataValue )</h1>
  1708. <p>When the <code>metadata</code> function is called with arguments <var>metadataKey</var> and <var>metadataValue</var>, the following steps are taken:</p>
  1709. <emu-alg><ol><li>Let <var>decorator</var> be a new built-in function object as defined in Metadata Decorator Functions.</li><li>Set the [[MetadataKey]] internal slot of <var>decorator</var> to <var>metadataKey</var>.</li><li>Set the [[MetadataValue]] internal slot of <var>decorator</var> to <var>metadataValue</var>.</li><li>Return <var>decorator</var>.
  1710. </li></ol></emu-alg>
  1711. </emu-clause>
  1712. <emu-clause id="reflect.definemetadata">
  1713. <h1><span class="secnum">4.1.3</span>Reflect.defineMetadata ( metadataKey, metadataValue, target [, propertyKey] )</h1>
  1714. <p>When the <code>defineMetadata</code> function is called with arguments <var>metadataKey</var>, <var>metadataValue</var>, <var>target</var>, and <var>propertyKey</var>, the following steps are taken:</p>
  1715. <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_56"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[DefineMetadata]](<var>metadataKey</var>, <var>metadataValue</var>, <var>propertyKey</var>).
  1716. </li></ol></emu-alg>
  1717. </emu-clause>
  1718. <emu-clause id="reflect.hasmetadata">
  1719. <h1><span class="secnum">4.1.4</span>Reflect.hasMetadata ( metadataKey, target [, propertyKey] )</h1>
  1720. <p>When the <code>hasMetadata</code> function is called with arguments <var>metadataKey</var>, <var>target</var>, and <var>propertyKey</var>, the following steps are taken:</p>
  1721. <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_57"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[HasMetadata]](<var>metadataKey</var>, <var>propertyKey</var>).
  1722. </li></ol></emu-alg>
  1723. </emu-clause>
  1724. <emu-clause id="reflect.hasownmetadata">
  1725. <h1><span class="secnum">4.1.5</span>Reflect.hasOwnMetadata ( metadataKey, target [, propertyKey] )</h1>
  1726. <p>When the <code>hasOwnMetadata</code> function is called with arguments <var>metadataKey</var>, <var>target</var>, and <var>propertyKey</var>, the following steps are taken:</p>
  1727. <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_58"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[HasOwn]](<var>metadataKey</var>, <var>propertyKey</var>).
  1728. </li></ol></emu-alg>
  1729. </emu-clause>
  1730. <emu-clause id="reflect.getmetadata">
  1731. <h1><span class="secnum">4.1.6</span>Reflect.getMetadata ( metadataKey, target [, propertyKey] )</h1>
  1732. <p>When the <code>getMetadata</code> function is called with arguments <var>metadataKey</var>, <var>target</var>, and <var>propertyKey</var>, the following steps are taken:</p>
  1733. <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_59"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[GetMetadata]](<var>metadataKey</var>, <var>propertyKey</var>).
  1734. </li></ol></emu-alg>
  1735. </emu-clause>
  1736. <emu-clause id="reflect.getownmetadata">
  1737. <h1><span class="secnum">4.1.7</span>Reflect.getOwnMetadata ( metadataKey, target [, propertyKey] )</h1>
  1738. <p>When the <code>getOwnMetadata</code> function is called with arguments <var>metadataKey</var>, <var>target</var>, and <var>propertyKey</var>, the following steps are taken:</p>
  1739. <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_60"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[GetOwnMetadata]](<var>metadataKey</var>, <var>propertyKey</var>).
  1740. </li></ol></emu-alg>
  1741. </emu-clause>
  1742. <emu-clause id="reflect.getmetadatakeys">
  1743. <h1><span class="secnum">4.1.8</span>Reflect.getMetadataKeys ( target [, propertyKey] )</h1>
  1744. <p>When the <code>getMetadataKeys</code> function is called with arguments <var>target</var> and <var>propertyKey</var>, the following steps are taken:</p>
  1745. <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_61"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[GetMetadataKeys]](<var>propertyKey</var>).
  1746. </li></ol></emu-alg>
  1747. </emu-clause>
  1748. <emu-clause id="reflect.getownmetadatakeys">
  1749. <h1><span class="secnum">4.1.9</span>Reflect.getOwnMetadataKeys ( target [, propertyKey] )</h1>
  1750. <p>When the <code>getOwnMetadataKeys</code> function is called with arguments <var>target</var> and <var>propertyKey</var>, the following steps are taken:</p>
  1751. <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_62"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[GetOwnMetadataKeys]](<var>propertyKey</var>).
  1752. </li></ol></emu-alg>
  1753. </emu-clause>
  1754. <emu-clause id="reflect.deletemetadata">
  1755. <h1><span class="secnum">4.1.10</span>Reflect.deleteMetadata ( metadataKey, target [, propertyKey] )</h1>
  1756. <p>When the <code>deleteMetadata</code> function is called with arguments <var>metadataKey</var>, <var>target</var>, and <var>propertyKey</var>, the following steps are taken:</p>
  1757. <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_63"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[DeleteMetadata]](<var>metadataKey</var>, <var>propertyKey</var>).
  1758. </li></ol></emu-alg>
  1759. </emu-clause>
  1760. </emu-clause>
  1761. </emu-clause></div></body>