Skip to content

Commit

Permalink
Specify the tokenizer for window.open's features argument
Browse files Browse the repository at this point in the history
This was specified in CSSOM View but the "noopener" feature did
not use the same tokenizer as the legacy features. Fixes #2474.

Also specify the aliases screenx, screeny, innerwidth, innerheight
for left, top, width, and height, respectively. Part of #2464.
Closes w3c/csswg-drafts#1128.

The tokenizer specified here closely follows Chromium and WebKit.
Difference from Chromium: U+0000 is not a separator.
Difference from WebKit and Chromium: U+000C is a separator.
  • Loading branch information
zcorpan committed Apr 5, 2017
1 parent f8e75a9 commit 79cc5a0
Showing 1 changed file with 103 additions and 9 deletions.
112 changes: 103 additions & 9 deletions source
Original file line number Diff line number Diff line change
Expand Up @@ -2365,6 +2365,9 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute
<p>The following terms are defined in the WHATWG Infra standard: <ref spec=INFRA></p>

<ul class="brief">
<li>The general iteration terms <dfn data-x-href="https://infra.spec.whatwg.org/#iteration-while">while</dfn>,
<dfn data-x-href="https://infra.spec.whatwg.org/#iteration-continue">continue</dfn>, and
<dfn data-x-href="https://infra.spec.whatwg.org/#iteration-break">break</dfn>.</li>
<li><dfn data-x-href="https://infra.spec.whatwg.org/#code-point">code point</dfn> and its synonym
<dfn data-x-href="https://infra.spec.whatwg.org/#code-point">character</dfn></li>
<li><dfn data-x-href="https://infra.spec.whatwg.org/#surrogate">surrogate</dfn></li>
Expand Down Expand Up @@ -3535,7 +3538,7 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute
<li><dfn data-x-href="https://drafts.csswg.org/cssom-view/#scroll-to-the-beginning-of-the-document">Scroll to the beginning of the document</dfn></li>
<li>The <dfn data-x="event-resize" data-x-href="https://drafts.csswg.org/cssom-view/#eventdef-window-resize"><code>resize</code></dfn> event</li>
<li>The <dfn data-x="event-scroll" data-x-href="https://drafts.csswg.org/cssom-view/#eventdef-document-scroll"><code>scroll</code></dfn> event</li>
<li><dfn data-x="dom-open-features" data-x-href="https://drafts.csswg.org/cssom-view/#the-features-argument-to-the-open()-method">The <var>features</var> argument of <code data-x="dom-open">window.open</code></dfn>
<li><dfn data-x-href="https://drafts.csswg.org/cssom-view/#set-up-browsing-context-features">set up browsing context features</dfn></li>
</ul>

