1 : /* ***** BEGIN LICENSE BLOCK *****
2 : * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 : *
4 : * The contents of this file are subject to the Mozilla Public License Version
5 : * 1.1 (the "License"); you may not use this file except in compliance with
6 : * the License. You may obtain a copy of the License at
7 : * http://www.mozilla.org/MPL/
8 : *
9 : * Software distributed under the License is distributed on an "AS IS" basis,
10 : * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 : * for the specific language governing rights and limitations under the
12 : * License.
13 : *
14 : * The Original Code is HTML5 View Source code.
15 : *
16 : * The Initial Developer of the Original Code is
17 : * Mozilla Foundation.
18 : * Portions created by the Initial Developer are Copyright (C) 2011
19 : * the Initial Developer. All Rights Reserved.
20 : *
21 : * Contributor(s):
22 : * Henri Sivonen <hsivonen@iki.fi>
23 : *
24 : * Alternatively, the contents of this file may be used under the terms of
25 : * either the GNU General Public License Version 2 or later (the "GPL"), or
26 : * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 : * in which case the provisions of the GPL or the LGPL are applicable instead
28 : * of those above. If you wish to allow use of your version of this file only
29 : * under the terms of either the GPL or the LGPL, and not to allow others to
30 : * use your version of this file under the terms of the MPL, indicate your
31 : * decision by deleting the provisions above and replace them with the notice
32 : * and other provisions required by the GPL or the LGPL. If you do not delete
33 : * the provisions above, a recipient may use your version of this file under
34 : * the terms of any one of the MPL, the GPL or the LGPL.
35 : *
36 : * ***** END LICENSE BLOCK ***** */
37 :
38 : void
39 0 : nsHtml5Tokenizer::StartPlainText()
40 : {
41 0 : stateSave = NS_HTML5TOKENIZER_PLAINTEXT;
42 0 : }
43 :
44 : void
45 0 : nsHtml5Tokenizer::EnableViewSource(nsHtml5Highlighter* aHighlighter)
46 : {
47 0 : mViewSource = aHighlighter;
48 0 : }
49 :
50 : bool
51 0 : nsHtml5Tokenizer::FlushViewSource()
52 : {
53 0 : return mViewSource->FlushOps();
54 : }
55 :
56 : void
57 0 : nsHtml5Tokenizer::StartViewSource(const nsAutoString& aTitle)
58 : {
59 0 : mViewSource->Start(aTitle);
60 0 : }
61 :
62 : void
63 0 : nsHtml5Tokenizer::EndViewSource()
64 : {
65 0 : mViewSource->End();
66 0 : }
67 :
68 : void
69 0 : nsHtml5Tokenizer::errWarnLtSlashInRcdata()
70 : {
71 0 : }
72 :
73 : // The null checks below annotated NS_LIKELY are not actually necessary.
74 :
75 : void
76 0 : nsHtml5Tokenizer::errUnquotedAttributeValOrNull(PRUnichar c)
77 : {
78 0 : if (NS_LIKELY(mViewSource)) {
79 0 : switch (c) {
80 : case '<':
81 0 : mViewSource->AddErrorToCurrentNode("errUnquotedAttributeLt");
82 0 : return;
83 : case '`':
84 0 : mViewSource->AddErrorToCurrentNode("errUnquotedAttributeGrave");
85 0 : return;
86 : case '\'':
87 : case '"':
88 0 : mViewSource->AddErrorToCurrentNode("errUnquotedAttributeQuote");
89 0 : return;
90 : case '=':
91 0 : mViewSource->AddErrorToCurrentNode("errUnquotedAttributeEquals");
92 0 : return;
93 : }
94 : }
95 : }
96 :
97 : void
98 0 : nsHtml5Tokenizer::errLtOrEqualsOrGraveInUnquotedAttributeOrNull(PRUnichar c)
99 : {
100 0 : if (NS_LIKELY(mViewSource)) {
101 0 : switch (c) {
102 : case '=':
103 0 : mViewSource->AddErrorToCurrentNode("errUnquotedAttributeStartEquals");
104 0 : return;
105 : case '<':
106 0 : mViewSource->AddErrorToCurrentNode("errUnquotedAttributeStartLt");
107 0 : return;
108 : case '`':
109 0 : mViewSource->AddErrorToCurrentNode("errUnquotedAttributeStartGrave");
110 0 : return;
111 : }
112 : }
113 : }
114 :
115 : void
116 0 : nsHtml5Tokenizer::errBadCharBeforeAttributeNameOrNull(PRUnichar c)
117 : {
118 0 : if (NS_LIKELY(mViewSource)) {
119 0 : if (c == '<') {
120 0 : mViewSource->AddErrorToCurrentNode("errBadCharBeforeAttributeNameLt");
121 0 : } else if (c == '=') {
122 0 : errEqualsSignBeforeAttributeName();
123 0 : } else if (c != 0xFFFD) {
124 0 : errQuoteBeforeAttributeName(c);
125 : }
126 : }
127 0 : }
128 :
129 : void
130 0 : nsHtml5Tokenizer::errBadCharAfterLt(PRUnichar c)
131 : {
132 0 : if (NS_LIKELY(mViewSource)) {
133 0 : mViewSource->AddErrorToCurrentNode("errBadCharAfterLt");
134 : }
135 0 : }
136 :
137 : void
138 0 : nsHtml5Tokenizer::errQuoteOrLtInAttributeNameOrNull(PRUnichar c)
139 : {
140 0 : if (NS_LIKELY(mViewSource)) {
141 0 : if (c == '<') {
142 0 : mViewSource->AddErrorToCurrentNode("errLtInAttributeName");
143 0 : } else if (c != 0xFFFD) {
144 0 : mViewSource->AddErrorToCurrentNode("errQuoteInAttributeName");
145 : }
146 : }
147 0 : }
148 :
149 : void
150 37 : nsHtml5Tokenizer::maybeErrAttributesOnEndTag(nsHtml5HtmlAttributes* attrs)
151 : {
152 37 : if (mViewSource && attrs->getLength() != 0) {
153 : /*
154 : * When an end tag token is emitted with attributes, that is a parse
155 : * error.
156 : */
157 0 : mViewSource->AddErrorToCurrentRun("maybeErrAttributesOnEndTag");
158 : }
159 37 : }
160 :
161 : void
162 124 : nsHtml5Tokenizer::maybeErrSlashInEndTag(bool selfClosing)
163 : {
164 124 : if (mViewSource && selfClosing && endTag) {
165 0 : mViewSource->AddErrorToCurrentSlash("maybeErrSlashInEndTag");
166 : }
167 124 : }
168 :
169 : PRUnichar
170 0 : nsHtml5Tokenizer::errNcrNonCharacter(PRUnichar ch)
171 : {
172 0 : if (NS_UNLIKELY(mViewSource)) {
173 0 : mViewSource->AddErrorToCurrentNode("errNcrNonCharacter");
174 : }
175 0 : return ch;
176 : }
177 :
178 : void
179 0 : nsHtml5Tokenizer::errAstralNonCharacter(PRInt32 ch)
180 : {
181 0 : if (NS_UNLIKELY(mViewSource)) {
182 0 : mViewSource->AddErrorToCurrentNode("errNcrNonCharacter");
183 : }
184 0 : }
185 :
186 : PRUnichar
187 0 : nsHtml5Tokenizer::errNcrControlChar(PRUnichar ch)
188 : {
189 0 : if (NS_UNLIKELY(mViewSource)) {
190 0 : mViewSource->AddErrorToCurrentNode("errNcrControlChar");
191 : }
192 0 : return ch;
193 : }
194 :
195 : void
196 0 : nsHtml5Tokenizer::errGarbageAfterLtSlash()
197 : {
198 0 : if (NS_LIKELY(mViewSource)) {
199 0 : mViewSource->AddErrorToCurrentNode("errGarbageAfterLtSlash");
200 : }
201 0 : }
202 :
203 : void
204 0 : nsHtml5Tokenizer::errLtSlashGt()
205 : {
206 0 : if (NS_LIKELY(mViewSource)) {
207 0 : mViewSource->AddErrorToCurrentNode("errLtSlashGt");
208 : }
209 0 : }
210 :
211 : void
212 0 : nsHtml5Tokenizer::errCharRefLacksSemicolon()
213 : {
214 0 : if (NS_UNLIKELY(mViewSource)) {
215 0 : mViewSource->AddErrorToCurrentNode("errCharRefLacksSemicolon");
216 : }
217 0 : }
218 :
219 : void
220 0 : nsHtml5Tokenizer::errNoDigitsInNCR()
221 : {
222 0 : if (NS_UNLIKELY(mViewSource)) {
223 0 : mViewSource->AddErrorToCurrentNode("errNoDigitsInNCR");
224 : }
225 0 : }
226 :
227 : void
228 0 : nsHtml5Tokenizer::errGtInSystemId()
229 : {
230 0 : if (NS_LIKELY(mViewSource)) {
231 0 : mViewSource->AddErrorToCurrentNode("errGtInSystemId");
232 : }
233 0 : }
234 :
235 : void
236 0 : nsHtml5Tokenizer::errGtInPublicId()
237 : {
238 0 : if (NS_LIKELY(mViewSource)) {
239 0 : mViewSource->AddErrorToCurrentNode("errGtInPublicId");
240 : }
241 0 : }
242 :
243 : void
244 0 : nsHtml5Tokenizer::errNamelessDoctype()
245 : {
246 0 : if (NS_LIKELY(mViewSource)) {
247 0 : mViewSource->AddErrorToCurrentNode("errNamelessDoctype");
248 : }
249 0 : }
250 :
251 : void
252 0 : nsHtml5Tokenizer::errConsecutiveHyphens()
253 : {
254 0 : if (NS_UNLIKELY(mViewSource)) {
255 0 : mViewSource->AddErrorToCurrentNode("errConsecutiveHyphens");
256 : }
257 0 : }
258 :
259 : void
260 0 : nsHtml5Tokenizer::errPrematureEndOfComment()
261 : {
262 0 : if (NS_LIKELY(mViewSource)) {
263 0 : mViewSource->AddErrorToCurrentNode("errPrematureEndOfComment");
264 : }
265 0 : }
266 :
267 : void
268 0 : nsHtml5Tokenizer::errBogusComment()
269 : {
270 0 : if (NS_UNLIKELY(mViewSource)) {
271 0 : mViewSource->AddErrorToCurrentNode("errBogusComment");
272 : }
273 0 : }
274 :
275 : void
276 0 : nsHtml5Tokenizer::errSlashNotFollowedByGt()
277 : {
278 0 : if (NS_LIKELY(mViewSource)) {
279 0 : mViewSource->AddErrorToCurrentSlash("errSlashNotFollowedByGt");
280 : }
281 0 : }
282 :
283 : void
284 0 : nsHtml5Tokenizer::errNoSpaceBetweenAttributes()
285 : {
286 0 : if (NS_LIKELY(mViewSource)) {
287 0 : mViewSource->AddErrorToCurrentNode("errNoSpaceBetweenAttributes");
288 : }
289 0 : }
290 :
291 : void
292 0 : nsHtml5Tokenizer::errAttributeValueMissing()
293 : {
294 0 : if (NS_LIKELY(mViewSource)) {
295 0 : mViewSource->AddErrorToCurrentNode("errAttributeValueMissing");
296 : }
297 0 : }
298 :
299 : void
300 0 : nsHtml5Tokenizer::errEqualsSignBeforeAttributeName()
301 : {
302 0 : if (NS_LIKELY(mViewSource)) {
303 0 : mViewSource->AddErrorToCurrentNode("errEqualsSignBeforeAttributeName");
304 : }
305 0 : }
306 :
307 : void
308 0 : nsHtml5Tokenizer::errLtGt()
309 : {
310 0 : if (NS_LIKELY(mViewSource)) {
311 0 : mViewSource->AddErrorToCurrentNode("errLtGt");
312 : }
313 0 : }
314 :
315 : void
316 0 : nsHtml5Tokenizer::errProcessingInstruction()
317 : {
318 0 : if (NS_LIKELY(mViewSource)) {
319 0 : mViewSource->AddErrorToCurrentNode("errProcessingInstruction");
320 : }
321 0 : }
322 :
323 : void
324 0 : nsHtml5Tokenizer::errUnescapedAmpersandInterpretedAsCharacterReference()
325 : {
326 0 : if (NS_UNLIKELY(mViewSource)) {
327 0 : mViewSource->AddErrorToCurrentAmpersand("errUnescapedAmpersandInterpretedAsCharacterReference");
328 : }
329 0 : }
330 :
331 : void
332 0 : nsHtml5Tokenizer::errNotSemicolonTerminated()
333 : {
334 0 : if (NS_UNLIKELY(mViewSource)) {
335 0 : mViewSource->AddErrorToCurrentNode("errNotSemicolonTerminated");
336 : }
337 0 : }
338 :
339 : void
340 0 : nsHtml5Tokenizer::errNoNamedCharacterMatch()
341 : {
342 0 : if (NS_UNLIKELY(mViewSource)) {
343 0 : mViewSource->AddErrorToCurrentAmpersand("errNoNamedCharacterMatch");
344 : }
345 0 : }
346 :
347 : void
348 0 : nsHtml5Tokenizer::errQuoteBeforeAttributeName(PRUnichar c)
349 : {
350 0 : if (NS_LIKELY(mViewSource)) {
351 0 : mViewSource->AddErrorToCurrentNode("errQuoteBeforeAttributeName");
352 : }
353 0 : }
354 :
355 : void
356 0 : nsHtml5Tokenizer::errExpectedPublicId()
357 : {
358 0 : if (NS_LIKELY(mViewSource)) {
359 0 : mViewSource->AddErrorToCurrentNode("errExpectedPublicId");
360 : }
361 0 : }
362 :
363 : void
364 0 : nsHtml5Tokenizer::errBogusDoctype()
365 : {
366 0 : if (NS_UNLIKELY(mViewSource)) {
367 0 : mViewSource->AddErrorToCurrentNode("errBogusDoctype");
368 : }
369 0 : }
370 :
371 : void
372 0 : nsHtml5Tokenizer::errNcrSurrogate()
373 : {
374 0 : if (NS_UNLIKELY(mViewSource)) {
375 0 : mViewSource->AddErrorToCurrentNode("errNcrSurrogate");
376 : }
377 0 : }
378 :
379 : void
380 0 : nsHtml5Tokenizer::errNcrCr()
381 : {
382 0 : if (NS_UNLIKELY(mViewSource)) {
383 0 : mViewSource->AddErrorToCurrentNode("errNcrCr");
384 : }
385 0 : }
386 :
387 : void
388 0 : nsHtml5Tokenizer::errNcrInC1Range()
389 : {
390 0 : if (NS_UNLIKELY(mViewSource)) {
391 0 : mViewSource->AddErrorToCurrentNode("errNcrInC1Range");
392 : }
393 0 : }
394 :
395 : void
396 0 : nsHtml5Tokenizer::errEofInPublicId()
397 : {
398 0 : if (NS_UNLIKELY(mViewSource)) {
399 0 : mViewSource->AddErrorToCurrentRun("errEofInPublicId");
400 : }
401 0 : }
402 :
403 : void
404 0 : nsHtml5Tokenizer::errEofInComment()
405 : {
406 0 : if (NS_UNLIKELY(mViewSource)) {
407 0 : mViewSource->AddErrorToCurrentRun("errEofInComment");
408 : }
409 0 : }
410 :
411 : void
412 0 : nsHtml5Tokenizer::errEofInDoctype()
413 : {
414 0 : if (NS_UNLIKELY(mViewSource)) {
415 0 : mViewSource->AddErrorToCurrentRun("errEofInDoctype");
416 : }
417 0 : }
418 :
419 : void
420 0 : nsHtml5Tokenizer::errEofInAttributeValue()
421 : {
422 0 : if (NS_UNLIKELY(mViewSource)) {
423 0 : mViewSource->AddErrorToCurrentRun("errEofInAttributeValue");
424 : }
425 0 : }
426 :
427 : void
428 0 : nsHtml5Tokenizer::errEofInAttributeName()
429 : {
430 0 : if (NS_UNLIKELY(mViewSource)) {
431 0 : mViewSource->AddErrorToCurrentRun("errEofInAttributeName");
432 : }
433 0 : }
434 :
435 : void
436 0 : nsHtml5Tokenizer::errEofWithoutGt()
437 : {
438 0 : if (NS_UNLIKELY(mViewSource)) {
439 0 : mViewSource->AddErrorToCurrentRun("errEofWithoutGt");
440 : }
441 0 : }
442 :
443 : void
444 0 : nsHtml5Tokenizer::errEofInTagName()
445 : {
446 0 : if (NS_UNLIKELY(mViewSource)) {
447 0 : mViewSource->AddErrorToCurrentRun("errEofInTagName");
448 : }
449 0 : }
450 :
451 : void
452 0 : nsHtml5Tokenizer::errEofInEndTag()
453 : {
454 0 : if (NS_UNLIKELY(mViewSource)) {
455 0 : mViewSource->AddErrorToCurrentRun("errEofInEndTag");
456 : }
457 0 : }
458 :
459 : void
460 0 : nsHtml5Tokenizer::errEofAfterLt()
461 : {
462 0 : if (NS_UNLIKELY(mViewSource)) {
463 0 : mViewSource->AddErrorToCurrentRun("errEofAfterLt");
464 : }
465 0 : }
466 :
467 : void
468 0 : nsHtml5Tokenizer::errNcrOutOfRange()
469 : {
470 0 : if (NS_UNLIKELY(mViewSource)) {
471 0 : mViewSource->AddErrorToCurrentNode("errNcrOutOfRange");
472 : }
473 0 : }
474 :
475 : void
476 0 : nsHtml5Tokenizer::errNcrUnassigned()
477 : {
478 0 : if (NS_UNLIKELY(mViewSource)) {
479 0 : mViewSource->AddErrorToCurrentNode("errNcrUnassigned");
480 : }
481 0 : }
482 :
483 : void
484 0 : nsHtml5Tokenizer::errDuplicateAttribute()
485 : {
486 0 : if (NS_UNLIKELY(mViewSource)) {
487 0 : mViewSource->AddErrorToCurrentNode("errDuplicateAttribute");
488 : }
489 0 : }
490 :
491 : void
492 0 : nsHtml5Tokenizer::errEofInSystemId()
493 : {
494 0 : if (NS_UNLIKELY(mViewSource)) {
495 0 : mViewSource->AddErrorToCurrentRun("errEofInSystemId");
496 : }
497 0 : }
498 :
499 : void
500 0 : nsHtml5Tokenizer::errExpectedSystemId()
501 : {
502 0 : if (NS_LIKELY(mViewSource)) {
503 0 : mViewSource->AddErrorToCurrentNode("errExpectedSystemId");
504 : }
505 0 : }
506 :
507 : void
508 0 : nsHtml5Tokenizer::errMissingSpaceBeforeDoctypeName()
509 : {
510 0 : if (NS_LIKELY(mViewSource)) {
511 0 : mViewSource->AddErrorToCurrentNode("errMissingSpaceBeforeDoctypeName");
512 : }
513 0 : }
514 :
515 : void
516 0 : nsHtml5Tokenizer::errHyphenHyphenBang()
517 : {
518 0 : if (NS_LIKELY(mViewSource)) {
519 0 : mViewSource->AddErrorToCurrentNode("errHyphenHyphenBang");
520 : }
521 0 : }
522 :
523 : void
524 0 : nsHtml5Tokenizer::errNcrControlChar()
525 : {
526 0 : if (NS_UNLIKELY(mViewSource)) {
527 0 : mViewSource->AddErrorToCurrentNode("errNcrControlChar");
528 : }
529 0 : }
530 :
531 : void
532 0 : nsHtml5Tokenizer::errNcrZero()
533 : {
534 0 : if (NS_UNLIKELY(mViewSource)) {
535 0 : mViewSource->AddErrorToCurrentNode("errNcrZero");
536 : }
537 0 : }
538 :
539 : void
540 0 : nsHtml5Tokenizer::errNoSpaceBetweenDoctypeSystemKeywordAndQuote()
541 : {
542 0 : if (NS_LIKELY(mViewSource)) {
543 0 : mViewSource->AddErrorToCurrentNode("errNoSpaceBetweenDoctypeSystemKeywordAndQuote");
544 : }
545 0 : }
546 :
547 : void
548 0 : nsHtml5Tokenizer::errNoSpaceBetweenPublicAndSystemIds()
549 : {
550 0 : if (NS_LIKELY(mViewSource)) {
551 0 : mViewSource->AddErrorToCurrentNode("errNoSpaceBetweenPublicAndSystemIds");
552 : }
553 0 : }
554 :
555 : void
556 0 : nsHtml5Tokenizer::errNoSpaceBetweenDoctypePublicKeywordAndQuote()
557 : {
558 0 : if (NS_LIKELY(mViewSource)) {
559 0 : mViewSource->AddErrorToCurrentNode("errNoSpaceBetweenDoctypePublicKeywordAndQuote");
560 : }
561 0 : }
|