1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/parser/html/nsHtml5MetaScanner.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,811 @@ 1.4 +/* 1.5 + * Copyright (c) 2007 Henri Sivonen 1.6 + * Copyright (c) 2008-2010 Mozilla Foundation 1.7 + * 1.8 + * Permission is hereby granted, free of charge, to any person obtaining a 1.9 + * copy of this software and associated documentation files (the "Software"), 1.10 + * to deal in the Software without restriction, including without limitation 1.11 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1.12 + * and/or sell copies of the Software, and to permit persons to whom the 1.13 + * Software is furnished to do so, subject to the following conditions: 1.14 + * 1.15 + * The above copyright notice and this permission notice shall be included in 1.16 + * all copies or substantial portions of the Software. 1.17 + * 1.18 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1.19 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1.20 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1.21 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1.22 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 1.23 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 1.24 + * DEALINGS IN THE SOFTWARE. 1.25 + */ 1.26 + 1.27 +/* 1.28 + * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT. 1.29 + * Please edit MetaScanner.java instead and regenerate. 1.30 + */ 1.31 + 1.32 +#define nsHtml5MetaScanner_cpp__ 1.33 + 1.34 +#include "nsIAtom.h" 1.35 +#include "nsHtml5AtomTable.h" 1.36 +#include "nsString.h" 1.37 +#include "nsNameSpaceManager.h" 1.38 +#include "nsIContent.h" 1.39 +#include "nsTraceRefcnt.h" 1.40 +#include "jArray.h" 1.41 +#include "nsHtml5ArrayCopy.h" 1.42 +#include "nsAHtml5TreeBuilderState.h" 1.43 +#include "nsHtml5Atoms.h" 1.44 +#include "nsHtml5ByteReadable.h" 1.45 +#include "nsIUnicodeDecoder.h" 1.46 +#include "nsHtml5Macros.h" 1.47 +#include "nsIContentHandle.h" 1.48 + 1.49 +#include "nsHtml5Tokenizer.h" 1.50 +#include "nsHtml5TreeBuilder.h" 1.51 +#include "nsHtml5AttributeName.h" 1.52 +#include "nsHtml5ElementName.h" 1.53 +#include "nsHtml5HtmlAttributes.h" 1.54 +#include "nsHtml5StackNode.h" 1.55 +#include "nsHtml5UTF16Buffer.h" 1.56 +#include "nsHtml5StateSnapshot.h" 1.57 +#include "nsHtml5Portability.h" 1.58 + 1.59 +#include "nsHtml5MetaScanner.h" 1.60 + 1.61 +static char16_t const CHARSET_DATA[] = { 'h', 'a', 'r', 's', 'e', 't' }; 1.62 +staticJArray<char16_t,int32_t> nsHtml5MetaScanner::CHARSET = { CHARSET_DATA, MOZ_ARRAY_LENGTH(CHARSET_DATA) }; 1.63 +static char16_t const CONTENT_DATA[] = { 'o', 'n', 't', 'e', 'n', 't' }; 1.64 +staticJArray<char16_t,int32_t> nsHtml5MetaScanner::CONTENT = { CONTENT_DATA, MOZ_ARRAY_LENGTH(CONTENT_DATA) }; 1.65 +static char16_t const HTTP_EQUIV_DATA[] = { 't', 't', 'p', '-', 'e', 'q', 'u', 'i', 'v' }; 1.66 +staticJArray<char16_t,int32_t> nsHtml5MetaScanner::HTTP_EQUIV = { HTTP_EQUIV_DATA, MOZ_ARRAY_LENGTH(HTTP_EQUIV_DATA) }; 1.67 +static char16_t const CONTENT_TYPE_DATA[] = { 'c', 'o', 'n', 't', 'e', 'n', 't', '-', 't', 'y', 'p', 'e' }; 1.68 +staticJArray<char16_t,int32_t> nsHtml5MetaScanner::CONTENT_TYPE = { CONTENT_TYPE_DATA, MOZ_ARRAY_LENGTH(CONTENT_TYPE_DATA) }; 1.69 + 1.70 +nsHtml5MetaScanner::nsHtml5MetaScanner() 1.71 + : readable(nullptr), 1.72 + metaState(NS_HTML5META_SCANNER_NO), 1.73 + contentIndex(INT32_MAX), 1.74 + charsetIndex(INT32_MAX), 1.75 + httpEquivIndex(INT32_MAX), 1.76 + contentTypeIndex(INT32_MAX), 1.77 + stateSave(NS_HTML5META_SCANNER_DATA), 1.78 + strBufLen(0), 1.79 + strBuf(jArray<char16_t,int32_t>::newJArray(36)), 1.80 + content(nullptr), 1.81 + charset(nullptr), 1.82 + httpEquivState(NS_HTML5META_SCANNER_HTTP_EQUIV_NOT_SEEN) 1.83 +{ 1.84 + MOZ_COUNT_CTOR(nsHtml5MetaScanner); 1.85 +} 1.86 + 1.87 + 1.88 +nsHtml5MetaScanner::~nsHtml5MetaScanner() 1.89 +{ 1.90 + MOZ_COUNT_DTOR(nsHtml5MetaScanner); 1.91 + nsHtml5Portability::releaseString(content); 1.92 + nsHtml5Portability::releaseString(charset); 1.93 +} 1.94 + 1.95 +void 1.96 +nsHtml5MetaScanner::stateLoop(int32_t state) 1.97 +{ 1.98 + int32_t c = -1; 1.99 + bool reconsume = false; 1.100 + stateloop: for (; ; ) { 1.101 + switch(state) { 1.102 + case NS_HTML5META_SCANNER_DATA: { 1.103 + for (; ; ) { 1.104 + if (reconsume) { 1.105 + reconsume = false; 1.106 + } else { 1.107 + c = read(); 1.108 + } 1.109 + switch(c) { 1.110 + case -1: { 1.111 + NS_HTML5_BREAK(stateloop); 1.112 + } 1.113 + case '<': { 1.114 + state = NS_HTML5META_SCANNER_TAG_OPEN; 1.115 + NS_HTML5_BREAK(dataloop); 1.116 + } 1.117 + default: { 1.118 + continue; 1.119 + } 1.120 + } 1.121 + } 1.122 + dataloop_end: ; 1.123 + } 1.124 + case NS_HTML5META_SCANNER_TAG_OPEN: { 1.125 + for (; ; ) { 1.126 + c = read(); 1.127 + switch(c) { 1.128 + case -1: { 1.129 + NS_HTML5_BREAK(stateloop); 1.130 + } 1.131 + case 'm': 1.132 + case 'M': { 1.133 + metaState = NS_HTML5META_SCANNER_M; 1.134 + state = NS_HTML5META_SCANNER_TAG_NAME; 1.135 + NS_HTML5_BREAK(tagopenloop); 1.136 + } 1.137 + case '!': { 1.138 + state = NS_HTML5META_SCANNER_MARKUP_DECLARATION_OPEN; 1.139 + NS_HTML5_CONTINUE(stateloop); 1.140 + } 1.141 + case '\?': 1.142 + case '/': { 1.143 + state = NS_HTML5META_SCANNER_SCAN_UNTIL_GT; 1.144 + NS_HTML5_CONTINUE(stateloop); 1.145 + } 1.146 + case '>': { 1.147 + state = NS_HTML5META_SCANNER_DATA; 1.148 + NS_HTML5_CONTINUE(stateloop); 1.149 + } 1.150 + default: { 1.151 + if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) { 1.152 + metaState = NS_HTML5META_SCANNER_NO; 1.153 + state = NS_HTML5META_SCANNER_TAG_NAME; 1.154 + NS_HTML5_BREAK(tagopenloop); 1.155 + } 1.156 + state = NS_HTML5META_SCANNER_DATA; 1.157 + reconsume = true; 1.158 + NS_HTML5_CONTINUE(stateloop); 1.159 + } 1.160 + } 1.161 + } 1.162 + tagopenloop_end: ; 1.163 + } 1.164 + case NS_HTML5META_SCANNER_TAG_NAME: { 1.165 + for (; ; ) { 1.166 + c = read(); 1.167 + switch(c) { 1.168 + case -1: { 1.169 + NS_HTML5_BREAK(stateloop); 1.170 + } 1.171 + case ' ': 1.172 + case '\t': 1.173 + case '\n': 1.174 + case '\f': { 1.175 + state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME; 1.176 + NS_HTML5_BREAK(tagnameloop); 1.177 + } 1.178 + case '/': { 1.179 + state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG; 1.180 + NS_HTML5_CONTINUE(stateloop); 1.181 + } 1.182 + case '>': { 1.183 + state = NS_HTML5META_SCANNER_DATA; 1.184 + NS_HTML5_CONTINUE(stateloop); 1.185 + } 1.186 + case 'e': 1.187 + case 'E': { 1.188 + if (metaState == NS_HTML5META_SCANNER_M) { 1.189 + metaState = NS_HTML5META_SCANNER_E; 1.190 + } else { 1.191 + metaState = NS_HTML5META_SCANNER_NO; 1.192 + } 1.193 + continue; 1.194 + } 1.195 + case 't': 1.196 + case 'T': { 1.197 + if (metaState == NS_HTML5META_SCANNER_E) { 1.198 + metaState = NS_HTML5META_SCANNER_T; 1.199 + } else { 1.200 + metaState = NS_HTML5META_SCANNER_NO; 1.201 + } 1.202 + continue; 1.203 + } 1.204 + case 'a': 1.205 + case 'A': { 1.206 + if (metaState == NS_HTML5META_SCANNER_T) { 1.207 + metaState = NS_HTML5META_SCANNER_A; 1.208 + } else { 1.209 + metaState = NS_HTML5META_SCANNER_NO; 1.210 + } 1.211 + continue; 1.212 + } 1.213 + default: { 1.214 + metaState = NS_HTML5META_SCANNER_NO; 1.215 + continue; 1.216 + } 1.217 + } 1.218 + } 1.219 + tagnameloop_end: ; 1.220 + } 1.221 + case NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME: { 1.222 + for (; ; ) { 1.223 + if (reconsume) { 1.224 + reconsume = false; 1.225 + } else { 1.226 + c = read(); 1.227 + } 1.228 + switch(c) { 1.229 + case -1: { 1.230 + NS_HTML5_BREAK(stateloop); 1.231 + } 1.232 + case ' ': 1.233 + case '\t': 1.234 + case '\n': 1.235 + case '\f': { 1.236 + continue; 1.237 + } 1.238 + case '/': { 1.239 + state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG; 1.240 + NS_HTML5_CONTINUE(stateloop); 1.241 + } 1.242 + case '>': { 1.243 + if (handleTag()) { 1.244 + NS_HTML5_BREAK(stateloop); 1.245 + } 1.246 + state = NS_HTML5META_SCANNER_DATA; 1.247 + NS_HTML5_CONTINUE(stateloop); 1.248 + } 1.249 + case 'c': 1.250 + case 'C': { 1.251 + contentIndex = 0; 1.252 + charsetIndex = 0; 1.253 + httpEquivIndex = INT32_MAX; 1.254 + contentTypeIndex = INT32_MAX; 1.255 + state = NS_HTML5META_SCANNER_ATTRIBUTE_NAME; 1.256 + NS_HTML5_BREAK(beforeattributenameloop); 1.257 + } 1.258 + case 'h': 1.259 + case 'H': { 1.260 + contentIndex = INT32_MAX; 1.261 + charsetIndex = INT32_MAX; 1.262 + httpEquivIndex = 0; 1.263 + contentTypeIndex = INT32_MAX; 1.264 + state = NS_HTML5META_SCANNER_ATTRIBUTE_NAME; 1.265 + NS_HTML5_BREAK(beforeattributenameloop); 1.266 + } 1.267 + default: { 1.268 + contentIndex = INT32_MAX; 1.269 + charsetIndex = INT32_MAX; 1.270 + httpEquivIndex = INT32_MAX; 1.271 + contentTypeIndex = INT32_MAX; 1.272 + state = NS_HTML5META_SCANNER_ATTRIBUTE_NAME; 1.273 + NS_HTML5_BREAK(beforeattributenameloop); 1.274 + } 1.275 + } 1.276 + } 1.277 + beforeattributenameloop_end: ; 1.278 + } 1.279 + case NS_HTML5META_SCANNER_ATTRIBUTE_NAME: { 1.280 + for (; ; ) { 1.281 + c = read(); 1.282 + switch(c) { 1.283 + case -1: { 1.284 + NS_HTML5_BREAK(stateloop); 1.285 + } 1.286 + case ' ': 1.287 + case '\t': 1.288 + case '\n': 1.289 + case '\f': { 1.290 + state = NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_NAME; 1.291 + NS_HTML5_CONTINUE(stateloop); 1.292 + } 1.293 + case '/': { 1.294 + state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG; 1.295 + NS_HTML5_CONTINUE(stateloop); 1.296 + } 1.297 + case '=': { 1.298 + strBufLen = 0; 1.299 + contentTypeIndex = 0; 1.300 + state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_VALUE; 1.301 + NS_HTML5_BREAK(attributenameloop); 1.302 + } 1.303 + case '>': { 1.304 + if (handleTag()) { 1.305 + NS_HTML5_BREAK(stateloop); 1.306 + } 1.307 + state = NS_HTML5META_SCANNER_DATA; 1.308 + NS_HTML5_CONTINUE(stateloop); 1.309 + } 1.310 + default: { 1.311 + if (metaState == NS_HTML5META_SCANNER_A) { 1.312 + if (c >= 'A' && c <= 'Z') { 1.313 + c += 0x20; 1.314 + } 1.315 + if (contentIndex < CONTENT.length && c == CONTENT[contentIndex]) { 1.316 + ++contentIndex; 1.317 + } else { 1.318 + contentIndex = INT32_MAX; 1.319 + } 1.320 + if (charsetIndex < CHARSET.length && c == CHARSET[charsetIndex]) { 1.321 + ++charsetIndex; 1.322 + } else { 1.323 + charsetIndex = INT32_MAX; 1.324 + } 1.325 + if (httpEquivIndex < HTTP_EQUIV.length && c == HTTP_EQUIV[httpEquivIndex]) { 1.326 + ++httpEquivIndex; 1.327 + } else { 1.328 + httpEquivIndex = INT32_MAX; 1.329 + } 1.330 + } 1.331 + continue; 1.332 + } 1.333 + } 1.334 + } 1.335 + attributenameloop_end: ; 1.336 + } 1.337 + case NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_VALUE: { 1.338 + for (; ; ) { 1.339 + c = read(); 1.340 + switch(c) { 1.341 + case -1: { 1.342 + NS_HTML5_BREAK(stateloop); 1.343 + } 1.344 + case ' ': 1.345 + case '\t': 1.346 + case '\n': 1.347 + case '\f': { 1.348 + continue; 1.349 + } 1.350 + case '\"': { 1.351 + state = NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_DOUBLE_QUOTED; 1.352 + NS_HTML5_BREAK(beforeattributevalueloop); 1.353 + } 1.354 + case '\'': { 1.355 + state = NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_SINGLE_QUOTED; 1.356 + NS_HTML5_CONTINUE(stateloop); 1.357 + } 1.358 + case '>': { 1.359 + if (handleTag()) { 1.360 + NS_HTML5_BREAK(stateloop); 1.361 + } 1.362 + state = NS_HTML5META_SCANNER_DATA; 1.363 + NS_HTML5_CONTINUE(stateloop); 1.364 + } 1.365 + default: { 1.366 + handleCharInAttributeValue(c); 1.367 + state = NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_UNQUOTED; 1.368 + NS_HTML5_CONTINUE(stateloop); 1.369 + } 1.370 + } 1.371 + } 1.372 + beforeattributevalueloop_end: ; 1.373 + } 1.374 + case NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_DOUBLE_QUOTED: { 1.375 + for (; ; ) { 1.376 + if (reconsume) { 1.377 + reconsume = false; 1.378 + } else { 1.379 + c = read(); 1.380 + } 1.381 + switch(c) { 1.382 + case -1: { 1.383 + NS_HTML5_BREAK(stateloop); 1.384 + } 1.385 + case '\"': { 1.386 + handleAttributeValue(); 1.387 + state = NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_VALUE_QUOTED; 1.388 + NS_HTML5_BREAK(attributevaluedoublequotedloop); 1.389 + } 1.390 + default: { 1.391 + handleCharInAttributeValue(c); 1.392 + continue; 1.393 + } 1.394 + } 1.395 + } 1.396 + attributevaluedoublequotedloop_end: ; 1.397 + } 1.398 + case NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_VALUE_QUOTED: { 1.399 + for (; ; ) { 1.400 + c = read(); 1.401 + switch(c) { 1.402 + case -1: { 1.403 + NS_HTML5_BREAK(stateloop); 1.404 + } 1.405 + case ' ': 1.406 + case '\t': 1.407 + case '\n': 1.408 + case '\f': { 1.409 + state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME; 1.410 + NS_HTML5_CONTINUE(stateloop); 1.411 + } 1.412 + case '/': { 1.413 + state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG; 1.414 + NS_HTML5_BREAK(afterattributevaluequotedloop); 1.415 + } 1.416 + case '>': { 1.417 + if (handleTag()) { 1.418 + NS_HTML5_BREAK(stateloop); 1.419 + } 1.420 + state = NS_HTML5META_SCANNER_DATA; 1.421 + NS_HTML5_CONTINUE(stateloop); 1.422 + } 1.423 + default: { 1.424 + state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME; 1.425 + reconsume = true; 1.426 + NS_HTML5_CONTINUE(stateloop); 1.427 + } 1.428 + } 1.429 + } 1.430 + afterattributevaluequotedloop_end: ; 1.431 + } 1.432 + case NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG: { 1.433 + c = read(); 1.434 + switch(c) { 1.435 + case -1: { 1.436 + NS_HTML5_BREAK(stateloop); 1.437 + } 1.438 + case '>': { 1.439 + if (handleTag()) { 1.440 + NS_HTML5_BREAK(stateloop); 1.441 + } 1.442 + state = NS_HTML5META_SCANNER_DATA; 1.443 + NS_HTML5_CONTINUE(stateloop); 1.444 + } 1.445 + default: { 1.446 + state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME; 1.447 + reconsume = true; 1.448 + NS_HTML5_CONTINUE(stateloop); 1.449 + } 1.450 + } 1.451 + } 1.452 + case NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_UNQUOTED: { 1.453 + for (; ; ) { 1.454 + if (reconsume) { 1.455 + reconsume = false; 1.456 + } else { 1.457 + c = read(); 1.458 + } 1.459 + switch(c) { 1.460 + case -1: { 1.461 + NS_HTML5_BREAK(stateloop); 1.462 + } 1.463 + case ' ': 1.464 + case '\t': 1.465 + case '\n': 1.466 + case '\f': { 1.467 + handleAttributeValue(); 1.468 + state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME; 1.469 + NS_HTML5_CONTINUE(stateloop); 1.470 + } 1.471 + case '>': { 1.472 + handleAttributeValue(); 1.473 + if (handleTag()) { 1.474 + NS_HTML5_BREAK(stateloop); 1.475 + } 1.476 + state = NS_HTML5META_SCANNER_DATA; 1.477 + NS_HTML5_CONTINUE(stateloop); 1.478 + } 1.479 + default: { 1.480 + handleCharInAttributeValue(c); 1.481 + continue; 1.482 + } 1.483 + } 1.484 + } 1.485 + } 1.486 + case NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_NAME: { 1.487 + for (; ; ) { 1.488 + c = read(); 1.489 + switch(c) { 1.490 + case -1: { 1.491 + NS_HTML5_BREAK(stateloop); 1.492 + } 1.493 + case ' ': 1.494 + case '\t': 1.495 + case '\n': 1.496 + case '\f': { 1.497 + continue; 1.498 + } 1.499 + case '/': { 1.500 + handleAttributeValue(); 1.501 + state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG; 1.502 + NS_HTML5_CONTINUE(stateloop); 1.503 + } 1.504 + case '=': { 1.505 + strBufLen = 0; 1.506 + contentTypeIndex = 0; 1.507 + state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_VALUE; 1.508 + NS_HTML5_CONTINUE(stateloop); 1.509 + } 1.510 + case '>': { 1.511 + handleAttributeValue(); 1.512 + if (handleTag()) { 1.513 + NS_HTML5_BREAK(stateloop); 1.514 + } 1.515 + state = NS_HTML5META_SCANNER_DATA; 1.516 + NS_HTML5_CONTINUE(stateloop); 1.517 + } 1.518 + case 'c': 1.519 + case 'C': { 1.520 + contentIndex = 0; 1.521 + charsetIndex = 0; 1.522 + state = NS_HTML5META_SCANNER_ATTRIBUTE_NAME; 1.523 + NS_HTML5_CONTINUE(stateloop); 1.524 + } 1.525 + default: { 1.526 + contentIndex = INT32_MAX; 1.527 + charsetIndex = INT32_MAX; 1.528 + state = NS_HTML5META_SCANNER_ATTRIBUTE_NAME; 1.529 + NS_HTML5_CONTINUE(stateloop); 1.530 + } 1.531 + } 1.532 + } 1.533 + } 1.534 + case NS_HTML5META_SCANNER_MARKUP_DECLARATION_OPEN: { 1.535 + for (; ; ) { 1.536 + c = read(); 1.537 + switch(c) { 1.538 + case -1: { 1.539 + NS_HTML5_BREAK(stateloop); 1.540 + } 1.541 + case '-': { 1.542 + state = NS_HTML5META_SCANNER_MARKUP_DECLARATION_HYPHEN; 1.543 + NS_HTML5_BREAK(markupdeclarationopenloop); 1.544 + } 1.545 + default: { 1.546 + state = NS_HTML5META_SCANNER_SCAN_UNTIL_GT; 1.547 + reconsume = true; 1.548 + NS_HTML5_CONTINUE(stateloop); 1.549 + } 1.550 + } 1.551 + } 1.552 + markupdeclarationopenloop_end: ; 1.553 + } 1.554 + case NS_HTML5META_SCANNER_MARKUP_DECLARATION_HYPHEN: { 1.555 + for (; ; ) { 1.556 + c = read(); 1.557 + switch(c) { 1.558 + case -1: { 1.559 + NS_HTML5_BREAK(stateloop); 1.560 + } 1.561 + case '-': { 1.562 + state = NS_HTML5META_SCANNER_COMMENT_START; 1.563 + NS_HTML5_BREAK(markupdeclarationhyphenloop); 1.564 + } 1.565 + default: { 1.566 + state = NS_HTML5META_SCANNER_SCAN_UNTIL_GT; 1.567 + reconsume = true; 1.568 + NS_HTML5_CONTINUE(stateloop); 1.569 + } 1.570 + } 1.571 + } 1.572 + markupdeclarationhyphenloop_end: ; 1.573 + } 1.574 + case NS_HTML5META_SCANNER_COMMENT_START: { 1.575 + for (; ; ) { 1.576 + c = read(); 1.577 + switch(c) { 1.578 + case -1: { 1.579 + NS_HTML5_BREAK(stateloop); 1.580 + } 1.581 + case '-': { 1.582 + state = NS_HTML5META_SCANNER_COMMENT_START_DASH; 1.583 + NS_HTML5_CONTINUE(stateloop); 1.584 + } 1.585 + case '>': { 1.586 + state = NS_HTML5META_SCANNER_DATA; 1.587 + NS_HTML5_CONTINUE(stateloop); 1.588 + } 1.589 + default: { 1.590 + state = NS_HTML5META_SCANNER_COMMENT; 1.591 + NS_HTML5_BREAK(commentstartloop); 1.592 + } 1.593 + } 1.594 + } 1.595 + commentstartloop_end: ; 1.596 + } 1.597 + case NS_HTML5META_SCANNER_COMMENT: { 1.598 + for (; ; ) { 1.599 + c = read(); 1.600 + switch(c) { 1.601 + case -1: { 1.602 + NS_HTML5_BREAK(stateloop); 1.603 + } 1.604 + case '-': { 1.605 + state = NS_HTML5META_SCANNER_COMMENT_END_DASH; 1.606 + NS_HTML5_BREAK(commentloop); 1.607 + } 1.608 + default: { 1.609 + continue; 1.610 + } 1.611 + } 1.612 + } 1.613 + commentloop_end: ; 1.614 + } 1.615 + case NS_HTML5META_SCANNER_COMMENT_END_DASH: { 1.616 + for (; ; ) { 1.617 + c = read(); 1.618 + switch(c) { 1.619 + case -1: { 1.620 + NS_HTML5_BREAK(stateloop); 1.621 + } 1.622 + case '-': { 1.623 + state = NS_HTML5META_SCANNER_COMMENT_END; 1.624 + NS_HTML5_BREAK(commentenddashloop); 1.625 + } 1.626 + default: { 1.627 + state = NS_HTML5META_SCANNER_COMMENT; 1.628 + NS_HTML5_CONTINUE(stateloop); 1.629 + } 1.630 + } 1.631 + } 1.632 + commentenddashloop_end: ; 1.633 + } 1.634 + case NS_HTML5META_SCANNER_COMMENT_END: { 1.635 + for (; ; ) { 1.636 + c = read(); 1.637 + switch(c) { 1.638 + case -1: { 1.639 + NS_HTML5_BREAK(stateloop); 1.640 + } 1.641 + case '>': { 1.642 + state = NS_HTML5META_SCANNER_DATA; 1.643 + NS_HTML5_CONTINUE(stateloop); 1.644 + } 1.645 + case '-': { 1.646 + continue; 1.647 + } 1.648 + default: { 1.649 + state = NS_HTML5META_SCANNER_COMMENT; 1.650 + NS_HTML5_CONTINUE(stateloop); 1.651 + } 1.652 + } 1.653 + } 1.654 + } 1.655 + case NS_HTML5META_SCANNER_COMMENT_START_DASH: { 1.656 + c = read(); 1.657 + switch(c) { 1.658 + case -1: { 1.659 + NS_HTML5_BREAK(stateloop); 1.660 + } 1.661 + case '-': { 1.662 + state = NS_HTML5META_SCANNER_COMMENT_END; 1.663 + NS_HTML5_CONTINUE(stateloop); 1.664 + } 1.665 + case '>': { 1.666 + state = NS_HTML5META_SCANNER_DATA; 1.667 + NS_HTML5_CONTINUE(stateloop); 1.668 + } 1.669 + default: { 1.670 + state = NS_HTML5META_SCANNER_COMMENT; 1.671 + NS_HTML5_CONTINUE(stateloop); 1.672 + } 1.673 + } 1.674 + } 1.675 + case NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_SINGLE_QUOTED: { 1.676 + for (; ; ) { 1.677 + if (reconsume) { 1.678 + reconsume = false; 1.679 + } else { 1.680 + c = read(); 1.681 + } 1.682 + switch(c) { 1.683 + case -1: { 1.684 + NS_HTML5_BREAK(stateloop); 1.685 + } 1.686 + case '\'': { 1.687 + handleAttributeValue(); 1.688 + state = NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_VALUE_QUOTED; 1.689 + NS_HTML5_CONTINUE(stateloop); 1.690 + } 1.691 + default: { 1.692 + handleCharInAttributeValue(c); 1.693 + continue; 1.694 + } 1.695 + } 1.696 + } 1.697 + } 1.698 + case NS_HTML5META_SCANNER_SCAN_UNTIL_GT: { 1.699 + for (; ; ) { 1.700 + if (reconsume) { 1.701 + reconsume = false; 1.702 + } else { 1.703 + c = read(); 1.704 + } 1.705 + switch(c) { 1.706 + case -1: { 1.707 + NS_HTML5_BREAK(stateloop); 1.708 + } 1.709 + case '>': { 1.710 + state = NS_HTML5META_SCANNER_DATA; 1.711 + NS_HTML5_CONTINUE(stateloop); 1.712 + } 1.713 + default: { 1.714 + continue; 1.715 + } 1.716 + } 1.717 + } 1.718 + } 1.719 + } 1.720 + } 1.721 + stateloop_end: ; 1.722 + stateSave = state; 1.723 +} 1.724 + 1.725 +void 1.726 +nsHtml5MetaScanner::handleCharInAttributeValue(int32_t c) 1.727 +{ 1.728 + if (metaState == NS_HTML5META_SCANNER_A) { 1.729 + if (contentIndex == CONTENT.length || charsetIndex == CHARSET.length) { 1.730 + addToBuffer(c); 1.731 + } else if (httpEquivIndex == HTTP_EQUIV.length) { 1.732 + if (contentTypeIndex < CONTENT_TYPE.length && toAsciiLowerCase(c) == CONTENT_TYPE[contentTypeIndex]) { 1.733 + ++contentTypeIndex; 1.734 + } else { 1.735 + contentTypeIndex = INT32_MAX; 1.736 + } 1.737 + } 1.738 + } 1.739 +} 1.740 + 1.741 +void 1.742 +nsHtml5MetaScanner::addToBuffer(int32_t c) 1.743 +{ 1.744 + if (strBufLen == strBuf.length) { 1.745 + jArray<char16_t,int32_t> newBuf = jArray<char16_t,int32_t>::newJArray(strBuf.length + (strBuf.length << 1)); 1.746 + nsHtml5ArrayCopy::arraycopy(strBuf, newBuf, strBuf.length); 1.747 + strBuf = newBuf; 1.748 + } 1.749 + strBuf[strBufLen++] = (char16_t) c; 1.750 +} 1.751 + 1.752 +void 1.753 +nsHtml5MetaScanner::handleAttributeValue() 1.754 +{ 1.755 + if (metaState != NS_HTML5META_SCANNER_A) { 1.756 + return; 1.757 + } 1.758 + if (contentIndex == CONTENT.length && !content) { 1.759 + content = nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen); 1.760 + return; 1.761 + } 1.762 + if (charsetIndex == CHARSET.length && !charset) { 1.763 + charset = nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen); 1.764 + return; 1.765 + } 1.766 + if (httpEquivIndex == HTTP_EQUIV.length && httpEquivState == NS_HTML5META_SCANNER_HTTP_EQUIV_NOT_SEEN) { 1.767 + httpEquivState = (contentTypeIndex == CONTENT_TYPE.length) ? NS_HTML5META_SCANNER_HTTP_EQUIV_CONTENT_TYPE : NS_HTML5META_SCANNER_HTTP_EQUIV_OTHER; 1.768 + return; 1.769 + } 1.770 +} 1.771 + 1.772 +bool 1.773 +nsHtml5MetaScanner::handleTag() 1.774 +{ 1.775 + bool stop = handleTagInner(); 1.776 + nsHtml5Portability::releaseString(content); 1.777 + content = nullptr; 1.778 + nsHtml5Portability::releaseString(charset); 1.779 + charset = nullptr; 1.780 + httpEquivState = NS_HTML5META_SCANNER_HTTP_EQUIV_NOT_SEEN; 1.781 + return stop; 1.782 +} 1.783 + 1.784 +bool 1.785 +nsHtml5MetaScanner::handleTagInner() 1.786 +{ 1.787 + if (!!charset && tryCharset(charset)) { 1.788 + return true; 1.789 + } 1.790 + if (!!content && httpEquivState == NS_HTML5META_SCANNER_HTTP_EQUIV_CONTENT_TYPE) { 1.791 + nsString* extract = nsHtml5TreeBuilder::extractCharsetFromContent(content); 1.792 + if (!extract) { 1.793 + return false; 1.794 + } 1.795 + bool success = tryCharset(extract); 1.796 + nsHtml5Portability::releaseString(extract); 1.797 + return success; 1.798 + } 1.799 + return false; 1.800 +} 1.801 + 1.802 +void 1.803 +nsHtml5MetaScanner::initializeStatics() 1.804 +{ 1.805 +} 1.806 + 1.807 +void 1.808 +nsHtml5MetaScanner::releaseStatics() 1.809 +{ 1.810 +} 1.811 + 1.812 + 1.813 +#include "nsHtml5MetaScannerCppSupplement.h" 1.814 +