<p>The following features and terms are defined in the <cite>CSS Syntax</cite> specifications:
Expand Down Expand Up @@ -78567,8 +78570,8 @@ callback <dfn>FrameRequestCallback</dfn> = void (<span>DOMHighResTimeStamp</span

<p>Opens a window to show <var>url</var> (defaults to <code>about:blank</code>), and returns it.
The <var>target</var> argument gives the name of the new window. If a window exists with that
name already, it is reused. The <var data-x="dom-open-features">features</var> argument can be
used to influence the rendering of the new window.</p>
name already, it is reused. The <var>features</var> argument can be used to influence the
rendering of the new window.</p>

</dd>

Expand Down Expand Up @@ -78663,8 +78666,12 @@ callback <dfn>FrameRequestCallback</dfn> = void (<span>DOMHighResTimeStamp</span
indicating a preference for navigating a new <span>top-level browsing context</span>, then let
<var>new</var> be true. Otherwise, let it be false.</p></li>

<li><p>Interpret <var>features</var> <span data-x="dom-open-features">as defined in the CSSOM
View specification</span>. <ref spec="CSSOMVIEW"></p></li>
<li><p>Let <var>tokenizedFeatures</var> be the result of <span
data-x="concept-window-open-features-tokenize">tokenizing</span> <var>features</var>.</p></li>

<li><p>If <var>target browsing context</var> is a new <span>auxiliary browsing context</span>,
then <span>set up browsing context features</span> for <var>target browsing context</var> given
<var>tokenizedFeatures</var>. <ref spec="CSSOMVIEW"></p></li>

<li>

Expand Down Expand Up @@ -78719,10 +78726,9 @@ callback <dfn>FrameRequestCallback</dfn> = void (<span>DOMHighResTimeStamp</span

<ol>

<li><p>If the result of <span data-x="split a string on commas">splitting <var>features</var>
on commas</span> contains the token "<code data-x="">noopener</code>", then <span
data-x="disowned its opener">disown <var>target browsing context</var>'s opener</span> and
return null.</p></li>
<li><p>If <var>tokenizedFeatures</var> <span data-x="map exists">contains</span> an entry with
the key "<code data-x="">noopener</code>", then <span data-x="disowned its opener">disown
<var>target browsing context</var>'s opener</span> and return null.</p></li>

<li><p>Otherwise, return the <code>WindowProxy</code> object of <var>target browsing
context</var>.</p></li>
Expand All @@ -78733,6 +78739,94 @@ callback <dfn>FrameRequestCallback</dfn> = void (<span>DOMHighResTimeStamp</span

</ol>

<p>To <dfn data-x="concept-window-open-features-tokenize">tokenize the <var>features</var>
argument</dfn>:</p>

<ol>
<li><p>Let <var>tokenizedFeatures</var> be a new <span>ordered map</span>.</p></li>

<li><p>Let <var>position</var> point at the first code point of <var>features</var>.</p></li>

<li>
<p><span>While</span> <var>position</var> is not past the end of <var>features</var>:</p>

<ol>
<li><p>Let <var>name</var> be the empty string.</p></li>

<li><p>Let <var>value</var> be the empty string.</p></li>

<li><p><span>Collect a sequence of code points</span> that are <span data-x="window features
separator">window features separators</span> from <var>features</var> given
<var>position</var>. This skips past leading separators before the name.</p></li>

<li><p><span>Collect a sequence of code points</span> that are not <span data-x="window
features separator">window features separators</span> from <var>features</var> given
<var>position</var>. Set <var>name</var> to the collected characters, <span>converted to ASCII
lowercase</span>.</p></li>

<li><p>Set <var>name</var> to the result of <span>normalizing the feature name</span>
<var>name</var>.</p></li>

<li>
<p><span>While</span> <var>position</var> is not past the end of <var>features</var> and the
code point at <var>position</var> in <var>features</var> is not U+003D (=):</p>

<ol>
<li><p>If the code point at <var>position</var> in <var>features</var> is U+002C (,), then
<span>break</span>.</p></li>

<li><p>Advance <var>position</var> by 1.</p></li>
</ol>

<p class="note">This skips to the first U+003D (=) but does not skip past a U+002C (,).</p>
</li>

<li>
<p>While <var>position</var> is not past the end of <var>features</var> and the code point at
<var>position</var> in <var>features</var> is a <span>window features separator</span>:</p>

<ol>
<li><p>If the code point at <var>position</var> in <var>features</var> is U+002C (,), then
<span>break</span>.</p></li>

<li><p>Advance <var>position</var> by 1.</p></li>
</ol>

<p class="note">This skips to the first non-separator but does not skip past a U+002C (,).</p>
</li>

<li><p><span>Collect a sequence of code points</span> that are not <span data-x="window
features separator">window features separators</span> code points from <var>features</var>
given <var>position</var>. Set <var>value</var> to the collected code points, <span>converted
to ASCII lowercase</span>.</p></li>

<li><p>If <var>name</var> is not the empty string, then set
<var>tokenizedFeatures</var>[<var>name</var>] to <var>value</var>.</p></li>
</ol>
</li>

<li><p>Return <var>tokenizedFeatures</var>.</p></li>
</ol>

<p>A code point is a <dfn>window features separator</dfn> if it is one of <span>ASCII
whitespace</span>, U+003D (=), or U+002C (,).</p>

<p>For legacy reasons, there are some aliases of some feature names. To <dfn data-x="normalizing
the feature name">normalize a feature name</dfn> <var>name</var>, switch on <var>name</var>:</p>

<dl class="switch">
<dt>"<code data-x="">screenx</code>"
<dd>Return "<code data-x="">left</code>".
<dt>"<code data-x="">screeny</code>"
<dd>Return "<code data-x="">top</code>".
<dt>"<code data-x="">innerwidth</code>"
<dd>Return "<code data-x="">width</code>".
<dt>"<code data-x="">innerheight</code>"
<dd>Return "<code data-x="">height</code>".
<dt>Anything else
<dd>Return <var>name</var>.
</dl>

<hr>

<p>The <dfn><code data-x="dom-name">name</code></dfn> attribute of the <code>Window</code> object
Expand Down

0 comments on commit 79cc5a0

Please sign in to comment.