Bug 1492908 [wpt PR 13122] - Update wpt metadata, a=testonly
[gecko.git] / parser / html / nsHtml5TokenizerCppSupplement.h
blob44b6a523237b66ed1edb656bbf44eff811651677
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "mozilla/CheckedInt.h"
6 #include "mozilla/Likely.h"
8 // INT32_MAX is (2^31)-1. Therefore, the highest power-of-two that fits
9 // is 2^30. Note that this is counting char16_t units. The underlying
10 // bytes will be twice that, but they fit even in 32-bit size_t even
11 // if a contiguous chunk of memory of that size is pretty unlikely to
12 // be available on a 32-bit system.
13 #define MAX_POWER_OF_TWO_IN_INT32 0x40000000
15 bool
16 nsHtml5Tokenizer::EnsureBufferSpace(int32_t aLength)
18 MOZ_RELEASE_ASSERT(aLength >= 0, "Negative length.");
19 if (aLength > MAX_POWER_OF_TWO_IN_INT32) {
20 // Can't happen when loading from network.
21 return false;
23 mozilla::CheckedInt<int32_t> worstCase(strBufLen);
24 worstCase += aLength;
25 worstCase += charRefBufLen;
26 // Add 2 to account for emissions of LT_GT, LT_SOLIDUS and RSQB_RSQB.
27 // Adding to the general worst case instead of only the
28 // TreeBuilder-exposed worst case to avoid re-introducing a bug when
29 // unifying the tokenizer and tree builder buffers in the future.
30 worstCase += 2;
31 if (!worstCase.isValid()) {
32 return false;
34 if (worstCase.value() > MAX_POWER_OF_TWO_IN_INT32) {
35 return false;
37 // TODO: Unify nsHtml5Tokenizer::strBuf and nsHtml5TreeBuilder::charBuffer
38 // so that the call below becomes unnecessary.
39 if (!tokenHandler->EnsureBufferSpace(worstCase.value())) {
40 return false;
42 if (!strBuf) {
43 if (worstCase.value() < MAX_POWER_OF_TWO_IN_INT32) {
44 // Add one to round to the next power of two to avoid immediate
45 // reallocation once there are a few characters in the buffer.
46 worstCase += 1;
48 strBuf = jArray<char16_t, int32_t>::newFallibleJArray(
49 mozilla::RoundUpPow2(worstCase.value()));
50 if (!strBuf) {
51 return false;
53 } else if (worstCase.value() > strBuf.length) {
54 jArray<char16_t, int32_t> newBuf =
55 jArray<char16_t, int32_t>::newFallibleJArray(
56 mozilla::RoundUpPow2(worstCase.value()));
57 if (!newBuf) {
58 return false;
60 memcpy(newBuf, strBuf, sizeof(char16_t) * size_t(strBufLen));
61 strBuf = newBuf;
63 return true;
66 void
67 nsHtml5Tokenizer::StartPlainText()
69 stateSave = nsHtml5Tokenizer::PLAINTEXT;
72 void
73 nsHtml5Tokenizer::EnableViewSource(nsHtml5Highlighter* aHighlighter)
75 mViewSource = aHighlighter;
78 bool
79 nsHtml5Tokenizer::FlushViewSource()
81 return mViewSource->FlushOps();
84 void
85 nsHtml5Tokenizer::StartViewSource(const nsAutoString& aTitle)
87 mViewSource->Start(aTitle);
90 void
91 nsHtml5Tokenizer::EndViewSource()
93 mViewSource->End();
96 void
97 nsHtml5Tokenizer::errWarnLtSlashInRcdata()
101 // The null checks below annotated MOZ_LIKELY are not actually necessary.
103 void
104 nsHtml5Tokenizer::errUnquotedAttributeValOrNull(char16_t c)
106 if (MOZ_LIKELY(mViewSource)) {
107 switch (c) {
108 case '<':
109 mViewSource->AddErrorToCurrentNode("errUnquotedAttributeLt");
110 return;
111 case '`':
112 mViewSource->AddErrorToCurrentNode("errUnquotedAttributeGrave");
113 return;
114 case '\'':
115 case '"':
116 mViewSource->AddErrorToCurrentNode("errUnquotedAttributeQuote");
117 return;
118 case '=':
119 mViewSource->AddErrorToCurrentNode("errUnquotedAttributeEquals");
120 return;
125 void
126 nsHtml5Tokenizer::errLtOrEqualsOrGraveInUnquotedAttributeOrNull(char16_t c)
128 if (MOZ_LIKELY(mViewSource)) {
129 switch (c) {
130 case '=':
131 mViewSource->AddErrorToCurrentNode("errUnquotedAttributeStartEquals");
132 return;
133 case '<':
134 mViewSource->AddErrorToCurrentNode("errUnquotedAttributeStartLt");
135 return;
136 case '`':
137 mViewSource->AddErrorToCurrentNode("errUnquotedAttributeStartGrave");
138 return;
143 void
144 nsHtml5Tokenizer::errBadCharBeforeAttributeNameOrNull(char16_t c)
146 if (MOZ_LIKELY(mViewSource)) {
147 if (c == '<') {
148 mViewSource->AddErrorToCurrentNode("errBadCharBeforeAttributeNameLt");
149 } else if (c == '=') {
150 errEqualsSignBeforeAttributeName();
151 } else if (c != 0xFFFD) {
152 errQuoteBeforeAttributeName(c);
157 void
158 nsHtml5Tokenizer::errBadCharAfterLt(char16_t c)
160 if (MOZ_LIKELY(mViewSource)) {
161 mViewSource->AddErrorToCurrentNode("errBadCharAfterLt");
165 void
166 nsHtml5Tokenizer::errQuoteOrLtInAttributeNameOrNull(char16_t c)
168 if (MOZ_LIKELY(mViewSource)) {
169 if (c == '<') {
170 mViewSource->AddErrorToCurrentNode("errLtInAttributeName");
171 } else if (c != 0xFFFD) {
172 mViewSource->AddErrorToCurrentNode("errQuoteInAttributeName");
177 void
178 nsHtml5Tokenizer::maybeErrAttributesOnEndTag(nsHtml5HtmlAttributes* attrs)
180 if (mViewSource && attrs->getLength() != 0) {
182 * When an end tag token is emitted with attributes, that is a parse
183 * error.
185 mViewSource->AddErrorToCurrentRun("maybeErrAttributesOnEndTag");
189 void
190 nsHtml5Tokenizer::maybeErrSlashInEndTag(bool selfClosing)
192 if (mViewSource && selfClosing && endTag) {
193 mViewSource->AddErrorToCurrentSlash("maybeErrSlashInEndTag");
197 char16_t
198 nsHtml5Tokenizer::errNcrNonCharacter(char16_t ch)
200 if (MOZ_UNLIKELY(mViewSource)) {
201 mViewSource->AddErrorToCurrentNode("errNcrNonCharacter");
203 return ch;
206 void
207 nsHtml5Tokenizer::errAstralNonCharacter(int32_t ch)
209 if (MOZ_UNLIKELY(mViewSource)) {
210 mViewSource->AddErrorToCurrentNode("errNcrNonCharacter");
214 char16_t
215 nsHtml5Tokenizer::errNcrControlChar(char16_t ch)
217 if (MOZ_UNLIKELY(mViewSource)) {
218 mViewSource->AddErrorToCurrentNode("errNcrControlChar");
220 return ch;
223 void
224 nsHtml5Tokenizer::errGarbageAfterLtSlash()
226 if (MOZ_LIKELY(mViewSource)) {
227 mViewSource->AddErrorToCurrentNode("errGarbageAfterLtSlash");
231 void
232 nsHtml5Tokenizer::errLtSlashGt()
234 if (MOZ_LIKELY(mViewSource)) {
235 mViewSource->AddErrorToCurrentNode("errLtSlashGt");
239 void
240 nsHtml5Tokenizer::errCharRefLacksSemicolon()
242 if (MOZ_UNLIKELY(mViewSource)) {
243 mViewSource->AddErrorToCurrentNode("errCharRefLacksSemicolon");
247 void
248 nsHtml5Tokenizer::errNoDigitsInNCR()
250 if (MOZ_UNLIKELY(mViewSource)) {
251 mViewSource->AddErrorToCurrentNode("errNoDigitsInNCR");
255 void
256 nsHtml5Tokenizer::errGtInSystemId()
258 if (MOZ_LIKELY(mViewSource)) {
259 mViewSource->AddErrorToCurrentNode("errGtInSystemId");
263 void
264 nsHtml5Tokenizer::errGtInPublicId()
266 if (MOZ_LIKELY(mViewSource)) {
267 mViewSource->AddErrorToCurrentNode("errGtInPublicId");
271 void
272 nsHtml5Tokenizer::errNamelessDoctype()
274 if (MOZ_LIKELY(mViewSource)) {
275 mViewSource->AddErrorToCurrentNode("errNamelessDoctype");
279 void
280 nsHtml5Tokenizer::errConsecutiveHyphens()
282 if (MOZ_UNLIKELY(mViewSource)) {
283 mViewSource->AddErrorToCurrentNode("errConsecutiveHyphens");
287 void
288 nsHtml5Tokenizer::errPrematureEndOfComment()
290 if (MOZ_LIKELY(mViewSource)) {
291 mViewSource->AddErrorToCurrentNode("errPrematureEndOfComment");
295 void
296 nsHtml5Tokenizer::errBogusComment()
298 if (MOZ_UNLIKELY(mViewSource)) {
299 mViewSource->AddErrorToCurrentNode("errBogusComment");
303 void
304 nsHtml5Tokenizer::errSlashNotFollowedByGt()
306 if (MOZ_LIKELY(mViewSource)) {
307 mViewSource->AddErrorToCurrentSlash("errSlashNotFollowedByGt");
311 void
312 nsHtml5Tokenizer::errNoSpaceBetweenAttributes()
314 if (MOZ_LIKELY(mViewSource)) {
315 mViewSource->AddErrorToCurrentNode("errNoSpaceBetweenAttributes");
319 void
320 nsHtml5Tokenizer::errAttributeValueMissing()
322 if (MOZ_LIKELY(mViewSource)) {
323 mViewSource->AddErrorToCurrentNode("errAttributeValueMissing");
327 void
328 nsHtml5Tokenizer::errEqualsSignBeforeAttributeName()
330 if (MOZ_LIKELY(mViewSource)) {
331 mViewSource->AddErrorToCurrentNode("errEqualsSignBeforeAttributeName");
335 void
336 nsHtml5Tokenizer::errLtGt()
338 if (MOZ_LIKELY(mViewSource)) {
339 mViewSource->AddErrorToCurrentNode("errLtGt");
343 void
344 nsHtml5Tokenizer::errProcessingInstruction()
346 if (MOZ_LIKELY(mViewSource)) {
347 mViewSource->AddErrorToCurrentNode("errProcessingInstruction");
351 void
352 nsHtml5Tokenizer::errUnescapedAmpersandInterpretedAsCharacterReference()
354 if (MOZ_UNLIKELY(mViewSource)) {
355 mViewSource->AddErrorToCurrentAmpersand(
356 "errUnescapedAmpersandInterpretedAsCharacterReference");
360 void
361 nsHtml5Tokenizer::errNotSemicolonTerminated()
363 if (MOZ_UNLIKELY(mViewSource)) {
364 mViewSource->AddErrorToCurrentNode("errNotSemicolonTerminated");
368 void
369 nsHtml5Tokenizer::errNoNamedCharacterMatch()
371 if (MOZ_UNLIKELY(mViewSource)) {
372 mViewSource->AddErrorToCurrentAmpersand("errNoNamedCharacterMatch");
376 void
377 nsHtml5Tokenizer::errQuoteBeforeAttributeName(char16_t c)
379 if (MOZ_LIKELY(mViewSource)) {
380 mViewSource->AddErrorToCurrentNode("errQuoteBeforeAttributeName");
384 void
385 nsHtml5Tokenizer::errExpectedPublicId()
387 if (MOZ_LIKELY(mViewSource)) {
388 mViewSource->AddErrorToCurrentNode("errExpectedPublicId");
392 void
393 nsHtml5Tokenizer::errBogusDoctype()
395 if (MOZ_UNLIKELY(mViewSource)) {
396 mViewSource->AddErrorToCurrentNode("errBogusDoctype");
400 void
401 nsHtml5Tokenizer::errNcrSurrogate()
403 if (MOZ_UNLIKELY(mViewSource)) {
404 mViewSource->AddErrorToCurrentNode("errNcrSurrogate");
408 void
409 nsHtml5Tokenizer::errNcrCr()
411 if (MOZ_UNLIKELY(mViewSource)) {
412 mViewSource->AddErrorToCurrentNode("errNcrCr");
416 void
417 nsHtml5Tokenizer::errNcrInC1Range()
419 if (MOZ_UNLIKELY(mViewSource)) {
420 mViewSource->AddErrorToCurrentNode("errNcrInC1Range");
424 void
425 nsHtml5Tokenizer::errEofInPublicId()
427 if (MOZ_UNLIKELY(mViewSource)) {
428 mViewSource->AddErrorToCurrentRun("errEofInPublicId");
432 void
433 nsHtml5Tokenizer::errEofInComment()
435 if (MOZ_UNLIKELY(mViewSource)) {
436 mViewSource->AddErrorToCurrentRun("errEofInComment");
440 void
441 nsHtml5Tokenizer::errEofInDoctype()
443 if (MOZ_UNLIKELY(mViewSource)) {
444 mViewSource->AddErrorToCurrentRun("errEofInDoctype");
448 void
449 nsHtml5Tokenizer::errEofInAttributeValue()
451 if (MOZ_UNLIKELY(mViewSource)) {
452 mViewSource->AddErrorToCurrentRun("errEofInAttributeValue");
456 void
457 nsHtml5Tokenizer::errEofInAttributeName()
459 if (MOZ_UNLIKELY(mViewSource)) {
460 mViewSource->AddErrorToCurrentRun("errEofInAttributeName");
464 void
465 nsHtml5Tokenizer::errEofWithoutGt()
467 if (MOZ_UNLIKELY(mViewSource)) {
468 mViewSource->AddErrorToCurrentRun("errEofWithoutGt");
472 void
473 nsHtml5Tokenizer::errEofInTagName()
475 if (MOZ_UNLIKELY(mViewSource)) {
476 mViewSource->AddErrorToCurrentRun("errEofInTagName");
480 void
481 nsHtml5Tokenizer::errEofInEndTag()
483 if (MOZ_UNLIKELY(mViewSource)) {
484 mViewSource->AddErrorToCurrentRun("errEofInEndTag");
488 void
489 nsHtml5Tokenizer::errEofAfterLt()
491 if (MOZ_UNLIKELY(mViewSource)) {
492 mViewSource->AddErrorToCurrentRun("errEofAfterLt");
496 void
497 nsHtml5Tokenizer::errNcrOutOfRange()
499 if (MOZ_UNLIKELY(mViewSource)) {
500 mViewSource->AddErrorToCurrentNode("errNcrOutOfRange");
504 void
505 nsHtml5Tokenizer::errNcrUnassigned()
507 if (MOZ_UNLIKELY(mViewSource)) {
508 mViewSource->AddErrorToCurrentNode("errNcrUnassigned");
512 void
513 nsHtml5Tokenizer::errDuplicateAttribute()
515 if (MOZ_UNLIKELY(mViewSource)) {
516 mViewSource->AddErrorToCurrentNode("errDuplicateAttribute");
520 void
521 nsHtml5Tokenizer::errEofInSystemId()
523 if (MOZ_UNLIKELY(mViewSource)) {
524 mViewSource->AddErrorToCurrentRun("errEofInSystemId");
528 void
529 nsHtml5Tokenizer::errExpectedSystemId()
531 if (MOZ_LIKELY(mViewSource)) {
532 mViewSource->AddErrorToCurrentNode("errExpectedSystemId");
536 void
537 nsHtml5Tokenizer::errMissingSpaceBeforeDoctypeName()
539 if (MOZ_LIKELY(mViewSource)) {
540 mViewSource->AddErrorToCurrentNode("errMissingSpaceBeforeDoctypeName");
544 void
545 nsHtml5Tokenizer::errHyphenHyphenBang()
547 if (MOZ_LIKELY(mViewSource)) {
548 mViewSource->AddErrorToCurrentNode("errHyphenHyphenBang");
552 void
553 nsHtml5Tokenizer::errNcrControlChar()
555 if (MOZ_UNLIKELY(mViewSource)) {
556 mViewSource->AddErrorToCurrentNode("errNcrControlChar");
560 void
561 nsHtml5Tokenizer::errNcrZero()
563 if (MOZ_UNLIKELY(mViewSource)) {
564 mViewSource->AddErrorToCurrentNode("errNcrZero");
568 void
569 nsHtml5Tokenizer::errNoSpaceBetweenDoctypeSystemKeywordAndQuote()
571 if (MOZ_LIKELY(mViewSource)) {
572 mViewSource->AddErrorToCurrentNode(
573 "errNoSpaceBetweenDoctypeSystemKeywordAndQuote");
577 void
578 nsHtml5Tokenizer::errNoSpaceBetweenPublicAndSystemIds()
580 if (MOZ_LIKELY(mViewSource)) {
581 mViewSource->AddErrorToCurrentNode("errNoSpaceBetweenPublicAndSystemIds");
585 void
586 nsHtml5Tokenizer::errNoSpaceBetweenDoctypePublicKeywordAndQuote()
588 if (MOZ_LIKELY(mViewSource)) {
589 mViewSource->AddErrorToCurrentNode(
590 "errNoSpaceBetweenDoctypePublicKeywordAndQuote");