Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/parser/html/nsHtml5Tokenizer.cpp
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (c) 2005-2007 Henri Sivonen
3
 * Copyright (c) 2007-2015 Mozilla Foundation
4
 * Portions of comments Copyright 2004-2010 Apple Computer, Inc., Mozilla
5
 * Foundation, and Opera Software ASA.
6
 *
7
 * Permission is hereby granted, free of charge, to any person obtaining a
8
 * copy of this software and associated documentation files (the "Software"),
9
 * to deal in the Software without restriction, including without limitation
10
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11
 * and/or sell copies of the Software, and to permit persons to whom the
12
 * Software is furnished to do so, subject to the following conditions:
13
 *
14
 * The above copyright notice and this permission notice shall be included in
15
 * all copies or substantial portions of the Software.
16
 *
17
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23
 * DEALINGS IN THE SOFTWARE.
24
 */
25
26
/*
27
 * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
28
 * Please edit Tokenizer.java instead and regenerate.
29
 */
30
31
#define nsHtml5Tokenizer_cpp__
32
33
#include "nsAtom.h"
34
#include "nsHtml5AtomTable.h"
35
#include "nsHtml5String.h"
36
#include "nsIContent.h"
37
#include "nsTraceRefcnt.h"
38
#include "jArray.h"
39
#include "nsHtml5DocumentMode.h"
40
#include "nsHtml5ArrayCopy.h"
41
#include "nsHtml5NamedCharacters.h"
42
#include "nsHtml5NamedCharactersAccel.h"
43
#include "nsGkAtoms.h"
44
#include "nsAHtml5TreeBuilderState.h"
45
#include "nsHtml5Macros.h"
46
#include "nsHtml5Highlighter.h"
47
#include "nsHtml5TokenizerLoopPolicies.h"
48
49
#include "nsHtml5AttributeName.h"
50
#include "nsHtml5ElementName.h"
51
#include "nsHtml5TreeBuilder.h"
52
#include "nsHtml5MetaScanner.h"
53
#include "nsHtml5StackNode.h"
54
#include "nsHtml5UTF16Buffer.h"
55
#include "nsHtml5StateSnapshot.h"
56
#include "nsHtml5Portability.h"
57
58
#include "nsHtml5Tokenizer.h"
59
60
char16_t nsHtml5Tokenizer::LT_GT[] = { '<', '>' };
61
char16_t nsHtml5Tokenizer::LT_SOLIDUS[] = { '<', '/' };
62
char16_t nsHtml5Tokenizer::RSQB_RSQB[] = { ']', ']' };
63
char16_t nsHtml5Tokenizer::REPLACEMENT_CHARACTER[] = { 0xfffd };
64
char16_t nsHtml5Tokenizer::LF[] = { '\n' };
65
char16_t nsHtml5Tokenizer::CDATA_LSQB[] = { 'C', 'D', 'A', 'T', 'A', '[' };
66
char16_t nsHtml5Tokenizer::OCTYPE[] = { 'o', 'c', 't', 'y', 'p', 'e' };
67
char16_t nsHtml5Tokenizer::UBLIC[] = { 'u', 'b', 'l', 'i', 'c' };
68
char16_t nsHtml5Tokenizer::YSTEM[] = { 'y', 's', 't', 'e', 'm' };
69
static char16_t const TITLE_ARR_DATA[] = { 't', 'i', 't', 'l', 'e' };
70
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::TITLE_ARR = {
71
  TITLE_ARR_DATA,
72
  MOZ_ARRAY_LENGTH(TITLE_ARR_DATA)
73
};
74
static char16_t const SCRIPT_ARR_DATA[] = { 's', 'c', 'r', 'i', 'p', 't' };
75
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::SCRIPT_ARR = {
76
  SCRIPT_ARR_DATA,
77
  MOZ_ARRAY_LENGTH(SCRIPT_ARR_DATA)
78
};
79
static char16_t const STYLE_ARR_DATA[] = { 's', 't', 'y', 'l', 'e' };
80
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::STYLE_ARR = {
81
  STYLE_ARR_DATA,
82
  MOZ_ARRAY_LENGTH(STYLE_ARR_DATA)
83
};
84
static char16_t const PLAINTEXT_ARR_DATA[] = { 'p', 'l', 'a', 'i', 'n',
85
                                               't', 'e', 'x', 't' };
86
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::PLAINTEXT_ARR = {
87
  PLAINTEXT_ARR_DATA,
88
  MOZ_ARRAY_LENGTH(PLAINTEXT_ARR_DATA)
89
};
90
static char16_t const XMP_ARR_DATA[] = { 'x', 'm', 'p' };
91
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::XMP_ARR = { XMP_ARR_DATA,
92
                                                              MOZ_ARRAY_LENGTH(
93
                                                                XMP_ARR_DATA) };
94
static char16_t const TEXTAREA_ARR_DATA[] = { 't', 'e', 'x', 't',
95
                                              'a', 'r', 'e', 'a' };
96
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::TEXTAREA_ARR = {
97
  TEXTAREA_ARR_DATA,
98
  MOZ_ARRAY_LENGTH(TEXTAREA_ARR_DATA)
99
};
100
static char16_t const IFRAME_ARR_DATA[] = { 'i', 'f', 'r', 'a', 'm', 'e' };
101
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::IFRAME_ARR = {
102
  IFRAME_ARR_DATA,
103
  MOZ_ARRAY_LENGTH(IFRAME_ARR_DATA)
104
};
105
static char16_t const NOEMBED_ARR_DATA[] = {
106
  'n', 'o', 'e', 'm', 'b', 'e', 'd'
107
};
108
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::NOEMBED_ARR = {
109
  NOEMBED_ARR_DATA,
110
  MOZ_ARRAY_LENGTH(NOEMBED_ARR_DATA)
111
};
112
static char16_t const NOSCRIPT_ARR_DATA[] = { 'n', 'o', 's', 'c',
113
                                              'r', 'i', 'p', 't' };
114
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::NOSCRIPT_ARR = {
115
  NOSCRIPT_ARR_DATA,
116
  MOZ_ARRAY_LENGTH(NOSCRIPT_ARR_DATA)
117
};
118
static char16_t const NOFRAMES_ARR_DATA[] = { 'n', 'o', 'f', 'r',
119
                                              'a', 'm', 'e', 's' };
120
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::NOFRAMES_ARR = {
121
  NOFRAMES_ARR_DATA,
122
  MOZ_ARRAY_LENGTH(NOFRAMES_ARR_DATA)
123
};
124
125
nsHtml5Tokenizer::nsHtml5Tokenizer(nsHtml5TreeBuilder* tokenHandler,
126
                                   bool viewingXmlSource)
127
  : tokenHandler(tokenHandler)
128
  , encodingDeclarationHandler(nullptr)
129
  , lastCR(false)
130
  , stateSave(0)
131
  , returnStateSave(0)
132
  , index(0)
133
  , forceQuirks(false)
134
  , additional(u'\0')
135
  , entCol(0)
136
  , firstCharKey(0)
137
  , lo(0)
138
  , hi(0)
139
  , candidate(0)
140
  , charRefBufMark(0)
141
  , value(0)
142
  , seenDigits(false)
143
  , cstart(0)
144
  , strBufLen(0)
145
  , charRefBuf(jArray<char16_t, int32_t>::newJArray(32))
146
  , charRefBufLen(0)
147
  , bmpChar(jArray<char16_t, int32_t>::newJArray(1))
148
  , astralChar(jArray<char16_t, int32_t>::newJArray(2))
149
  , endTagExpectation(nullptr)
150
  , endTagExpectationAsArray{}
151
  , endTag(false)
152
  , containsHyphen(false)
153
  , tagName(nullptr)
154
  , nonInternedTagName(new nsHtml5ElementName())
155
  , attributeName(nullptr)
156
  , nonInternedAttributeName(new nsHtml5AttributeName())
157
  , doctypeName(nullptr)
158
  , publicIdentifier(nullptr)
159
  , systemIdentifier(nullptr)
160
  , attributes(tokenHandler->HasBuilder() ? new nsHtml5HtmlAttributes(0)
161
                                          : nullptr)
162
  , newAttributesEachTime(!tokenHandler->HasBuilder())
163
  , shouldSuspend(false)
164
  , confident(false)
165
  , line(0)
166
  , attributeLine(0)
167
  , interner(nullptr)
168
  , viewingXmlSource(viewingXmlSource)
169
0
{
170
0
  MOZ_COUNT_CTOR(nsHtml5Tokenizer);
171
0
}
172
173
void
174
nsHtml5Tokenizer::setInterner(nsHtml5AtomTable* interner)
175
0
{
176
0
  this->interner = interner;
177
0
}
178
179
void
180
nsHtml5Tokenizer::initLocation(nsHtml5String newPublicId,
181
                               nsHtml5String newSystemId)
182
0
{
183
0
  this->systemId = newSystemId;
184
0
  this->publicId = newPublicId;
185
0
}
186
187
bool
188
nsHtml5Tokenizer::isViewingXmlSource()
189
0
{
190
0
  return viewingXmlSource;
191
0
}
192
193
void
194
nsHtml5Tokenizer::setStateAndEndTagExpectation(int32_t specialTokenizerState,
195
                                               nsAtom* endTagExpectation)
196
0
{
197
0
  this->stateSave = specialTokenizerState;
198
0
  if (specialTokenizerState == nsHtml5Tokenizer::DATA) {
199
0
    return;
200
0
  }
201
0
  autoJArray<char16_t, int32_t> asArray =
202
0
    nsHtml5Portability::newCharArrayFromLocal(endTagExpectation);
203
0
  this->endTagExpectation =
204
0
    nsHtml5ElementName::elementNameByBuffer(asArray, asArray.length, interner);
205
0
  MOZ_ASSERT(!!this->endTagExpectation);
206
0
  endTagExpectationToArray();
207
0
}
208
209
void
210
nsHtml5Tokenizer::setStateAndEndTagExpectation(
211
  int32_t specialTokenizerState,
212
  nsHtml5ElementName* endTagExpectation)
213
0
{
214
0
  this->stateSave = specialTokenizerState;
215
0
  this->endTagExpectation = endTagExpectation;
216
0
  endTagExpectationToArray();
217
0
}
218
219
void
220
nsHtml5Tokenizer::endTagExpectationToArray()
221
0
{
222
0
  switch (endTagExpectation->getGroup()) {
223
0
    case nsHtml5TreeBuilder::TITLE: {
224
0
      endTagExpectationAsArray = TITLE_ARR;
225
0
      return;
226
0
    }
227
0
    case nsHtml5TreeBuilder::SCRIPT: {
228
0
      endTagExpectationAsArray = SCRIPT_ARR;
229
0
      return;
230
0
    }
231
0
    case nsHtml5TreeBuilder::STYLE: {
232
0
      endTagExpectationAsArray = STYLE_ARR;
233
0
      return;
234
0
    }
235
0
    case nsHtml5TreeBuilder::PLAINTEXT: {
236
0
      endTagExpectationAsArray = PLAINTEXT_ARR;
237
0
      return;
238
0
    }
239
0
    case nsHtml5TreeBuilder::XMP: {
240
0
      endTagExpectationAsArray = XMP_ARR;
241
0
      return;
242
0
    }
243
0
    case nsHtml5TreeBuilder::TEXTAREA: {
244
0
      endTagExpectationAsArray = TEXTAREA_ARR;
245
0
      return;
246
0
    }
247
0
    case nsHtml5TreeBuilder::IFRAME: {
248
0
      endTagExpectationAsArray = IFRAME_ARR;
249
0
      return;
250
0
    }
251
0
    case nsHtml5TreeBuilder::NOEMBED: {
252
0
      endTagExpectationAsArray = NOEMBED_ARR;
253
0
      return;
254
0
    }
255
0
    case nsHtml5TreeBuilder::NOSCRIPT: {
256
0
      endTagExpectationAsArray = NOSCRIPT_ARR;
257
0
      return;
258
0
    }
259
0
    case nsHtml5TreeBuilder::NOFRAMES: {
260
0
      endTagExpectationAsArray = NOFRAMES_ARR;
261
0
      return;
262
0
    }
263
0
    default: {
264
0
      MOZ_ASSERT(false, "Bad end tag expectation.");
265
0
      return;
266
0
    }
267
0
  }
268
0
}
269
270
void
271
nsHtml5Tokenizer::setLineNumber(int32_t line)
272
0
{
273
0
  this->attributeLine = line;
274
0
  this->line = line;
275
0
}
276
277
nsHtml5HtmlAttributes*
278
nsHtml5Tokenizer::emptyAttributes()
279
0
{
280
0
  return nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES;
281
0
}
282
283
void
284
nsHtml5Tokenizer::emitOrAppendCharRefBuf(int32_t returnState)
285
0
{
286
0
  if ((returnState & DATA_AND_RCDATA_MASK)) {
287
0
    appendCharRefBufToStrBuf();
288
0
  } else {
289
0
    if (charRefBufLen > 0) {
290
0
      tokenHandler->characters(charRefBuf, 0, charRefBufLen);
291
0
      charRefBufLen = 0;
292
0
    }
293
0
  }
294
0
}
295
296
nsHtml5String
297
nsHtml5Tokenizer::strBufToString()
298
0
{
299
0
  nsHtml5String str = nsHtml5Portability::newStringFromBuffer(
300
0
    strBuf,
301
0
    0,
302
0
    strBufLen,
303
0
    tokenHandler,
304
0
    !newAttributesEachTime &&
305
0
      attributeName == nsHtml5AttributeName::ATTR_CLASS);
306
0
  clearStrBufAfterUse();
307
0
  return str;
308
0
}
309
310
void
311
nsHtml5Tokenizer::strBufToDoctypeName()
312
0
{
313
0
  doctypeName =
314
0
    nsHtml5Portability::newLocalNameFromBuffer(strBuf, strBufLen, interner);
315
0
  clearStrBufAfterUse();
316
0
}
317
318
void
319
nsHtml5Tokenizer::emitStrBuf()
320
0
{
321
0
  if (strBufLen > 0) {
322
0
    tokenHandler->characters(strBuf, 0, strBufLen);
323
0
    clearStrBufAfterUse();
324
0
  }
325
0
}
326
327
void
328
nsHtml5Tokenizer::appendStrBuf(char16_t* buffer, int32_t offset, int32_t length)
329
0
{
330
0
  int32_t newLen = strBufLen + length;
331
0
  MOZ_ASSERT(newLen <= strBuf.length, "Previous buffer length insufficient.");
332
0
  if (MOZ_UNLIKELY(strBuf.length < newLen)) {
333
0
    if (MOZ_UNLIKELY(!EnsureBufferSpace(length))) {
334
0
      MOZ_CRASH("Unable to recover from buffer reallocation failure");
335
0
    }
336
0
  }
337
0
  nsHtml5ArrayCopy::arraycopy(buffer, offset, strBuf, strBufLen, length);
338
0
  strBufLen = newLen;
339
0
}
340
341
void
342
nsHtml5Tokenizer::emitComment(int32_t provisionalHyphens, int32_t pos)
343
0
{
344
0
  tokenHandler->comment(strBuf, 0, strBufLen - provisionalHyphens);
345
0
  clearStrBufAfterUse();
346
0
  cstart = pos + 1;
347
0
}
348
349
void
350
nsHtml5Tokenizer::flushChars(char16_t* buf, int32_t pos)
351
0
{
352
0
  if (pos > cstart) {
353
0
    tokenHandler->characters(buf, cstart, pos - cstart);
354
0
  }
355
0
  cstart = INT32_MAX;
356
0
}
357
358
void
359
nsHtml5Tokenizer::strBufToElementNameString()
360
0
{
361
0
  if (containsHyphen) {
362
0
    nsAtom* annotationName = nsHtml5ElementName::ELT_ANNOTATION_XML->getName();
363
0
    if (nsHtml5Portability::localEqualsBuffer(
364
0
          annotationName, strBuf, strBufLen)) {
365
0
      tagName = nsHtml5ElementName::ELT_ANNOTATION_XML;
366
0
    } else {
367
0
      nonInternedTagName->setNameForNonInterned(
368
0
        nsHtml5Portability::newLocalNameFromBuffer(strBuf, strBufLen, interner),
369
0
        true);
370
0
      tagName = nonInternedTagName;
371
0
    }
372
0
  } else {
373
0
    tagName =
374
0
      nsHtml5ElementName::elementNameByBuffer(strBuf, strBufLen, interner);
375
0
    if (!tagName) {
376
0
      nonInternedTagName->setNameForNonInterned(
377
0
        nsHtml5Portability::newLocalNameFromBuffer(strBuf, strBufLen, interner),
378
0
        false);
379
0
      tagName = nonInternedTagName;
380
0
    }
381
0
  }
382
0
  containsHyphen = false;
383
0
  clearStrBufAfterUse();
384
0
}
385
386
int32_t
387
nsHtml5Tokenizer::emitCurrentTagToken(bool selfClosing, int32_t pos)
388
0
{
389
0
  cstart = pos + 1;
390
0
  maybeErrSlashInEndTag(selfClosing);
391
0
  stateSave = nsHtml5Tokenizer::DATA;
392
0
  nsHtml5HtmlAttributes* attrs =
393
0
    (!attributes ? nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES : attributes);
394
0
  if (endTag) {
395
0
    maybeErrAttributesOnEndTag(attrs);
396
0
    if (!viewingXmlSource) {
397
0
      tokenHandler->endTag(tagName);
398
0
    }
399
0
    if (newAttributesEachTime) {
400
0
      delete attributes;
401
0
      attributes = nullptr;
402
0
    }
403
0
  } else {
404
0
    if (viewingXmlSource) {
405
0
      MOZ_ASSERT(newAttributesEachTime);
406
0
      delete attributes;
407
0
      attributes = nullptr;
408
0
    } else {
409
0
      tokenHandler->startTag(tagName, attrs, selfClosing);
410
0
    }
411
0
  }
412
0
  tagName = nullptr;
413
0
  if (newAttributesEachTime) {
414
0
    attributes = nullptr;
415
0
  } else {
416
0
    attributes->clear(0);
417
0
  }
418
0
  return stateSave;
419
0
}
420
421
void
422
nsHtml5Tokenizer::attributeNameComplete()
423
0
{
424
0
  attributeName =
425
0
    nsHtml5AttributeName::nameByBuffer(strBuf, strBufLen, interner);
426
0
  if (!attributeName) {
427
0
    nonInternedAttributeName->setNameForNonInterned(
428
0
      nsHtml5Portability::newLocalNameFromBuffer(strBuf, strBufLen, interner));
429
0
    attributeName = nonInternedAttributeName;
430
0
  }
431
0
  clearStrBufAfterUse();
432
0
  if (!attributes) {
433
0
    attributes = new nsHtml5HtmlAttributes(0);
434
0
  }
435
0
  if (attributes->contains(attributeName)) {
436
0
    errDuplicateAttribute();
437
0
    attributeName = nullptr;
438
0
  }
439
0
}
440
441
void
442
nsHtml5Tokenizer::addAttributeWithoutValue()
443
0
{
444
0
445
0
  if (attributeName) {
446
0
    attributes->addAttribute(
447
0
      attributeName, nsHtml5Portability::newEmptyString(), attributeLine);
448
0
    attributeName = nullptr;
449
0
  } else {
450
0
    clearStrBufAfterUse();
451
0
  }
452
0
}
453
454
void
455
nsHtml5Tokenizer::addAttributeWithValue()
456
0
{
457
0
  if (attributeName) {
458
0
    nsHtml5String val = strBufToString();
459
0
    if (mViewSource) {
460
0
      mViewSource->MaybeLinkifyAttributeValue(attributeName, val);
461
0
    }
462
0
    attributes->addAttribute(attributeName, val, attributeLine);
463
0
    attributeName = nullptr;
464
0
  } else {
465
0
    clearStrBufAfterUse();
466
0
  }
467
0
}
468
469
void
470
nsHtml5Tokenizer::start()
471
0
{
472
0
  initializeWithoutStarting();
473
0
  tokenHandler->startTokenization(this);
474
0
}
475
476
bool
477
nsHtml5Tokenizer::tokenizeBuffer(nsHtml5UTF16Buffer* buffer)
478
0
{
479
0
  int32_t state = stateSave;
480
0
  int32_t returnState = returnStateSave;
481
0
  char16_t c = '\0';
482
0
  shouldSuspend = false;
483
0
  lastCR = false;
484
0
  int32_t start = buffer->getStart();
485
0
  int32_t end = buffer->getEnd();
486
0
  int32_t pos = start - 1;
487
0
  switch (state) {
488
0
    case DATA:
489
0
    case RCDATA:
490
0
    case SCRIPT_DATA:
491
0
    case PLAINTEXT:
492
0
    case RAWTEXT:
493
0
    case CDATA_SECTION:
494
0
    case SCRIPT_DATA_ESCAPED:
495
0
    case SCRIPT_DATA_ESCAPE_START:
496
0
    case SCRIPT_DATA_ESCAPE_START_DASH:
497
0
    case SCRIPT_DATA_ESCAPED_DASH:
498
0
    case SCRIPT_DATA_ESCAPED_DASH_DASH:
499
0
    case SCRIPT_DATA_DOUBLE_ESCAPE_START:
500
0
    case SCRIPT_DATA_DOUBLE_ESCAPED:
501
0
    case SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN:
502
0
    case SCRIPT_DATA_DOUBLE_ESCAPED_DASH:
503
0
    case SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH:
504
0
    case SCRIPT_DATA_DOUBLE_ESCAPE_END: {
505
0
      cstart = start;
506
0
      break;
507
0
    }
508
0
    default: {
509
0
      cstart = INT32_MAX;
510
0
      break;
511
0
    }
512
0
  }
513
0
  if (mViewSource) {
514
0
    mViewSource->SetBuffer(buffer);
515
0
    pos = stateLoop<nsHtml5ViewSourcePolicy>(
516
0
      state, c, pos, buffer->getBuffer(), false, returnState, buffer->getEnd());
517
0
    mViewSource->DropBuffer((pos == buffer->getEnd()) ? pos : pos + 1);
518
0
  } else {
519
0
    pos = stateLoop<nsHtml5SilentPolicy>(
520
0
      state, c, pos, buffer->getBuffer(), false, returnState, buffer->getEnd());
521
0
  }
522
0
  if (pos == end) {
523
0
    buffer->setStart(pos);
524
0
  } else {
525
0
    buffer->setStart(pos + 1);
526
0
  }
527
0
  return lastCR;
528
0
}
529
530
template<class P>
531
int32_t
532
nsHtml5Tokenizer::stateLoop(int32_t state,
533
                            char16_t c,
534
                            int32_t pos,
535
                            char16_t* buf,
536
                            bool reconsume,
537
                            int32_t returnState,
538
                            int32_t endPos)
