【この訳に特有な表記規約】
◎表記記号この~pageでは、 ~JS仕様による表記規約が利用されている:
- ~algo内に現れる抽象-演算のうち[ `完了~Record$を返すよう定義されたもの ]には、 `"~NOABRUPT" や "~ABRUPT" を接頭する記法@~TC39#sec-returnifabrupt-shorthands$ が利用される (これは、 完了~Recordで包装された[ 値/~error ]を透過的に取扱うための記法であり, "~ABRUPT" は 例外が投出され得ること/ "~NOABRUPT" は 例外は決して投出されないことを表す)。
- `~Foo^sl という表記は、 名前 "~Foo" の[ 内部~slot/内部~method/~Record~field ]を表す。
- この訳では、 次の記法も用いる ⇒ “%O.`~Foo^sl ~EQ ε” という表記は、 %O は名前 `~Foo^l の[ 内部~slot/内部~method/~Record~field ]を有さず,その値は無いことを意味する。 “〜 ~NEQ ε” はその否定を意味する。
7.2. ~naviと~session履歴に関係する~API
7.2.1 `Window^I, `WindowProxy^I, `Location^I ~obj用の~security基盤
概して,~objは`生成元$を超えて~accessされることはないが、 ~webは,この規則に対するいくつかの旧来の例外に依存しているため、 それらの例外を取り除くと,~web~platformとは言えなくなる。 ◎ Although typically objects cannot be accessed across origins, the web platform would not be true to itself if it did not have some legacy exceptions to that rule that the web depends upon.
この節では、 ~JS仕様による[ 各種用語, 表記規約 ]を利用する。 `JAVASCRIPT$r ◎ This section uses the terminology and typographic conventions from the JavaScript specification. [JAVASCRIPT]
7.2.1.1. ~IDLとの統合
`~security検査を遂行する$ときは、 所与の ( %~platform~obj, %識別子, %種別 ) に対し,次の手続きを走らす: ◎ When perform a security check is invoked, with a platformObject, identifier, and type, run these steps:
- ~IF[ %~platform~obj は[ `Window$I / `Location$I ]~objでない ] ⇒ ~RET ◎ If platformObject is not a Window or Location object, then return.
- %~prop群 ~LET `CrossOriginProperties$jA( %~platform~obj ) ◎ ↓
-
%~prop群 を成す ~EACH( %e ) に対し: ◎ For each e of CrossOriginProperties(platformObject):
- ~IF[ `SameValue$jA( %e . `Property^sl, %識別子 ) ~NEQ ~T ] ⇒ ~CONTINUE ◎ If SameValue(e.[[Property]], identifier) is true, then:
-
~IF[ ~OR↓ ]…
- [ %種別 ~EQ `~method^i ]~AND[ %e . `NeedsGet^sl ~EQ ε ]~AND[ %e . `NeedsSet^sl ~EQ ε ]
- [ %種別 ~EQ `取得子^i ]~AND[ %e . `NeedsGet^sl ~EQ ~T ]
- [ %種別 ~EQ `設定子^i ]~AND[ %e . `NeedsSet^sl ~EQ ~T ]
…ならば ⇒ ~RET
◎ If type is "method" and e has neither [[NeedsGet]] nor [[NeedsSet]], then return. ◎ Otherwise, if type is "getter" and e.[[NeedsGet]] is true, then return. ◎ Otherwise, if type is "setter" and e.[[NeedsSet]] is true, then return.
- ~IF[ `IsPlatformObjectSameOrigin$jA( %~platform~obj ) ~EQ ~F ] ⇒ ~THROW `SecurityError$E ◎ If IsPlatformObjectSameOrigin(platformObject) is false, then throw a "SecurityError" DOMException.
7.2.1.2. 共用~内部~slot: `CrossOriginPropertyDescriptorMap^sl
各[ `Window$I / `Location$I ]~objは、 `CrossOriginPropertyDescriptorMap@sl 内部~slotを有する — その値は~mapであり,初期~時は空とする。 この~mapが包含する各~entryの: ◎ Window and Location objects both have a [[CrossOriginPropertyDescriptorMap]] internal slot, whose value is initially an empty map. ◎ The [[CrossOriginPropertyDescriptorMap]] internal slot contains a map with\
- ~keyは、 ( %currentGlobal, %objectGlobal, %propertyKey ) からなる~tupleを与える。 ◎ entries whose keys are (currentGlobal, objectGlobal, propertyKey)-tuples\
- 値は、[ %currentGlobal が[ `Window$I / `Location$I ]~obj %objectGlobal を検分するときに,~scriptから可視になるもの ]を記憶しておく~prop記述子を与える。 ◎ and values are property descriptors, as a memoization of what is visible to scripts when currentGlobal inspects a Window or Location object from objectGlobal.\
この~mapを成す~entryたちは、 `CrossOriginGetOwnPropertyHelper$jA() により後から埋められ,未来の検索に際して諮られる。 ◎ It is filled lazily by CrossOriginGetOwnPropertyHelper, which consults it on future lookups.
~UAは、 この~map内に保持されている各~entryに対しては,[ その値を成す一部への参照を保持するものが無いとき ]には[ 対応する~keyと伴に~garbage収集される ]ことを[ 当の~garbage収集が観測-可能にならない ]限り許容するべきである。 ◎ User agents should allow a value held in the map to be garbage collected along with its corresponding key when nothing holds a reference to any part of the value. That is, as long as garbage collection is not observable.
例えば,次の~codeがある下では:
const %href = Object.getOwnPropertyDescriptor( %crossOriginLocation, `href^l ).set
~map内の値とそれに対応する~keyは、 観測-可能になるので,~garbage収集できない。
◎ For example, with const href = Object.getOwnPropertyDescriptor(crossOriginLocation, "href").set the value and its corresponding key in the map cannot be garbage collected as that would be observable.~UAは、 `document.domain$c が設定されたときには,それに伴い[ ~mapから対応する ( ~key, 値 ) ~pairたちを除去する ]よう最適化してもヨイ。 `document.domain$c は~~過去の値を訪問し直せないので、 これは,観測-可能にならない。 ◎ User agents may have an optimization whereby they remove key-value pairs from the map when document.domain is set. This is not observable as document.domain cannot revisit an earlier value.
例えば `www.example.com^c 上の `document.domain$c を `example.com^l に設定した場合、 ~UAは,~map内の ( ~key, 値 ) ~pairのうち,[ ~keyの一部が `www.example.com^c であるもの ]すべてを除去できることになる — それが再び当の`生成元$の一部を成すことは決してなく, 対応する値が~mapから検索取得されることも決してないので。 ◎ For example, setting document.domain to "example.com" on www.example.com means user agents can remove all key-value pairs from the map where part of the key is www.example.com, as that can never be part of the origin again and therefore the corresponding value could never be retrieved from the map.
7.2.1.3. 各種 共用~抽象-演算
7.2.1.3.1. `CrossOriginProperties^jA( %O )
- ~Assert: %O は[ `Location$I / `Window$I ]~objである ◎ Assert: O is a Location or Window object.
- ~IF[ %O は `Location$I ~objである ] ⇒ ~RET « { `Property^sl: `href^l, `NeedsGet^sl: ~F, `NeedsSet^sl: ~T }, { `Property^sl: `replace^l } » ◎ If O is a Location object, then return « { [[Property]]: "href", [[NeedsGet]]: false, [[NeedsSet]]: true }, { [[Property]]: "replace" } ».
- ~RET « { `Property^sl: `window^l, `NeedsGet^sl: ~T, `NeedsSet^sl: ~F }, { `Property^sl: `self^l, `NeedsGet^sl: ~T, `NeedsSet^sl: ~F }, { `Property^sl: `location^l, `NeedsGet^sl: ~T, `NeedsSet^sl: ~T }, { `Property^sl: `close^l }, { `Property^sl: `closed^l, `NeedsGet^sl: ~T, `NeedsSet^sl: ~F }, { `Property^sl: `focus^l }, { `Property^sl: `blur^l }, { `Property^sl: `frames^l, `NeedsGet^sl: ~T, `NeedsSet^sl: ~F }, { `Property^sl: `length^l, `NeedsGet^sl: ~T, `NeedsSet^sl: ~F }, { `Property^sl: `top^l, `NeedsGet^sl: ~T, `NeedsSet^sl: ~F }, { `Property^sl: `opener^l, `NeedsGet^sl: ~T, `NeedsSet^sl: ~F }, { `Property^sl: `parent^l, `NeedsGet^sl: ~T, `NeedsSet^sl: ~F }, { `Property^sl: `postMessage^l } » ◎ Return « { [[Property]]: "window", [[NeedsGet]]: true, [[NeedsSet]]: false }, { [[Property]]: "self", [[NeedsGet]]: true, [[NeedsSet]]: false }, { [[Property]]: "location", [[NeedsGet]]: true, [[NeedsSet]]: true }, { [[Property]]: "close" }, { [[Property]]: "closed", [[NeedsGet]]: true, [[NeedsSet]]: false }, { [[Property]]: "focus" }, { [[Property]]: "blur" }, { [[Property]]: "frames", [[NeedsGet]]: true, [[NeedsSet]]: false }, { [[Property]]: "length", [[NeedsGet]]: true, [[NeedsSet]]: false }, { [[Property]]: "top", [[NeedsGet]]: true, [[NeedsSet]]: false }, { [[Property]]: "opener", [[NeedsGet]]: true, [[NeedsSet]]: false }, { [[Property]]: "parent", [[NeedsGet]]: true, [[NeedsSet]]: false }, { [[Property]]: "postMessage" } ».
注記: この抽象-演算は、 `完了~Record$を返さない。 ◎ This abstract operation does not return a Completion Record.
注記: この~algoにおいては、 各 有index~propは,~safelistされる必要はない — それらは `WindowProxy$I ~objにより直に取扱われるので。 ◎ Indexed properties do not need to be safelisted in this algorithm, as they are handled directly by the WindowProxy object.
次に挙げる~JS~prop名は、 `非同一-生成元から~access可能な~window~prop名@ であるとされる ⇒# `window^l, `self^l, `location^l, `close^l, `closed^l, `focus^l, `blur^l, `frames^l, `length^l, `top^l, `opener^l, `parent^l, `postMessage^l, `配列~index~prop名$ ◎ A JavaScript property name P is a cross-origin accessible window property name if it is "window", "self", "location", "close", "closed", "focus", "blur", "frames", "length", "top", "opener", "parent", "postMessage", or an array index property name.
7.2.1.3.2. `CrossOriginPropertyFallback^jA( %P )
- ~IF[ %P ~IN { `then^l, `Symbol.toStringTag$jI, `Symbol.hasInstance$jI, `Symbol.isConcatSpreadable$jI } ] ⇒ ~RET `~prop記述子$x { `Value^sl: `undefined^jv, `Writable^sl: ~F, `Enumerable^sl: ~F, `Configurable^sl: ~T } ◎ If P is "then", %Symbol.toStringTag%, %Symbol.hasInstance%, or %Symbol.isConcatSpreadable%, then return PropertyDescriptor{ [[Value]]: undefined, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
- ~THROW `SecurityError$E ◎ Throw a "SecurityError" DOMException.
7.2.1.3.3. `IsPlatformObjectSameOrigin^jA( %O )
- ~RET ~IS[ ( `現在の設定群~obj$の`生成元$enV, %O に`関連な設定群~obj$の`生成元$enV ) は`同じ生成元~domain$である ] ◎ Return true if the current settings object's origin is same origin-domain with O's relevant settings object's origin, and false otherwise.
注記: この抽象-演算は、 `完了~Record$を返さない。 ◎ This abstract operation does not return a Completion Record.
注記:
`現在の設定群~obj$は、
概ね “~call元” に対応する
— この検査は、
当の[
取得子/設定子/~method
]用の`~JS実行~文脈$が`~JS実行~文脈~stack$へ~~導かれる前に生じるので。
例えば
%w.document
のような~codeにおいては、
この段は `document$m 取得子に達する前に,
`WindowProxy$I %w 用の `Get$sl ~algoの一部として呼出される。
◎
Here the current settings object roughly corresponds to the "caller", because this check occurs before the execution context for the getter/setter/method in question makes its way onto the JavaScript execution context stack. For example, in the code w.document, this step is invoked before the document getter is reached as part of the [[Get]] algorithm for the WindowProxy w.
7.2.1.3.4. `CrossOriginGetOwnPropertyHelper^jA( %O, %P )
注記: この抽象-演算が `undefined^jv を返す, かつ ~custom化する挙動もない場合、 ~call元は `SecurityError$E 例外を投出する必要がある。 実施においては、 これは,~call元が `CrossOriginPropertyFallback$jA を~callすることにより取扱われる。 ◎ If this abstract operation returns undefined and there is no custom behavior, the caller needs to throw a "SecurityError" DOMException. In practice this is handled by the caller calling CrossOriginPropertyFallback.
- %非同一-生成元~key ~LET ( `現在の設定群~obj$, %O に`関連な設定群~obj$, %P ) からなる~tuple ◎ Let crossOriginKey be a tuple consisting of the current settings object, O's relevant settings object, and P.
- %~prop群 ~LET `CrossOriginProperties$jA( %O ) ◎ ↓
-
%~prop群 を成す ~EACH( %e ) に対し: ◎ For each e of CrossOriginProperties(O):
-
~IF[ `SameValue$jA( %e . `Property^sl, %P ) ~EQ ~T ]: ◎ If SameValue(e.[[Property]], P) is true, then:
- ~IF[ %O . `CrossOriginPropertyDescriptorMap$sl は,[ ~key ~EQ %非同一-生成元~key ]なる~entryを包含する ] ⇒ ~RET その~entryの値 ◎ If the value of the [[CrossOriginPropertyDescriptorMap]] internal slot of O contains an entry whose key is crossOriginKey, then return that entry's value.
- %元の記述子 ~LET `OrdinaryGetOwnProperty$jA( %O, %P ) ◎ Let originalDesc be OrdinaryGetOwnProperty(O, P).
- %非同一-生成元~記述子 ~LET `undefined^jv ◎ Let crossOriginDesc be undefined.
-
~IF[ %e . `NeedsGet^sl ~EQ ε ]~AND[ %e . `NeedsSet^sl ~EQ ε ]: ◎ If e.[[NeedsGet]] and e.[[NeedsSet]] are absent, then:
- %値 ~LET %元の記述子 . `Value^sl ◎ Let value be originalDesc.[[Value]].
- ~IF[ `IsCallable$jA( %値 ) ~EQ ~T ] ⇒ %値 ~SET [ `現在の~realm$内に作成される匿名な組込みの関数 ]であって,[ ~obj %O 上の~IDL演算 %P ]と同じ手続きを遂行するもの ◎ If IsCallable(value) is true, then set value to an anonymous built-in function, created in the current realm, that performs the same steps as the IDL operation P on object O.
- %非同一-生成元~記述子 ~SET `~prop記述子$x { `Value^sl: %値, `Enumerable^sl: ~F, `Writable^sl: ~F, `Configurable^sl: ~T } ◎ Set crossOriginDesc to PropertyDescriptor{ [[Value]]: value, [[Enumerable]]: false, [[Writable]]: false, [[Configurable]]: true }.
-
~ELSE: ◎ Otherwise:
- %非同一-生成元~Get ~LET `undefined^jv ◎ Let crossOriginGet be undefined.
- ~IF[ %e . `NeedsGet^sl ~EQ ~T ] ⇒ %非同一-生成元~Get ~SET[ `現在の~realm$内に作成される匿名な組込みの関数 ]であって,[ ~obj %O 上の~IDL属性 %P の取得子 ]と同じ手続きを遂行するもの ◎ If e.[[NeedsGet]] is true, then set crossOriginGet to an anonymous built-in function, created in the current realm, that performs the same steps as the getter of the IDL attribute P on object O.
- %非同一-生成元~Set ~LET `undefined^jv ◎ Let crossOriginSet be undefined.
- ~IF[ %e.`NeedsSet^sl ~EQ ~T ] ⇒ %非同一-生成元~Set ~SET[ `現在の~realm$内に作成される匿名な組込みの関数 ]であって,[ ~obj %O 上の~IDL属性 %P の設定子 ]と同じ手続きを遂行するもの ◎ If e.[[NeedsSet]] is true, then set crossOriginSet to an anonymous built-in function, created in the current realm, that performs the same steps as the setter of the IDL attribute P on object O.
- %非同一-生成元~記述子 ~SET `~prop記述子$x{ `Get^sl: %非同一-生成元~Get, `Set^sl: %非同一-生成元~Set, `Enumerable^sl: ~F, `Configurable^sl: ~T } ◎ Set crossOriginDesc to PropertyDescriptor{ [[Get]]: crossOriginGet, [[Set]]: crossOriginSet, [[Enumerable]]: false, [[Configurable]]: true }.
- %O . `CrossOriginPropertyDescriptorMap$sl 内に 新たな~entry ( ~key %非同一-生成元~key, 値 %非同一-生成元~記述子 ) を作成する ◎ Create an entry in the value of the [[CrossOriginPropertyDescriptorMap]] internal slot of O with key crossOriginKey and value crossOriginDesc.
- ~RET %非同一-生成元~記述子 ◎ Return crossOriginDesc.
-
- ~RET `undefined^jv ◎ Return undefined.
注記: この抽象-演算は、 `完了~Record$を返さない。 ◎ This abstract operation does not return a Completion Record.
注記: ここで生産される~prop記述子が~configurableになる理由は、 ~JS仕様から,`~essential内部~methodが成す不変則$を保全することが要求されるからである。 特に,~propの値は~naviに伴って変化し得るので、 ~propは~configurableになることが要求される。 (しかしながら、 既存の~web内容との互換性を得るため,この不変則を保全できない事例もある。 その点については、 `tc39/ecma262 #課題 672$, および それを参照している この仕様の他所を見よ。) `JAVASCRIPT$r ◎ The reason that the property descriptors produced here are configurable is to preserve the invariants of the essential internal methods required by the JavaScript specification. In particular, since the value of the property can change as a consequence of navigation, it is required that the property be configurable. (However, see tc39/ecma262 issue #672 and references to it elsewhere in this specification for cases where we are not able to preserve these invariants, for compatibility with existing web content.) [JAVASCRIPT]
注記: ~prop記述子が — 同一-生成元の挙動に合致しないにもかかわらず — 列挙-不可【 `Enumerable^sl: ~F 】にされている理由は、 既存の~web内容との互換性を得るためである。 詳細は、 `課題 #3183@~HTMLissue/3183$ を見よ。 ◎ The reason the property descriptors are non-enumerable, despite this mismatching the same-origin behavior, is for compatibility with existing web content. See issue #3183 for details.
7.2.1.3.5. `CrossOriginGet^jA( %O, %P, %Receiver )
- %記述子 ~LET ~ABRUPT %O . `GetOwnProperty^sl( %P ) ◎ Let desc be ? O.[[GetOwnProperty]](P).
- ~Assert: %記述子 ~NEQ `undefined^jv ◎ Assert: desc is not undefined.
- ~IF[ `IsDataDescriptor$jA( %記述子 ) ~EQ ~T ] ⇒ ~RET %記述子 . `Value^sl ◎ If IsDataDescriptor(desc) is true, then return desc.[[Value]].
- ~Assert: `IsAccessorDescriptor$jA( %記述子 ) ~EQ ~T ◎ Assert: IsAccessorDescriptor(desc) is true.
- %取得子 ~LET %記述子 . `Get^sl ◎ Let getter be desc.[[Get]].
- ~IF[ %取得子 ~EQ `undefined^jv ] ⇒ ~THROW `SecurityError$E ◎ If getter is undefined, then throw a "SecurityError" DOMException.
- ~RET ~ABRUPT `Call$jA( %取得子, %Receiver ) ◎ Return ? Call(getter, Receiver).
7.2.1.3.6. `CrossOriginSet^jA( %O, %P, %V, %Receiver )
- %記述子 ~LET ~ABRUPT %O . `GetOwnProperty^sl( %P ) ◎ Let desc be ? O.[[GetOwnProperty]](P).
- ~Assert: %記述子 ~NEQ `undefined^jv ◎ Assert: desc is not undefined.
- %設定子 ~LET %記述子 . `Set^sl ◎ ↓
-
~IF[ %設定子 ~NIN { ε, `undefined^jv } ]: ◎ If desc.[[Set]] is present and its value is not undefined, then:
- ~ABRUPT `Call$jA( %設定子, %Receiver, « %V ») ◎ Perform ? Call(setter, Receiver, « V »).
- ~RET ~T ◎ Return true.
- ~THROW `SecurityError$E ◎ Throw a "SecurityError" DOMException.
7.2.1.3.7. `CrossOriginOwnPropertyKeys^jA( %O )
- %~key群 ~LET 新たな空な `List$js ◎ Let keys be a new empty List.
- %~prop群 ~LET `CrossOriginProperties$jA( %O ) ◎ ↓
- %~prop群 を成す ~EACH( %e ) に対し ⇒ %~key群 に %e . `Property^sl を`付加する$ ◎ For each e of CrossOriginProperties(O), append e.[[Property]] to keys.
- %~key群 に次を順に`付加する$ ⇒# `then^l, `Symbol.toStringTag$jI, `Symbol.hasInstance$jI, `Symbol.isConcatSpreadable$jI ◎ Return the concatenation of keys and « "then", %Symbol.toStringTag%, %Symbol.hasInstance%, %Symbol.isConcatSpreadable% ».
- ~RET %~key群 ◎ ↑
注記: この抽象-演算は、 `完了~Record$を返さない。 ◎ This abstract operation does not return a Completion Record.
7.2.2. `Window^I ~obj
【 この節を成す内容は、 `別~page@~WINDOW#the-window-object$にて。 】
7.2.3. `WindowProxy^I ~exotic~obj
各 `閲覧~文脈$ %B には、 `WindowProxy@I ~obj %P が結付けられる。 それは、 普通の~objである `Window$I ~obj %W を次のように包装する~exotic~objである:
- %P 上のほとんどの演算は、 %W へ指し向けられる。
- %B が`~navigate$されたときは、 %W も別の `Window$I ~objに変更される。
- %P の `Window@sl 内部~slotが, %W を表現する。
- %P に対応する`~interface~obj$はない。
`WindowProxy$I ~objは、 以下の各~節にて明示的に他が指定される場合を除き,普通の内部~methodを利用するモノトスル。
◎ A WindowProxy is an exotic object that wraps a Window ordinary object, indirecting most operations through to the wrapped object. Each browsing context has an associated WindowProxy object. When the browsing context is navigated, the Window object wrapped by the browsing context's associated WindowProxy object is changed. ◎ The WindowProxy exotic object must use the ordinary internal methods except where it is explicitly specified otherwise below. ◎ There is no WindowProxy interface object. ◎ Every WindowProxy object has a [[Window]] internal slot representing the wrapped Window object.注記: `WindowProxy$I は、 “proxy(代理)” と命名されているが、 本当の proxy がするような,~targetの内部~methodへ polymorphic に dispatch するものではない — それは、 `WindowProxy$I ~objと `Location$I ~objとの間の machinery 【機構?】 を再利用したいと欲されることに因る。 `Window$I ~objが普通の~objのままであり続ける限り,これは観測され得ないので、 どちらの仕方でも実装できる。 ◎ Although WindowProxy is named as a "proxy", it does not do polymorphic dispatch on its target's internal methods as a real proxy would, due to a desire to reuse machinery between WindowProxy and Location objects. As long as the Window object remains an ordinary object this is unobservable and can be implemented either way.
7.2.3.1. `GetPrototypeOf^sl()
- %W ~LET `this^jv . `Window$sl ◎ Let W be the value of the [[Window]] internal slot of this.
- ~IF[ `IsPlatformObjectSameOrigin$jA( %W ) ~EQ ~T ] ⇒ ~RET ~NOABRUPT `OrdinaryGetPrototypeOf$jA( %W ) ◎ If IsPlatformObjectSameOrigin(W) is true, then return ! OrdinaryGetPrototypeOf(W).
- ~RET ~NULL ◎ Return null.
7.2.3.2. `SetPrototypeOf^sl( %V )
- ~RET `SetImmutablePrototype$jA( `this^jv, %V ) ◎ Return ! SetImmutablePrototype(this, V).
7.2.3.3. `IsExtensible^sl()
- ~RET ~T ◎ Return true.
7.2.3.4. `PreventExtensions^sl()
- ~RET ~F ◎ Return false.
7.2.3.5. `GetOwnProperty^sl( %P )
- %W ~LET `this^jv . `Window$sl ◎ Let W be the value of the [[Window]] internal slot of this.
-
~IF[ %P は`配列~indexである$ ]: ◎ If P is an array index property name, then:
- %~index ~LET ~NOABRUPT `ToUint32$jA( %P ) ◎ Let index be ! ToUint32(P).
- %子~群 ~LET %W に`結付けられた文書$の`文書~treeに属する子~navigable群$ ◎ Let children be the document-tree child navigables of W's associated Document.
- %値 ~LET `undefined^jv ◎ Let value be undefined.
-
~IF[ %~index ~LT %子~群 の`~size$ ]: ◎ If index is less than children's size, then:
-
%~sort済み子~群 ~LET `~listを昇順に~sortする$( %子~群, 次の手続き )
手続きは、 所与の ( `~navigable$ %A, `~navigable$ %B ) に対し ⇒ ~RET ~IS[ %A の`容器$navは %B の`容器$navより早く[ %W に`結付けられた文書$ ]の中へ挿入された ]
◎ Sort children in ascending order, with navigableA being less than navigableB if navigableA's container was inserted into W's associated Document earlier than navigableB's container was. - %値 ~SET %~sort済み子~群[ %~index ] にて`作動中な~WindowProxy$nav ◎ Set value to children[index]'s active WindowProxy.
-
-
~IF[ %値 ~EQ `undefined^jv ]: ◎ If value is undefined, then:
- ~IF[ `IsPlatformObjectSameOrigin$jA( %W ) ~EQ ~T ] ⇒ ~RET `undefined^jv ◎ If IsPlatformObjectSameOrigin(W) is true, then return undefined.
- ~THROW `SecurityError$E ◎ Throw a "SecurityError" DOMException.
- ~RET `~prop記述子$x{ `Value^sl: %値, `Writable^sl: ~F, `Enumerable^sl: ~T, `Configurable^sl: ~T } ◎ Return PropertyDescriptor{ [[Value]]: value, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: true }.
-
~IF[ `IsPlatformObjectSameOrigin$jA( %W ) ~EQ ~T ] ⇒ ~RET ~NOABRUPT `OrdinaryGetOwnProperty$jA( %W, %P ) ◎ If IsPlatformObjectSameOrigin(W) is true, then return ! OrdinaryGetOwnProperty(W, P).
注記: これは、 ~JS仕様の`~essential内部~methodが成す不変則$に対する`故意的な違反$であり、 既存の~web内容との互換性を保守するためにある。 `tc39/ecma262 #課題 672$ を見よ。 `JAVASCRIPT$r ◎ This is a willful violation of the JavaScript specification's invariants of the essential internal methods to maintain compatibility with existing web content. See tc39/ecma262 issue #672 for more information. [JAVASCRIPT]
- %~prop ~LET `CrossOriginGetOwnPropertyHelper$jA( %W, %P ) ◎ Let property be CrossOriginGetOwnPropertyHelper(W, P).
- ~IF[ %~prop ~NEQ `undefined^jv ] ⇒ ~RET %~prop ◎ If property is not undefined, then return property.
-
~IF[ %~prop ~EQ `undefined^jv ]~AND[ %P ~IN %W の`文書~treeに属する子~navigable~target名~prop集合$ ]: ◎ If property is undefined and P is in W's document-tree child navigable target name property set, then:
- %値 ~LET [ %W の[ 名前 %P を伴う`有名~obj$ ]]を成す`作動中な~WindowProxy$nav【?】 ◎ Let value be the active WindowProxy of the named object of W with the name P.
-
~RET `~prop記述子$x{ `Value^sl: %値, `Enumerable^sl: ~F, `Writable^sl: ~F, `Configurable^sl: ~T } ◎ Return PropertyDescriptor{ [[Value]]: value, [[Enumerable]]: false, [[Writable]]: false, [[Configurable]]: true }.
注記: ~prop記述子が列挙-不可にされている理由は — それは同一-生成元の挙動に合致していないにもかかわらず — 既存の~web内容との互換性を得るためである。 `課題 #3183@~HTMLissue/3183$ を見よ。 ◎ The reason the property descriptors are non-enumerable, despite this mismatching the same-origin behavior, is for compatibility with existing web content. See issue #3183 for details.
- ~RET ~ABRUPT `CrossOriginPropertyFallback$jA( %P ) ◎ Return ? CrossOriginPropertyFallback(P).
7.2.3.6. `DefineOwnProperty^sl( %P, %記述子 )
- %W ~LET `this^jv . `Window$sl ◎ Let W be the value of the [[Window]] internal slot of this.
-
~IF[ `IsPlatformObjectSameOrigin$jA( %W ) ~EQ ~T ]: ◎ If IsPlatformObjectSameOrigin(W) is true, then:
- ~IF[ %P は`配列~indexである$ ] ⇒ ~RET ~F ◎ If P is an array index property name, return false.
-
~RET ~ABRUPT `OrdinaryDefineOwnProperty$jA( %W, %P, %記述子 ) ◎ Return ? OrdinaryDefineOwnProperty(W, P, Desc).
注記: これは、 ~JS仕様の`~essential内部~methodが成す不変則$に対する`故意的な違反$であり、 既存の~web内容との互換性を保守するためにある。 `tc39/ecma262 #課題 672$ を見よ。 `JAVASCRIPT$r ◎ This is a willful violation of the JavaScript specification's invariants of the essential internal methods to maintain compatibility with existing web content. See tc39/ecma262 issue #672 for more information. [JAVASCRIPT]
- ~THROW `SecurityError$E ◎ Throw a "SecurityError" DOMException.
7.2.3.7. `Get^sl( %P, %Receiver )
- %W ~LET `this^jv . `Window$sl ◎ Let W be the value of the [[Window]] internal slot of this.
- `閲覧~文脈どうしの~accessは報告されるべきかどうか検査する$( ↓ ) ⇒# `現在の大域~obj$に`対応する閲覧~文脈$, %W に`対応する閲覧~文脈$, %P, `現在の設定群~obj$ ◎ Check if an access between two browsing contexts should be reported, given the current global object's browsing context, W's browsing context, P, and the current settings object.
- ~IF[ `IsPlatformObjectSameOrigin$jA( %W ) ~EQ ~T ] ⇒ ~RET ~ABRUPT `OrdinaryGet$jA( `this^jv, %P, %Receiver ) ◎ If IsPlatformObjectSameOrigin(W) is true, then return ? OrdinaryGet(this, P, Receiver).
- ~RET ~ABRUPT `CrossOriginGet$jA( `this^jv, %P, %Receiver ) ◎ Return ? CrossOriginGet(this, P, Receiver).
注記: %W に代えて `this^jv が渡される — `OrdinaryGet$jA, `CrossOriginGet$jA は、 `GetOwnProperty$sl 内部~methodを呼出すことになるので。 ◎ this is passed rather than W as OrdinaryGet and CrossOriginGet will invoke the [[GetOwnProperty]] internal method.
7.2.3.8. `Set^sl( %P, %V, %Receiver )
- %W ~LET `this^jv . `Window$sl ◎ Let W be the value of the [[Window]] internal slot of this.
- `閲覧~文脈どうしの~accessは報告されるべきかどうか検査する$( ↓ ) ⇒# `現在の大域~obj$に`対応する閲覧~文脈$, %W に`対応する閲覧~文脈$, %P, `現在の設定群~obj$ ◎ Check if an access between two browsing contexts should be reported, given the current global object's browsing context, W's browsing context, P, and the current settings object.
-
~IF[ `IsPlatformObjectSameOrigin$jA( %W ) ~EQ ~T ]: ◎ If IsPlatformObjectSameOrigin(W) is true, then:
- ~IF[ %P は`配列~indexである$ ] ⇒ ~RET ~F ◎ If P is an array index property name, then return false.
- ~RET ~ABRUPT `OrdinarySet$jA( %W, %P, %V, %Receiver ) ◎ Return ? OrdinarySet(W, P, V, Receiver).
-
~RET ~ABRUPT `CrossOriginSet$jA( `this^jv, %P, %V, %Receiver ) ◎ Return ? CrossOriginSet(this, P, V, Receiver).
注記: %W ではなく `this^jv が渡される — `CrossOriginSet$jA は `GetOwnProperty$sl 内部~methodを呼出すことになるので。 ◎ this is passed rather than W as CrossOriginSet will invoke the [[GetOwnProperty]] internal method.
7.2.3.9. `Delete^sl( %P )
- %W ~LET `this^jv . `Window$sl ◎ Let W be the value of the [[Window]] internal slot of this.
-
~IF[ `IsPlatformObjectSameOrigin$jA( %W ) ~EQ ~T ]: ◎ If IsPlatformObjectSameOrigin(W) is true, then:
- ~IF[ %P は`配列~indexである$ ] ⇒ ~RET [ ~NOABRUPT `this^jv . `GetOwnProperty^sl( %P ) ~EQ `undefined^jv ならば ~T / ~ELSE_ ~F ] ◎ If P is an array index property name, then: • Let desc be ! this.[[GetOwnProperty]](P). • If desc is undefined, then return true. • Return false.
- ~RET ~ABRUPT `OrdinaryDelete$jA( %W, %P ) ◎ Return ? OrdinaryDelete(W, P).
- ~THROW `SecurityError$E ◎ Throw a "SecurityError" DOMException.
7.2.3.10. `OwnPropertyKeys^sl()
- %W ~LET `this^jv . `Window$sl ◎ Let W be the value of the [[Window]] internal slot of this.
- %~prop個数 ~LET %W に`結付けられた文書$の`文書~treeに属する子~navigable群$の`~size$ ◎ Let maxProperties be W's associated Document's document-tree child navigables's size.
- %~key群 ~LET `範囲$ { 0 〜 %~prop個数 ~MINUS 1 } ◎ Let keys be the range 0 to maxProperties, exclusive.
- %~key群 を次の結果で`拡張する$ ⇒ `IsPlatformObjectSameOrigin$jA( %W ) に応じて ⇒# ~T ならば `OrdinaryOwnPropertyKeys$jA( %W ) / ~F ならば ~NOABRUPT `CrossOriginOwnPropertyKeys$jA( %W ) ◎ If IsPlatformObjectSameOrigin(W) is true, then return the concatenation of keys and OrdinaryOwnPropertyKeys(W). ◎ Return the concatenation of keys and ! CrossOriginOwnPropertyKeys(W).
- ~RET %~key群 ◎ ↑
7.2.4. `Location^I ~interface
【 この節を成す内容のうち,~APIに関する部分は、 `別~page@~WINDOW#the-location-interface$にて。 】
各 `Window$I ~objには、 その作成-時に,新たな `Location$I ~objが結付けられる。 ◎ Each Window object is associated with a unique instance of a Location object, allocated when the Window object is created.
`Location$I ~exotic~objは、 ~IDLの寄せ集めであり,[ ~JS~内部~method~post-creationの呼出n, および ~JS~内部~methodの上書き ]を通して,それの~scary~security施策と組にして定義される。 この~excrescenceを実装するときは、 要注意。 ◎ The Location exotic object is defined through a mishmash of IDL, invocation of JavaScript internal methods post-creation, and overridden JavaScript internal methods. Coupled with its scary security policy, please take extra care while implementing this excrescence.
`Location$I ~objを~作成するときは、 次の~手続きを走らす: ◎ To create a Location object, run these steps:
- %L ~LET 新たな `Location$I `~platform~obj$ ◎ Let location be a new Location platform object.
- %valueOf ~LET %L に`関連な~realm$ . `Intrinsics^sl . [[`Object.prototype.valueOf$jI]] ◎ Let valueOf be location's relevant realm.[[Intrinsics]].[[%Object.prototype.valueOf%]].
- ~NOABRUPT %L . `DefineOwnProperty^sl( `valueOf^l, { `Value^sl: %valueOf, `Writable^sl: ~F, `Enumerable^sl: ~F, `Configurable^sl: ~F } ) ◎ Perform ! location.[[DefineOwnProperty]]("valueOf", { [[Value]]: valueOf, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }).
- ~NOABRUPT %L . `DefineOwnProperty^sl( `Symbol.toPrimitive$jI, { `Value^sl: `undefined^jv, `Writable^sl: ~F, `Enumerable^sl: ~F, `Configurable^sl: ~F } ) ◎ Perform ! location.[[DefineOwnProperty]](%Symbol.toPrimitive%, { [[Value]]: undefined, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }).
- %L . `DefaultProperties$sl ~SET %L . `OwnPropertyKeys^sl() ◎ Set the value of the [[DefaultProperties]] internal slot of location to location.[[OwnPropertyKeys]]().
- ~RET %L ◎ Return location.
注記: 自前の~data~propとして[ `valueOf^c, `Symbol.toPrimitive$jI ]を追加すること, および `Location$I のすべての~IDL属性に `LegacyUnforgeable$xA を付与することは、 `Location$I ~interfaceに諮っていたり, それを文字列~化して`文書~URL$を決定し,~securityに敏感な仕方で利用していた、 旧来の~codeに要求される。 特に,[ `valueOf^c, `Symbol.toPrimitive$jI, `LegacyUnforgeable$xA 文字列化子( `stringifier^m ) ]は、 `foo[location] = bar^c や `location + ""^c のような~codeが誤った先を指し得ないことを確保するための軽減である。 ◎ The addition of valueOf and %Symbol.toPrimitive% own data properties, as well as the fact that all of Location's IDL attributes are marked [LegacyUnforgeable], is required by legacy code that consulted the Location interface, or stringified it, to determine the document URL, and then used it in a security-sensitive way. In particular, the valueOf, %Symbol.toPrimitive%, and [LegacyUnforgeable] stringifier mitigations ensure that code such as foo[location] = bar or location + "" cannot be misdirected.
先に説明したとおり, `Location$I ~exotic~objは、 ~security目的のため,~IDLを超える追加的な~logicが要求される。 `Location$I ~objは、 以下の各~節にて明示的に他が指定される場合を除き,普通の内部~methodを利用するモノトスル。 ◎ As explained earlier, the Location exotic object requires additional logic beyond IDL for security purposes. The Location object must use the ordinary internal methods except where it is explicitly specified otherwise below.
加えて、 どの `Location$I ~objも, `DefaultProperties@sl 内部~slotを有する — それは、 ~objの作成-時における~objの自前の~propを表現する。 ◎ Also, every Location object has a [[DefaultProperties]] internal slot representing its own properties at time of its creation.
7.2.4.1. `GetPrototypeOf^sl()
- ~IF[ `IsPlatformObjectSameOrigin$jA( `this^jv ) ~EQ ~T ] ⇒ ~RET ~NOABRUPT `OrdinaryGetPrototypeOf$jA( `this^jv ) ◎ If IsPlatformObjectSameOrigin(this) is true, then return ! OrdinaryGetPrototypeOf(this).
- ~RET ~NULL ◎ Return null.
7.2.4.2. `SetPrototypeOf^sl( %V )
- ~RET `SetImmutablePrototype$jA( `this^jv, %V ) ◎ Return ! SetImmutablePrototype(this, V).
7.2.4.3. `IsExtensible^sl()
- ~RET ~T ◎ Return true.
7.2.4.4. `PreventExtensions^sl()
- ~RET ~F ◎ Return false.
7.2.4.5. `GetOwnProperty^sl( %P )
-
~IF[ ~NOABRUPT `IsPlatformObjectSameOrigin$jA( `this^jv ) ~EQ ~T ]: ◎ If IsPlatformObjectSameOrigin(this) is true, then:
- %記述子 ~LET `OrdinaryGetOwnProperty$jA( `this^jv, %P ) ◎ Let desc be OrdinaryGetOwnProperty(this, P).
- ~IF[ %P ~IN `this^jv . `DefaultProperties$sl ] ⇒ %記述子 . `Configurable^sl ~SET ~T ◎ If the value of the [[DefaultProperties]] internal slot of this contains P, then set desc.[[Configurable]] to true.
- ~RET %記述子 ◎ Return desc.
- %~prop ~LET `CrossOriginGetOwnPropertyHelper$jA( `this^jv, %P ) ◎ Let property be CrossOriginGetOwnPropertyHelper(this, P).
- ~IF[ %~prop ~NEQ `undefined^jv ] ⇒ ~RET %~prop ◎ If property is not undefined, then return property.
- ~RET ~ABRUPT `CrossOriginPropertyFallback$jA( %P ) ◎ Return ? CrossOriginPropertyFallback(P).
7.2.4.6. `DefineOwnProperty^sl( %P, %記述子 )
-
~IF[ ~NOABRUPT `IsPlatformObjectSameOrigin$jA( `this^jv ) ~EQ ~T ]: ◎ If IsPlatformObjectSameOrigin(this) is true, then:
- ~IF[ %P ~IN `this^jv . `DefaultProperties$sl ] ⇒ ~RET ~F ◎ If the value of the [[DefaultProperties]] internal slot of this contains P, then return false.
- ~RET ~ABRUPT `OrdinaryDefineOwnProperty$jA( `this^jv, %P, %記述子 ) ◎ Return ? OrdinaryDefineOwnProperty(this, P, Desc).
- ~THROW `SecurityError$E ◎ Throw a "SecurityError" DOMException.
7.2.4.7. `Get^sl( %P, %Receiver )
- ~IF[ `IsPlatformObjectSameOrigin$jA( `this^jv ) ~EQ ~T ] ⇒ ~RET ~ABRUPT `OrdinaryGet$jA( `this^jv, %P, %Receiver ) ◎ If IsPlatformObjectSameOrigin(this) is true, then return ? OrdinaryGet(this, P, Receiver).
- ~RET ~ABRUPT `CrossOriginGet$jA( `this^jv, %P, %Receiver ) ◎ Return ? CrossOriginGet(this, P, Receiver).
7.2.4.8. `Set^sl( %P, %V, %Receiver )
- ~IF[ `IsPlatformObjectSameOrigin$jA( `this^jv ) ~EQ ~T ] ⇒ ~RET ~ABRUPT `OrdinarySet$jA( `this^jv, %P, %V, %Receiver ) ◎ If IsPlatformObjectSameOrigin(this) is true, then return ? OrdinarySet(this, P, V, Receiver).
- ~RET ~ABRUPT `CrossOriginSet$jA( `this^jv, %P, %V, %Receiver ) ◎ Return ? CrossOriginSet(this, P, V, Receiver).
7.2.4.9. `Delete^sl( %P )
- ~IF[ `IsPlatformObjectSameOrigin$jA( `this^jv ) ~EQ ~T ] ⇒ ~RET ~ABRUPT `OrdinaryDelete$jA( `this^jv, %P ) ◎ If IsPlatformObjectSameOrigin(this) is true, then return ? OrdinaryDelete(this, P).
- ~THROW `SecurityError$E ◎ Throw a "SecurityError" DOMException.
7.2.4.10. `OwnPropertyKeys^sl()
- ~IF[ `IsPlatformObjectSameOrigin$jA( `this^jv ) ~EQ ~T ] ⇒ ~RET `OrdinaryOwnPropertyKeys$jA( `this^jv ) ◎ If IsPlatformObjectSameOrigin(this) is true, then return OrdinaryOwnPropertyKeys(this).
- ~RET `CrossOriginOwnPropertyKeys$jA( `this^jv ) ◎ Return CrossOriginOwnPropertyKeys(this).
7.2.5. `History^I ~interface
【 この節を成す内容は、 `別~page@~WINDOW#the-history-interface$にて。 】
7.2.6. ~navi~API
【 この節を成す内容は、 `別~page@~HTMLnavAPI$にて。 】
7.2.7. ~event~interface
【 この節を成す内容は、 `別~page@~WINDOW#nav-traversal-event-interfaces$にて。 】