LCOV - code coverage report
Current view: top level - parser/html - nsHtml5MetaScanner.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 156 338 46.2 %
Date: 2017-07-14 16:53:18 Functions: 8 10 80.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2007 Henri Sivonen
       3             :  * Copyright (c) 2008-2015 Mozilla Foundation
       4             :  *
       5             :  * Permission is hereby granted, free of charge, to any person obtaining a
       6             :  * copy of this software and associated documentation files (the "Software"),
       7             :  * to deal in the Software without restriction, including without limitation
       8             :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
       9             :  * and/or sell copies of the Software, and to permit persons to whom the
      10             :  * Software is furnished to do so, subject to the following conditions:
      11             :  *
      12             :  * The above copyright notice and this permission notice shall be included in
      13             :  * all copies or substantial portions of the Software.
      14             :  *
      15             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      16             :  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      17             :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
      18             :  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      19             :  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
      20             :  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
      21             :  * DEALINGS IN THE SOFTWARE.
      22             :  */
      23             : 
      24             : /*
      25             :  * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
      26             :  * Please edit MetaScanner.java instead and regenerate.
      27             :  */
      28             : 
      29             : #define nsHtml5MetaScanner_cpp__
      30             : 
      31             : #include "nsIAtom.h"
      32             : #include "nsHtml5AtomTable.h"
      33             : #include "nsHtml5String.h"
      34             : #include "nsNameSpaceManager.h"
      35             : #include "nsIContent.h"
      36             : #include "nsTraceRefcnt.h"
      37             : #include "jArray.h"
      38             : #include "nsHtml5ArrayCopy.h"
      39             : #include "nsAHtml5TreeBuilderState.h"
      40             : #include "nsGkAtoms.h"
      41             : #include "nsHtml5ByteReadable.h"
      42             : #include "nsHtml5Macros.h"
      43             : #include "nsIContentHandle.h"
      44             : #include "nsHtml5Portability.h"
      45             : 
      46             : #include "nsHtml5AttributeName.h"
      47             : #include "nsHtml5ElementName.h"
      48             : #include "nsHtml5Tokenizer.h"
      49             : #include "nsHtml5TreeBuilder.h"
      50             : #include "nsHtml5StackNode.h"
      51             : #include "nsHtml5UTF16Buffer.h"
      52             : #include "nsHtml5StateSnapshot.h"
      53             : #include "nsHtml5Portability.h"
      54             : 
      55             : #include "nsHtml5MetaScanner.h"
      56             : 
      57             : static char16_t const CHARSET_DATA[] = { 'h', 'a', 'r', 's', 'e', 't' };
      58             : staticJArray<char16_t,int32_t> nsHtml5MetaScanner::CHARSET = { CHARSET_DATA, MOZ_ARRAY_LENGTH(CHARSET_DATA) };
      59             : static char16_t const CONTENT_DATA[] = { 'o', 'n', 't', 'e', 'n', 't' };
      60             : staticJArray<char16_t,int32_t> nsHtml5MetaScanner::CONTENT = { CONTENT_DATA, MOZ_ARRAY_LENGTH(CONTENT_DATA) };
      61             : static char16_t const HTTP_EQUIV_DATA[] = { 't', 't', 'p', '-', 'e', 'q', 'u', 'i', 'v' };
      62             : staticJArray<char16_t,int32_t> nsHtml5MetaScanner::HTTP_EQUIV = { HTTP_EQUIV_DATA, MOZ_ARRAY_LENGTH(HTTP_EQUIV_DATA) };
      63             : static char16_t const CONTENT_TYPE_DATA[] = { 'c', 'o', 'n', 't', 'e', 'n', 't', '-', 't', 'y', 'p', 'e' };
      64             : staticJArray<char16_t,int32_t> nsHtml5MetaScanner::CONTENT_TYPE = { CONTENT_TYPE_DATA, MOZ_ARRAY_LENGTH(CONTENT_TYPE_DATA) };
      65             : 
      66           2 : nsHtml5MetaScanner::nsHtml5MetaScanner(nsHtml5TreeBuilder* tb)
      67             :   : readable(nullptr)
      68             :   , metaState(NO)
      69             :   , contentIndex(INT32_MAX)
      70             :   , charsetIndex(INT32_MAX)
      71             :   , httpEquivIndex(INT32_MAX)
      72             :   , contentTypeIndex(INT32_MAX)
      73             :   , stateSave(DATA)
      74             :   , strBufLen(0)
      75           4 :   , strBuf(jArray<char16_t, int32_t>::newJArray(36))
      76             :   , content(nullptr)
      77             :   , charset(nullptr)
      78             :   , httpEquivState(HTTP_EQUIV_NOT_SEEN)
      79             :   , treeBuilder(tb)
      80           6 :   , mEncoding(nullptr)
      81             : {
      82           2 :   MOZ_COUNT_CTOR(nsHtml5MetaScanner);
      83           2 : }
      84             : 
      85             : 
      86           4 : nsHtml5MetaScanner::~nsHtml5MetaScanner()
      87             : {
      88           2 :   MOZ_COUNT_DTOR(nsHtml5MetaScanner);
      89           2 :   content.Release();
      90           2 :   charset.Release();
      91           2 : }
      92             : 
      93             : void 
      94           2 : nsHtml5MetaScanner::stateLoop(int32_t state)
      95             : {
      96           2 :   int32_t c = -1;
      97           2 :   bool reconsume = false;
      98             :   stateloop: for (; ; ) {
      99          16 :     switch(state) {
     100             :       case DATA: {
     101             :         for (; ; ) {
     102          16 :           if (reconsume) {
     103           0 :             reconsume = false;
     104             :           } else {
     105          12 :             c = read();
     106             :           }
     107          12 :           switch(c) {
     108             :             case -1: {
     109           0 :               NS_HTML5_BREAK(stateloop);
     110             :             }
     111             :             case '<': {
     112           8 :               state = nsHtml5MetaScanner::TAG_OPEN;
     113           8 :               NS_HTML5_BREAK(dataloop);
     114             :             }
     115             :             default: {
     116           4 :               continue;
     117             :             }
     118             :           }
     119             :         }
     120             :         dataloop_end: ;
     121             :       }
     122             :       case TAG_OPEN: {
     123             :         for (; ; ) {
     124           8 :           c = read();
     125           8 :           switch(c) {
     126             :             case -1: {
     127           0 :               NS_HTML5_BREAK(stateloop);
     128             :             }
     129             :             case 'm':
     130             :             case 'M': {
     131           2 :               metaState = M;
     132           2 :               state = nsHtml5MetaScanner::TAG_NAME;
     133           2 :               NS_HTML5_BREAK(tagopenloop);
     134             :             }
     135             :             case '!': {
     136           3 :               state = nsHtml5MetaScanner::MARKUP_DECLARATION_OPEN;
     137           3 :               NS_HTML5_CONTINUE(stateloop);
     138             :             }
     139             :             case '\?':
     140             :             case '/': {
     141           0 :               state = nsHtml5MetaScanner::SCAN_UNTIL_GT;
     142           0 :               NS_HTML5_CONTINUE(stateloop);
     143             :             }
     144             :             case '>': {
     145           0 :               state = nsHtml5MetaScanner::DATA;
     146           0 :               NS_HTML5_CONTINUE(stateloop);
     147             :             }
     148             :             default: {
     149           3 :               if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
     150           3 :                 metaState = NO;
     151           3 :                 state = nsHtml5MetaScanner::TAG_NAME;
     152           3 :                 NS_HTML5_BREAK(tagopenloop);
     153             :               }
     154           0 :               state = nsHtml5MetaScanner::DATA;
     155           0 :               reconsume = true;
     156           0 :               NS_HTML5_CONTINUE(stateloop);
     157             :             }
     158             :           }
     159             :         }
     160             :         tagopenloop_end: ;
     161             :       }
     162             :       case TAG_NAME: {
     163             :         for (; ; ) {
     164          35 :           c = read();
     165          20 :           switch(c) {
     166             :             case -1: {
     167           0 :               NS_HTML5_BREAK(stateloop);
     168             :             }
     169             :             case ' ':
     170             :             case '\t':
     171             :             case '\n':
     172             :             case '\f': {
     173           2 :               state = nsHtml5MetaScanner::BEFORE_ATTRIBUTE_NAME;
     174           2 :               NS_HTML5_BREAK(tagnameloop);
     175             :             }
     176             :             case '/': {
     177           0 :               state = nsHtml5MetaScanner::SELF_CLOSING_START_TAG;
     178           0 :               NS_HTML5_CONTINUE(stateloop);
     179             :             }
     180             :             case '>': {
     181           3 :               state = nsHtml5MetaScanner::DATA;
     182           3 :               NS_HTML5_CONTINUE(stateloop);
     183             :             }
     184             :             case 'e':
     185             :             case 'E': {
     186           3 :               if (metaState == M) {
     187           2 :                 metaState = E;
     188             :               } else {
     189           1 :                 metaState = NO;
     190             :               }
     191           3 :               continue;
     192             :             }
     193             :             case 't':
     194             :             case 'T': {
     195           4 :               if (metaState == E) {
     196           2 :                 metaState = T;
     197             :               } else {
     198           2 :                 metaState = NO;
     199             :               }
     200           4 :               continue;
     201             :             }
     202             :             case 'a':
     203             :             case 'A': {
     204           3 :               if (metaState == T) {
     205           2 :                 metaState = A;
     206             :               } else {
     207           1 :                 metaState = NO;
     208             :               }
     209           3 :               continue;
     210             :             }
     211             :             default: {
     212           5 :               metaState = NO;
     213           5 :               continue;
     214             :             }
     215             :           }
     216             :         }
     217             :         tagnameloop_end: ;
     218             :       }
     219             :       case BEFORE_ATTRIBUTE_NAME: {
     220             :         for (; ; ) {
     221           2 :           if (reconsume) {
     222           0 :             reconsume = false;
     223             :           } else {
     224           2 :             c = read();
     225             :           }
     226           2 :           switch(c) {
     227             :             case -1: {
     228           0 :               NS_HTML5_BREAK(stateloop);
     229             :             }
     230             :             case ' ':
     231             :             case '\t':
     232             :             case '\n':
     233             :             case '\f': {
     234           0 :               continue;
     235             :             }
     236             :             case '/': {
     237           0 :               state = nsHtml5MetaScanner::SELF_CLOSING_START_TAG;
     238           0 :               NS_HTML5_CONTINUE(stateloop);
     239             :             }
     240             :             case '>': {
     241           0 :               if (handleTag()) {
     242           0 :                 NS_HTML5_BREAK(stateloop);
     243             :               }
     244           0 :               state = DATA;
     245           0 :               NS_HTML5_CONTINUE(stateloop);
     246             :             }
     247             :             case 'c':
     248             :             case 'C': {
     249           2 :               contentIndex = 0;
     250           2 :               charsetIndex = 0;
     251           2 :               httpEquivIndex = INT32_MAX;
     252           2 :               contentTypeIndex = INT32_MAX;
     253           2 :               state = nsHtml5MetaScanner::ATTRIBUTE_NAME;
     254           2 :               NS_HTML5_BREAK(beforeattributenameloop);
     255             :             }
     256             :             case 'h':
     257             :             case 'H': {
     258           0 :               contentIndex = INT32_MAX;
     259           0 :               charsetIndex = INT32_MAX;
     260           0 :               httpEquivIndex = 0;
     261           0 :               contentTypeIndex = INT32_MAX;
     262           0 :               state = nsHtml5MetaScanner::ATTRIBUTE_NAME;
     263           0 :               NS_HTML5_BREAK(beforeattributenameloop);
     264             :             }
     265             :             default: {
     266           0 :               contentIndex = INT32_MAX;
     267           0 :               charsetIndex = INT32_MAX;
     268           0 :               httpEquivIndex = INT32_MAX;
     269           0 :               contentTypeIndex = INT32_MAX;
     270           0 :               state = nsHtml5MetaScanner::ATTRIBUTE_NAME;
     271           0 :               NS_HTML5_BREAK(beforeattributenameloop);
     272             :             }
     273             :           }
     274             :         }
     275             :         beforeattributenameloop_end: ;
     276             :       }
     277             :       case ATTRIBUTE_NAME: {
     278             :         for (; ; ) {
     279          26 :           c = read();
     280          14 :           switch(c) {
     281             :             case -1: {
     282           0 :               NS_HTML5_BREAK(stateloop);
     283             :             }
     284             :             case ' ':
     285             :             case '\t':
     286             :             case '\n':
     287             :             case '\f': {
     288           0 :               state = nsHtml5MetaScanner::AFTER_ATTRIBUTE_NAME;
     289           0 :               NS_HTML5_CONTINUE(stateloop);
     290             :             }
     291             :             case '/': {
     292           0 :               state = nsHtml5MetaScanner::SELF_CLOSING_START_TAG;
     293           0 :               NS_HTML5_CONTINUE(stateloop);
     294             :             }
     295             :             case '=': {
     296           2 :               strBufLen = 0;
     297           2 :               contentTypeIndex = 0;
     298           2 :               state = nsHtml5MetaScanner::BEFORE_ATTRIBUTE_VALUE;
     299           2 :               NS_HTML5_BREAK(attributenameloop);
     300             :             }
     301             :             case '>': {
     302           0 :               if (handleTag()) {
     303           0 :                 NS_HTML5_BREAK(stateloop);
     304             :               }
     305           0 :               state = nsHtml5MetaScanner::DATA;
     306           0 :               NS_HTML5_CONTINUE(stateloop);
     307             :             }
     308             :             default: {
     309          12 :               if (metaState == A) {
     310          12 :                 if (c >= 'A' && c <= 'Z') {
     311           0 :                   c += 0x20;
     312             :                 }
     313          12 :                 if (contentIndex < CONTENT.length && c == CONTENT[contentIndex]) {
     314           0 :                   ++contentIndex;
     315             :                 } else {
     316          12 :                   contentIndex = INT32_MAX;
     317             :                 }
     318          12 :                 if (charsetIndex < CHARSET.length && c == CHARSET[charsetIndex]) {
     319          12 :                   ++charsetIndex;
     320             :                 } else {
     321           0 :                   charsetIndex = INT32_MAX;
     322             :                 }
     323          12 :                 if (httpEquivIndex < HTTP_EQUIV.length && c == HTTP_EQUIV[httpEquivIndex]) {
     324           0 :                   ++httpEquivIndex;
     325             :                 } else {
     326          12 :                   httpEquivIndex = INT32_MAX;
     327             :                 }
     328             :               }
     329          12 :               continue;
     330             :             }
     331             :           }
     332             :         }
     333             :         attributenameloop_end: ;
     334             :       }
     335             :       case BEFORE_ATTRIBUTE_VALUE: {
     336             :         for (; ; ) {
     337           2 :           c = read();
     338           2 :           switch(c) {
     339             :             case -1: {
     340           0 :               NS_HTML5_BREAK(stateloop);
     341             :             }
     342             :             case ' ':
     343             :             case '\t':
     344             :             case '\n':
     345             :             case '\f': {
     346           0 :               continue;
     347             :             }
     348             :             case '\"': {
     349           2 :               state = nsHtml5MetaScanner::ATTRIBUTE_VALUE_DOUBLE_QUOTED;
     350           2 :               NS_HTML5_BREAK(beforeattributevalueloop);
     351             :             }
     352             :             case '\'': {
     353           0 :               state = nsHtml5MetaScanner::ATTRIBUTE_VALUE_SINGLE_QUOTED;
     354           0 :               NS_HTML5_CONTINUE(stateloop);
     355             :             }
     356             :             case '>': {
     357           0 :               if (handleTag()) {
     358           0 :                 NS_HTML5_BREAK(stateloop);
     359             :               }
     360           0 :               state = nsHtml5MetaScanner::DATA;
     361           0 :               NS_HTML5_CONTINUE(stateloop);
     362             :             }
     363             :             default: {
     364           0 :               handleCharInAttributeValue(c);
     365           0 :               state = nsHtml5MetaScanner::ATTRIBUTE_VALUE_UNQUOTED;
     366           0 :               NS_HTML5_CONTINUE(stateloop);
     367             :             }
     368             :           }
     369             :         }
     370             :         beforeattributevalueloop_end: ;
     371             :       }
     372             :       case ATTRIBUTE_VALUE_DOUBLE_QUOTED: {
     373             :         for (; ; ) {
     374          22 :           if (reconsume) {
     375           0 :             reconsume = false;
     376             :           } else {
     377          12 :             c = read();
     378             :           }
     379          12 :           switch(c) {
     380             :             case -1: {
     381           0 :               NS_HTML5_BREAK(stateloop);
     382             :             }
     383             :             case '\"': {
     384           2 :               handleAttributeValue();
     385           2 :               state = nsHtml5MetaScanner::AFTER_ATTRIBUTE_VALUE_QUOTED;
     386           2 :               NS_HTML5_BREAK(attributevaluedoublequotedloop);
     387             :             }
     388             :             default: {
     389          10 :               handleCharInAttributeValue(c);
     390          10 :               continue;
     391             :             }
     392             :           }
     393             :         }
     394             :         attributevaluedoublequotedloop_end: ;
     395             :       }
     396             :       case AFTER_ATTRIBUTE_VALUE_QUOTED: {
     397             :         for (; ; ) {
     398           2 :           c = read();
     399           2 :           switch(c) {
     400             :             case -1: {
     401           0 :               NS_HTML5_BREAK(stateloop);
     402             :             }
     403             :             case ' ':
     404             :             case '\t':
     405             :             case '\n':
     406             :             case '\f': {
     407           0 :               state = nsHtml5MetaScanner::BEFORE_ATTRIBUTE_NAME;
     408           0 :               NS_HTML5_CONTINUE(stateloop);
     409             :             }
     410             :             case '/': {
     411           0 :               state = nsHtml5MetaScanner::SELF_CLOSING_START_TAG;
     412           0 :               NS_HTML5_BREAK(afterattributevaluequotedloop);
     413             :             }
     414             :             case '>': {
     415           2 :               if (handleTag()) {
     416           2 :                 NS_HTML5_BREAK(stateloop);
     417             :               }
     418           0 :               state = nsHtml5MetaScanner::DATA;
     419           0 :               NS_HTML5_CONTINUE(stateloop);
     420             :             }
     421             :             default: {
     422           0 :               state = nsHtml5MetaScanner::BEFORE_ATTRIBUTE_NAME;
     423           0 :               reconsume = true;
     424           0 :               NS_HTML5_CONTINUE(stateloop);
     425             :             }
     426             :           }
     427             :         }
     428             :         afterattributevaluequotedloop_end: ;
     429             :       }
     430             :       case SELF_CLOSING_START_TAG: {
     431           0 :         c = read();
     432           0 :         switch(c) {
     433             :           case -1: {
     434           0 :             NS_HTML5_BREAK(stateloop);
     435             :           }
     436             :           case '>': {
     437           0 :             if (handleTag()) {
     438           0 :               NS_HTML5_BREAK(stateloop);
     439             :             }
     440           0 :             state = nsHtml5MetaScanner::DATA;
     441           0 :             NS_HTML5_CONTINUE(stateloop);
     442             :           }
     443             :           default: {
     444           0 :             state = nsHtml5MetaScanner::BEFORE_ATTRIBUTE_NAME;
     445           0 :             reconsume = true;
     446           0 :             NS_HTML5_CONTINUE(stateloop);
     447             :           }
     448             :         }
     449             :       }
     450             :       case ATTRIBUTE_VALUE_UNQUOTED: {
     451             :         for (; ; ) {
     452           0 :           if (reconsume) {
     453           0 :             reconsume = false;
     454             :           } else {
     455           0 :             c = read();
     456             :           }
     457           0 :           switch(c) {
     458             :             case -1: {
     459           0 :               NS_HTML5_BREAK(stateloop);
     460             :             }
     461             :             case ' ':
     462             :             case '\t':
     463             :             case '\n':
     464             :             case '\f': {
     465           0 :               handleAttributeValue();
     466           0 :               state = nsHtml5MetaScanner::BEFORE_ATTRIBUTE_NAME;
     467           0 :               NS_HTML5_CONTINUE(stateloop);
     468             :             }
     469             :             case '>': {
     470           0 :               handleAttributeValue();
     471           0 :               if (handleTag()) {
     472           0 :                 NS_HTML5_BREAK(stateloop);
     473             :               }
     474           0 :               state = nsHtml5MetaScanner::DATA;
     475           0 :               NS_HTML5_CONTINUE(stateloop);
     476             :             }
     477             :             default: {
     478           0 :               handleCharInAttributeValue(c);
     479           0 :               continue;
     480             :             }
     481             :           }
     482             :         }
     483             :       }
     484             :       case AFTER_ATTRIBUTE_NAME: {
     485             :         for (; ; ) {
     486           0 :           c = read();
     487           0 :           switch(c) {
     488             :             case -1: {
     489           0 :               NS_HTML5_BREAK(stateloop);
     490             :             }
     491             :             case ' ':
     492             :             case '\t':
     493             :             case '\n':
     494             :             case '\f': {
     495           0 :               continue;
     496             :             }
     497             :             case '/': {
     498           0 :               handleAttributeValue();
     499           0 :               state = nsHtml5MetaScanner::SELF_CLOSING_START_TAG;
     500           0 :               NS_HTML5_CONTINUE(stateloop);
     501             :             }
     502             :             case '=': {
     503           0 :               strBufLen = 0;
     504           0 :               contentTypeIndex = 0;
     505           0 :               state = nsHtml5MetaScanner::BEFORE_ATTRIBUTE_VALUE;
     506           0 :               NS_HTML5_CONTINUE(stateloop);
     507             :             }
     508             :             case '>': {
     509           0 :               handleAttributeValue();
     510           0 :               if (handleTag()) {
     511           0 :                 NS_HTML5_BREAK(stateloop);
     512             :               }
     513           0 :               state = nsHtml5MetaScanner::DATA;
     514           0 :               NS_HTML5_CONTINUE(stateloop);
     515             :             }
     516             :             case 'c':
     517             :             case 'C': {
     518           0 :               contentIndex = 0;
     519           0 :               charsetIndex = 0;
     520           0 :               state = nsHtml5MetaScanner::ATTRIBUTE_NAME;
     521           0 :               NS_HTML5_CONTINUE(stateloop);
     522             :             }
     523             :             default: {
     524           0 :               contentIndex = INT32_MAX;
     525           0 :               charsetIndex = INT32_MAX;
     526           0 :               state = nsHtml5MetaScanner::ATTRIBUTE_NAME;
     527           0 :               NS_HTML5_CONTINUE(stateloop);
     528             :             }
     529             :           }
     530             :         }
     531             :       }
     532             :       case MARKUP_DECLARATION_OPEN: {
     533             :         for (; ; ) {
     534           3 :           c = read();
     535           3 :           switch(c) {
     536             :             case -1: {
     537           0 :               NS_HTML5_BREAK(stateloop);
     538             :             }
     539             :             case '-': {
     540           2 :               state = nsHtml5MetaScanner::MARKUP_DECLARATION_HYPHEN;
     541           2 :               NS_HTML5_BREAK(markupdeclarationopenloop);
     542             :             }
     543             :             default: {
     544           1 :               state = nsHtml5MetaScanner::SCAN_UNTIL_GT;
     545           1 :               reconsume = true;
     546           1 :               NS_HTML5_CONTINUE(stateloop);
     547             :             }
     548             :           }
     549             :         }
     550             :         markupdeclarationopenloop_end: ;
     551             :       }
     552             :       case MARKUP_DECLARATION_HYPHEN: {
     553             :         for (; ; ) {
     554           2 :           c = read();
     555           2 :           switch(c) {
     556             :             case -1: {
     557           0 :               NS_HTML5_BREAK(stateloop);
     558             :             }
     559             :             case '-': {
     560           2 :               state = nsHtml5MetaScanner::COMMENT_START;
     561           2 :               NS_HTML5_BREAK(markupdeclarationhyphenloop);
     562             :             }
     563             :             default: {
     564           0 :               state = nsHtml5MetaScanner::SCAN_UNTIL_GT;
     565           0 :               reconsume = true;
     566           0 :               NS_HTML5_CONTINUE(stateloop);
     567             :             }
     568             :           }
     569             :         }
     570             :         markupdeclarationhyphenloop_end: ;
     571             :       }
     572             :       case COMMENT_START: {
     573             :         for (; ; ) {
     574           2 :           c = read();
     575           2 :           switch(c) {
     576             :             case -1: {
     577           0 :               NS_HTML5_BREAK(stateloop);
     578             :             }
     579             :             case '-': {
     580           0 :               state = nsHtml5MetaScanner::COMMENT_START_DASH;
     581           0 :               NS_HTML5_CONTINUE(stateloop);
     582             :             }
     583             :             case '>': {
     584           0 :               state = nsHtml5MetaScanner::DATA;
     585           0 :               NS_HTML5_CONTINUE(stateloop);
     586             :             }
     587             :             default: {
     588           2 :               state = nsHtml5MetaScanner::COMMENT;
     589           2 :               NS_HTML5_BREAK(commentstartloop);
     590             :             }
     591             :           }
     592             :         }
     593             :         commentstartloop_end: ;
     594             :       }
     595             :       case COMMENT: {
     596             :         for (; ; ) {
     597         804 :           c = read();
     598         405 :           switch(c) {
     599             :             case -1: {
     600           0 :               NS_HTML5_BREAK(stateloop);
     601             :             }
     602             :             case '-': {
     603           6 :               state = nsHtml5MetaScanner::COMMENT_END_DASH;
     604           6 :               NS_HTML5_BREAK(commentloop);
     605             :             }
     606             :             default: {
     607         399 :               continue;
     608             :             }
     609             :           }
     610             :         }
     611             :         commentloop_end: ;
     612             :       }
     613             :       case COMMENT_END_DASH: {
     614             :         for (; ; ) {
     615           6 :           c = read();
     616           6 :           switch(c) {
     617             :             case -1: {
     618           0 :               NS_HTML5_BREAK(stateloop);
     619             :             }
     620             :             case '-': {
     621           2 :               state = nsHtml5MetaScanner::COMMENT_END;
     622           2 :               NS_HTML5_BREAK(commentenddashloop);
     623             :             }
     624             :             default: {
     625           4 :               state = nsHtml5MetaScanner::COMMENT;
     626           4 :               NS_HTML5_CONTINUE(stateloop);
     627             :             }
     628             :           }
     629             :         }
     630             :         commentenddashloop_end: ;
     631             :       }
     632             :       case COMMENT_END: {
     633             :         for (; ; ) {
     634           2 :           c = read();
     635           2 :           switch(c) {
     636             :             case -1: {
     637           0 :               NS_HTML5_BREAK(stateloop);
     638             :             }
     639             :             case '>': {
     640           2 :               state = nsHtml5MetaScanner::DATA;
     641           2 :               NS_HTML5_CONTINUE(stateloop);
     642             :             }
     643             :             case '-': {
     644           0 :               continue;
     645             :             }
     646             :             default: {
     647           0 :               state = nsHtml5MetaScanner::COMMENT;
     648           0 :               NS_HTML5_CONTINUE(stateloop);
     649             :             }
     650             :           }
     651             :         }
     652             :       }
     653             :       case COMMENT_START_DASH: {
     654           0 :         c = read();
     655           0 :         switch(c) {
     656             :           case -1: {
     657           0 :             NS_HTML5_BREAK(stateloop);
     658             :           }
     659             :           case '-': {
     660           0 :             state = nsHtml5MetaScanner::COMMENT_END;
     661           0 :             NS_HTML5_CONTINUE(stateloop);
     662             :           }
     663             :           case '>': {
     664           0 :             state = nsHtml5MetaScanner::DATA;
     665           0 :             NS_HTML5_CONTINUE(stateloop);
     666             :           }
     667             :           default: {
     668           0 :             state = nsHtml5MetaScanner::COMMENT;
     669           0 :             NS_HTML5_CONTINUE(stateloop);
     670             :           }
     671             :         }
     672             :       }
     673             :       case ATTRIBUTE_VALUE_SINGLE_QUOTED: {
     674             :         for (; ; ) {
     675           0 :           if (reconsume) {
     676           0 :             reconsume = false;
     677             :           } else {
     678           0 :             c = read();
     679             :           }
     680           0 :           switch(c) {
     681             :             case -1: {
     682           0 :               NS_HTML5_BREAK(stateloop);
     683             :             }
     684             :             case '\'': {
     685           0 :               handleAttributeValue();
     686           0 :               state = nsHtml5MetaScanner::AFTER_ATTRIBUTE_VALUE_QUOTED;
     687           0 :               NS_HTML5_CONTINUE(stateloop);
     688             :             }
     689             :             default: {
     690           0 :               handleCharInAttributeValue(c);
     691           0 :               continue;
     692             :             }
     693             :           }
     694             :         }
     695             :       }
     696             :       case SCAN_UNTIL_GT: {
     697             :         for (; ; ) {
     698         121 :           if (reconsume) {
     699           1 :             reconsume = false;
     700             :           } else {
     701          60 :             c = read();
     702             :           }
     703          61 :           switch(c) {
     704             :             case -1: {
     705           0 :               NS_HTML5_BREAK(stateloop);
     706             :             }
     707             :             case '>': {
     708           1 :               state = nsHtml5MetaScanner::DATA;
     709           1 :               NS_HTML5_CONTINUE(stateloop);
     710             :             }
     711             :             default: {
     712          60 :               continue;
     713             :             }
     714             :           }
     715             :         }
     716             :       }
     717             :     }
     718             :   }
     719             :   stateloop_end: ;
     720           2 :   stateSave = state;
     721           2 : }
     722             : 
     723             : void 
     724          10 : nsHtml5MetaScanner::handleCharInAttributeValue(int32_t c)
     725             : {
     726          10 :   if (metaState == A) {
     727          10 :     if (contentIndex == CONTENT.length || charsetIndex == CHARSET.length) {
     728          10 :       addToBuffer(c);
     729           0 :     } else if (httpEquivIndex == HTTP_EQUIV.length) {
     730           0 :       if (contentTypeIndex < CONTENT_TYPE.length && toAsciiLowerCase(c) == CONTENT_TYPE[contentTypeIndex]) {
     731           0 :         ++contentTypeIndex;
     732             :       } else {
     733           0 :         contentTypeIndex = INT32_MAX;
     734             :       }
     735             :     }
     736             :   }
     737          10 : }
     738             : 
     739             : void 
     740          10 : nsHtml5MetaScanner::addToBuffer(int32_t c)
     741             : {
     742          10 :   if (strBufLen == strBuf.length) {
     743           0 :     jArray<char16_t,int32_t> newBuf = jArray<char16_t,int32_t>::newJArray(strBuf.length + (strBuf.length << 1));
     744           0 :     nsHtml5ArrayCopy::arraycopy(strBuf, newBuf, strBuf.length);
     745           0 :     strBuf = newBuf;
     746             :   }
     747          10 :   strBuf[strBufLen++] = (char16_t) c;
     748          10 : }
     749             : 
     750             : void 
     751           2 : nsHtml5MetaScanner::handleAttributeValue()
     752             : {
     753           2 :   if (metaState != A) {
     754           0 :     return;
     755             :   }
     756           2 :   if (contentIndex == CONTENT.length && !content) {
     757           0 :     content = nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen, treeBuilder);
     758           0 :     return;
     759             :   }
     760           2 :   if (charsetIndex == CHARSET.length && !charset) {
     761           2 :     charset = nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen, treeBuilder);
     762           2 :     return;
     763             :   }
     764           0 :   if (httpEquivIndex == HTTP_EQUIV.length &&
     765           0 :       httpEquivState == HTTP_EQUIV_NOT_SEEN) {
     766           0 :     httpEquivState = (contentTypeIndex == CONTENT_TYPE.length)
     767           0 :                        ? HTTP_EQUIV_CONTENT_TYPE
     768             :                        : HTTP_EQUIV_OTHER;
     769           0 :     return;
     770             :   }
     771             : }
     772             : 
     773             : bool 
     774           2 : nsHtml5MetaScanner::handleTag()
     775             : {
     776           2 :   bool stop = handleTagInner();
     777           2 :   content.Release();
     778           2 :   content = nullptr;
     779           2 :   charset.Release();
     780           2 :   charset = nullptr;
     781           2 :   httpEquivState = HTTP_EQUIV_NOT_SEEN;
     782           2 :   return stop;
     783             : }
     784             : 
     785             : bool 
     786           2 : nsHtml5MetaScanner::handleTagInner()
     787             : {
     788           2 :   if (!!charset && tryCharset(charset)) {
     789           2 :     return true;
     790             :   }
     791           0 :   if (!!content && httpEquivState == HTTP_EQUIV_CONTENT_TYPE) {
     792             :     nsHtml5String extract =
     793           0 :       nsHtml5TreeBuilder::extractCharsetFromContent(content, treeBuilder);
     794           0 :     if (!extract) {
     795           0 :       return false;
     796             :     }
     797           0 :     bool success = tryCharset(extract);
     798           0 :     extract.Release();
     799           0 :     return success;
     800             :   }
     801           0 :   return false;
     802             : }
     803             : 
     804             : void
     805           0 : nsHtml5MetaScanner::initializeStatics()
     806             : {
     807           0 : }
     808             : 
     809             : void
     810           0 : nsHtml5MetaScanner::releaseStatics()
     811             : {
     812           0 : }
     813             : 
     814             : 
     815             : #include "nsHtml5MetaScannerCppSupplement.h"
     816             : 

Generated by: LCOV version 1.13