539
0
{
540
0
stateloop:
541
0
  for (;;) {
542
0
    switch (state) {
543
0
      case DATA: {
544
0
        for (;;) {
545
0
          if (reconsume) {
546
0
            reconsume = false;
547
0
          } else {
548
0
            if (++pos == endPos) {
549
0
              NS_HTML5_BREAK(stateloop);
550
0
            }
551
0
            c = checkChar(buf, pos);
552
0
          }
553
0
          switch (c) {
554
0
            case '&': {
555
0
              flushChars(buf, pos);
556
0
              MOZ_ASSERT(!charRefBufLen,
557
0
                         "charRefBufLen not reset after previous use!");
558
0
              appendCharRefBuf(c);
559
0
              setAdditionalAndRememberAmpersandLocation('\0');
560
0
              returnState = state;
561
0
              state =
562
0
                P::transition(mViewSource,
563
0
                              nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
564
0
                              reconsume,
565
0
                              pos);
566
0
              NS_HTML5_CONTINUE(stateloop);
567
0
            }
568
0
            case '<': {
569
0
              flushChars(buf, pos);
570
0
              state = P::transition(
571
0
                mViewSource, nsHtml5Tokenizer::TAG_OPEN, reconsume, pos);
572
0
              NS_HTML5_BREAK(dataloop);
573
0
            }
574
0
            case '\0': {
575
0
              emitReplacementCharacter(buf, pos);
576
0
              continue;
577
0
            }
578
0
            case '\r': {
579
0
              emitCarriageReturn(buf, pos);
580
0
              NS_HTML5_BREAK(stateloop);
581
0
            }
582
0
            case '\n': {
583
0
              silentLineFeed();
584
0
              MOZ_FALLTHROUGH;
585
0
            }
586
0
            default: {
587
0
              continue;
588
0
            }
589
0
          }
590
0
        }
591
0
      dataloop_end:;
592
0
        MOZ_FALLTHROUGH;
593
0
      }
594
0
      case TAG_OPEN: {
595
0
        for (;;) {
596
0
          if (++pos == endPos) {
597
0
            NS_HTML5_BREAK(stateloop);
598
0
          }
599
0
          c = checkChar(buf, pos);
600
0
          if (c >= 'A' && c <= 'Z') {
601
0
            endTag = false;
602
0
            clearStrBufBeforeUse();
603
0
            appendStrBuf((char16_t)(c + 0x20));
604
0
            containsHyphen = false;
605
0
            state = P::transition(
606
0
              mViewSource, nsHtml5Tokenizer::TAG_NAME, reconsume, pos);
607
0
            NS_HTML5_BREAK(tagopenloop);
608
0
          } else if (c >= 'a' && c <= 'z') {
609
0
            endTag = false;
610
0
            clearStrBufBeforeUse();
611
0
            appendStrBuf(c);
612
0
            containsHyphen = false;
613
0
            state = P::transition(
614
0
              mViewSource, nsHtml5Tokenizer::TAG_NAME, reconsume, pos);
615
0
            NS_HTML5_BREAK(tagopenloop);
616
0
          }
617
0
          switch (c) {
618
0
            case '!': {
619
0
              state = P::transition(mViewSource,
620
0
                                    nsHtml5Tokenizer::MARKUP_DECLARATION_OPEN,
621
0
                                    reconsume,
622
0
                                    pos);
623
0
              NS_HTML5_CONTINUE(stateloop);
624
0
            }
625
0
            case '/': {
626
0
              state = P::transition(
627
0
                mViewSource, nsHtml5Tokenizer::CLOSE_TAG_OPEN, reconsume, pos);
628
0
              NS_HTML5_CONTINUE(stateloop);
629
0
            }
630
0
            case '\?': {
631
0
              if (viewingXmlSource) {
632
0
                state = P::transition(mViewSource,
633
0
                                      nsHtml5Tokenizer::PROCESSING_INSTRUCTION,
634
0
                                      reconsume,
635
0
                                      pos);
636
0
                NS_HTML5_CONTINUE(stateloop);
637
0
              }
638
0
              if (P::reportErrors) {
639
0
                errProcessingInstruction();
640
0
              }
641
0
              clearStrBufBeforeUse();
642
0
              appendStrBuf(c);
643
0
              state = P::transition(
644
0
                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
645
0
              NS_HTML5_CONTINUE(stateloop);
646
0
            }
647
0
            case '>': {
648
0
              if (P::reportErrors) {
649
0
                errLtGt();
650
0
              }
651
0
              tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 2);
652
0
              cstart = pos + 1;
653
0
              state = P::transition(
654
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
655
0
              NS_HTML5_CONTINUE(stateloop);
656
0
            }
657
0
            default: {
658
0
              if (P::reportErrors) {
659
0
                errBadCharAfterLt(c);
660
0
              }
661
0
              tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
662
0
              cstart = pos;
663
0
              reconsume = true;
664
0
              state = P::transition(
665
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
666
0
              NS_HTML5_CONTINUE(stateloop);
667
0
            }
668
0
          }
669
0
        }
670
0
      tagopenloop_end:;
671
0
        MOZ_FALLTHROUGH;
672
0
      }
673
0
      case TAG_NAME: {
674
0
        for (;;) {
675
0
          if (++pos == endPos) {
676
0
            NS_HTML5_BREAK(stateloop);
677
0
          }
678
0
          c = checkChar(buf, pos);
679
0
          switch (c) {
680
0
            case '\r': {
681
0
              silentCarriageReturn();
682
0
              strBufToElementNameString();
683
0
              state = P::transition(mViewSource,
684
0
                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
685
0
                                    reconsume,
686
0
                                    pos);
687
0
              NS_HTML5_BREAK(stateloop);
688
0
            }
689
0
            case '\n': {
690
0
              silentLineFeed();
691
0
              MOZ_FALLTHROUGH;
692
0
            }
693
0
            case ' ':
694
0
            case '\t':
695
0
            case '\f': {
696
0
              strBufToElementNameString();
697
0
              state = P::transition(mViewSource,
698
0
                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
699
0
                                    reconsume,
700
0
                                    pos);
701
0
              NS_HTML5_BREAK(tagnameloop);
702
0
            }
703
0
            case '/': {
704
0
              strBufToElementNameString();
705
0
              state = P::transition(mViewSource,
706
0
                                    nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
707
0
                                    reconsume,
708
0
                                    pos);
709
0
              NS_HTML5_CONTINUE(stateloop);
710
0
            }
711
0
            case '>': {
712
0
              strBufToElementNameString();
713
0
              state = P::transition(
714
0
                mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
715
0
              if (shouldSuspend) {
716
0
                NS_HTML5_BREAK(stateloop);
717
0
              }
718
0
              NS_HTML5_CONTINUE(stateloop);
719
0
            }
720
0
            case '\0': {
721
0
              c = 0xfffd;
722
0
              MOZ_FALLTHROUGH;
723
0
            }
724
0
            default: {
725
0
              if (c >= 'A' && c <= 'Z') {
726
0
                c += 0x20;
727
0
              } else if (c == '-') {
728
0
                containsHyphen = true;
729
0
              }
730
0
              appendStrBuf(c);
731
0
              continue;
732
0
            }
733
0
          }
734
0
        }
735
0
      tagnameloop_end:;
736
0
        MOZ_FALLTHROUGH;
737
0
      }
738
0
      case BEFORE_ATTRIBUTE_NAME: {
739
0
        for (;;) {
740
0
          if (reconsume) {
741
0
            reconsume = false;
742
0
          } else {
743
0
            if (++pos == endPos) {
744
0
              NS_HTML5_BREAK(stateloop);
745
0
            }
746
0
            c = checkChar(buf, pos);
747
0
          }
748
0
          switch (c) {
749
0
            case '\r': {
750
0
              silentCarriageReturn();
751
0
              NS_HTML5_BREAK(stateloop);
752
0
            }
753
0
            case '\n': {
754
0
              silentLineFeed();
755
0
              MOZ_FALLTHROUGH;
756
0
            }
757
0
            case ' ':
758
0
            case '\t':
759
0
            case '\f': {
760
0
              continue;
761
0
            }
762
0
            case '/': {
763
0
              state = P::transition(mViewSource,
764
0
                                    nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
765
0
                                    reconsume,
766
0
                                    pos);
767
0
              NS_HTML5_CONTINUE(stateloop);
768
0
            }
769
0
            case '>': {
770
0
              state = P::transition(
771
0
                mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
772
0
              if (shouldSuspend) {
773
0
                NS_HTML5_BREAK(stateloop);
774
0
              }
775
0
              NS_HTML5_CONTINUE(stateloop);
776
0
            }
777
0
            case '\0': {
778
0
              c = 0xfffd;
779
0
              MOZ_FALLTHROUGH;
780
0
            }
781
0
            case '\"':
782
0
            case '\'':
783
0
            case '<':
784
0
            case '=': {
785
0
              if (P::reportErrors) {
786
0
                errBadCharBeforeAttributeNameOrNull(c);
787
0
              }
788
0
              MOZ_FALLTHROUGH;
789
0
            }
790
0
            default: {
791
0
              if (c >= 'A' && c <= 'Z') {
792
0
                c += 0x20;
793
0
              }
794
0
              attributeLine = line;
795
0
              clearStrBufBeforeUse();
796
0
              appendStrBuf(c);
797
0
              state = P::transition(
798
0
                mViewSource, nsHtml5Tokenizer::ATTRIBUTE_NAME, reconsume, pos);
799
0
              NS_HTML5_BREAK(beforeattributenameloop);
800
0
            }
801
0
          }
802
0
        }
803
0
      beforeattributenameloop_end:;
804
0
        MOZ_FALLTHROUGH;
805
0
      }
806
0
      case ATTRIBUTE_NAME: {
807
0
        for (;;) {
808
0
          if (++pos == endPos) {
809
0
            NS_HTML5_BREAK(stateloop);
810
0
          }
811
0
          c = checkChar(buf, pos);
812
0
          switch (c) {
813
0
            case '\r': {
814
0
              silentCarriageReturn();
815
0
              attributeNameComplete();
816
0
              state = P::transition(mViewSource,
817
0
                                    nsHtml5Tokenizer::AFTER_ATTRIBUTE_NAME,
818
0
                                    reconsume,
819
0
                                    pos);
820
0
              NS_HTML5_BREAK(stateloop);
821
0
            }
822
0
            case '\n': {
823
0
              silentLineFeed();
824
0
              MOZ_FALLTHROUGH;
825
0
            }
826
0
            case ' ':
827
0
            case '\t':
828
0
            case '\f': {
829
0
              attributeNameComplete();
830
0
              state = P::transition(mViewSource,
831
0
                                    nsHtml5Tokenizer::AFTER_ATTRIBUTE_NAME,
832
0
                                    reconsume,
833
0
                                    pos);
834
0
              NS_HTML5_CONTINUE(stateloop);
835
0
            }
836
0
            case '/': {
837
0
              attributeNameComplete();
838
0
              addAttributeWithoutValue();
839
0
              state = P::transition(mViewSource,
840
0
                                    nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
841
0
                                    reconsume,
842
0
                                    pos);
843
0
              NS_HTML5_CONTINUE(stateloop);
844
0
            }
845
0
            case '=': {
846
0
              attributeNameComplete();
847
0
              state = P::transition(mViewSource,
848
0
                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_VALUE,
849
0
                                    reconsume,
850
0
                                    pos);
851
0
              NS_HTML5_BREAK(attributenameloop);
852
0
            }
853
0
            case '>': {
854
0
              attributeNameComplete();
855
0
              addAttributeWithoutValue();
856
0
              state = P::transition(
857
0
                mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
858
0
              if (shouldSuspend) {
859
0
                NS_HTML5_BREAK(stateloop);
860
0
              }
861
0
              NS_HTML5_CONTINUE(stateloop);
862
0
            }
863
0
            case '\0': {
864
0
              c = 0xfffd;
865
0
              MOZ_FALLTHROUGH;
866
0
            }
867
0
            case '\"':
868
0
            case '\'':
869
0
            case '<': {
870
0
              if (P::reportErrors) {
871
0
                errQuoteOrLtInAttributeNameOrNull(c);
872
0
              }
873
0
              MOZ_FALLTHROUGH;
874
0
            }
875
0
            default: {
876
0
              if (c >= 'A' && c <= 'Z') {
877
0
                c += 0x20;
878
0
              }
879
0
              appendStrBuf(c);
880
0
              continue;
881
0
            }
882
0
          }
883
0
        }
884
0
      attributenameloop_end:;
885
0
        MOZ_FALLTHROUGH;
886
0
      }
887
0
      case BEFORE_ATTRIBUTE_VALUE: {
888
0
        for (;;) {
889
0
          if (++pos == endPos) {
890
0
            NS_HTML5_BREAK(stateloop);
891
0
          }
892
0
          c = checkChar(buf, pos);
893
0
          switch (c) {
894
0
            case '\r': {
895
0
              silentCarriageReturn();
896
0
              NS_HTML5_BREAK(stateloop);
897
0
            }
898
0
            case '\n': {
899
0
              silentLineFeed();
900
0
              MOZ_FALLTHROUGH;
901
0
            }
902
0
            case ' ':
903
0
            case '\t':
904
0
            case '\f': {
905
0
              continue;
906
0
            }
907
0
            case '\"': {
908
0
              attributeLine = line;
909
0
              clearStrBufBeforeUse();
910
0
              state =
911
0
                P::transition(mViewSource,
912
0
                              nsHtml5Tokenizer::ATTRIBUTE_VALUE_DOUBLE_QUOTED,
913
0
                              reconsume,
914
0
                              pos);
915
0
              NS_HTML5_BREAK(beforeattributevalueloop);
916
0
            }
917
0
            case '&': {
918
0
              attributeLine = line;
919
0
              clearStrBufBeforeUse();
920
0
              reconsume = true;
921
0
              state = P::transition(mViewSource,
922
0
                                    nsHtml5Tokenizer::ATTRIBUTE_VALUE_UNQUOTED,
923
0
                                    reconsume,
924
0
                                    pos);
925
0
926
0
              NS_HTML5_CONTINUE(stateloop);
927
0
            }
928
0
            case '\'': {
929
0
              attributeLine = line;
930
0
              clearStrBufBeforeUse();
931
0
              state =
932
0
                P::transition(mViewSource,
933
0
                              nsHtml5Tokenizer::ATTRIBUTE_VALUE_SINGLE_QUOTED,
934
0
                              reconsume,
935
0
                              pos);
936
0
              NS_HTML5_CONTINUE(stateloop);
937
0
            }
938
0
            case '>': {
939
0
              if (P::reportErrors) {
940
0
                errAttributeValueMissing();
941
0
              }
942
0
              addAttributeWithoutValue();
943
0
              state = P::transition(
944
0
                mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
945
0
              if (shouldSuspend) {
946
0
                NS_HTML5_BREAK(stateloop);
947
0
              }
948
0
              NS_HTML5_CONTINUE(stateloop);
949
0
            }
950
0
            case '\0': {
951
0
              c = 0xfffd;
952
0
              MOZ_FALLTHROUGH;
953
0
            }
954
0
            case '<':
955
0
            case '=':
956
0
            case '`': {
957
0
              if (P::reportErrors) {
958
0
                errLtOrEqualsOrGraveInUnquotedAttributeOrNull(c);
959
0
              }
960
0
              MOZ_FALLTHROUGH;
961
0
            }
962
0
            default: {
963
0
              attributeLine = line;
964
0
              clearStrBufBeforeUse();
965
0
              appendStrBuf(c);
966
0
              state = P::transition(mViewSource,
967
0
                                    nsHtml5Tokenizer::ATTRIBUTE_VALUE_UNQUOTED,
968
0
                                    reconsume,
969
0
                                    pos);
970
0
971
0
              NS_HTML5_CONTINUE(stateloop);
972
0
            }
973
0
          }
974
0
        }
975
0
      beforeattributevalueloop_end:;
976
0
        MOZ_FALLTHROUGH;
977
0
      }
978
0
      case ATTRIBUTE_VALUE_DOUBLE_QUOTED: {
979
0
        for (;;) {
980
0
          if (reconsume) {
981
0
            reconsume = false;
982
0
          } else {
983
0
            if (++pos == endPos) {
984
0
              NS_HTML5_BREAK(stateloop);
985
0
            }
986
0
            c = checkChar(buf, pos);
987
0
          }
988
0
          switch (c) {
989
0
            case '\"': {
990
0
              addAttributeWithValue();
991
0
              state =
992
0
                P::transition(mViewSource,
993
0
                              nsHtml5Tokenizer::AFTER_ATTRIBUTE_VALUE_QUOTED,
994
0
                              reconsume,
995
0
                              pos);
996
0
              NS_HTML5_BREAK(attributevaluedoublequotedloop);
997
0
            }
998
0
            case '&': {
999
0
              MOZ_ASSERT(!charRefBufLen,
1000
0
                         "charRefBufLen not reset after previous use!");
1001
0
              appendCharRefBuf(c);
1002
0
              setAdditionalAndRememberAmpersandLocation('\"');
1003
0
              returnState = state;
1004
0
              state =
1005
0
                P::transition(mViewSource,
1006
0
                              nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
1007
0
                              reconsume,
1008
0
                              pos);
1009
0
              NS_HTML5_CONTINUE(stateloop);
1010
0
            }
1011
0
            case '\r': {
1012
0
              appendStrBufCarriageReturn();
1013
0
              NS_HTML5_BREAK(stateloop);
1014
0
            }
1015
0
            case '\n': {
1016
0
              appendStrBufLineFeed();
1017
0
              continue;
1018
0
            }
1019
0
            case '\0': {
1020
0
              c = 0xfffd;
1021
0
              MOZ_FALLTHROUGH;
1022
0
            }
1023
0
            default: {
1024
0
              appendStrBuf(c);
1025
0
              continue;
1026
0
            }
1027
0
          }
1028
0
        }
1029
0
      attributevaluedoublequotedloop_end:;
1030
0
        MOZ_FALLTHROUGH;
1031
0
      }
1032
0
      case AFTER_ATTRIBUTE_VALUE_QUOTED: {
1033
0
        for (;;) {
1034
0
          if (++pos == endPos) {
1035
0
            NS_HTML5_BREAK(stateloop);
1036
0
          }
1037
0
          c = checkChar(buf, pos);
1038
0
          switch (c) {
1039
0
            case '\r': {
1040
0
              silentCarriageReturn();
1041
0
              state = P::transition(mViewSource,
1042
0
                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
1043
0
                                    reconsume,
1044
0
                                    pos);
1045
0
              NS_HTML5_BREAK(stateloop);
1046
0
            }
1047
0
            case '\n': {
1048
0
              silentLineFeed();
1049
0
              MOZ_FALLTHROUGH;
1050
0
            }
1051
0
            case ' ':
1052
0
            case '\t':
1053
0
            case '\f': {
1054
0
              state = P::transition(mViewSource,
1055
0
                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
1056
0
                                    reconsume,
1057
0
                                    pos);
1058
0
              NS_HTML5_CONTINUE(stateloop);
1059
0
            }
1060
0
            case '/': {
1061
0
              state = P::transition(mViewSource,
1062
0
                                    nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
1063
0
                                    reconsume,
1064
0
                                    pos);
1065
0
              NS_HTML5_BREAK(afterattributevaluequotedloop);
1066
0
            }
1067
0
            case '>': {
1068
0
              state = P::transition(
1069
0
                mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
1070
0
              if (shouldSuspend) {
1071
0
                NS_HTML5_BREAK(stateloop);
1072
0
              }
1073
0
              NS_HTML5_CONTINUE(stateloop);
1074
0
            }
1075
0
            default: {
1076
0
              if (P::reportErrors) {
1077
0
                errNoSpaceBetweenAttributes();
1078
0
              }
1079
0
              reconsume = true;
1080
0
              state = P::transition(mViewSource,
1081
0
                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
1082
0
                                    reconsume,
1083
0
                                    pos);
1084
0
              NS_HTML5_CONTINUE(stateloop);
1085
0
            }
1086
0
          }
1087
0
        }
1088
0
      afterattributevaluequotedloop_end:;
1089
0
        MOZ_FALLTHROUGH;
1090
0
      }
1091
0
      case SELF_CLOSING_START_TAG: {
1092
0
        if (++pos == endPos) {
1093
0
          NS_HTML5_BREAK(stateloop);
1094
0
        }
1095
0
        c = checkChar(buf, pos);
1096
0
        switch (c) {
1097
0
          case '>': {
1098
0
            state = P::transition(
1099
0
              mViewSource, emitCurrentTagToken(true, pos), reconsume, pos);
1100
0
            if (shouldSuspend) {
1101
0
              NS_HTML5_BREAK(stateloop);
1102
0
            }
1103
0
            NS_HTML5_CONTINUE(stateloop);
1104
0
          }
1105
0
          default: {
1106
0
            if (P::reportErrors) {
1107
0
              errSlashNotFollowedByGt();
1108
0
            }
1109
0
            reconsume = true;
1110
0
            state = P::transition(mViewSource,
1111
0
                                  nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
1112
0
                                  reconsume,
1113
0
                                  pos);
1114
0
            NS_HTML5_CONTINUE(stateloop);
1115
0
          }
1116
0
        }
1117
0
      }
1118
0
      case ATTRIBUTE_VALUE_UNQUOTED: {
1119
0
        for (;;) {
1120
0
          if (reconsume) {
1121
0
            reconsume = false;
1122
0
          } else {
1123
0
            if (++pos == endPos) {
1124
0
              NS_HTML5_BREAK(stateloop);
1125
0
            }
1126
0
            c = checkChar(buf, pos);
1127
0
          }
1128
0
          switch (c) {
1129
0
            case '\r': {
1130
0
              silentCarriageReturn();
1131
0
              addAttributeWithValue();
1132
0
              state = P::transition(mViewSource,
1133
0
                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
1134
0
                                    reconsume,
1135
0
                                    pos);
1136
0
              NS_HTML5_BREAK(stateloop);
1137
0
            }
1138
0
            case '\n': {
1139
0
              silentLineFeed();
1140
0
              MOZ_FALLTHROUGH;
1141
0
            }
1142
0
            case ' ':
1143
0
            case '\t':
1144
0
            case '\f': {
1145
0
              addAttributeWithValue();
1146
0
              state = P::transition(mViewSource,
1147
0
                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
1148
0
                                    reconsume,
1149
0
                                    pos);
1150
0
              NS_HTML5_CONTINUE(stateloop);
1151
0
            }
1152
0
            case '&': {
1153
0
              MOZ_ASSERT(!charRefBufLen,
1154
0
                         "charRefBufLen not reset after previous use!");
1155
0
              appendCharRefBuf(c);
1156
0
              setAdditionalAndRememberAmpersandLocation('>');
1157
0
              returnState = state;
1158
0
              state =
1159
0
                P::transition(mViewSource,
1160
0
                              nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
1161
0
                              reconsume,
1162
0
                              pos);
1163
0
              NS_HTML5_CONTINUE(stateloop);
1164
0
            }
1165
0
            case '>': {
1166
0
              addAttributeWithValue();
1167
0
              state = P::transition(
1168
0
                mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
1169
0
              if (shouldSuspend) {
1170
0
                NS_HTML5_BREAK(stateloop);
1171
0
              }
1172
0
              NS_HTML5_CONTINUE(stateloop);
1173
0
            }
1174
0
            case '\0': {
1175
0
              c = 0xfffd;
1176
0
              MOZ_FALLTHROUGH;
1177
0
            }
1178
0
            case '<':
1179
0
            case '\"':
1180
0
            case '\'':
1181
0
            case '=':
1182
0
            case '`': {
1183
0
              if (P::reportErrors) {
1184
0
                errUnquotedAttributeValOrNull(c);
1185
0
              }
1186
0
              MOZ_FALLTHROUGH;
1187
0
            }
1188
0
            default: {
1189
0
1190
0
              appendStrBuf(c);
1191
0
              continue;
1192
0
            }
1193
0
          }
1194
0
        }
1195
0
      }
1196
0
      case AFTER_ATTRIBUTE_NAME: {
1197
0
        for (;;) {
1198
0
          if (++pos == endPos) {
1199
0
            NS_HTML5_BREAK(stateloop);
1200
0
          }
1201
0
          c = checkChar(buf, pos);
1202
0
          switch (c) {
1203
0
            case '\r': {
1204
0
              silentCarriageReturn();
1205
0
              NS_HTML5_BREAK(stateloop);
1206
0
            }
1207
0
            case '\n': {
1208
0
              silentLineFeed();
1209
0
              MOZ_FALLTHROUGH;
1210
0
            }
1211
0
            case ' ':
1212
0
            case '\t':
1213
0
            case '\f': {
1214
0
              continue;
1215
0
            }
1216
0
            case '/': {
1217
0
              addAttributeWithoutValue();
1218
0
              state = P::transition(mViewSource,
1219
0
                                    nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
1220
0
                                    reconsume,
1221
0
                                    pos);
1222
0
              NS_HTML5_CONTINUE(stateloop);
1223
0
            }
1224
0
            case '=': {
1225
0
              state = P::transition(mViewSource,
1226
0
                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_VALUE,
1227
0
                                    reconsume,
1228
0
                                    pos);
1229
0
              NS_HTML5_CONTINUE(stateloop);
1230
0
            }
1231
0
            case '>': {
1232
0
              addAttributeWithoutValue();
1233
0
              state = P::transition(
1234
0
                mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
1235
0
              if (shouldSuspend) {
1236
0
                NS_HTML5_BREAK(stateloop);
1237
0
              }
1238
0
              NS_HTML5_CONTINUE(stateloop);
1239
0
            }
1240
0
            case '\0': {
1241
0
              c = 0xfffd;
1242
0
              MOZ_FALLTHROUGH;
1243
0
            }
1244
0
            case '\"':
1245
0
            case '\'':
1246
0
            case '<': {
1247
0
              if (P::reportErrors) {
1248
0
                errQuoteOrLtInAttributeNameOrNull(c);
1249
0
              }
1250
0
              MOZ_FALLTHROUGH;
1251
0
            }
1252
0
            default: {
1253
0
              addAttributeWithoutValue();
1254
0
              if (c >= 'A' && c <= 'Z') {
1255
0
                c += 0x20;
1256
0
              }
1257
0
              clearStrBufBeforeUse();
1258
0
              appendStrBuf(c);
1259
0
              state = P::transition(
1260
0
                mViewSource, nsHtml5Tokenizer::ATTRIBUTE_NAME, reconsume, pos);
1261
0
              NS_HTML5_CONTINUE(stateloop);
1262
0
            }
1263
0
          }
1264
0
        }
1265
0
      }
1266
0
      case MARKUP_DECLARATION_OPEN: {
1267
0
        for (;;) {
1268
0
          if (++pos == endPos) {
1269
0
            NS_HTML5_BREAK(stateloop);
1270
0
          }
1271
0
          c = checkChar(buf, pos);
1272
0
          switch (c) {
1273
0
            case '-': {
1274
0
              clearStrBufBeforeUse();
1275
0
              appendStrBuf(c);
1276
0
              state = P::transition(mViewSource,
1277
0
                                    nsHtml5Tokenizer::MARKUP_DECLARATION_HYPHEN,
1278
0
                                    reconsume,
1279
0
                                    pos);
1280
0
              NS_HTML5_BREAK(markupdeclarationopenloop);
1281
0
            }
1282
0
            case 'd':
1283
0
            case 'D': {
1284
0
              clearStrBufBeforeUse();
1285
0
              appendStrBuf(c);
1286
0
              index = 0;
1287
0
              state = P::transition(mViewSource,
1288
0
                                    nsHtml5Tokenizer::MARKUP_DECLARATION_OCTYPE,
1289
0
                                    reconsume,
1290
0
                                    pos);
1291
0
              NS_HTML5_CONTINUE(stateloop);
1292
0
            }
1293
0
            case '[': {
1294
0
              if (tokenHandler->cdataSectionAllowed()) {
1295
0
                clearStrBufBeforeUse();
1296
0
                appendStrBuf(c);
1297
0
                index = 0;
1298
0
                state = P::transition(
1299
0
                  mViewSource, nsHtml5Tokenizer::CDATA_START, reconsume, pos);
1300
0
                NS_HTML5_CONTINUE(stateloop);
1301
0
              }
1302
0
              MOZ_FALLTHROUGH;
1303
0
            }
1304
0
            default: {
1305
0
              if (P::reportErrors) {
1306
0
                errBogusComment();
1307
0
              }
1308
0
              clearStrBufBeforeUse();
1309
0
              reconsume = true;
1310
0
              state = P::transition(
1311
0
                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
1312
0
              NS_HTML5_CONTINUE(stateloop);
1313
0
            }
1314
0
          }
1315
0
        }
1316
0
      markupdeclarationopenloop_end:;
1317
0
        MOZ_FALLTHROUGH;
1318
0
      }
1319
0
      case MARKUP_DECLARATION_HYPHEN: {
1320
0
        for (;;) {
1321
0
          if (++pos == endPos) {
1322
0
            NS_HTML5_BREAK(stateloop);
1323
0
          }
1324
0
          c = checkChar(buf, pos);
1325
0
          switch (c) {
1326
0
            case '\0': {
1327
0
              NS_HTML5_BREAK(stateloop);
1328
0
            }
1329
0
            case '-': {
1330
0
              clearStrBufAfterOneHyphen();
1331
0
              state = P::transition(
1332
0
                mViewSource, nsHtml5Tokenizer::COMMENT_START, reconsume, pos);
1333
0
              NS_HTML5_BREAK(markupdeclarationhyphenloop);
1334
0
            }
1335
0
            default: {
1336
0
              if (P::reportErrors) {
1337
0
                errBogusComment();
1338
0
              }
1339
0
              reconsume = true;
1340
0
              state = P::transition(
1341
0
                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
1342
0
              NS_HTML5_CONTINUE(stateloop);
1343
0
            }
1344
0
          }
1345
0
        }
1346
0
      markupdeclarationhyphenloop_end:;
1347
0
        MOZ_FALLTHROUGH;
1348
0
      }
1349
0
      case COMMENT_START: {
1350
0
        for (;;) {
1351
0
          if (++pos == endPos) {
1352
0
            NS_HTML5_BREAK(stateloop);
1353
0
          }
1354
0
          c = checkChar(buf, pos);
1355
0
          switch (c) {
1356
0
            case '-': {
1357
0
              appendStrBuf(c);
1358
0
              state = P::transition(mViewSource,
1359
0
                                    nsHtml5Tokenizer::COMMENT_START_DASH,
1360
0
                                    reconsume,
1361
0
                                    pos);
1362
0
              NS_HTML5_CONTINUE(stateloop);
1363
0
            }
1364
0
            case '>': {
1365
0
              if (P::reportErrors) {
1366
0
                errPrematureEndOfComment();
1367
0
              }
1368
0
              emitComment(0, pos);
1369
0
              state = P::transition(
1370
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
1371
0
              NS_HTML5_CONTINUE(stateloop);
1372
0
            }
1373
0
            case '\r': {
1374
0
              appendStrBufCarriageReturn();
1375
0
              state = P::transition(
1376
0
                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
1377
0
              NS_HTML5_BREAK(stateloop);
1378
0
            }
1379
0
            case '\n': {
1380
0
              appendStrBufLineFeed();
1381
0
              state = P::transition(
1382
0
                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
1383
0
              NS_HTML5_BREAK(commentstartloop);
1384
0
            }
1385
0
            case '\0': {
1386
0
              c = 0xfffd;
1387
0
              MOZ_FALLTHROUGH;
1388
0
            }
1389
0
            default: {
1390
0
              appendStrBuf(c);
1391
0
              state = P::transition(
1392
0
                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
1393
0
              NS_HTML5_BREAK(commentstartloop);
1394
0
            }
1395
0
          }
1396
0
        }
1397
0
      commentstartloop_end:;
1398
0
        MOZ_FALLTHROUGH;
1399
0
      }
1400
0
      case COMMENT: {
1401
0
        for (;;) {
1402
0
          if (++pos == endPos) {
1403
0
            NS_HTML5_BREAK(stateloop);
1404
0
          }
1405
0
          c = checkChar(buf, pos);
1406
0
          switch (c) {
1407
0
            case '-': {
1408
0
              appendStrBuf(c);
1409
0
              state = P::transition(mViewSource,
1410
0
                                    nsHtml5Tokenizer::COMMENT_END_DASH,
1411
0
                                    reconsume,
1412
0
                                    pos);
1413
0
              NS_HTML5_BREAK(commentloop);
1414
0
            }
1415
0
            case '\r': {
1416
0
              appendStrBufCarriageReturn();
1417
0
              NS_HTML5_BREAK(stateloop);
1418
0
            }
1419
0
            case '\n': {
1420
0
              appendStrBufLineFeed();
1421
0
              continue;
1422
0
            }
1423
0
            case '\0': {
1424
0
              c = 0xfffd;
1425
0
              MOZ_FALLTHROUGH;
1426
0
            }
1427
0
            default: {
1428
0
              appendStrBuf(c);
1429
0
              continue;
1430
0
            }
1431
0
          }
1432
0
        }
1433
0
      commentloop_end:;
1434
0
        MOZ_FALLTHROUGH;
1435
0
      }
1436
0
      case COMMENT_END_DASH: {
1437
0
        for (;;) {
1438
0
          if (++pos == endPos) {
1439
0
            NS_HTML5_BREAK(stateloop);
1440
0
          }
1441
0
          c = checkChar(buf, pos);
1442
0
          switch (c) {
1443
0
            case '-': {
1444
0
              appendStrBuf(c);
1445
0
              state = P::transition(
1446
0
                mViewSource, nsHtml5Tokenizer::COMMENT_END, reconsume, pos);
1447
0
              NS_HTML5_BREAK(commentenddashloop);
1448
0
            }
1449
0
            case '\r': {
1450
0
              appendStrBufCarriageReturn();
1451
0
              state = P::transition(
1452
0
                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
1453
0
              NS_HTML5_BREAK(stateloop);
1454
0
            }
1455
0
            case '\n': {
1456
0
              appendStrBufLineFeed();
1457
0
              state = P::transition(
1458
0
                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
1459
0
              NS_HTML5_CONTINUE(stateloop);
1460
0
            }
1461
0
            case '\0': {
1462
0
              c = 0xfffd;
1463
0
              MOZ_FALLTHROUGH;
1464
0
            }
1465
0
            default: {
1466
0
              appendStrBuf(c);
1467
0
              state = P::transition(
1468
0
                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
1469
0
              NS_HTML5_CONTINUE(stateloop);
1470
0
            }
1471
0
          }
1472
0
        }
1473
0
      commentenddashloop_end:;
1474
0
        MOZ_FALLTHROUGH;
1475
0
      }
1476
0
      case COMMENT_END: {
1477
0
        for (;;) {
1478
0
          if (++pos == endPos) {
1479
0
            NS_HTML5_BREAK(stateloop);
1480
0
          }
1481
0
          c = checkChar(buf, pos);
1482
0
          switch (c) {
1483
0
            case '>': {
1484
0
              emitComment(2, pos);
1485
0
              state = P::transition(
1486
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
1487
0
              NS_HTML5_CONTINUE(stateloop);
1488
0
            }
1489
0
            case '-': {
1490
0
              adjustDoubleHyphenAndAppendToStrBufAndErr(c);
1491
0
              continue;
1492
0
            }
1493
0
            case '\r': {
1494
0
              adjustDoubleHyphenAndAppendToStrBufCarriageReturn();
1495
0
              state = P::transition(
1496
0
                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
1497
0
              NS_HTML5_BREAK(stateloop);
1498
0
            }
1499
0
            case '\n': {
1500
0
              adjustDoubleHyphenAndAppendToStrBufLineFeed();
1501
0
              state = P::transition(
1502
0
                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
1503
0
              NS_HTML5_CONTINUE(stateloop);
1504
0
            }
1505
0
            case '!': {
1506
0
              if (P::reportErrors) {
1507
0
                errHyphenHyphenBang();
1508
0
              }
1509
0
              appendStrBuf(c);
1510
0
              state = P::transition(mViewSource,
1511
0
                                    nsHtml5Tokenizer::COMMENT_END_BANG,
1512
0
                                    reconsume,
1513
0
                                    pos);
1514
0
              NS_HTML5_CONTINUE(stateloop);
1515
0
            }
1516
0
            case '\0': {
1517
0
              c = 0xfffd;
1518
0
              MOZ_FALLTHROUGH;
1519
0
            }
1520
0
            default: {
1521
0
              adjustDoubleHyphenAndAppendToStrBufAndErr(c);
1522
0
              state = P::transition(
1523
0
                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
1524
0
              NS_HTML5_CONTINUE(stateloop);
1525
0
            }
1526
0
          }
1527
0
        }
1528
0
      }
1529
0
      case COMMENT_END_BANG: {
1530
0
        for (;;) {
1531
0
          if (++pos == endPos) {
1532
0
            NS_HTML5_BREAK(stateloop);
1533
0
          }
1534
0
          c = checkChar(buf, pos);
1535
0
          switch (c) {
1536
0
            case '>': {
1537
0
              emitComment(3, pos);
1538
0
              state = P::transition(
1539
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
1540
0
              NS_HTML5_CONTINUE(stateloop);
1541
0
            }
1542
0
            case '-': {
1543
0
              appendStrBuf(c);
1544
0
              state = P::transition(mViewSource,
1545
0
                                    nsHtml5Tokenizer::COMMENT_END_DASH,
1546
0
                                    reconsume,
1547
0
                                    pos);
1548
0
              NS_HTML5_CONTINUE(stateloop);
1549
0
            }
1550
0
            case '\r': {
1551
0
              appendStrBufCarriageReturn();
1552
0
              NS_HTML5_BREAK(stateloop);
1553
0
            }
1554
0
            case '\n': {
1555
0
              appendStrBufLineFeed();
1556
0
              continue;
1557
0
            }
1558
0
            case '\0': {
1559
0
              c = 0xfffd;
1560
0
              MOZ_FALLTHROUGH;
1561
0
            }
1562
0
            default: {
1563
0
              appendStrBuf(c);
1564
0
              state = P::transition(
1565
0
                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
1566
0
              NS_HTML5_CONTINUE(stateloop);
1567
0
            }
1568
0
          }
1569
0
        }
1570
0
      }
1571
0
      case COMMENT_START_DASH: {
1572
0
        if (++pos == endPos) {
1573
0
          NS_HTML5_BREAK(stateloop);
1574
0
        }
1575
0
        c = checkChar(buf, pos);
1576
0
        switch (c) {
1577
0
          case '-': {
1578
0
            appendStrBuf(c);
1579
0
            state = P::transition(
1580
0
              mViewSource, nsHtml5Tokenizer::COMMENT_END, reconsume, pos);
1581
0
            NS_HTML5_CONTINUE(stateloop);
1582
0
          }
1583
0
          case '>': {
1584
0
            if (P::reportErrors) {
1585
0
              errPrematureEndOfComment();
1586
0
            }
1587
0
            emitComment(1, pos);
1588
0
            state = P::transition(
1589
0
              mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
1590
0
            NS_HTML5_CONTINUE(stateloop);
1591
0
          }
1592
0
          case '\r': {
1593
0
            appendStrBufCarriageReturn();
1594
0
            state = P::transition(
1595
0
              mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
1596
0
            NS_HTML5_BREAK(stateloop);
1597
0
          }
1598
0
          case '\n': {
1599
0
            appendStrBufLineFeed();
1600
0
            state = P::transition(
1601
0
              mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
1602
0
            NS_HTML5_CONTINUE(stateloop);
1603
0
          }
1604
0
          case '\0': {
1605
0
            c = 0xfffd;
1606
0
            MOZ_FALLTHROUGH;
1607
0
          }
1608
0
          default: {
1609
0
            appendStrBuf(c);
1610
0
            state = P::transition(
1611
0
              mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
1612
0
            NS_HTML5_CONTINUE(stateloop);
1613
0
          }
1614
0
        }
1615
0
      }
1616
0
      case CDATA_START: {
1617
0
        for (;;) {
1618
0
          if (++pos == endPos) {
1619
0
            NS_HTML5_BREAK(stateloop);
1620
0
          }
1621
0
          c = checkChar(buf, pos);
1622
0
          if (index < 6) {
1623
0
            if (c == nsHtml5Tokenizer::CDATA_LSQB[index]) {
1624
0
              appendStrBuf(c);
1625
0
            } else {
1626
0
              if (P::reportErrors) {
1627
0
                errBogusComment();
1628
0
              }
1629
0
              reconsume = true;
1630
0
              state = P::transition(
1631
0
                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
1632
0
              NS_HTML5_CONTINUE(stateloop);
1633
0
            }
1634
0
            index++;
1635
0
            continue;
1636
0
          } else {
1637
0
            clearStrBufAfterUse();
1638
0
            cstart = pos;
1639
0
            reconsume = true;
1640
0
            state = P::transition(
1641
0
              mViewSource, nsHtml5Tokenizer::CDATA_SECTION, reconsume, pos);
1642
0
            break;
1643
0
          }
1644
0
        }
1645
0
        MOZ_FALLTHROUGH;
1646
0
      }
1647
0
      case CDATA_SECTION: {
1648
0
        for (;;) {
1649
0
          if (reconsume) {
1650
0
            reconsume = false;
1651
0
          } else {
1652
0
            if (++pos == endPos) {
1653
0
              NS_HTML5_BREAK(stateloop);
1654
0
            }
1655
0
            c = checkChar(buf, pos);
1656
0
          }
1657
0
          switch (c) {
1658
0
            case ']': {
1659
0
              flushChars(buf, pos);
1660
0
              state = P::transition(
1661
0
                mViewSource, nsHtml5Tokenizer::CDATA_RSQB, reconsume, pos);
1662
0
              NS_HTML5_BREAK(cdatasectionloop);
1663
0
            }
1664
0
            case '\0': {
1665
0
              emitReplacementCharacter(buf, pos);
1666
0
              continue;
1667
0
            }
1668
0
            case '\r': {
1669
0
              emitCarriageReturn(buf, pos);
1670
0
              NS_HTML5_BREAK(stateloop);
1671
0
            }
1672
0
            case '\n': {
1673
0
              silentLineFeed();
1674
0
              MOZ_FALLTHROUGH;
1675
0
            }
1676
0
            default: {
1677
0
              continue;
1678
0
            }
1679
0
          }
1680
0
        }
1681
0
      cdatasectionloop_end:;
1682
0
        MOZ_FALLTHROUGH;
1683
0
      }
1684
0
      case CDATA_RSQB: {
1685
0
        for (;;) {
1686
0
          if (++pos == endPos) {
1687
0
            NS_HTML5_BREAK(stateloop);
1688
0
          }
1689
0
          c = checkChar(buf, pos);
1690
0
          switch (c) {
1691
0
            case ']': {
1692
0
              state = P::transition(
1693
0
                mViewSource, nsHtml5Tokenizer::CDATA_RSQB_RSQB, reconsume, pos);
1694
0
              NS_HTML5_BREAK(cdatarsqb);
1695
0
            }
1696
0
            default: {
1697
0
              tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 1);
1698
0
              cstart = pos;
1699
0
              reconsume = true;
1700
0
              state = P::transition(
1701
0
                mViewSource, nsHtml5Tokenizer::CDATA_SECTION, reconsume, pos);
1702
0
              NS_HTML5_CONTINUE(stateloop);
1703
0
            }
1704
0
          }
1705
0
        }
1706
0
      cdatarsqb_end:;
1707
0
        MOZ_FALLTHROUGH;
1708
0
      }
1709
0
      case CDATA_RSQB_RSQB: {
1710
0
        for (;;) {
1711
0
          if (++pos == endPos) {
1712
0
            NS_HTML5_BREAK(stateloop);
1713
0
          }
1714
0
          c = checkChar(buf, pos);
1715
0
          switch (c) {
1716
0
            case ']': {
1717
0
              tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 1);
1718
0
              continue;
1719
0
            }
1720
0
            case '>': {
1721
0
              cstart = pos + 1;
1722
0
              state = P::transition(
1723
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
1724
0
              NS_HTML5_CONTINUE(stateloop);
1725
0
            }
1726
0
            default: {
1727
0
              tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 2);
1728
0
              cstart = pos;
1729
0
              reconsume = true;
1730
0
              state = P::transition(
1731
0
                mViewSource, nsHtml5Tokenizer::CDATA_SECTION, reconsume, pos);
1732
0
              NS_HTML5_CONTINUE(stateloop);
1733
0
            }
1734
0
          }
1735
0
        }
1736
0
      }
1737
0
      case ATTRIBUTE_VALUE_SINGLE_QUOTED: {
1738
0
        for (;;) {
1739
0
          if (reconsume) {
1740
0
            reconsume = false;
1741
0
          } else {
1742
0
            if (++pos == endPos) {
1743
0
              NS_HTML5_BREAK(stateloop);
1744
0
            }
1745
0
            c = checkChar(buf, pos);
1746
0
          }
1747
0
          switch (c) {
1748
0
            case '\'': {
1749
0
              addAttributeWithValue();
1750
0
              state =
1751
0
                P::transition(mViewSource,
1752
0
                              nsHtml5Tokenizer::AFTER_ATTRIBUTE_VALUE_QUOTED,
1753
0
                              reconsume,
1754
0
                              pos);
1755
0
              NS_HTML5_CONTINUE(stateloop);
1756
0
            }
1757
0
            case '&': {
1758
0
              MOZ_ASSERT(!charRefBufLen,
1759
0
                         "charRefBufLen not reset after previous use!");
1760
0
              appendCharRefBuf(c);
1761
0
              setAdditionalAndRememberAmpersandLocation('\'');
1762
0
              returnState = state;
1763
0
              state =
1764
0
                P::transition(mViewSource,
1765
0
                              nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
1766
0
                              reconsume,
1767
0
                              pos);
1768
0
              NS_HTML5_BREAK(attributevaluesinglequotedloop);
1769
0
            }
1770
0
            case '\r': {
1771
0
              appendStrBufCarriageReturn();
1772
0
              NS_HTML5_BREAK(stateloop);
1773
0
            }
1774
0
            case '\n': {
1775
0
              appendStrBufLineFeed();
1776
0
              continue;
1777
0
            }
1778
0
            case '\0': {
1779
0
              c = 0xfffd;
1780
0
              MOZ_FALLTHROUGH;
1781
0
            }
1782
0
            default: {
1783
0
              appendStrBuf(c);
1784
0
              continue;
1785
0
            }
1786
0
          }
1787
0
        }
1788
0
      attributevaluesinglequotedloop_end:;
1789
0
        MOZ_FALLTHROUGH;
1790
0
      }
1791
0
      case CONSUME_CHARACTER_REFERENCE: {
1792
0
        if (++pos == endPos) {
1793
0
          NS_HTML5_BREAK(stateloop);
1794
0
        }
1795
0
        c = checkChar(buf, pos);
1796
0
        if (c == '\0') {
1797
0
          NS_HTML5_BREAK(stateloop);
1798
0
        }
1799
0
        switch (c) {
1800
0
          case ' ':
1801
0
          case '\t':
1802
0
          case '\n':
1803
0
          case '\r':
1804
0
          case '\f':
1805
0
          case '<':
1806
0
          case '&': {
1807
0
            emitOrAppendCharRefBuf(returnState);
1808
0
            if (!(returnState & DATA_AND_RCDATA_MASK)) {
1809
0
              cstart = pos;
1810
0
            }
1811
0
            reconsume = true;
1812
0
            state = P::transition(mViewSource, returnState, reconsume, pos);
1813
0
            NS_HTML5_CONTINUE(stateloop);
1814
0
          }
1815
0
          case '#': {
1816
0
            appendCharRefBuf('#');
1817
0
            state = P::transition(
1818
0
              mViewSource, nsHtml5Tokenizer::CONSUME_NCR, reconsume, pos);
1819
0
            NS_HTML5_CONTINUE(stateloop);
1820
0
          }
1821
0
          default: {
1822
0
            if (c == additional) {
1823
0
              emitOrAppendCharRefBuf(returnState);
1824
0
              reconsume = true;
1825
0
              state = P::transition(mViewSource, returnState, reconsume, pos);
1826
0
              NS_HTML5_CONTINUE(stateloop);
1827
0
            }
1828
0
            if (c >= 'a' && c <= 'z') {
1829
0
              firstCharKey = c - 'a' + 26;
1830
0
            } else if (c >= 'A' && c <= 'Z') {
1831
0
              firstCharKey = c - 'A';
1832
0
            } else {
1833
0
              if (P::reportErrors) {
1834
0
                errNoNamedCharacterMatch();
1835
0
              }
1836
0
              emitOrAppendCharRefBuf(returnState);
1837
0
              if (!(returnState & DATA_AND_RCDATA_MASK)) {
1838
0
                cstart = pos;
1839
0
              }
1840
0
              reconsume = true;
1841
0
              state = P::transition(mViewSource, returnState, reconsume, pos);
1842
0
              NS_HTML5_CONTINUE(stateloop);
1843
0
            }
1844
0
            appendCharRefBuf(c);
1845
0
            state =
1846
0
              P::transition(mViewSource,
1847
0
                            nsHtml5Tokenizer::CHARACTER_REFERENCE_HILO_LOOKUP,
1848
0
                            reconsume,
1849
0
                            pos);
1850
0
          }
1851
0
        }
1852
0
        MOZ_FALLTHROUGH;
1853
0
      }
1854
0
      case CHARACTER_REFERENCE_HILO_LOOKUP: {
1855
0
        {
1856
0
          if (++pos == endPos) {
1857
0
            NS_HTML5_BREAK(stateloop);
1858
0
          }
1859
0
          c = checkChar(buf, pos);
1860
0
          if (c == '\0') {
1861
0
            NS_HTML5_BREAK(stateloop);
1862
0
          }
1863
0
          int32_t hilo = 0;
1864
0
          if (c <= 'z') {
1865
0
            const int32_t* row = nsHtml5NamedCharactersAccel::HILO_ACCEL[c];
1866
0
            if (row) {
1867
0
              hilo = row[firstCharKey];
1868
0
            }
1869
0
          }
1870
0
          if (!hilo) {
1871
0
            if (P::reportErrors) {
1872
0
              errNoNamedCharacterMatch();
1873
0
            }
1874
0
            emitOrAppendCharRefBuf(returnState);
1875
0
            if (!(returnState & DATA_AND_RCDATA_MASK)) {
1876
0
              cstart = pos;
1877
0
            }
1878
0
            reconsume = true;
1879
0
            state = P::transition(mViewSource, returnState, reconsume, pos);
1880
0
            NS_HTML5_CONTINUE(stateloop);
1881
0
          }
1882
0
          appendCharRefBuf(c);
1883
0
          lo = hilo & 0xFFFF;
1884
0
          hi = hilo >> 16;
1885
0
          entCol = -1;
1886
0
          candidate = -1;
1887
0
          charRefBufMark = 0;
1888
0
          state = P::transition(mViewSource,
1889
0
                                nsHtml5Tokenizer::CHARACTER_REFERENCE_TAIL,
1890
0
                                reconsume,
1891
0
                                pos);
1892
0
        }
1893
0
        MOZ_FALLTHROUGH;
1894
0
      }
1895
0
      case CHARACTER_REFERENCE_TAIL: {
1896
0
        for (;;) {
1897
0
          if (++pos == endPos) {
1898
0
            NS_HTML5_BREAK(stateloop);
1899
0
          }
1900
0
          c = checkChar(buf, pos);
1901
0
          if (c == '\0') {
1902
0
            NS_HTML5_BREAK(stateloop);
1903
0
          }
1904
0
          entCol++;
1905
0
          for (;;) {
1906
0
            if (hi < lo) {
1907
0
              NS_HTML5_BREAK(outer);
1908
0
            }
1909
0
            if (entCol == nsHtml5NamedCharacters::NAMES[lo].length()) {
1910
0
              candidate = lo;
1911
0
              charRefBufMark = charRefBufLen;
1912
0
              lo++;
1913
0
            } else if (entCol > nsHtml5NamedCharacters::NAMES[lo].length()) {
1914
0
              NS_HTML5_BREAK(outer);
1915
0
            } else if (c > nsHtml5NamedCharacters::NAMES[lo].charAt(entCol)) {
1916
0
              lo++;
1917
0
            } else {
1918
0
              NS_HTML5_BREAK(loloop);
1919
0
            }
1920
0
          }
1921
0
        loloop_end:;
1922
0
          for (;;) {
1923
0
            if (hi < lo) {
1924
0
              NS_HTML5_BREAK(outer);
1925
0
            }
1926
0
            if (entCol == nsHtml5NamedCharacters::NAMES[hi].length()) {
1927
0
              NS_HTML5_BREAK(hiloop);
1928
0
            }
1929
0
            if (entCol > nsHtml5NamedCharacters::NAMES[hi].length()) {
1930
0
              NS_HTML5_BREAK(outer);
1931
0
            } else if (c < nsHtml5NamedCharacters::NAMES[hi].charAt(entCol)) {
1932
0
              hi--;
1933
0
            } else {
1934
0
              NS_HTML5_BREAK(hiloop);
1935
0
            }
1936
0
          }
1937
0
        hiloop_end:;
1938
0
          if (c == ';') {
1939
0
            if (entCol + 1 == nsHtml5NamedCharacters::NAMES[lo].length()) {
1940
0
              candidate = lo;
1941
0
              charRefBufMark = charRefBufLen;
1942
0
            }
1943
0
            NS_HTML5_BREAK(outer);
1944
0
          }
1945
0
          if (hi < lo) {
1946
0
            NS_HTML5_BREAK(outer);
1947
0
          }
1948
0
          appendCharRefBuf(c);
1949
0
          continue;
1950
0
        }
1951
0
      outer_end:;
1952
0
        if (candidate == -1) {
1953
0
          if (P::reportErrors) {
1954
0
            errNoNamedCharacterMatch();
1955
0
          }
1956
0
          emitOrAppendCharRefBuf(returnState);
1957
0
          if (!(returnState & DATA_AND_RCDATA_MASK)) {
1958
0
            cstart = pos;
1959
0
          }
1960
0
          reconsume = true;
1961
0
          state = P::transition(mViewSource, returnState, reconsume, pos);
1962
0
          NS_HTML5_CONTINUE(stateloop);
1963
0
        } else {
1964
0
          const nsHtml5CharacterName& candidateName =
1965
0
            nsHtml5NamedCharacters::NAMES[candidate];
1966
0
          if (!candidateName.length() ||
1967
0
              candidateName.charAt(candidateName.length() - 1) != ';') {
1968
0
            if ((returnState & DATA_AND_RCDATA_MASK)) {
1969
0
              char16_t ch;
1970
0
              if (charRefBufMark == charRefBufLen) {
1971
0
                ch = c;
1972
0
              } else {
1973
0
                ch = charRefBuf[charRefBufMark];
1974
0
              }
1975
0
              if (ch == '=' || (ch >= '0' && ch <= '9') ||
1976
0
                  (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
1977
0
                if (P::reportErrors) {
1978
0
                  errNoNamedCharacterMatch();
1979
0
                }
1980
0
                appendCharRefBufToStrBuf();
1981
0
                reconsume = true;
1982
0
                state = P::transition(mViewSource, returnState, reconsume, pos);
1983
0
                NS_HTML5_CONTINUE(stateloop);
1984
0
              }
1985
0
            }
1986
0
            if ((returnState & DATA_AND_RCDATA_MASK)) {
1987
0
              if (P::reportErrors) {
1988
0
                errUnescapedAmpersandInterpretedAsCharacterReference();
1989
0
              }
1990
0
            } else {
1991
0
              if (P::reportErrors) {
1992
0
                errNotSemicolonTerminated();
1993
0
              }
1994
0
            }
1995
0
          }
1996
0
          P::completedNamedCharacterReference(mViewSource);
1997
0
          const char16_t* val = nsHtml5NamedCharacters::VALUES[candidate];
1998
0
          if (!val[1]) {
1999
0
            emitOrAppendOne(val, returnState);
2000
0
          } else {
2001
0
            emitOrAppendTwo(val, returnState);
2002
0
          }
2003
0
          if (charRefBufMark < charRefBufLen) {
2004
0
            if ((returnState & DATA_AND_RCDATA_MASK)) {
2005
0
              appendStrBuf(
2006
0
                charRefBuf, charRefBufMark, charRefBufLen - charRefBufMark);
2007
0
            } else {
2008
0
              tokenHandler->characters(
2009
0
                charRefBuf, charRefBufMark, charRefBufLen - charRefBufMark);
2010
0
            }
2011
0
          }
2012
0
          bool earlyBreak = (c == ';' && charRefBufMark == charRefBufLen);
2013
0
          charRefBufLen = 0;
2014
0
          if (!(returnState & DATA_AND_RCDATA_MASK)) {
2015
0
            cstart = earlyBreak ? pos + 1 : pos;
2016
0
          }
2017
0
          reconsume = !earlyBreak;
2018
0
          state = P::transition(mViewSource, returnState, reconsume, pos);
2019
0
          NS_HTML5_CONTINUE(stateloop);
2020
0
        }
2021
0
      }
2022
0
      case CONSUME_NCR: {
2023
0
        if (++pos == endPos) {
2024
0
          NS_HTML5_BREAK(stateloop);
2025
0
        }
2026
0
        c = checkChar(buf, pos);
2027
0
        value = 0;
2028
0
        seenDigits = false;
2029
0
        switch (c) {
2030
0
          case 'x':
2031
0
          case 'X': {
2032
0
            appendCharRefBuf(c);
2033
0
            state = P::transition(
2034
0
              mViewSource, nsHtml5Tokenizer::HEX_NCR_LOOP, reconsume, pos);
2035
0
            NS_HTML5_CONTINUE(stateloop);
2036
0
          }
2037
0
          default: {
2038
0
            reconsume = true;
2039
0
            state = P::transition(
2040
0
              mViewSource, nsHtml5Tokenizer::DECIMAL_NRC_LOOP, reconsume, pos);
2041
0
          }
2042
0
        }
2043
0
        MOZ_FALLTHROUGH;
2044
0
      }
2045
0
      case DECIMAL_NRC_LOOP: {
2046
0
        for (;;) {
2047
0
          if (reconsume) {
2048
0
            reconsume = false;
2049
0
          } else {
2050
0
            if (++pos == endPos) {
2051
0
              NS_HTML5_BREAK(stateloop);
2052
0
            }
2053
0
            c = checkChar(buf, pos);
2054
0
          }
2055
0
          MOZ_ASSERT(value >= 0, "value must not become negative.");
2056
0
          if (c >= '0' && c <= '9') {
2057
0
            seenDigits = true;
2058
0
            if (value <= 0x10FFFF) {
2059
0
              value *= 10;
2060
0
              value += c - '0';
2061
0
            }
2062
0
            continue;
2063
0
          } else if (c == ';') {
2064
0
            if (seenDigits) {
2065
0
              if (!(returnState & DATA_AND_RCDATA_MASK)) {
2066
0
                cstart = pos + 1;
2067
0
              }
2068
0
              state = P::transition(mViewSource,
2069
0
                                    nsHtml5Tokenizer::HANDLE_NCR_VALUE,
2070
0
                                    reconsume,
2071
0
                                    pos);
2072
0
              NS_HTML5_BREAK(decimalloop);
2073
0
            } else {
2074
0
              if (P::reportErrors) {
2075
0
                errNoDigitsInNCR();
2076
0
              }
2077
0
              appendCharRefBuf(';');
2078
0
              emitOrAppendCharRefBuf(returnState);
2079
0
              if (!(returnState & DATA_AND_RCDATA_MASK)) {
2080
0
                cstart = pos + 1;
2081
0
              }
2082
0
              state = P::transition(mViewSource, returnState, reconsume, pos);
2083
0
              NS_HTML5_CONTINUE(stateloop);
2084
0
            }
2085
0
          } else {
2086
0
            if (!seenDigits) {
2087
0
              if (P::reportErrors) {
2088
0
                errNoDigitsInNCR();
2089
0
              }
2090
0
              emitOrAppendCharRefBuf(returnState);
2091
0
              if (!(returnState & DATA_AND_RCDATA_MASK)) {
2092
0
                cstart = pos;
2093
0
              }
2094
0
              reconsume = true;
2095
0
              state = P::transition(mViewSource, returnState, reconsume, pos);
2096
0
              NS_HTML5_CONTINUE(stateloop);
2097
0
            } else {
2098
0
              if (P::reportErrors) {
2099
0
                errCharRefLacksSemicolon();
2100
0
              }
2101
0
              if (!(returnState & DATA_AND_RCDATA_MASK)) {
2102
0
                cstart = pos;
2103
0
              }
2104
0
              reconsume = true;
2105
0
              state = P::transition(mViewSource,
2106
0
                                    nsHtml5Tokenizer::HANDLE_NCR_VALUE,
2107
0
                                    reconsume,
2108
0
                                    pos);
2109
0
              NS_HTML5_BREAK(decimalloop);
2110
0
            }
2111
0
          }
2112
0
        }
2113
0
      decimalloop_end:;
2114
0
        MOZ_FALLTHROUGH;
2115
0
      }
2116
0
      case HANDLE_NCR_VALUE: {
2117
0
        charRefBufLen = 0;
2118
0
        handleNcrValue(returnState);
2119
0
        state = P::transition(mViewSource, returnState, reconsume, pos);
2120
0
        NS_HTML5_CONTINUE(stateloop);
2121
0
      }
2122
0
      case HEX_NCR_LOOP: {
2123
0
        for (;;) {
2124
0
          if (++pos == endPos) {
2125
0
            NS_HTML5_BREAK(stateloop);
2126
0
          }
2127
0
          c = checkChar(buf, pos);
2128
0
          MOZ_ASSERT(value >= 0, "value must not become negative.");
2129
0
          if (c >= '0' && c <= '9') {
2130
0
            seenDigits = true;
2131
0
            if (value <= 0x10FFFF) {
2132
0
              value *= 16;
2133
0
              value += c - '0';
2134
0
            }
2135
0
            continue;
2136
0
          } else if (c >= 'A' && c <= 'F') {
2137
0
            seenDigits = true;
2138
0
            if (value <= 0x10FFFF) {
2139
0
              value *= 16;
2140
0
              value += c - 'A' + 10;
2141
0
            }
2142
0
            continue;
2143
0
          } else if (c >= 'a' && c <= 'f') {
2144
0
            seenDigits = true;
2145
0
            if (value <= 0x10FFFF) {
2146
0
              value *= 16;
2147
0
              value += c - 'a' + 10;
2148
0
            }
2149
0
            continue;
2150
0
          } else if (c == ';') {
2151
0
            if (seenDigits) {
2152
0
              if (!(returnState & DATA_AND_RCDATA_MASK)) {
2153
0
                cstart = pos + 1;
2154
0
              }
2155
0
              state = P::transition(mViewSource,
2156
0
                                    nsHtml5Tokenizer::HANDLE_NCR_VALUE,
2157
0
                                    reconsume,
2158
0
                                    pos);
2159
0
              NS_HTML5_CONTINUE(stateloop);
2160
0
            } else {
2161
0
              if (P::reportErrors) {
2162
0
                errNoDigitsInNCR();
2163
0
              }
2164
0
              appendCharRefBuf(';');
2165
0
              emitOrAppendCharRefBuf(returnState);
2166
0
              if (!(returnState & DATA_AND_RCDATA_MASK)) {
2167
0
                cstart = pos + 1;
2168
0
              }
2169
0
              state = P::transition(mViewSource, returnState, reconsume, pos);
2170
0
              NS_HTML5_CONTINUE(stateloop);
2171
0
            }
2172
0
          } else {
2173
0
            if (!seenDigits) {
2174
0
              if (P::reportErrors) {
2175
0
                errNoDigitsInNCR();
2176
0
              }
2177
0
              emitOrAppendCharRefBuf(returnState);
2178
0
              if (!(returnState & DATA_AND_RCDATA_MASK)) {
2179
0
                cstart = pos;
2180
0
              }
2181
0
              reconsume = true;
2182
0
              state = P::transition(mViewSource, returnState, reconsume, pos);
2183
0
              NS_HTML5_CONTINUE(stateloop);
2184
0
            } else {
2185
0
              if (P::reportErrors) {
2186
0
                errCharRefLacksSemicolon();
2187
0
              }
2188
0
              if (!(returnState & DATA_AND_RCDATA_MASK)) {
2189
0
                cstart = pos;
2190
0
              }
2191
0
              reconsume = true;
2192
0
              state = P::transition(mViewSource,
2193
0
                                    nsHtml5Tokenizer::HANDLE_NCR_VALUE,
2194
0
                                    reconsume,
2195
0
                                    pos);
2196
0
              NS_HTML5_CONTINUE(stateloop);
2197
0
            }
2198
0
          }
2199
0
        }
2200
0
      }
2201
0
      case PLAINTEXT: {
2202
0
        for (;;) {
2203
0
          if (reconsume) {
2204
0
            reconsume = false;
2205
0
          } else {
2206
0
            if (++pos == endPos) {
2207
0
              NS_HTML5_BREAK(stateloop);
2208
0
            }
2209
0
            c = checkChar(buf, pos);
2210
0
          }
2211
0
          switch (c) {
2212
0
            case '\0': {
2213
0
              emitPlaintextReplacementCharacter(buf, pos);
2214
0
              continue;
2215
0
            }
2216
0
            case '\r': {
2217
0
              emitCarriageReturn(buf, pos);
2218
0
              NS_HTML5_BREAK(stateloop);
2219
0
            }
2220
0
            case '\n': {
2221
0
              silentLineFeed();
2222
0
              MOZ_FALLTHROUGH;
2223
0
            }
2224
0
            default: {
2225
0
              continue;
2226
0
            }
2227
0
          }
2228
0
        }
2229
0
      }
2230
0
      case CLOSE_TAG_OPEN: {
2231
0
        if (++pos == endPos) {
2232
0
          NS_HTML5_BREAK(stateloop);
2233
0
        }
2234
0
        c = checkChar(buf, pos);
2235
0
        switch (c) {
2236
0
          case '>': {
2237
0
            if (P::reportErrors) {
2238
0
              errLtSlashGt();
2239
0
            }
2240
0
            cstart = pos + 1;
2241
0
            state = P::transition(
2242
0
              mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
2243
0
            NS_HTML5_CONTINUE(stateloop);
2244
0
          }
2245
0
          case '\r': {
2246
0
            silentCarriageReturn();
2247
0
            if (P::reportErrors) {
2248
0
              errGarbageAfterLtSlash();
2249
0
            }
2250
0
            clearStrBufBeforeUse();
2251
0
            appendStrBuf('\n');
2252
0
            state = P::transition(
2253
0
              mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
2254
0
            NS_HTML5_BREAK(stateloop);
2255
0
          }
2256
0
          case '\n': {
2257
0
            silentLineFeed();
2258
0
            if (P::reportErrors) {
2259
0
              errGarbageAfterLtSlash();
2260
0
            }
2261
0
            clearStrBufBeforeUse();
2262
0
            appendStrBuf(c);
2263
0
            state = P::transition(
2264
0
              mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
2265
0
            NS_HTML5_CONTINUE(stateloop);
2266
0
          }
2267
0
          case '\0': {
2268
0
            c = 0xfffd;
2269
0
            MOZ_FALLTHROUGH;
2270
0
          }
2271
0
          default: {
2272
0
            if (c >= 'A' && c <= 'Z') {
2273
0
              c += 0x20;
2274
0
            }
2275
0
            if (c >= 'a' && c <= 'z') {
2276
0
              endTag = true;
2277
0
              clearStrBufBeforeUse();
2278
0
              appendStrBuf(c);
2279
0
              containsHyphen = false;
2280
0
              state = P::transition(
2281
0
                mViewSource, nsHtml5Tokenizer::TAG_NAME, reconsume, pos);
2282
0
              NS_HTML5_CONTINUE(stateloop);
2283
0
            } else {
2284
0
              if (P::reportErrors) {
2285
0
                errGarbageAfterLtSlash();
2286
0
              }
2287
0
              clearStrBufBeforeUse();
2288
0
              appendStrBuf(c);
2289
0
              state = P::transition(
2290
0
                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
2291
0
              NS_HTML5_CONTINUE(stateloop);
2292
0
            }
2293
0
          }
2294
0
        }
2295
0
      }
2296
0
      case RCDATA: {
2297
0
        for (;;) {
2298
0
          if (reconsume) {
2299
0
            reconsume = false;
2300
0
          } else {
2301
0
            if (++pos == endPos) {
2302
0
              NS_HTML5_BREAK(stateloop);
2303
0
            }
2304
0
            c = checkChar(buf, pos);
2305
0
          }
2306
0
          switch (c) {
2307
0
            case '&': {
2308
0
              flushChars(buf, pos);
2309
0
              MOZ_ASSERT(!charRefBufLen,
2310
0
                         "charRefBufLen not reset after previous use!");
2311
0
              appendCharRefBuf(c);
2312
0
              setAdditionalAndRememberAmpersandLocation('\0');
2313
0
              returnState = state;
2314
0
              state =
2315
0
                P::transition(mViewSource,
2316
0
                              nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
2317
0
                              reconsume,
2318
0
                              pos);
2319
0
              NS_HTML5_CONTINUE(stateloop);
2320
0
            }
2321
0
            case '<': {
2322
0
              flushChars(buf, pos);
2323
0
              returnState = state;
2324
0
              state =
2325
0
                P::transition(mViewSource,
2326
0
                              nsHtml5Tokenizer::RAWTEXT_RCDATA_LESS_THAN_SIGN,
2327
0
                              reconsume,
2328
0
                              pos);
2329
0
              NS_HTML5_CONTINUE(stateloop);
2330
0
            }
2331
0
            case '\0': {
2332
0
              emitReplacementCharacter(buf, pos);
2333
0
              continue;
2334
0
            }
2335
0
            case '\r': {
2336
0
              emitCarriageReturn(buf, pos);
2337
0
              NS_HTML5_BREAK(stateloop);
2338
0
            }
2339
0
            case '\n': {
2340
0
              silentLineFeed();
2341
0
              MOZ_FALLTHROUGH;
2342
0
            }
2343
0
            default: {
2344
0
              continue;
2345
0
            }
2346
0
          }
2347
0
        }
2348
0
      }
2349
0
      case RAWTEXT: {
2350
0
        for (;;) {
2351
0
          if (reconsume) {
2352
0
            reconsume = false;
2353
0
          } else {
2354
0
            if (++pos == endPos) {
2355
0
              NS_HTML5_BREAK(stateloop);
2356
0
            }
2357
0
            c = checkChar(buf, pos);
2358
0
          }
2359
0
          switch (c) {
2360
0
            case '<': {
2361
0
              flushChars(buf, pos);
2362
0
              returnState = state;
2363
0
              state =
2364
0
                P::transition(mViewSource,
2365
0
                              nsHtml5Tokenizer::RAWTEXT_RCDATA_LESS_THAN_SIGN,
2366
0
                              reconsume,
2367
0
                              pos);
2368
0
              NS_HTML5_BREAK(rawtextloop);
2369
0
            }
2370
0
            case '\0': {
2371
0
              emitReplacementCharacter(buf, pos);
2372
0
              continue;
2373
0
            }
2374
0
            case '\r': {
2375
0
              emitCarriageReturn(buf, pos);
2376
0
              NS_HTML5_BREAK(stateloop);
2377
0
            }
2378
0
            case '\n': {
2379
0
              silentLineFeed();
2380
0
              MOZ_FALLTHROUGH;
2381
0
            }
2382
0
            default: {
2383
0
              continue;
2384
0
            }
2385
0
          }
2386
0
        }
2387
0
      rawtextloop_end:;
2388
0
        MOZ_FALLTHROUGH;
2389
0
      }
2390
0
      case RAWTEXT_RCDATA_LESS_THAN_SIGN: {
2391
0
        for (;;) {
2392
0
          if (++pos == endPos) {
2393
0
            NS_HTML5_BREAK(stateloop);
2394
0
          }
2395
0
          c = checkChar(buf, pos);
2396
0
          switch (c) {
2397
0
            case '/': {
2398
0
              index = 0;
2399
0
              clearStrBufBeforeUse();
2400
0
              state = P::transition(mViewSource,
2401
0
                                    nsHtml5Tokenizer::NON_DATA_END_TAG_NAME,
2402
0
                                    reconsume,
2403
0
                                    pos);
2404
0
              NS_HTML5_BREAK(rawtextrcdatalessthansignloop);
2405
0
            }
2406
0
            default: {
2407
0
              tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
2408
0
              cstart = pos;
2409
0
              reconsume = true;
2410
0
              state = P::transition(mViewSource, returnState, reconsume, pos);
2411
0
              NS_HTML5_CONTINUE(stateloop);
2412
0
            }
2413
0
          }
2414
0
        }
2415
0
      rawtextrcdatalessthansignloop_end:;
2416
0
        MOZ_FALLTHROUGH;
2417
0
      }
2418
0
      case NON_DATA_END_TAG_NAME: {
2419
0
        for (;;) {
2420
0
          if (++pos == endPos) {
2421
0
            NS_HTML5_BREAK(stateloop);
2422
0
          }
2423
0
          c = checkChar(buf, pos);
2424
0
          if (index < endTagExpectationAsArray.length) {
2425
0
            char16_t e = endTagExpectationAsArray[index];
2426
0
            char16_t folded = c;
2427
0
            if (c >= 'A' && c <= 'Z') {
2428
0
              folded += 0x20;
2429
0
            }
2430
0
            if (folded != e) {
2431
0
              tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
2432
0
              emitStrBuf();
2433
0
              cstart = pos;
2434
0
              reconsume = true;
2435
0
              state = P::transition(mViewSource, returnState, reconsume, pos);
2436
0
              NS_HTML5_CONTINUE(stateloop);
2437
0
            }
2438
0
            appendStrBuf(c);
2439
0
            index++;
2440
0
            continue;
2441
0
          } else {
2442
0
            endTag = true;
2443
0
            tagName = endTagExpectation;
2444
0
            switch (c) {
2445
0
              case '\r': {
2446
0
                silentCarriageReturn();
2447
0
                clearStrBufAfterUse();
2448
0
                state = P::transition(mViewSource,
2449
0
                                      nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
2450
0
                                      reconsume,
2451
0
                                      pos);
2452
0
                NS_HTML5_BREAK(stateloop);
2453
0
              }
2454
0
              case '\n': {
2455
0
                silentLineFeed();
2456
0
                MOZ_FALLTHROUGH;
2457
0
              }
2458
0
              case ' ':
2459
0
              case '\t':
2460
0
              case '\f': {
2461
0
                clearStrBufAfterUse();
2462
0
                state = P::transition(mViewSource,
2463
0
                                      nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
2464
0
                                      reconsume,
2465
0
                                      pos);
2466
0
                NS_HTML5_CONTINUE(stateloop);
2467
0
              }
2468
0
              case '/': {
2469
0
                clearStrBufAfterUse();
2470
0
                state = P::transition(mViewSource,
2471
0
                                      nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
2472
0
                                      reconsume,
2473
0
                                      pos);
2474
0
                NS_HTML5_CONTINUE(stateloop);
2475
0
              }
2476
0
              case '>': {
2477
0
                clearStrBufAfterUse();
2478
0
                state = P::transition(
2479
0
                  mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
2480
0
                if (shouldSuspend) {
2481
0
                  NS_HTML5_BREAK(stateloop);
2482
0
                }
2483
0
                NS_HTML5_CONTINUE(stateloop);
2484
0
              }
2485
0
              default: {
2486
0
                tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
2487
0
                emitStrBuf();
2488
0
                if (c == '\0') {
2489
0
                  emitReplacementCharacter(buf, pos);
2490
0
                } else {
2491
0
                  cstart = pos;
2492
0
                }
2493
0
                state = P::transition(mViewSource, returnState, reconsume, pos);
2494
0
                NS_HTML5_CONTINUE(stateloop);
2495
0
              }
2496
0
            }
2497
0
          }
2498
0
        }
2499
0
      }
2500
0
      case BOGUS_COMMENT: {
2501
0
        for (;;) {
2502
0
          if (reconsume) {
2503
0
            reconsume = false;
2504
0
          } else {
2505
0
            if (++pos == endPos) {
2506
0
              NS_HTML5_BREAK(stateloop);
2507
0
            }
2508
0
            c = checkChar(buf, pos);
2509
0
          }
2510
0
          switch (c) {
2511
0
            case '>': {
2512
0
              emitComment(0, pos);
2513
0
              state = P::transition(
2514
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
2515
0
              NS_HTML5_CONTINUE(stateloop);
2516
0
            }
2517
0
            case '-': {
2518
0
              appendStrBuf(c);
2519
0
              state = P::transition(mViewSource,
2520
0
                                    nsHtml5Tokenizer::BOGUS_COMMENT_HYPHEN,
2521
0
                                    reconsume,
2522
0
                                    pos);
2523
0
              NS_HTML5_BREAK(boguscommentloop);
2524
0
            }
2525
0
            case '\r': {
2526
0
              appendStrBufCarriageReturn();
2527
0
              NS_HTML5_BREAK(stateloop);
2528
0
            }
2529
0
            case '\n': {
2530
0
              appendStrBufLineFeed();
2531
0
              continue;
2532
0
            }
2533
0
            case '\0': {
2534
0
              c = 0xfffd;
2535
0
              MOZ_FALLTHROUGH;
2536
0
            }
2537
0
            default: {
2538
0
              appendStrBuf(c);
2539
0
              continue;
2540
0
            }
2541
0
          }
2542
0
        }
2543
0
      boguscommentloop_end:;
2544
0
        MOZ_FALLTHROUGH;
2545
0
      }
2546
0
      case BOGUS_COMMENT_HYPHEN: {
2547
0
      boguscommenthyphenloop:
2548
0
        for (;;) {
2549
0
          if (++pos == endPos) {
2550
0
            NS_HTML5_BREAK(stateloop);
2551
0
          }
2552
0
          c = checkChar(buf, pos);
2553
0
          switch (c) {
2554
0
            case '>': {
2555
0
              emitComment(0, pos);
2556
0
              state = P::transition(
2557
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
2558
0
              NS_HTML5_CONTINUE(stateloop);
2559
0
            }
2560
0
            case '-': {
2561
0
              appendSecondHyphenToBogusComment();
2562
0
              NS_HTML5_CONTINUE(boguscommenthyphenloop);
2563
0
            }
2564
0
            case '\r': {
2565
0
              appendStrBufCarriageReturn();
2566
0
              state = P::transition(
2567
0
                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
2568
0
              NS_HTML5_BREAK(stateloop);
2569
0
            }
2570
0
            case '\n': {
2571
0
              appendStrBufLineFeed();
2572
0
              state = P::transition(
2573
0
                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
2574
0
              NS_HTML5_CONTINUE(stateloop);
2575
0
            }
2576
0
            case '\0': {
2577
0
              c = 0xfffd;
2578
0
              MOZ_FALLTHROUGH;
2579
0
            }
2580
0
            default: {
2581
0
              appendStrBuf(c);
2582
0
              state = P::transition(
2583
0
                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
2584
0
              NS_HTML5_CONTINUE(stateloop);
2585
0
            }
2586
0
          }
2587
0
        }
2588
0
      }
2589
0
      case SCRIPT_DATA: {
2590
0
        for (;;) {
2591
0
          if (reconsume) {
2592
0
            reconsume = false;
2593
0
          } else {
2594
0
            if (++pos == endPos) {
2595
0
              NS_HTML5_BREAK(stateloop);
2596
0
            }
2597
0
            c = checkChar(buf, pos);
2598
0
          }
2599
0
          switch (c) {
2600
0
            case '<': {
2601
0
              flushChars(buf, pos);
2602
0
              returnState = state;
2603
0
              state =
2604
0
                P::transition(mViewSource,
2605
0
                              nsHtml5Tokenizer::SCRIPT_DATA_LESS_THAN_SIGN,
2606
0
                              reconsume,
2607
0
                              pos);
2608
0
              NS_HTML5_BREAK(scriptdataloop);
2609
0
            }
2610
0
            case '\0': {
2611
0
              emitReplacementCharacter(buf, pos);
2612
0
              continue;
2613
0
            }
2614
0
            case '\r': {
2615
0
              emitCarriageReturn(buf, pos);
2616
0
              NS_HTML5_BREAK(stateloop);
2617
0
            }
2618
0
            case '\n': {
2619
0
              silentLineFeed();
2620
0
              MOZ_FALLTHROUGH;
2621
0
            }
2622
0
            default: {
2623
0
              continue;
2624
0
            }
2625
0
          }
2626
0
        }
2627
0
      scriptdataloop_end:;
2628
0
        MOZ_FALLTHROUGH;
2629
0
      }
2630
0
      case SCRIPT_DATA_LESS_THAN_SIGN: {
2631
0
        for (;;) {
2632
0
          if (++pos == endPos) {
2633
0
            NS_HTML5_BREAK(stateloop);
2634
0
          }
2635
0
          c = checkChar(buf, pos);
2636
0
          switch (c) {
2637
0
            case '/': {
2638
0
              index = 0;
2639
0
              clearStrBufBeforeUse();
2640
0
              state = P::transition(mViewSource,
2641
0
                                    nsHtml5Tokenizer::NON_DATA_END_TAG_NAME,
2642
0
                                    reconsume,
2643
0
                                    pos);
2644
0
              NS_HTML5_CONTINUE(stateloop);
2645
0
            }
2646
0
            case '!': {
2647
0
              tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
2648
0
              cstart = pos;
2649
0
              state = P::transition(mViewSource,
2650
0
                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPE_START,
2651
0
                                    reconsume,
2652
0
                                    pos);
2653
0
              NS_HTML5_BREAK(scriptdatalessthansignloop);
2654
0
            }
2655
0
            default: {
2656
0
              tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
2657
0
              cstart = pos;
2658
0
              reconsume = true;
2659
0
              state = P::transition(
2660
0
                mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
2661
0
              NS_HTML5_CONTINUE(stateloop);
2662
0
            }
2663
0
          }
2664
0
        }
2665
0
      scriptdatalessthansignloop_end:;
2666
0
        MOZ_FALLTHROUGH;
2667
0
      }
2668
0
      case SCRIPT_DATA_ESCAPE_START: {
2669
0
        for (;;) {
2670
0
          if (++pos == endPos) {
2671
0
            NS_HTML5_BREAK(stateloop);
2672
0
          }
2673
0
          c = checkChar(buf, pos);
2674
0
          switch (c) {
2675
0
            case '-': {
2676
0
              state =
2677
0
                P::transition(mViewSource,
2678
0
                              nsHtml5Tokenizer::SCRIPT_DATA_ESCAPE_START_DASH,
2679
0
                              reconsume,
2680
0
                              pos);
2681
0
              NS_HTML5_BREAK(scriptdataescapestartloop);
2682
0
            }
2683
0
            default: {
2684
0
              reconsume = true;
2685
0
              state = P::transition(
2686
0
                mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
2687
0
              NS_HTML5_CONTINUE(stateloop);
2688
0
            }
2689
0
          }
2690
0
        }
2691
0
      scriptdataescapestartloop_end:;
2692
0
        MOZ_FALLTHROUGH;
2693
0
      }
2694
0
      case SCRIPT_DATA_ESCAPE_START_DASH: {
2695
0
        for (;;) {
2696
0
          if (++pos == endPos) {
2697
0
            NS_HTML5_BREAK(stateloop);
2698
0
          }
2699
0
          c = checkChar(buf, pos);
2700
0
          switch (c) {
2701
0
            case '-': {
2702
0
              state =
2703
0
                P::transition(mViewSource,
2704
0
                              nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH_DASH,
2705
0
                              reconsume,
2706
0
                              pos);
2707
0
              NS_HTML5_BREAK(scriptdataescapestartdashloop);
2708
0
            }
2709
0
            default: {
2710
0
              reconsume = true;
2711
0
              state = P::transition(
2712
0
                mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
2713
0
              NS_HTML5_CONTINUE(stateloop);
2714
0
            }
2715
0
          }
2716
0
        }
2717
0
      scriptdataescapestartdashloop_end:;
2718
0
        MOZ_FALLTHROUGH;
2719
0
      }
2720
0
      case SCRIPT_DATA_ESCAPED_DASH_DASH: {
2721
0
        for (;;) {
2722
0
          if (++pos == endPos) {
2723
0
            NS_HTML5_BREAK(stateloop);
2724
0
          }
2725
0
          c = checkChar(buf, pos);
2726
0
          switch (c) {
2727
0
            case '-': {
2728
0
              continue;
2729
0
            }
2730
0
            case '<': {
2731
0
              flushChars(buf, pos);
2732
0
              state = P::transition(
2733
0
                mViewSource,
2734
0
                nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN,
2735
0
                reconsume,
2736
0
                pos);
2737
0
              NS_HTML5_CONTINUE(stateloop);
2738
0
            }
2739
0
            case '>': {
2740
0
              state = P::transition(
2741
0
                mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
2742
0
              NS_HTML5_CONTINUE(stateloop);
2743
0
            }
2744
0
            case '\0': {
2745
0
              emitReplacementCharacter(buf, pos);
2746
0
              state = P::transition(mViewSource,
2747
0
                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
2748
0
                                    reconsume,
2749
0
                                    pos);
2750
0
              NS_HTML5_BREAK(scriptdataescapeddashdashloop);
2751
0
            }
2752
0
            case '\r': {
2753
0
              emitCarriageReturn(buf, pos);
2754
0
              state = P::transition(mViewSource,
2755
0
                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
2756
0
                                    reconsume,
2757
0
                                    pos);
2758
0
              NS_HTML5_BREAK(stateloop);
2759
0
            }
2760
0
            case '\n': {
2761
0
              silentLineFeed();
2762
0
              MOZ_FALLTHROUGH;
2763
0
            }
2764
0
            default: {
2765
0
              state = P::transition(mViewSource,
2766
0
                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
2767
0
                                    reconsume,
2768
0
                                    pos);
2769
0
              NS_HTML5_BREAK(scriptdataescapeddashdashloop);
2770
0
            }
2771
0
          }
2772
0
        }
2773
0
      scriptdataescapeddashdashloop_end:;
2774
0
        MOZ_FALLTHROUGH;
2775
0
      }
2776
0
      case SCRIPT_DATA_ESCAPED: {
2777
0
        for (;;) {
2778
0
          if (reconsume) {
2779
0
            reconsume = false;
2780
0
          } else {
2781
0
            if (++pos == endPos) {
2782
0
              NS_HTML5_BREAK(stateloop);
2783
0
            }
2784
0
            c = checkChar(buf, pos);
2785
0
          }
2786
0
          switch (c) {
2787
0
            case '-': {
2788
0
              state = P::transition(mViewSource,
2789
0
                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH,
2790
0
                                    reconsume,
2791
0
                                    pos);
2792
0
              NS_HTML5_BREAK(scriptdataescapedloop);
2793
0
            }
2794
0
            case '<': {
2795
0
              flushChars(buf, pos);
2796
0
              state = P::transition(
2797
0
                mViewSource,
2798
0
                nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN,
2799
0
                reconsume,
2800
0
                pos);
2801
0
              NS_HTML5_CONTINUE(stateloop);
2802
0
            }
2803
0
            case '\0': {
2804
0
              emitReplacementCharacter(buf, pos);
2805
0
              continue;
2806
0
            }
2807
0
            case '\r': {
2808
0
              emitCarriageReturn(buf, pos);
2809
0
              NS_HTML5_BREAK(stateloop);
2810
0
            }
2811
0
            case '\n': {
2812
0
              silentLineFeed();
2813
0
              MOZ_FALLTHROUGH;
2814
0
            }
2815
0
            default: {
2816
0
              continue;
2817
0
            }
2818
0
          }
2819
0
        }
2820
0
      scriptdataescapedloop_end:;
2821
0
        MOZ_FALLTHROUGH;
2822
0
      }
2823
0
      case SCRIPT_DATA_ESCAPED_DASH: {
2824
0
        for (;;) {
2825
0
          if (++pos == endPos) {
2826
0
            NS_HTML5_BREAK(stateloop);
2827
0
          }
2828
0
          c = checkChar(buf, pos);
2829
0
          switch (c) {
2830
0
            case '-': {
2831
0
              state =
2832
0
                P::transition(mViewSource,
2833
0
                              nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH_DASH,
2834
0
                              reconsume,
2835
0
                              pos);
2836
0
              NS_HTML5_CONTINUE(stateloop);
2837
0
            }
2838
0
            case '<': {
2839
0
              flushChars(buf, pos);
2840
0
              state = P::transition(
2841
0
                mViewSource,
2842
0
                nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN,
2843
0
                reconsume,
2844
0
                pos);
2845
0
              NS_HTML5_BREAK(scriptdataescapeddashloop);
2846
0
            }
2847
0
            case '\0': {
2848
0
              emitReplacementCharacter(buf, pos);
2849
0
              state = P::transition(mViewSource,
2850
0
                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
2851
0
                                    reconsume,
2852
0
                                    pos);
2853
0
              NS_HTML5_CONTINUE(stateloop);
2854
0
            }
2855
0
            case '\r': {
2856
0
              emitCarriageReturn(buf, pos);
2857
0
              state = P::transition(mViewSource,
2858
0
                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
2859
0
                                    reconsume,
2860
0
                                    pos);
2861
0
              NS_HTML5_BREAK(stateloop);
2862
0
            }
2863
0
            case '\n': {
2864
0
              silentLineFeed();
2865
0
              MOZ_FALLTHROUGH;
2866
0
            }
2867
0
            default: {
2868
0
              state = P::transition(mViewSource,
2869
0
                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
2870
0
                                    reconsume,
2871
0
                                    pos);
2872
0
              NS_HTML5_CONTINUE(stateloop);
2873
0
            }
2874
0
          }
2875
0
        }
2876
0
      scriptdataescapeddashloop_end:;
2877
0
        MOZ_FALLTHROUGH;
2878
0
      }
2879
0
      case SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN: {
2880
0
        for (;;) {
2881
0
          if (++pos == endPos) {
2882
0
            NS_HTML5_BREAK(stateloop);
2883
0
          }
2884
0
          c = checkChar(buf, pos);
2885
0
          switch (c) {
2886
0
            case '/': {
2887
0
              index = 0;
2888
0
              clearStrBufBeforeUse();
2889
0
              returnState = nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED;
2890
0
              state = P::transition(mViewSource,
2891
0
                                    nsHtml5Tokenizer::NON_DATA_END_TAG_NAME,
2892
0
                                    reconsume,
2893
0
                                    pos);
2894
0
              NS_HTML5_CONTINUE(stateloop);
2895
0
            }
2896
0
            case 'S':
2897
0
            case 's': {
2898
0
              tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
2899
0
              cstart = pos;
2900
0
              index = 1;
2901
0
              state =
2902
0
                P::transition(mViewSource,
2903
0
                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPE_START,
2904
0
                              reconsume,
2905
0
                              pos);
2906
0
              NS_HTML5_BREAK(scriptdataescapedlessthanloop);
2907
0
            }
2908
0
            default: {
2909
0
              tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
2910
0
              cstart = pos;
2911
0
              reconsume = true;
2912
0
              state = P::transition(mViewSource,
2913
0
                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
2914
0
                                    reconsume,
2915
0
                                    pos);
2916
0
              NS_HTML5_CONTINUE(stateloop);
2917
0
            }
2918
0
          }
2919
0
        }
2920
0
      scriptdataescapedlessthanloop_end:;
2921
0
        MOZ_FALLTHROUGH;
2922
0
      }
2923
0
      case SCRIPT_DATA_DOUBLE_ESCAPE_START: {
2924
0
        for (;;) {
2925
0
          if (++pos == endPos) {
2926
0
            NS_HTML5_BREAK(stateloop);
2927
0
          }
2928
0
          c = checkChar(buf, pos);
2929
0
          MOZ_ASSERT(index > 0);
2930
0
          if (index < 6) {
2931
0
            char16_t folded = c;
2932
0
            if (c >= 'A' && c <= 'Z') {
2933
0
              folded += 0x20;
2934
0
            }
2935
0
            if (folded != nsHtml5Tokenizer::SCRIPT_ARR[index]) {
2936
0
              reconsume = true;
2937
0
              state = P::transition(mViewSource,
2938
0
                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
2939
0
                                    reconsume,
2940
0
                                    pos);
2941
0
              NS_HTML5_CONTINUE(stateloop);
2942
0
            }
2943
0
            index++;
2944
0
            continue;
2945
0
          }
2946
0
          switch (c) {
2947
0
            case '\r': {
2948
0
              emitCarriageReturn(buf, pos);
2949
0
              state =
2950
0
                P::transition(mViewSource,
2951
0
                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
2952
0
                              reconsume,
2953
0
                              pos);
2954
0
              NS_HTML5_BREAK(stateloop);
2955
0
            }
2956
0
            case '\n': {
2957
0
              silentLineFeed();
2958
0
              MOZ_FALLTHROUGH;
2959
0
            }
2960
0
            case ' ':
2961
0
            case '\t':
2962
0
            case '\f':
2963
0
            case '/':
2964
0
            case '>': {
2965
0
              state =
2966
0
                P::transition(mViewSource,
2967
0
                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
2968
0
                              reconsume,
2969
0
                              pos);
2970
0
              NS_HTML5_BREAK(scriptdatadoubleescapestartloop);
2971
0
            }
2972
0
            default: {
2973
0
              reconsume = true;
2974
0
              state = P::transition(mViewSource,
2975
0
                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
2976
0
                                    reconsume,
2977
0
                                    pos);
2978
0
              NS_HTML5_CONTINUE(stateloop);
2979
0
            }
2980
0
          }
2981
0
        }
2982
0
      scriptdatadoubleescapestartloop_end:;
2983
0
        MOZ_FALLTHROUGH;
2984
0
      }
2985
0
      case SCRIPT_DATA_DOUBLE_ESCAPED: {
2986
0
        for (;;) {
2987
0
          if (reconsume) {
2988
0
            reconsume = false;
2989
0
          } else {
2990
0
            if (++pos == endPos) {
2991
0
              NS_HTML5_BREAK(stateloop);
2992
0
            }
2993
0
            c = checkChar(buf, pos);
2994
0
          }
2995
0
          switch (c) {
2996
0
            case '-': {
2997
0
              state =
2998
0
                P::transition(mViewSource,
2999
0
                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_DASH,
3000
0
                              reconsume,
3001
0
                              pos);
3002
0
              NS_HTML5_BREAK(scriptdatadoubleescapedloop);
3003
0
            }
3004
0
            case '<': {
3005
0
              state = P::transition(
3006
0
                mViewSource,
3007
0
                nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,
3008
0
                reconsume,
3009
0
                pos);
3010
0
              NS_HTML5_CONTINUE(stateloop);
3011
0
            }
3012
0
            case '\0': {
3013
0
              emitReplacementCharacter(buf, pos);
3014
0
              continue;
3015
0
            }
3016
0
            case '\r': {
3017
0
              emitCarriageReturn(buf, pos);
3018
0
              NS_HTML5_BREAK(stateloop);
3019
0
            }
3020
0
            case '\n': {
3021
0
              silentLineFeed();
3022
0
              MOZ_FALLTHROUGH;
3023
0
            }
3024
0
            default: {
3025
0
              continue;
3026
0
            }
3027
0
          }
3028
0
        }
3029
0
      scriptdatadoubleescapedloop_end:;
3030
0
        MOZ_FALLTHROUGH;
3031
0
      }
3032
0
      case SCRIPT_DATA_DOUBLE_ESCAPED_DASH: {
3033
0
        for (;;) {
3034
0
          if (++pos == endPos) {
3035
0
            NS_HTML5_BREAK(stateloop);
3036
0
          }
3037
0
          c = checkChar(buf, pos);
3038
0
          switch (c) {
3039
0
            case '-': {
3040
0
              state = P::transition(
3041
0
                mViewSource,
3042
0
                nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH,
3043
0
                reconsume,
3044
0
                pos);
3045
0
              NS_HTML5_BREAK(scriptdatadoubleescapeddashloop);
3046
0
            }
3047
0
            case '<': {
3048
0
              state = P::transition(
3049
0
                mViewSource,
3050
0
                nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,
3051
0
                reconsume,
3052
0
                pos);
3053
0
              NS_HTML5_CONTINUE(stateloop);
3054
0
            }
3055
0
            case '\0': {
3056
0
              emitReplacementCharacter(buf, pos);
3057
0
              state =
3058
0
                P::transition(mViewSource,
3059
0
                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
3060
0
                              reconsume,
3061
0
                              pos);
3062
0
              NS_HTML5_CONTINUE(stateloop);
3063
0
            }
3064
0
            case '\r': {
3065
0
              emitCarriageReturn(buf, pos);
3066
0
              state =
3067
0
                P::transition(mViewSource,
3068
0
                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
3069
0
                              reconsume,
3070
0
                              pos);
3071
0
              NS_HTML5_BREAK(stateloop);
3072
0
            }
3073
0
            case '\n': {
3074
0
              silentLineFeed();
3075
0
              MOZ_FALLTHROUGH;
3076
0
            }
3077
0
            default: {
3078
0
              state =
3079
0
                P::transition(mViewSource,
3080
0
                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
3081
0
                              reconsume,
3082
0
                              pos);
3083
0
              NS_HTML5_CONTINUE(stateloop);
3084
0
            }
3085
0
          }
3086
0
        }
3087
0
      scriptdatadoubleescapeddashloop_end:;
3088
0
        MOZ_FALLTHROUGH;
3089
0
      }
3090
0
      case SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH: {
3091
0
        for (;;) {
3092
0
          if (++pos == endPos) {
3093
0
            NS_HTML5_BREAK(stateloop);
3094
0
          }
3095
0
          c = checkChar(buf, pos);
3096
0
          switch (c) {
3097
0
            case '-': {
3098
0
              continue;
3099
0
            }
3100
0
            case '<': {
3101
0
              state = P::transition(
3102
0
                mViewSource,
3103
0
                nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,
3104
0
                reconsume,
3105
0
                pos);
3106
0
              NS_HTML5_BREAK(scriptdatadoubleescapeddashdashloop);
3107
0
            }
3108
0
            case '>': {
3109
0
              state = P::transition(
3110
0
                mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
3111
0
              NS_HTML5_CONTINUE(stateloop);
3112
0
            }
3113
0
            case '\0': {
3114
0
              emitReplacementCharacter(buf, pos);
3115
0
              state =
3116
0
                P::transition(mViewSource,
3117
0
                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
3118
0
                              reconsume,
3119
0
                              pos);
3120
0
              NS_HTML5_CONTINUE(stateloop);
3121
0
            }
3122
0
            case '\r': {
3123
0
              emitCarriageReturn(buf, pos);
3124
0
              state =
3125
0
                P::transition(mViewSource,
3126
0
                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
3127
0
                              reconsume,
3128
0
                              pos);
3129
0
              NS_HTML5_BREAK(stateloop);
3130
0
            }
3131
0
            case '\n': {
3132
0
              silentLineFeed();
3133
0
              MOZ_FALLTHROUGH;
3134
0
            }
3135
0
            default: {
3136
0
              state =
3137
0
                P::transition(mViewSource,
3138
0
                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
3139
0
                              reconsume,
3140
0
                              pos);
3141
0
              NS_HTML5_CONTINUE(stateloop);
3142
0
            }
3143
0
          }
3144
0
        }
3145
0
      scriptdatadoubleescapeddashdashloop_end:;
3146
0
        MOZ_FALLTHROUGH;
3147
0
      }
3148
0
      case SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN: {
3149
0
        for (;;) {
3150
0
          if (++pos == endPos) {
3151
0
            NS_HTML5_BREAK(stateloop);
3152
0
          }
3153
0
          c = checkChar(buf, pos);
3154
0
          switch (c) {
3155
0
            case '/': {
3156
0
              index = 0;
3157
0
              state =
3158
0
                P::transition(mViewSource,
3159
0
                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPE_END,
3160
0
                              reconsume,
3161
0
                              pos);
3162
0
              NS_HTML5_BREAK(scriptdatadoubleescapedlessthanloop);
3163
0
            }
3164
0
            default: {
3165
0
              reconsume = true;
3166
0
              state =
3167
0
                P::transition(mViewSource,
3168
0
                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
3169
0
                              reconsume,
3170
0
                              pos);
3171
0
              NS_HTML5_CONTINUE(stateloop);
3172
0
            }
3173
0
          }
3174
0
        }
3175
0
      scriptdatadoubleescapedlessthanloop_end:;
3176
0
        MOZ_FALLTHROUGH;
3177
0
      }
3178
0
      case SCRIPT_DATA_DOUBLE_ESCAPE_END: {
3179
0
        for (;;) {
3180
0
          if (++pos == endPos) {
3181
0
            NS_HTML5_BREAK(stateloop);
3182
0
          }
3183
0
          c = checkChar(buf, pos);
3184
0
          if (index < 6) {
3185
0
            char16_t folded = c;
3186
0
            if (c >= 'A' && c <= 'Z') {
3187
0
              folded += 0x20;
3188
0
            }
3189
0
            if (folded != nsHtml5Tokenizer::SCRIPT_ARR[index]) {
3190
0
              reconsume = true;
3191
0
              state =
3192
0
                P::transition(mViewSource,
3193
0
                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
3194
0
                              reconsume,
3195
0
                              pos);
3196
0
              NS_HTML5_CONTINUE(stateloop);
3197
0
            }
3198
0
            index++;
3199
0
            continue;
3200
0
          }
3201
0
          switch (c) {
3202
0
            case '\r': {
3203
0
              emitCarriageReturn(buf, pos);
3204
0
              state = P::transition(mViewSource,
3205
0
                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
3206
0
                                    reconsume,
3207
0
                                    pos);
3208
0
              NS_HTML5_BREAK(stateloop);
3209
0
            }
3210
0
            case '\n': {
3211
0
              silentLineFeed();
3212
0
              MOZ_FALLTHROUGH;
3213
0
            }
3214
0
            case ' ':
3215
0
            case '\t':
3216
0
            case '\f':
3217
0
            case '/':
3218
0
            case '>': {
3219
0
              state = P::transition(mViewSource,
3220
0
                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
3221
0
                                    reconsume,
3222
0
                                    pos);
3223
0
              NS_HTML5_CONTINUE(stateloop);
3224
0
            }
3225
0
            default: {
3226
0
              reconsume = true;
3227
0
              state =
3228
0
                P::transition(mViewSource,
3229
0
                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
3230
0
                              reconsume,
3231
0
                              pos);
3232
0
              NS_HTML5_CONTINUE(stateloop);
3233
0
            }
3234
0
          }
3235
0
        }
3236
0
      }
3237
0
      case MARKUP_DECLARATION_OCTYPE: {
3238
0
        for (;;) {
3239
0
          if (++pos == endPos) {
3240
0
            NS_HTML5_BREAK(stateloop);
3241
0
          }
3242
0
          c = checkChar(buf, pos);
3243
0
          if (index < 6) {
3244
0
            char16_t folded = c;
3245
0
            if (c >= 'A' && c <= 'Z') {
3246
0
              folded += 0x20;
3247
0
            }
3248
0
            if (folded == nsHtml5Tokenizer::OCTYPE[index]) {
3249
0
              appendStrBuf(c);
3250
0
            } else {
3251
0
              if (P::reportErrors) {
3252
0
                errBogusComment();
3253
0
              }
3254
0
              reconsume = true;
3255
0
              state = P::transition(
3256
0
                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
3257
0
              NS_HTML5_CONTINUE(stateloop);
3258
0
            }
3259
0
            index++;
3260
0
            continue;
3261
0
          } else {
3262
0
            reconsume = true;
3263
0
            state = P::transition(
3264
0
              mViewSource, nsHtml5Tokenizer::DOCTYPE, reconsume, pos);
3265
0
            NS_HTML5_BREAK(markupdeclarationdoctypeloop);
3266
0
          }
3267
0
        }
3268
0
      markupdeclarationdoctypeloop_end:;
3269
0
        MOZ_FALLTHROUGH;
3270
0
      }
3271
0
      case DOCTYPE: {
3272
0
        for (;;) {
3273
0
          if (reconsume) {
3274
0
            reconsume = false;
3275
0
          } else {
3276
0
            if (++pos == endPos) {
3277
0
              NS_HTML5_BREAK(stateloop);
3278
0
            }
3279
0
            c = checkChar(buf, pos);
3280
0
          }
3281
0
          initDoctypeFields();
3282
0
          switch (c) {
3283
0
            case '\r': {
3284
0
              silentCarriageReturn();
3285
0
              state = P::transition(mViewSource,
3286
0
                                    nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME,
3287
0
                                    reconsume,
3288
0
                                    pos);
3289
0
              NS_HTML5_BREAK(stateloop);
3290
0
            }
3291
0
            case '\n': {
3292
0
              silentLineFeed();
3293
0
              MOZ_FALLTHROUGH;
3294
0
            }
3295
0
            case ' ':
3296
0
            case '\t':
3297
0
            case '\f': {
3298
0
              state = P::transition(mViewSource,
3299
0
                                    nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME,
3300
0
                                    reconsume,
3301
0
                                    pos);
3302
0
              NS_HTML5_BREAK(doctypeloop);
3303
0
            }
3304
0
            default: {
3305
0
              if (P::reportErrors) {
3306
0
                errMissingSpaceBeforeDoctypeName();
3307
0
              }
3308
0
              reconsume = true;
3309
0
              state = P::transition(mViewSource,
3310
0
                                    nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME,
3311
0
                                    reconsume,
3312
0
                                    pos);
3313
0
              NS_HTML5_BREAK(doctypeloop);
3314
0
            }
3315
0
          }
3316
0
        }
3317
0
      doctypeloop_end:;
3318
0
        MOZ_FALLTHROUGH;
3319
0
      }
3320
0
      case BEFORE_DOCTYPE_NAME: {
3321
0
        for (;;) {
3322
0
          if (reconsume) {
3323
0
            reconsume = false;
3324
0
          } else {
3325
0
            if (++pos == endPos) {
3326
0
              NS_HTML5_BREAK(stateloop);
3327
0
            }
3328
0
            c = checkChar(buf, pos);
3329
0
          }
3330
0
          switch (c) {
3331
0
            case '\r': {
3332
0
              silentCarriageReturn();
3333
0
              NS_HTML5_BREAK(stateloop);
3334
0
            }
3335
0
            case '\n': {
3336
0
              silentLineFeed();
3337
0
              MOZ_FALLTHROUGH;
3338
0
            }
3339
0
            case ' ':
3340
0
            case '\t':
3341
0
            case '\f': {
3342
0
              continue;
3343
0
            }
3344
0
            case '>': {
3345
0
              if (P::reportErrors) {
3346
0
                errNamelessDoctype();
3347
0
              }
3348
0
              forceQuirks = true;
3349
0
              emitDoctypeToken(pos);
3350
0
              state = P::transition(
3351
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
3352
0
              NS_HTML5_CONTINUE(stateloop);
3353
0
            }
3354
0
            case '\0': {
3355
0
              c = 0xfffd;
3356
0
              MOZ_FALLTHROUGH;
3357
0
            }
3358
0
            default: {
3359
0
              if (c >= 'A' && c <= 'Z') {
3360
0
                c += 0x20;
3361
0
              }
3362
0
              clearStrBufBeforeUse();
3363
0
              appendStrBuf(c);
3364
0
              state = P::transition(
3365
0
                mViewSource, nsHtml5Tokenizer::DOCTYPE_NAME, reconsume, pos);
3366
0
              NS_HTML5_BREAK(beforedoctypenameloop);
3367
0
            }
3368
0
          }
3369
0
        }
3370
0
      beforedoctypenameloop_end:;
3371
0
        MOZ_FALLTHROUGH;
3372
0
      }
3373
0
      case DOCTYPE_NAME: {
3374
0
        for (;;) {
3375
0
          if (++pos == endPos) {
3376
0
            NS_HTML5_BREAK(stateloop);
3377
0
          }
3378
0
          c = checkChar(buf, pos);
3379
0
          switch (c) {
3380
0
            case '\r': {
3381
0
              silentCarriageReturn();
3382
0
              strBufToDoctypeName();
3383
0
              state = P::transition(mViewSource,
3384
0
                                    nsHtml5Tokenizer::AFTER_DOCTYPE_NAME,
3385
0
                                    reconsume,
3386
0
                                    pos);
3387
0
              NS_HTML5_BREAK(stateloop);
3388
0
            }
3389
0
            case '\n': {
3390
0
              silentLineFeed();
3391
0
              MOZ_FALLTHROUGH;
3392
0
            }
3393
0
            case ' ':
3394
0
            case '\t':
3395
0
            case '\f': {
3396
0
              strBufToDoctypeName();
3397
0
              state = P::transition(mViewSource,
3398
0
                                    nsHtml5Tokenizer::AFTER_DOCTYPE_NAME,
3399
0
                                    reconsume,
3400
0
                                    pos);
3401
0
              NS_HTML5_BREAK(doctypenameloop);
3402
0
            }
3403
0
            case '>': {
3404
0
              strBufToDoctypeName();
3405
0
              emitDoctypeToken(pos);
3406
0
              state = P::transition(
3407
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
3408
0
              NS_HTML5_CONTINUE(stateloop);
3409
0
            }
3410
0
            case '\0': {
3411
0
              c = 0xfffd;
3412
0
              MOZ_FALLTHROUGH;
3413
0
            }
3414
0
            default: {
3415
0
              if (c >= 'A' && c <= 'Z') {
3416
0
                c += 0x0020;
3417
0
              }
3418
0
              appendStrBuf(c);
3419
0
              continue;
3420
0
            }
3421
0
          }
3422
0
        }
3423
0
      doctypenameloop_end:;
3424
0
        MOZ_FALLTHROUGH;
3425
0
      }
3426
0
      case AFTER_DOCTYPE_NAME: {
3427
0
        for (;;) {
3428
0
          if (++pos == endPos) {
3429
0
            NS_HTML5_BREAK(stateloop);
3430
0
          }
3431
0
          c = checkChar(buf, pos);
3432
0
          switch (c) {
3433
0
            case '\r': {
3434
0
              silentCarriageReturn();
3435
0
              NS_HTML5_BREAK(stateloop);
3436
0
            }
3437
0
            case '\n': {
3438
0
              silentLineFeed();
3439
0
              MOZ_FALLTHROUGH;
3440
0
            }
3441
0
            case ' ':
3442
0
            case '\t':
3443
0
            case '\f': {
3444
0
              continue;
3445
0
            }
3446
0
            case '>': {
3447
0
              emitDoctypeToken(pos);
3448
0
              state = P::transition(
3449
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
3450
0
              NS_HTML5_CONTINUE(stateloop);
3451
0
            }
3452
0
            case 'p':
3453
0
            case 'P': {
3454
0
              index = 0;
3455
0
              state = P::transition(
3456
0
                mViewSource, nsHtml5Tokenizer::DOCTYPE_UBLIC, reconsume, pos);
3457
0
              NS_HTML5_BREAK(afterdoctypenameloop);
3458
0
            }
3459
0
            case 's':
3460
0
            case 'S': {
3461
0
              index = 0;
3462
0
              state = P::transition(
3463
0
                mViewSource, nsHtml5Tokenizer::DOCTYPE_YSTEM, reconsume, pos);
3464
0
              NS_HTML5_CONTINUE(stateloop);
3465
0
            }
3466
0
            default: {
3467
0
              bogusDoctype();
3468
0
              state = P::transition(
3469
0
                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
3470
0
              NS_HTML5_CONTINUE(stateloop);
3471
0
            }
3472
0
          }
3473
0
        }
3474
0
      afterdoctypenameloop_end:;
3475
0
        MOZ_FALLTHROUGH;
3476
0
      }
3477
0
      case DOCTYPE_UBLIC: {
3478
0
        for (;;) {
3479
0
          if (++pos == endPos) {
3480
0
            NS_HTML5_BREAK(stateloop);
3481
0
          }
3482
0
          c = checkChar(buf, pos);
3483
0
          if (index < 5) {
3484
0
            char16_t folded = c;
3485
0
            if (c >= 'A' && c <= 'Z') {
3486
0
              folded += 0x20;
3487
0
            }
3488
0
            if (folded != nsHtml5Tokenizer::UBLIC[index]) {
3489
0
              bogusDoctype();
3490
0
              reconsume = true;
3491
0
              state = P::transition(
3492
0
                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
3493
0
              NS_HTML5_CONTINUE(stateloop);
3494
0
            }
3495
0
            index++;
3496
0
            continue;
3497
0
          } else {
3498
0
            reconsume = true;
3499
0
            state =
3500
0
              P::transition(mViewSource,
3501
0
                            nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_KEYWORD,
3502
0
                            reconsume,
3503
0
                            pos);
3504
0
            NS_HTML5_BREAK(doctypeublicloop);
3505
0
          }
3506
0
        }
3507
0
      doctypeublicloop_end:;
3508
0
        MOZ_FALLTHROUGH;
3509
0
      }
3510
0
      case AFTER_DOCTYPE_PUBLIC_KEYWORD: {
3511
0
        for (;;) {
3512
0
          if (reconsume) {
3513
0
            reconsume = false;
3514
0
          } else {
3515
0
            if (++pos == endPos) {
3516
0
              NS_HTML5_BREAK(stateloop);
3517
0
            }
3518
0
            c = checkChar(buf, pos);
3519
0
          }
3520
0
          switch (c) {
3521
0
            case '\r': {
3522
0
              silentCarriageReturn();
3523
0
              state = P::transition(
3524
0
                mViewSource,
3525
0
                nsHtml5Tokenizer::BEFORE_DOCTYPE_PUBLIC_IDENTIFIER,
3526
0
                reconsume,
3527
0
                pos);
3528
0
              NS_HTML5_BREAK(stateloop);
3529
0
            }
3530
0
            case '\n': {
3531
0
              silentLineFeed();
3532
0
              MOZ_FALLTHROUGH;
3533
0
            }
3534
0
            case ' ':
3535
0
            case '\t':
3536
0
            case '\f': {
3537
0
              state = P::transition(
3538
0
                mViewSource,
3539
0
                nsHtml5Tokenizer::BEFORE_DOCTYPE_PUBLIC_IDENTIFIER,
3540
0
                reconsume,
3541
0
                pos);
3542
0
              NS_HTML5_BREAK(afterdoctypepublickeywordloop);
3543
0
            }
3544
0
            case '\"': {
3545
0
              if (P::reportErrors) {
3546
0
                errNoSpaceBetweenDoctypePublicKeywordAndQuote();
3547
0
              }
3548
0
              clearStrBufBeforeUse();
3549
0
              state = P::transition(
3550
0
                mViewSource,
3551
0
                nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED,
3552
0
                reconsume,
3553
0
                pos);
3554
0
              NS_HTML5_CONTINUE(stateloop);
3555
0
            }
3556
0
            case '\'': {
3557
0
              if (P::reportErrors) {
3558
0
                errNoSpaceBetweenDoctypePublicKeywordAndQuote();
3559
0
              }
3560
0
              clearStrBufBeforeUse();
3561
0
              state = P::transition(
3562
0
                mViewSource,
3563
0
                nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED,
3564
0
                reconsume,
3565
0
                pos);
3566
0
              NS_HTML5_CONTINUE(stateloop);
3567
0
            }
3568
0
            case '>': {
3569
0
              if (P::reportErrors) {
3570
0
                errExpectedPublicId();
3571
0
              }
3572
0
              forceQuirks = true;
3573
0
              emitDoctypeToken(pos);
3574
0
              state = P::transition(
3575
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
3576
0
              NS_HTML5_CONTINUE(stateloop);
3577
0
            }
3578
0
            default: {
3579
0
              bogusDoctype();
3580
0
              state = P::transition(
3581
0
                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
3582
0
              NS_HTML5_CONTINUE(stateloop);
3583
0
            }
3584
0
          }
3585
0
        }
3586
0
      afterdoctypepublickeywordloop_end:;
3587
0
        MOZ_FALLTHROUGH;
3588
0
      }
3589
0
      case BEFORE_DOCTYPE_PUBLIC_IDENTIFIER: {
3590
0
        for (;;) {
3591
0
          if (++pos == endPos) {
3592
0
            NS_HTML5_BREAK(stateloop);
3593
0
          }
3594
0
          c = checkChar(buf, pos);
3595
0
          switch (c) {
3596
0
            case '\r': {
3597
0
              silentCarriageReturn();
3598
0
              NS_HTML5_BREAK(stateloop);
3599
0
            }
3600
0
            case '\n': {
3601
0
              silentLineFeed();
3602
0
              MOZ_FALLTHROUGH;
3603
0
            }
3604
0
            case ' ':
3605
0
            case '\t':
3606
0
            case '\f': {
3607
0
              continue;
3608
0
            }
3609
0
            case '\"': {
3610
0
              clearStrBufBeforeUse();
3611
0
              state = P::transition(
3612
0
                mViewSource,
3613
0
                nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED,
3614
0
                reconsume,
3615
0
                pos);
3616
0
              NS_HTML5_BREAK(beforedoctypepublicidentifierloop);
3617
0
            }
3618
0
            case '\'': {
3619
0
              clearStrBufBeforeUse();
3620
0
              state = P::transition(
3621
0
                mViewSource,
3622
0
                nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED,
3623
0
                reconsume,
3624
0
                pos);
3625
0
              NS_HTML5_CONTINUE(stateloop);
3626
0
            }
3627
0
            case '>': {
3628
0
              if (P::reportErrors) {
3629
0
                errExpectedPublicId();
3630
0
              }
3631
0
              forceQuirks = true;
3632
0
              emitDoctypeToken(pos);
3633
0
              state = P::transition(
3634
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
3635
0
              NS_HTML5_CONTINUE(stateloop);
3636
0
            }
3637
0
            default: {
3638
0
              bogusDoctype();
3639
0
              state = P::transition(
3640
0
                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
3641
0
              NS_HTML5_CONTINUE(stateloop);
3642
0
            }
3643
0
          }
3644
0
        }
3645
0
      beforedoctypepublicidentifierloop_end:;
3646
0
        MOZ_FALLTHROUGH;
3647
0
      }
3648
0
      case DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED: {
3649
0
        for (;;) {
3650
0
          if (++pos == endPos) {
3651
0
            NS_HTML5_BREAK(stateloop);
3652
0
          }
3653
0
          c = checkChar(buf, pos);
3654
0
          switch (c) {
3655
0
            case '\"': {
3656
0
              publicIdentifier = strBufToString();
3657
0
              state =
3658
0
                P::transition(mViewSource,
3659
0
                              nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_IDENTIFIER,
3660
0
                              reconsume,
3661
0
                              pos);
3662
0
              NS_HTML5_BREAK(doctypepublicidentifierdoublequotedloop);
3663
0
            }
3664
0
            case '>': {
3665
0
              if (P::reportErrors) {
3666
0
                errGtInPublicId();
3667
0
              }
3668
0
              forceQuirks = true;
3669
0
              publicIdentifier = strBufToString();
3670
0
              emitDoctypeToken(pos);
3671
0
              state = P::transition(
3672
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
3673
0
              NS_HTML5_CONTINUE(stateloop);
3674
0
            }
3675
0
            case '\r': {
3676
0
              appendStrBufCarriageReturn();
3677
0
              NS_HTML5_BREAK(stateloop);
3678
0
            }
3679
0
            case '\n': {
3680
0
              appendStrBufLineFeed();
3681
0
              continue;
3682
0
            }
3683
0
            case '\0': {
3684
0
              c = 0xfffd;
3685
0
              MOZ_FALLTHROUGH;
3686
0
            }
3687
0
            default: {
3688
0
              appendStrBuf(c);
3689
0
              continue;
3690
0
            }
3691
0
          }
3692
0
        }
3693
0
      doctypepublicidentifierdoublequotedloop_end:;
3694
0
        MOZ_FALLTHROUGH;
3695
0
      }
3696
0
      case AFTER_DOCTYPE_PUBLIC_IDENTIFIER: {
3697
0
        for (;;) {
3698
0
          if (++pos == endPos) {
3699
0
            NS_HTML5_BREAK(stateloop);
3700
0
          }
3701
0
          c = checkChar(buf, pos);
3702
0
          switch (c) {
3703
0
            case '\r': {
3704
0
              silentCarriageReturn();
3705
0
              state = P::transition(
3706
0
                mViewSource,
3707
0
                nsHtml5Tokenizer::BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS,
3708
0
                reconsume,
3709
0
                pos);
3710
0
              NS_HTML5_BREAK(stateloop);
3711
0
            }
3712
0
            case '\n': {
3713
0
              silentLineFeed();
3714
0
              MOZ_FALLTHROUGH;
3715
0
            }
3716
0
            case ' ':
3717
0
            case '\t':
3718
0
            case '\f': {
3719
0
              state = P::transition(
3720
0
                mViewSource,
3721
0
                nsHtml5Tokenizer::BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS,
3722
0
                reconsume,
3723
0
                pos);
3724
0
              NS_HTML5_BREAK(afterdoctypepublicidentifierloop);
3725
0
            }
3726
0
            case '>': {
3727
0
              emitDoctypeToken(pos);
3728
0
              state = P::transition(
3729
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
3730
0
              NS_HTML5_CONTINUE(stateloop);
3731
0
            }
3732
0
            case '\"': {
3733
0
              if (P::reportErrors) {
3734
0
                errNoSpaceBetweenPublicAndSystemIds();
3735
0
              }
3736
0
              clearStrBufBeforeUse();
3737
0
              state = P::transition(
3738
0
                mViewSource,
3739
0
                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
3740
0
                reconsume,
3741
0
                pos);
3742
0
              NS_HTML5_CONTINUE(stateloop);
3743
0
            }
3744
0
            case '\'': {
3745
0
              if (P::reportErrors) {
3746
0
                errNoSpaceBetweenPublicAndSystemIds();
3747
0
              }
3748
0
              clearStrBufBeforeUse();
3749
0
              state = P::transition(
3750
0
                mViewSource,
3751
0
                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
3752
0
                reconsume,
3753
0
                pos);
3754
0
              NS_HTML5_CONTINUE(stateloop);
3755
0
            }
3756
0
            default: {
3757
0
              bogusDoctype();
3758
0
              state = P::transition(
3759
0
                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
3760
0
              NS_HTML5_CONTINUE(stateloop);
3761
0
            }
3762
0
          }
3763
0
        }
3764
0
      afterdoctypepublicidentifierloop_end:;
3765
0
        MOZ_FALLTHROUGH;
3766
0
      }
3767
0
      case BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS: {
3768
0
        for (;;) {
3769
0
          if (++pos == endPos) {
3770
0
            NS_HTML5_BREAK(stateloop);
3771
0
          }
3772
0
          c = checkChar(buf, pos);
3773
0
          switch (c) {
3774
0
            case '\r': {
3775
0
              silentCarriageReturn();
3776
0
              NS_HTML5_BREAK(stateloop);
3777
0
            }
3778
0
            case '\n': {
3779
0
              silentLineFeed();
3780
0
              MOZ_FALLTHROUGH;
3781
0
            }
3782
0
            case ' ':
3783
0
            case '\t':
3784
0
            case '\f': {
3785
0
              continue;
3786
0
            }
3787
0
            case '>': {
3788
0
              emitDoctypeToken(pos);
3789
0
              state = P::transition(
3790
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
3791
0
              NS_HTML5_CONTINUE(stateloop);
3792
0
            }
3793
0
            case '\"': {
3794
0
              clearStrBufBeforeUse();
3795
0
              state = P::transition(
3796
0
                mViewSource,
3797
0
                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
3798
0
                reconsume,
3799
0
                pos);
3800
0
              NS_HTML5_BREAK(betweendoctypepublicandsystemidentifiersloop);
3801
0
            }
3802
0
            case '\'': {
3803
0
              clearStrBufBeforeUse();
3804
0
              state = P::transition(
3805
0
                mViewSource,
3806
0
                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
3807
0
                reconsume,
3808
0
                pos);
3809
0
              NS_HTML5_CONTINUE(stateloop);
3810
0
            }
3811
0
            default: {
3812
0
              bogusDoctype();
3813
0
              state = P::transition(
3814
0
                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
3815
0
              NS_HTML5_CONTINUE(stateloop);
3816
0
            }
3817
0
          }
3818
0
        }
3819
0
      betweendoctypepublicandsystemidentifiersloop_end:;
3820
0
        MOZ_FALLTHROUGH;
3821
0
      }
3822
0
      case DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED: {
3823
0
        for (;;) {
3824
0
          if (++pos == endPos) {
3825
0
            NS_HTML5_BREAK(stateloop);
3826
0
          }
3827
0
          c = checkChar(buf, pos);
3828
0
          switch (c) {
3829
0
            case '\"': {
3830
0
              systemIdentifier = strBufToString();
3831
0
              state =
3832
0
                P::transition(mViewSource,
3833
0
                              nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_IDENTIFIER,
3834
0
                              reconsume,
3835
0
                              pos);
3836
0
              NS_HTML5_CONTINUE(stateloop);
3837
0
            }
3838
0
            case '>': {
3839
0
              if (P::reportErrors) {
3840
0
                errGtInSystemId();
3841
0
              }
3842
0
              forceQuirks = true;
3843
0
              systemIdentifier = strBufToString();
3844
0
              emitDoctypeToken(pos);
3845
0
              state = P::transition(
3846
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
3847
0
              NS_HTML5_CONTINUE(stateloop);
3848
0
            }
3849
0
            case '\r': {
3850
0
              appendStrBufCarriageReturn();
3851
0
              NS_HTML5_BREAK(stateloop);
3852
0
            }
3853
0
            case '\n': {
3854
0
              appendStrBufLineFeed();
3855
0
              continue;
3856
0
            }
3857
0
            case '\0': {
3858
0
              c = 0xfffd;
3859
0
              MOZ_FALLTHROUGH;
3860
0
            }
3861
0
            default: {
3862
0
              appendStrBuf(c);
3863
0
              continue;
3864
0
            }
3865
0
          }
3866
0
        }
3867
0
      }
3868
0
      case AFTER_DOCTYPE_SYSTEM_IDENTIFIER: {
3869
0
        for (;;) {
3870
0
          if (++pos == endPos) {
3871
0
            NS_HTML5_BREAK(stateloop);
3872
0
          }
3873
0
          c = checkChar(buf, pos);
3874
0
          switch (c) {
3875
0
            case '\r': {
3876
0
              silentCarriageReturn();
3877
0
              NS_HTML5_BREAK(stateloop);
3878
0
            }
3879
0
            case '\n': {
3880
0
              silentLineFeed();
3881
0
              MOZ_FALLTHROUGH;
3882
0
            }
3883
0
            case ' ':
3884
0
            case '\t':
3885
0
            case '\f': {
3886
0
              continue;
3887
0
            }
3888
0
            case '>': {
3889
0
              emitDoctypeToken(pos);
3890
0
              state = P::transition(
3891
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
3892
0
              NS_HTML5_CONTINUE(stateloop);
3893
0
            }
3894
0
            default: {
3895
0
              bogusDoctypeWithoutQuirks();
3896
0
              state = P::transition(
3897
0
                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
3898
0
              NS_HTML5_BREAK(afterdoctypesystemidentifierloop);
3899
0
            }
3900
0
          }
3901
0
        }
3902
0
      afterdoctypesystemidentifierloop_end:;
3903
0
        MOZ_FALLTHROUGH;
3904
0
      }
3905
0
      case BOGUS_DOCTYPE: {
3906
0
        for (;;) {
3907
0
          if (reconsume) {
3908
0
            reconsume = false;
3909
0
          } else {
3910
0
            if (++pos == endPos) {
3911
0
              NS_HTML5_BREAK(stateloop);
3912
0
            }
3913
0
            c = checkChar(buf, pos);
3914
0
          }
3915
0
          switch (c) {
3916
0
            case '>': {
3917
0
              emitDoctypeToken(pos);
3918
0
              state = P::transition(
3919
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
3920
0
              NS_HTML5_CONTINUE(stateloop);
3921
0
            }
3922
0
            case '\r': {
3923
0
              silentCarriageReturn();
3924
0
              NS_HTML5_BREAK(stateloop);
3925
0
            }
3926
0
            case '\n': {
3927
0
              silentLineFeed();
3928
0
              MOZ_FALLTHROUGH;
3929
0
            }
3930
0
            default: {
3931
0
              continue;
3932
0
            }
3933
0
          }
3934
0
        }
3935
0
      }
3936
0
      case DOCTYPE_YSTEM: {
3937
0
        for (;;) {
3938
0
          if (++pos == endPos) {
3939
0
            NS_HTML5_BREAK(stateloop);
3940
0
          }
3941
0
          c = checkChar(buf, pos);
3942
0
          if (index < 5) {
3943
0
            char16_t folded = c;
3944
0
            if (c >= 'A' && c <= 'Z') {
3945
0
              folded += 0x20;
3946
0
            }
3947
0
            if (folded != nsHtml5Tokenizer::YSTEM[index]) {
3948
0
              bogusDoctype();
3949
0
              reconsume = true;
3950
0
              state = P::transition(
3951
0
                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
3952
0
              NS_HTML5_CONTINUE(stateloop);
3953
0
            }
3954
0
            index++;
3955
0
            NS_HTML5_CONTINUE(stateloop);
3956
0
          } else {
3957
0
            reconsume = true;
3958
0
            state =
3959
0
              P::transition(mViewSource,
3960
0
                            nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_KEYWORD,
3961
0
                            reconsume,
3962
0
                            pos);
3963
0
            NS_HTML5_BREAK(doctypeystemloop);
3964
0
          }
3965
0
        }
3966
0
      doctypeystemloop_end:;
3967
0
        MOZ_FALLTHROUGH;
3968
0
      }
3969
0
      case AFTER_DOCTYPE_SYSTEM_KEYWORD: {
3970
0
        for (;;) {
3971
0
          if (reconsume) {
3972
0
            reconsume = false;
3973
0
          } else {
3974
0
            if (++pos == endPos) {
3975
0
              NS_HTML5_BREAK(stateloop);
3976
0
            }
3977
0
            c = checkChar(buf, pos);
3978
0
          }
3979
0
          switch (c) {
3980
0
            case '\r': {
3981
0
              silentCarriageReturn();
3982
0
              state = P::transition(
3983
0
                mViewSource,
3984
0
                nsHtml5Tokenizer::BEFORE_DOCTYPE_SYSTEM_IDENTIFIER,
3985
0
                reconsume,
3986
0
                pos);
3987
0
              NS_HTML5_BREAK(stateloop);
3988
0
            }
3989
0
            case '\n': {
3990
0
              silentLineFeed();
3991
0
              MOZ_FALLTHROUGH;
3992
0
            }
3993
0
            case ' ':
3994
0
            case '\t':
3995
0
            case '\f': {
3996
0
              state = P::transition(
3997
0
                mViewSource,
3998
0
                nsHtml5Tokenizer::BEFORE_DOCTYPE_SYSTEM_IDENTIFIER,
3999
0
                reconsume,
4000
0
                pos);
4001
0
              NS_HTML5_BREAK(afterdoctypesystemkeywordloop);
4002
0
            }
4003
0
            case '\"': {
4004
0
              if (P::reportErrors) {
4005
0
                errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
4006
0
              }
4007
0
              clearStrBufBeforeUse();
4008
0
              state = P::transition(
4009
0
                mViewSource,
4010
0
                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
4011
0
                reconsume,
4012
0
                pos);
4013
0
              NS_HTML5_CONTINUE(stateloop);
4014
0
            }
4015
0
            case '\'': {
4016
0
              if (P::reportErrors) {
4017
0
                errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
4018
0
              }
4019
0
              clearStrBufBeforeUse();
4020
0
              state = P::transition(
4021
0
                mViewSource,
4022
0
                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
4023
0
                reconsume,
4024
0
                pos);
4025
0
              NS_HTML5_CONTINUE(stateloop);
4026
0
            }
4027
0
            case '>': {
4028
0
              if (P::reportErrors) {
4029
0
                errExpectedPublicId();
4030
0
              }
4031
0
              forceQuirks = true;
4032
0
              emitDoctypeToken(pos);
4033
0
              state = P::transition(
4034
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
4035
0
              NS_HTML5_CONTINUE(stateloop);
4036
0
            }
4037
0
            default: {
4038
0
              bogusDoctype();
4039
0
              state = P::transition(
4040
0
                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
4041
0
              NS_HTML5_CONTINUE(stateloop);
4042
0
            }
4043
0
          }
4044
0
        }
4045
0
      afterdoctypesystemkeywordloop_end:;
4046
0
        MOZ_FALLTHROUGH;
4047
0
      }
4048
0
      case BEFORE_DOCTYPE_SYSTEM_IDENTIFIER: {
4049
0
        for (;;) {
4050
0
          if (++pos == endPos) {
4051
0
            NS_HTML5_BREAK(stateloop);
4052
0
          }
4053
0
          c = checkChar(buf, pos);
4054
0
          switch (c) {
4055
0
            case '\r': {
4056
0
              silentCarriageReturn();
4057
0
              NS_HTML5_BREAK(stateloop);
4058
0
            }
4059
0
            case '\n': {
4060
0
              silentLineFeed();
4061
0
              MOZ_FALLTHROUGH;
4062
0
            }
4063
0
            case ' ':
4064
0
            case '\t':
4065
0
            case '\f': {
4066
0
              continue;
4067
0
            }
4068
0
            case '\"': {
4069
0
              clearStrBufBeforeUse();
4070
0
              state = P::transition(
4071
0
                mViewSource,
4072
0
                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
4073
0
                reconsume,
4074
0
                pos);
4075
0
              NS_HTML5_CONTINUE(stateloop);
4076
0
            }
4077
0
            case '\'': {
4078
0
              clearStrBufBeforeUse();
4079
0
              state = P::transition(
4080
0
                mViewSource,
4081
0
                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
4082
0
                reconsume,
4083
0
                pos);
4084
0
              NS_HTML5_BREAK(beforedoctypesystemidentifierloop);
4085
0
            }
4086
0
            case '>': {
4087
0
              if (P::reportErrors) {
4088
0
                errExpectedSystemId();
4089
0
              }
4090
0
              forceQuirks = true;
4091
0
              emitDoctypeToken(pos);
4092
0
              state = P::transition(
4093
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
4094
0
              NS_HTML5_CONTINUE(stateloop);
4095
0
            }
4096
0
            default: {
4097
0
              bogusDoctype();
4098
0
              state = P::transition(
4099
0
                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
4100
0
              NS_HTML5_CONTINUE(stateloop);
4101
0
            }
4102
0
          }
4103
0
        }
4104
0
      beforedoctypesystemidentifierloop_end:;
4105
0
        MOZ_FALLTHROUGH;
4106
0
      }
4107
0
      case DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED: {
4108
0
        for (;;) {
4109
0
          if (++pos == endPos) {
4110
0
            NS_HTML5_BREAK(stateloop);
4111
0
          }
4112
0
          c = checkChar(buf, pos);
4113
0
          switch (c) {
4114
0
            case '\'': {
4115
0
              systemIdentifier = strBufToString();
4116
0
              state =
4117
0
                P::transition(mViewSource,
4118
0
                              nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_IDENTIFIER,
4119
0
                              reconsume,
4120
0
                              pos);
4121
0
              NS_HTML5_CONTINUE(stateloop);
4122
0
            }
4123
0
            case '>': {
4124
0
              if (P::reportErrors) {
4125
0
                errGtInSystemId();
4126
0
              }
4127
0
              forceQuirks = true;
4128
0
              systemIdentifier = strBufToString();
4129
0
              emitDoctypeToken(pos);
4130
0
              state = P::transition(
4131
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
4132
0
              NS_HTML5_CONTINUE(stateloop);
4133
0
            }
4134
0
            case '\r': {
4135
0
              appendStrBufCarriageReturn();
4136
0
              NS_HTML5_BREAK(stateloop);
4137
0
            }
4138
0
            case '\n': {
4139
0
              appendStrBufLineFeed();
4140
0
              continue;
4141
0
            }
4142
0
            case '\0': {
4143
0
              c = 0xfffd;
4144
0
              MOZ_FALLTHROUGH;
4145
0
            }
4146
0
            default: {
4147
0
              appendStrBuf(c);
4148
0
              continue;
4149
0
            }
4150
0
          }
4151
0
        }
4152
0
      }
4153
0
      case DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED: {
4154
0
        for (;;) {
4155
0
          if (++pos == endPos) {
4156
0
            NS_HTML5_BREAK(stateloop);
4157
0
          }
4158
0
          c = checkChar(buf, pos);
4159
0
          switch (c) {
4160
0
            case '\'': {
4161
0
              publicIdentifier = strBufToString();
4162
0
              state =
4163
0
                P::transition(mViewSource,
4164
0
                              nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_IDENTIFIER,
4165
0
                              reconsume,
4166
0
                              pos);
4167
0
              NS_HTML5_CONTINUE(stateloop);
4168
0
            }
4169
0
            case '>': {
4170
0
              if (P::reportErrors) {
4171
0
                errGtInPublicId();
4172
0
              }
4173
0
              forceQuirks = true;
4174
0
              publicIdentifier = strBufToString();
4175
0
              emitDoctypeToken(pos);
4176
0
              state = P::transition(
4177
0
                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
4178
0
              NS_HTML5_CONTINUE(stateloop);
4179
0
            }
4180
0
            case '\r': {
4181
0
              appendStrBufCarriageReturn();
4182
0
              NS_HTML5_BREAK(stateloop);
4183
0
            }
4184
0
            case '\n': {
4185
0
              appendStrBufLineFeed();
4186
0
              continue;
4187
0
            }
4188
0
            case '\0': {
4189
0
              c = 0xfffd;
4190
0
              MOZ_FALLTHROUGH;
4191
0
            }
4192
0
            default: {
4193
0
              appendStrBuf(c);
4194
0
              continue;
4195
0
            }
4196
0
          }
4197
0
        }
4198
0
      }
4199
0
      case PROCESSING_INSTRUCTION: {
4200
0
        for (;;) {
4201
0
          if (++pos == endPos) {
4202
0
            NS_HTML5_BREAK(stateloop);
4203
0
          }
4204
0
          c = checkChar(buf, pos);
4205
0
          switch (c) {
4206
0
            case '\?': {
4207
0
              state = P::transition(
4208
0
                mViewSource,
4209
0
                nsHtml5Tokenizer::PROCESSING_INSTRUCTION_QUESTION_MARK,
4210
0
                reconsume,
4211
0
                pos);
4212
0
              NS_HTML5_BREAK(processinginstructionloop);
4213
0
            }
4214
0
            default: {
4215
0
              continue;
4216
0
            }
4217
0
          }
4218
0
        }
4219
0
      processinginstructionloop_end:;
4220
0
        MOZ_FALLTHROUGH;
4221
0
      }
4222
0
      case PROCESSING_INSTRUCTION_QUESTION_MARK: {
4223
0
        if (++pos == endPos) {
4224
0
          NS_HTML5_BREAK(stateloop);
4225
0
        }
4226
0
        c = checkChar(buf, pos);
4227
0
        switch (c) {
4228
0
          case '>': {
4229
0
            state = P::transition(
4230
0
              mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
4231
0
            NS_HTML5_CONTINUE(stateloop);
4232
0
          }
4233
0
          default: {
4234
0
            state = P::transition(mViewSource,
4235
0
                                  nsHtml5Tokenizer::PROCESSING_INSTRUCTION,
4236
0
                                  reconsume,
4237
0
                                  pos);
4238
0
            NS_HTML5_CONTINUE(stateloop);
4239
0
          }
4240
0
        }
4241
0
      }
4242
0
    }
4243
0
  }
4244
0
stateloop_end:;
4245
0
  flushChars(buf, pos);
4246
0
  stateSave = state;
4247
0
  returnStateSave = returnState;
4248
0
  return pos;
4249
0
}
Unexecuted instantiation: int nsHtml5Tokenizer::stateLoop<nsHtml5ViewSourcePolicy>(int, char16_t, int, char16_t*, bool, int, int)
Unexecuted instantiation: int nsHtml5Tokenizer::stateLoop<nsHtml5SilentPolicy>(int, char16_t, int, char16_t*, bool, int, int)
4250
4251
void
4252
nsHtml5Tokenizer::initDoctypeFields()
4253
0
{
4254
0
  clearStrBufAfterUse();
4255
0
  doctypeName = nsGkAtoms::_empty;
4256
0
  if (systemIdentifier) {
4257
0
    systemIdentifier.Release();
4258
0
    systemIdentifier = nullptr;
4259
0
  }
4260
0
  if (publicIdentifier) {
4261
0
    publicIdentifier.Release();
4262
0
    publicIdentifier = nullptr;
4263
0
  }
4264
0
  forceQuirks = false;
4265
0
}
4266
4267
void
4268
nsHtml5Tokenizer::emitCarriageReturn(char16_t* buf, int32_t pos)
4269
0
{
4270
0
  silentCarriageReturn();
4271
0
  flushChars(buf, pos);
4272
0
  tokenHandler->characters(nsHtml5Tokenizer::LF, 0, 1);
4273
0
  cstart = INT32_MAX;
4274
0
}
4275
4276
void
4277
nsHtml5Tokenizer::emitReplacementCharacter(char16_t* buf, int32_t pos)
4278
0
{
4279
0
  flushChars(buf, pos);
4280
0
  tokenHandler->zeroOriginatingReplacementCharacter();
4281
0
  cstart = pos + 1;
4282
0
}
4283
4284
void
4285
nsHtml5Tokenizer::emitPlaintextReplacementCharacter(char16_t* buf, int32_t pos)
4286
0
{
4287
0
  flushChars(buf, pos);
4288
0
  tokenHandler->characters(REPLACEMENT_CHARACTER, 0, 1);
4289
0
  cstart = pos + 1;
4290
0
}
4291
4292
void
4293
nsHtml5Tokenizer::setAdditionalAndRememberAmpersandLocation(char16_t add)
4294
0
{
4295
0
  additional = add;
4296
0
}
4297
4298
void
4299
nsHtml5Tokenizer::bogusDoctype()
4300
0
{
4301
0
  errBogusDoctype();
4302
0
  forceQuirks = true;
4303
0
}
4304
4305
void
4306
nsHtml5Tokenizer::bogusDoctypeWithoutQuirks()
4307
0
{
4308
0
  errBogusDoctype();
4309
0
  forceQuirks = false;
4310
0
}
4311
4312
void
4313
nsHtml5Tokenizer::handleNcrValue(int32_t returnState)
4314
0
{
4315
0
  if (value <= 0xFFFF) {
4316
0
    if (value >= 0x80 && value <= 0x9f) {
4317
0
      errNcrInC1Range();
4318
0
      char16_t* val = nsHtml5NamedCharacters::WINDOWS_1252[value - 0x80];
4319
0
      emitOrAppendOne(val, returnState);
4320
0
    } else if (value == 0x0) {
4321
0
      errNcrZero();
4322
0
      emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER, returnState);
4323
0
    } else if ((value & 0xF800) == 0xD800) {
4324
0
      errNcrSurrogate();
4325
0
      emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER, returnState);
4326
0
    } else {
4327
0
      char16_t ch = (char16_t)value;
4328
0
      bmpChar[0] = ch;
4329
0
      emitOrAppendOne(bmpChar, returnState);
4330
0
    }
4331
0
  } else if (value <= 0x10FFFF) {
4332
0
    astralChar[0] = (char16_t)(nsHtml5Tokenizer::LEAD_OFFSET + (value >> 10));
4333
0
    astralChar[1] = (char16_t)(0xDC00 + (value & 0x3FF));
4334
0
    emitOrAppendTwo(astralChar, returnState);
4335
0
  } else {
4336
0
    errNcrOutOfRange();
4337
0
    emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER, returnState);
4338
0
  }
4339
0
}
4340
4341
void
4342
nsHtml5Tokenizer::eof()
4343
0
{
4344
0
  int32_t state = stateSave;
4345
0
  int32_t returnState = returnStateSave;
4346
0
eofloop:
4347
0
  for (;;) {
4348
0
    switch (state) {
4349
0
      case SCRIPT_DATA_LESS_THAN_SIGN:
4350
0
      case SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN: {
4351
0
        tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
4352
0
        NS_HTML5_BREAK(eofloop);
4353
0
      }
4354
0
      case TAG_OPEN: {
4355
0
        errEofAfterLt();
4356
0
        tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
4357
0
        NS_HTML5_BREAK(eofloop);
4358
0
      }
4359
0
      case RAWTEXT_RCDATA_LESS_THAN_SIGN: {
4360
0
        tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
4361
0
        NS_HTML5_BREAK(eofloop);
4362
0
      }
4363
0
      case NON_DATA_END_TAG_NAME: {
4364
0
        tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
4365
0
        emitStrBuf();
4366
0
        NS_HTML5_BREAK(eofloop);
4367
0
      }
4368
0
      case CLOSE_TAG_OPEN: {
4369
0
        errEofAfterLt();
4370
0
        tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
4371
0
        NS_HTML5_BREAK(eofloop);
4372
0
      }
4373
0
      case TAG_NAME: {
4374
0
        errEofInTagName();
4375
0
        NS_HTML5_BREAK(eofloop);
4376
0
      }
4377
0
      case BEFORE_ATTRIBUTE_NAME:
4378
0
      case AFTER_ATTRIBUTE_VALUE_QUOTED:
4379
0
      case SELF_CLOSING_START_TAG: {
4380
0
        errEofWithoutGt();
4381
0
        NS_HTML5_BREAK(eofloop);
4382
0
      }
4383
0
      case ATTRIBUTE_NAME: {
4384
0
        errEofInAttributeName();
4385
0
        NS_HTML5_BREAK(eofloop);
4386
0
      }
4387
0
      case AFTER_ATTRIBUTE_NAME:
4388
0
      case BEFORE_ATTRIBUTE_VALUE: {
4389
0
        errEofWithoutGt();
4390
0
        NS_HTML5_BREAK(eofloop);
4391
0
      }
4392
0
      case ATTRIBUTE_VALUE_DOUBLE_QUOTED:
4393
0
      case ATTRIBUTE_VALUE_SINGLE_QUOTED:
4394
0
      case ATTRIBUTE_VALUE_UNQUOTED: {
4395
0
        errEofInAttributeValue();
4396
0
        NS_HTML5_BREAK(eofloop);
4397
0
      }
4398
0
      case BOGUS_COMMENT: {
4399
0
        emitComment(0, 0);
4400
0
        NS_HTML5_BREAK(eofloop);
4401
0
      }
4402
0
      case BOGUS_COMMENT_HYPHEN: {
4403
0
        emitComment(0, 0);
4404
0
        NS_HTML5_BREAK(eofloop);
4405
0
      }
4406
0
      case MARKUP_DECLARATION_OPEN: {
4407
0
        errBogusComment();
4408
0
        emitComment(0, 0);
4409
0
        NS_HTML5_BREAK(eofloop);
4410
0
      }
4411
0
      case MARKUP_DECLARATION_HYPHEN: {
4412
0
        errBogusComment();
4413
0
        emitComment(0, 0);
4414
0
        NS_HTML5_BREAK(eofloop);
4415
0
      }
4416
0
      case MARKUP_DECLARATION_OCTYPE: {
4417
0
        if (index < 6) {
4418
0
          errBogusComment();
4419
0
          emitComment(0, 0);
4420
0
        } else {
4421
0
          errEofInDoctype();
4422
0
          doctypeName = nsGkAtoms::_empty;
4423
0
          if (systemIdentifier) {
4424
0
            systemIdentifier.Release();
4425
0
            systemIdentifier = nullptr;
4426
0
          }
4427
0
          if (publicIdentifier) {
4428
0
            publicIdentifier.Release();
4429
0
            publicIdentifier = nullptr;
4430
0
          }
4431
0
          forceQuirks = true;
4432
0
          emitDoctypeToken(0);
4433
0
          NS_HTML5_BREAK(eofloop);
4434
0
        }
4435
0
        NS_HTML5_BREAK(eofloop);
4436
0
      }
4437
0
      case COMMENT_START:
4438
0
      case COMMENT: {
4439
0
        errEofInComment();
4440
0
        emitComment(0, 0);
4441
0
        NS_HTML5_BREAK(eofloop);
4442
0
      }
4443
0
      case COMMENT_END: {
4444
0
        errEofInComment();
4445
0
        emitComment(2, 0);
4446
0
        NS_HTML5_BREAK(eofloop);
4447
0
      }
4448
0
      case COMMENT_END_DASH:
4449
0
      case COMMENT_START_DASH: {
4450
0
        errEofInComment();
4451
0
        emitComment(1, 0);
4452
0
        NS_HTML5_BREAK(eofloop);
4453
0
      }
4454
0
      case COMMENT_END_BANG: {
4455
0
        errEofInComment();
4456
0
        emitComment(3, 0);
4457
0
        NS_HTML5_BREAK(eofloop);
4458
0
      }
4459
0
      case DOCTYPE:
4460
0
      case BEFORE_DOCTYPE_NAME: {
4461
0
        errEofInDoctype();
4462
0
        forceQuirks = true;
4463
0
        emitDoctypeToken(0);
4464
0
        NS_HTML5_BREAK(eofloop);
4465
0
      }
4466
0
      case DOCTYPE_NAME: {
4467
0
        errEofInDoctype();
4468
0
        strBufToDoctypeName();
4469
0
        forceQuirks = true;
4470
0
        emitDoctypeToken(0);
4471
0
        NS_HTML5_BREAK(eofloop);
4472
0
      }
4473
0
      case DOCTYPE_UBLIC:
4474
0
      case DOCTYPE_YSTEM:
4475
0
      case AFTER_DOCTYPE_NAME:
4476
0
      case AFTER_DOCTYPE_PUBLIC_KEYWORD:
4477
0
      case AFTER_DOCTYPE_SYSTEM_KEYWORD:
4478
0
      case BEFORE_DOCTYPE_PUBLIC_IDENTIFIER: {
4479
0
        errEofInDoctype();
4480
0
        forceQuirks = true;
4481
0
        emitDoctypeToken(0);
4482
0
        NS_HTML5_BREAK(eofloop);
4483
0
      }
4484
0
      case DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED:
4485
0
      case DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED: {
4486
0
        errEofInPublicId();
4487
0
        forceQuirks = true;
4488
0
        publicIdentifier = strBufToString();
4489
0
        emitDoctypeToken(0);
4490
0
        NS_HTML5_BREAK(eofloop);
4491
0
      }
4492
0
      case AFTER_DOCTYPE_PUBLIC_IDENTIFIER:
4493
0
      case BEFORE_DOCTYPE_SYSTEM_IDENTIFIER:
4494
0
      case BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS: {
4495
0
        errEofInDoctype();
4496
0
        forceQuirks = true;
4497
0
        emitDoctypeToken(0);
4498
0
        NS_HTML5_BREAK(eofloop);
4499
0
      }
4500
0
      case DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED:
4501
0
      case DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED: {
4502
0
        errEofInSystemId();
4503
0
        forceQuirks = true;
4504
0
        systemIdentifier = strBufToString();
4505
0
        emitDoctypeToken(0);
4506
0
        NS_HTML5_BREAK(eofloop);
4507
0
      }
4508
0
      case AFTER_DOCTYPE_SYSTEM_IDENTIFIER: {
4509
0
        errEofInDoctype();
4510
0
        forceQuirks = true;
4511
0
        emitDoctypeToken(0);
4512
0
        NS_HTML5_BREAK(eofloop);
4513
0
      }
4514
0
      case BOGUS_DOCTYPE: {
4515
0
        emitDoctypeToken(0);
4516
0
        NS_HTML5_BREAK(eofloop);
4517
0
      }
4518
0
      case CONSUME_CHARACTER_REFERENCE: {
4519
0
        emitOrAppendCharRefBuf(returnState);
4520
0
        state = returnState;
4521
0
        continue;
4522
0
      }
4523
0
      case CHARACTER_REFERENCE_HILO_LOOKUP: {
4524
0
        errNoNamedCharacterMatch();
4525
0
        emitOrAppendCharRefBuf(returnState);
4526
0
        state = returnState;
4527
0
        continue;
4528
0
      }
4529
0
      case CHARACTER_REFERENCE_TAIL: {
4530
0
        for (;;) {
4531
0
          char16_t c = '\0';
4532
0
          entCol++;
4533
0
          for (;;) {
4534
0
            if (hi == -1) {
4535
0
              NS_HTML5_BREAK(hiloop);
4536
0
            }
4537
0
            if (entCol == nsHtml5NamedCharacters::NAMES[hi].length()) {
4538
0
              NS_HTML5_BREAK(hiloop);
4539
0
            }
4540
0
            if (entCol > nsHtml5NamedCharacters::NAMES[hi].length()) {
4541
0
              NS_HTML5_BREAK(outer);
4542
0
            } else if (c < nsHtml5NamedCharacters::NAMES[hi].charAt(entCol)) {
4543
0
              hi--;
4544
0
            } else {
4545
0
              NS_HTML5_BREAK(hiloop);
4546
0
            }
4547
0
          }
4548
0
        hiloop_end:;
4549
0
          for (;;) {
4550
0
            if (hi < lo) {
4551
0
              NS_HTML5_BREAK(outer);
4552
0
            }
4553
0
            if (entCol == nsHtml5NamedCharacters::NAMES[lo].length()) {
4554
0
              candidate = lo;
4555
0
              charRefBufMark = charRefBufLen;
4556
0
              lo++;
4557
0
            } else if (entCol > nsHtml5NamedCharacters::NAMES[lo].length()) {
4558
0
              NS_HTML5_BREAK(outer);
4559
0
            } else if (c > nsHtml5NamedCharacters::NAMES[lo].charAt(entCol)) {
4560
0
              lo++;
4561
0
            } else {
4562
0
              NS_HTML5_BREAK(loloop);
4563
0
            }
4564
0
          }
4565
0
        loloop_end:;
4566
0
          if (hi < lo) {
4567
0
            NS_HTML5_BREAK(outer);
4568
0
          }
4569
0
          continue;
4570
0
        }
4571
0
      outer_end:;
4572
0
        if (candidate == -1) {
4573
0
          errNoNamedCharacterMatch();
4574
0
          emitOrAppendCharRefBuf(returnState);
4575
0
          state = returnState;
4576
0
          NS_HTML5_CONTINUE(eofloop);
4577
0
        } else {
4578
0
          const nsHtml5CharacterName& candidateName =
4579
0
            nsHtml5NamedCharacters::NAMES[candidate];
4580
0
          if (!candidateName.length() ||
4581
0
              candidateName.charAt(candidateName.length() - 1) != ';') {
4582
0
            if ((returnState & DATA_AND_RCDATA_MASK)) {
4583
0
              char16_t ch;
4584
0
              if (charRefBufMark == charRefBufLen) {
4585
0
                ch = '\0';
4586
0
              } else {
4587
0
                ch = charRefBuf[charRefBufMark];
4588
0
              }
4589
0
              if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') ||
4590
0
                  (ch >= 'a' && ch <= 'z')) {
4591
0
                errNoNamedCharacterMatch();
4592
0
                appendCharRefBufToStrBuf();
4593
0
                state = returnState;
4594
0
                NS_HTML5_CONTINUE(eofloop);
4595
0
              }
4596
0
            }
4597
0
            if ((returnState & DATA_AND_RCDATA_MASK)) {
4598
0
              errUnescapedAmpersandInterpretedAsCharacterReference();
4599
0
            } else {
4600
0
              errNotSemicolonTerminated();
4601
0
            }
4602
0
          }
4603
0
          const char16_t* val = nsHtml5NamedCharacters::VALUES[candidate];
4604
0
          if (!val[1]) {
4605
0
            emitOrAppendOne(val, returnState);
4606
0
          } else {
4607
0
            emitOrAppendTwo(val, returnState);
4608
0
          }
4609
0
          if (charRefBufMark < charRefBufLen) {
4610
0
            if ((returnState & DATA_AND_RCDATA_MASK)) {
4611
0
              appendStrBuf(
4612
0
                charRefBuf, charRefBufMark, charRefBufLen - charRefBufMark);
4613
0
            } else {
4614
0
              tokenHandler->characters(
4615
0
                charRefBuf, charRefBufMark, charRefBufLen - charRefBufMark);
4616
0
            }
4617
0
          }
4618
0
          charRefBufLen = 0;
4619
0
          state = returnState;
4620
0
          NS_HTML5_CONTINUE(eofloop);
4621
0
        }
4622
0
      }
4623
0
      case CONSUME_NCR:
4624
0
      case DECIMAL_NRC_LOOP:
4625
0
      case HEX_NCR_LOOP: {
4626
0
        if (!seenDigits) {
4627
0
          errNoDigitsInNCR();
4628
0
          emitOrAppendCharRefBuf(returnState);
4629
0
          state = returnState;
4630
0
          continue;
4631
0
        } else {
4632
0
          errCharRefLacksSemicolon();
4633
0
        }
4634
0
        handleNcrValue(returnState);
4635
0
        state = returnState;
4636
0
        continue;
4637
0
      }
4638
0
      case CDATA_RSQB: {
4639
0
        tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 1);
4640
0
        NS_HTML5_BREAK(eofloop);
4641
0
      }
4642
0
      case CDATA_RSQB_RSQB: {
4643
0
        tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 2);
4644
0
        NS_HTML5_BREAK(eofloop);
4645
0
      }
4646
0
      case DATA:
4647
0
      default: {
4648
0
        NS_HTML5_BREAK(eofloop);
4649
0
      }
4650
0
    }
4651
0
  }
4652
0
eofloop_end:;
4653
0
  tokenHandler->eof();
4654
0
  return;
4655
0
}
4656
4657
void
4658
nsHtml5Tokenizer::emitDoctypeToken(int32_t pos)
4659
0
{
4660
0
  cstart = pos + 1;
4661
0
  tokenHandler->doctype(
4662
0
    doctypeName, publicIdentifier, systemIdentifier, forceQuirks);
4663
0
  doctypeName = nullptr;
4664
0
  publicIdentifier.Release();
4665
0
  publicIdentifier = nullptr;
4666
0
  systemIdentifier.Release();
4667
0
  systemIdentifier = nullptr;
4668
0
}
4669
4670
bool
4671
nsHtml5Tokenizer::internalEncodingDeclaration(nsHtml5String internalCharset)
4672
0
{
4673
0
  if (encodingDeclarationHandler) {
4674
0
    return encodingDeclarationHandler->internalEncodingDeclaration(
4675
0
      internalCharset);
4676
0
  }
4677
0
  return false;
4678
0
}
4679
4680
void
4681
nsHtml5Tokenizer::emitOrAppendTwo(const char16_t* val, int32_t returnState)
4682
0
{
4683
0
  if ((returnState & DATA_AND_RCDATA_MASK)) {
4684
0
    appendStrBuf(val[0]);
4685
0
    appendStrBuf(val[1]);
4686
0
  } else {
4687
0
    tokenHandler->characters(val, 0, 2);
4688
0
  }
4689
0
}
4690
4691
void
4692
nsHtml5Tokenizer::emitOrAppendOne(const char16_t* val, int32_t returnState)
4693
0
{
4694
0
  if ((returnState & DATA_AND_RCDATA_MASK)) {
4695
0
    appendStrBuf(val[0]);
4696
0
  } else {
4697
0
    tokenHandler->characters(val, 0, 1);
4698
0
  }
4699
0
}
4700
4701
void
4702
nsHtml5Tokenizer::end()
4703
0
{
4704
0
  strBuf = nullptr;
4705
0
  doctypeName = nullptr;
4706
0
  if (systemIdentifier) {
4707
0
    systemIdentifier.Release();
4708
0
    systemIdentifier = nullptr;
4709
0
  }
4710
0
  if (publicIdentifier) {
4711
0
    publicIdentifier.Release();
4712
0
    publicIdentifier = nullptr;
4713
0
  }
4714
0
  tagName = nullptr;
4715
0
  nonInternedTagName->setNameForNonInterned(nullptr, false);
4716
0
  attributeName = nullptr;
4717
0
  nonInternedAttributeName->setNameForNonInterned(nullptr);
4718
0
  tokenHandler->endTokenization();
4719
0
  if (attributes) {
4720
0
    attributes->clear(0);
4721
0
  }
4722
0
}
4723
4724
void
4725
nsHtml5Tokenizer::requestSuspension()
4726
0
{
4727
0
  shouldSuspend = true;
4728
0
}
4729
4730
bool
4731
nsHtml5Tokenizer::isInDataState()
4732
0
{
4733
0
  return (stateSave == DATA);
4734
0
}
4735
4736
void
4737
nsHtml5Tokenizer::resetToDataState()
4738
0
{
4739
0
  clearStrBufAfterUse();
4740
0
  charRefBufLen = 0;
4741
0
  stateSave = nsHtml5Tokenizer::DATA;
4742
0
  lastCR = false;
4743
0
  index = 0;
4744
0
  forceQuirks = false;
4745
0
  additional = '\0';
4746
0
  entCol = -1;
4747
0
  firstCharKey = -1;
4748
0
  lo = 0;
4749
0
  hi = 0;
4750
0
  candidate = -1;
4751
0
  charRefBufMark = 0;
4752
0
  value = 0;
4753
0
  seenDigits = false;
4754
0
  endTag = false;
4755
0
  shouldSuspend = false;
4756
0
  initDoctypeFields();
4757
0
  containsHyphen = false;
4758
0
  tagName = nullptr;
4759
0
  attributeName = nullptr;
4760
0
  if (newAttributesEachTime) {
4761
0
    if (attributes) {
4762
0
      delete attributes;
4763
0
      attributes = nullptr;
4764
0
    }
4765
0
  }
4766
0
}
4767
4768
void
4769
nsHtml5Tokenizer::loadState(nsHtml5Tokenizer* other)
4770
0
{
4771
0
  strBufLen = other->strBufLen;
4772
0
  if (strBufLen > strBuf.length) {
4773
0
    strBuf = jArray<char16_t, int32_t>::newJArray(strBufLen);
4774
0
  }
4775
0
  nsHtml5ArrayCopy::arraycopy(other->strBuf, strBuf, strBufLen);
4776
0
  charRefBufLen = other->charRefBufLen;
4777
0
  nsHtml5ArrayCopy::arraycopy(other->charRefBuf, charRefBuf, charRefBufLen);
4778
0
  stateSave = other->stateSave;
4779
0
  returnStateSave = other->returnStateSave;
4780
0
  endTagExpectation = other->endTagExpectation;
4781
0
  endTagExpectationAsArray = other->endTagExpectationAsArray;
4782
0
  lastCR = other->lastCR;
4783
0
  index = other->index;
4784
0
  forceQuirks = other->forceQuirks;
4785
0
  additional = other->additional;
4786
0
  entCol = other->entCol;
4787
0
  firstCharKey = other->firstCharKey;
4788
0
  lo = other->lo;
4789
0
  hi = other->hi;
4790
0
  candidate = other->candidate;
4791
0
  charRefBufMark = other->charRefBufMark;
4792
0
  value = other->value;
4793
0
  seenDigits = other->seenDigits;
4794
0
  endTag = other->endTag;
4795
0
  shouldSuspend = false;
4796
0
  if (!other->doctypeName) {
4797
0
    doctypeName = nullptr;
4798
0
  } else {
4799
0
    doctypeName =
4800
0
      nsHtml5Portability::newLocalFromLocal(other->doctypeName, interner);
4801
0
  }
4802
0
  systemIdentifier.Release();
4803
0
  if (!other->systemIdentifier) {
4804
0
    systemIdentifier = nullptr;
4805
0
  } else {
4806
0
    systemIdentifier =
4807
0
      nsHtml5Portability::newStringFromString(other->systemIdentifier);
4808
0
  }
4809
0
  publicIdentifier.Release();
4810
0
  if (!other->publicIdentifier) {
4811
0
    publicIdentifier = nullptr;
4812
0
  } else {
4813
0
    publicIdentifier =
4814
0
      nsHtml5Portability::newStringFromString(other->publicIdentifier);
4815
0
  }
4816
0
  containsHyphen = other->containsHyphen;
4817
0
  if (!other->tagName) {
4818
0
    tagName = nullptr;
4819
0
  } else if (other->tagName->isInterned()) {
4820
0
    tagName = other->tagName;
4821
0
  } else {
4822
0
    nonInternedTagName->setNameForNonInterned(
4823
0
      nsHtml5Portability::newLocalFromLocal(other->tagName->getName(),
4824
0
                                            interner),
4825
0
      other->tagName->isCustom());
4826
0
    tagName = nonInternedTagName;
4827
0
  }
4828
0
  if (!other->attributeName) {
4829
0
    attributeName = nullptr;
4830
0
  } else if (other->attributeName->isInterned()) {
4831
0
    attributeName = other->attributeName;
4832
0
  } else {
4833
0
    nonInternedAttributeName->setNameForNonInterned(
4834
0
      nsHtml5Portability::newLocalFromLocal(
4835
0
        other->attributeName->getLocal(nsHtml5AttributeName::HTML), interner));
4836
0
    attributeName = nonInternedAttributeName;
4837
0
  }
4838
0
  delete attributes;
4839
0
  if (!other->attributes) {
4840
0
    attributes = nullptr;
4841
0
  } else {
4842
0
    attributes = other->attributes->cloneAttributes(interner);
4843
0
  }
4844
0
}
4845
4846
void
4847
nsHtml5Tokenizer::initializeWithoutStarting()
4848
0
{
4849
0
  confident = false;
4850
0
  strBuf = nullptr;
4851
0
  line = 1;
4852
0
  attributeLine = 1;
4853
0
  resetToDataState();
4854
0
}
4855
4856
void
4857
nsHtml5Tokenizer::setEncodingDeclarationHandler(
4858
  nsHtml5StreamParser* encodingDeclarationHandler)
4859
0
{
4860
0
  this->encodingDeclarationHandler = encodingDeclarationHandler;
4861
0
}
4862
4863
nsHtml5Tokenizer::~nsHtml5Tokenizer()
4864
0
{
4865
0
  MOZ_COUNT_DTOR(nsHtml5Tokenizer);
4866
0
  delete nonInternedTagName;
4867
0
  delete nonInternedAttributeName;
4868
0
  nonInternedTagName = nullptr;
4869
0
  delete attributes;
4870
0
  attributes = nullptr;
4871
0
}
4872
4873
void
4874
nsHtml5Tokenizer::initializeStatics()
4875
3
{
4876
3
}
4877
4878
void
4879
nsHtml5Tokenizer::releaseStatics()
4880
0
{
4881
0
}
4882
4883
#include "nsHtml5TokenizerCppSupplement.h"