Skip to content

Commit 9008ac9

Browse files
committed
Move base64 algorithms to Infra
See whatwg/infra#145 for the change to the Infra Standard. Closes whatwg#2912.
1 parent b5dd852 commit 9008ac9

File tree

1 file changed

+11
-187
lines changed

1 file changed

+11
-187
lines changed

source

Lines changed: 11 additions & 187 deletions
Original file line numberDiff line numberDiff line change
@@ -143,24 +143,6 @@
143143

144144
.parse-error-table td > p:first-child { margin-top: 0; }
145145

146-
#base64-table {
147-
white-space: nowrap;
148-
font-size: 0.6em;
149-
column-width: 6em;
150-
column-count: 5;
151-
column-gap: 1em;
152-
-moz-column-width: 6em;
153-
-moz-column-count: 5;
154-
-moz-column-gap: 1em;
155-
-webkit-column-width: 6em;
156-
-webkit-column-count: 5;
157-
-webkit-column-gap: 1em;
158-
}
159-
#base64-table thead { display: none; }
160-
#base64-table * { border: none; }
161-
#base64-table tbody td:first-child:after { content: ':'; }
162-
#base64-table tbody td:last-child { text-align: right; }
163-
164146
#named-character-references-table {
165147
white-space: nowrap;
166148
font-size: 0.6em;
@@ -2450,6 +2432,8 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute
24502432
<dfn data-x="set append" data-x-href="https://infra.spec.whatwg.org/#set-append">append</dfn></li>
24512433
<li>The <dfn data-x-href="https://infra.spec.whatwg.org/#struct">struct</dfn> specification type and the associated definition for
24522434
<dfn data-x="struct item" data-x-href="https://infra.spec.whatwg.org/#struct-item">item</dfn></li>
2435+
<li>The <dfn data-x-href="https://infra.spec.whatwg.org/#forgiving-base64-encode">forgiving-base64 encode</dfn> and
2436+
<dfn data-x-href="https://infra.spec.whatwg.org/#forgiving-base64-decode">forgiving-base64 decode</dfn> algorithms</li>
24532437
<li><dfn data-x-href="https://infra.spec.whatwg.org/#html-namespace">HTML namespace</dfn></li>
24542438
<li><dfn data-x-href="https://infra.spec.whatwg.org/#mathml-namespace">MathML namespace</dfn></li>
24552439
<li><dfn data-x-href="https://infra.spec.whatwg.org/#svg-namespace">SVG namespace</dfn></li>
@@ -90025,7 +90009,7 @@ interface <dfn>WindowOrWorkerGlobalScope</dfn> {
9002590009

9002690010
// base64 utility methods
9002790011
DOMString <span data-x="dom-btoa">btoa</span>(DOMString data);
90028-
DOMString <span data-x="dom-atob">atob</span>(DOMString data);
90012+
ByteString <span data-x="dom-atob">atob</span>(DOMString data);
9002990013

9003090014
// timers
9003190015
long <span data-x="dom-setTimeout">setTimeout</span>(<span>TimerHandler</span> handler, optional long timeout = 0, any... arguments);
@@ -90114,180 +90098,23 @@ document.body.appendChild(frame)</pre>
9011490098
<p>The <dfn data-x="dom-btoa"><code id="dom-windowbase64-btoa">btoa(<var>data</var>)</code></dfn>
9011590099
method must throw an <span>"<code>InvalidCharacterError</code>"</span> <code>DOMException</code>
9011690100
if <var>data</var> contains any character whose code point is greater than U+00FF. Otherwise, the
90117-
user agent must convert <var>data</var> to a sequence of octets whose <var>n</var>th octet is the
90118-
eight-bit representation of the code point of the <var>n</var>th character of <var>data</var>, and
90119-
then must apply the base64 algorithm to that sequence of octets, and return the result. <ref
90120-
spec=RFC4648><!--base64--></p>
90121-
<!-- Aryeh says: This seems to be what all browsers do as of January 2011 (except IE, which
90122-
doesn't support these functions at all). -->
90123-
90101+
user agent must convert <var>data</var> to a byte sequence whose <var>n</var>th byte is the
90102+
eight-bit representation of the <var>n</var>th code point of <var>data</var>, and then must apply
90103+
<span>forgiving-base64 encode</span> to that byte sequence and return the result.</p>
9012490104

9012590105
<p>The <dfn data-x="dom-atob"><code id="dom-windowbase64-atob">atob(<var>data</var>)</code></dfn>
9012690106
method, when invoked, must run the following steps:</p>
9012790107

9012890108
<ol>
90109+
<li><p>Let <var>decodedData</var> be the result of running <span>forgiving-base64 decode</span>
90110+
on <var>data</var>.</p></li>
9012990111

90130-
<!-- Aryeh says: Copies Firefox behavior as of January 2011 (4.0b8). WebKit is somewhat laxer,
90131-
and Opera throws no exceptions at all. gsnedders reports Opera's behavior causes site-compat
90132-
problems, and I figure most sites depend on Firefox if on anything, so go with that. -->
90133-
90134-
<!-- Since updated to drop whitespace, based on the arguments here:
90135-
https://lists.w3.org/Archives/Public/public-whatwg-archive/2011May/0207.html
90136-
-->
90137-
90138-
<li><p>Let <var>position</var> be a pointer into <var>data</var>, initially
90139-
pointing at the start of the string.</p></li>
90140-
90141-
<li><p>Remove all <span>ASCII whitespace</span> from <var>data</var>.</p></li>
90142-
90143-
<li><p>If the length of <var>data</var> divides by 4 leaving no remainder, then: if
90144-
<var>data</var> ends with one or two U+003D EQUALS SIGN (=) characters, remove them from
90145-
<var>data</var>.</p></li>
90146-
90147-
<li><p>If the length of <var>data</var> divides by 4 leaving a remainder of 1, throw an
90148-
<span>"<code>InvalidCharacterError</code>"</span> <code>DOMException</code> and abort these
90149-
steps.</p>
90150-
90151-
<li>
90152-
90153-
<p>If <var>data</var> contains a character that is not in the following list of
90154-
characters and character ranges, throw an <span>"<code>InvalidCharacterError</code>"</span>
90155-
<code>DOMException</code> and abort these steps:</p>
90156-
90157-
<ul class="brief">
90158-
<li>U+002B PLUS SIGN (+)
90159-
<li>U+002F SOLIDUS (/)
90160-
<li><span>ASCII alphanumeric</span>
90161-
</ul>
90162-
90163-
</li>
90164-
90165-
<li><p>Let <var>output</var> be a string, initially empty.</p></li>
90166-
90167-
<li><p>Let <var>buffer</var> be a buffer that can have bits appended to it, initially
90168-
empty.</p></li>
90169-
90170-
<li>
90171-
90172-
<p>While <var>position</var> does not point past the end of <var>data</var>, run these
90173-
substeps:</p>
90174-
90175-
<ol>
90176-
90177-
<li>
90178-
90179-
<p>Find the character pointed to by <var>position</var> in the first column of the
90180-
following table. Let <var>n</var> be the number given in the second cell of the same
90181-
row.</p>
90182-
90183-
<div id="base64-table">
90184-
<table>
90185-
<thead>
90186-
<tr>
90187-
<th>Character
90188-
<th>Number
90189-
<tbody>
90190-
<tr><td>A<td>0
90191-
<tr><td>B<td>1
90192-
<tr><td>C<td>2
90193-
<tr><td>D<td>3
90194-
<tr><td>E<td>4
90195-
<tr><td>F<td>5
90196-
<tr><td>G<td>6
90197-
<tr><td>H<td>7
90198-
<tr><td>I<td>8
90199-
<tr><td>J<td>9
90200-
<tr><td>K<td>10
90201-
<tr><td>L<td>11
90202-
<tr><td>M<td>12
90203-
<tr><td>N<td>13
90204-
<tr><td>O<td>14
90205-
<tr><td>P<td>15
90206-
<tr><td>Q<td>16
90207-
<tr><td>R<td>17
90208-
<tr><td>S<td>18
90209-
<tr><td>T<td>19
90210-
<tr><td>U<td>20
90211-
<tr><td>V<td>21
90212-
<tr><td>W<td>22
90213-
<tr><td>X<td>23
90214-
<tr><td>Y<td>24
90215-
<tr><td>Z<td>25
90216-
<tr><td>a<td>26
90217-
<tr><td>b<td>27
90218-
<tr><td>c<td>28
90219-
<tr><td>d<td>29
90220-
<tr><td>e<td>30
90221-
<tr><td>f<td>31
90222-
<tr><td>g<td>32
90223-
<tr><td>h<td>33
90224-
<tr><td>i<td>34
90225-
<tr><td>j<td>35
90226-
<tr><td>k<td>36
90227-
<tr><td>l<td>37
90228-
<tr><td>m<td>38
90229-
<tr><td>n<td>39
90230-
<tr><td>o<td>40
90231-
<tr><td>p<td>41
90232-
<tr><td>q<td>42
90233-
<tr><td>r<td>43
90234-
<tr><td>s<td>44
90235-
<tr><td>t<td>45
90236-
<tr><td>u<td>46
90237-
<tr><td>v<td>47
90238-
<tr><td>w<td>48
90239-
<tr><td>x<td>49
90240-
<tr><td>y<td>50
90241-
<tr><td>z<td>51
90242-
<tr><td>0<td>52
90243-
<tr><td>1<td>53
90244-
<tr><td>2<td>54
90245-
<tr><td>3<td>55
90246-
<tr><td>4<td>56
90247-
<tr><td>5<td>57
90248-
<tr><td>6<td>58
90249-
<tr><td>7<td>59
90250-
<tr><td>8<td>60
90251-
<tr><td>9<td>61
90252-
<tr><td>+<td>62
90253-
<tr><td>/<td>63
90254-
</table>
90255-
</div>
90256-
90257-
</li>
90258-
90259-
<li><p>Append to <var>buffer</var> the six bits corresponding to <var>number</var>, most significant bit first.</p></li>
90260-
90261-
<li><p>If <var>buffer</var> has accumulated 24 bits, interpret them as three 8-bit
90262-
big-endian numbers. Append the three characters with code points equal to those numbers to <var>output</var>, in the same order, and then empty <var>buffer</var>.</p></li>
90263-
90264-
<li><p>Advance <var>position</var> by one character.</p></li>
90265-
90266-
</ol>
90267-
90268-
</li>
90269-
90270-
<li>
90271-
90272-
<p>If <var>buffer</var> is not empty, it contains either 12 or 18 bits. If it contains
90273-
12 bits, discard the last four and interpret the remaining eight as an 8-bit big-endian number.
90274-
If it contains 18 bits, discard the last two and interpret the remaining 16 as two 8-bit
90275-
big-endian numbers. Append the one or two characters with code points equal to those one or two
90276-
numbers to <var>output</var>, in the same order.</p>
90277-
90278-
<p class="note">The discarded bits mean that, for instance, <code data-x="">atob("YQ")</code> and
90279-
<code data-x="">atob("YR")</code> both return "<code data-x="">a</code>".</p>
90280-
90281-
</li>
90282-
90283-
<li><p>Return <var>output</var>.</p></li>
90112+
<li><p>If <var>decodedData</var> is failure, then throw an
90113+
<span>"<code>InvalidCharacterError</code>"</span> <code>DOMException</code>.</p></li>
9028490114

90115+
<li><p>Return <var>decodedData</var>.</p></li>
9028590116
</ol>
9028690117

90287-
<!-- Note: this function is defined explicitly here because RFC4648 does not specify how to handle
90288-
erroneous input, and no preexisting browser implementation simply throws an exception on all
90289-
erroneous input. -->
90290-
9029190118
</div>
9029290119

9029390120

@@ -120244,9 +120071,6 @@ INSERT INTERFACES HERE
120244120071
<dt id="refsRFC7595">[RFC7595]</dt>
120245120072
<dd><cite><a href="https://tools.ietf.org/html/rfc7595">Guidelines and Registration Procedures for URI Schemes</a></cite>, D. Thaler, T. Hansen, T. Hardie. IETF.</dd>
120246120073

120247-
<dt id="refsRFC4648">[RFC4648]</dt>
120248-
<dd><cite><a href="https://tools.ietf.org/html/rfc4648">The Base16, Base32, and Base64 Data Encodings</a></cite>, S. Josefsson. IETF.</dd>
120249-
120250120074
<dt id="refsRFC5322">[RFC5322]</dt>
120251120075
<dd><cite><a href="https://tools.ietf.org/html/rfc5322">Internet Message Format</a></cite>, P. Resnick. IETF.</dd>
120252120076

0 commit comments

Comments
 (0)