parser/html/nsHtml5MetaScanner.cpp

changeset 0
6474c204b198
     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 +

mercurial