LCOV - code coverage report
Current view: directory - parser/html - nsHtml5MetaScanner.cpp (source / functions) Found Hit Coverage
Test: app.info Lines: 348 0 0.0 %
Date: 2012-06-02 Functions: 10 0 0.0 %

       1                 : /*
       2                 :  * Copyright (c) 2007 Henri Sivonen
       3                 :  * Copyright (c) 2008-2010 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 "prtypes.h"
      32                 : #include "nsIAtom.h"
      33                 : #include "nsHtml5AtomTable.h"
      34                 : #include "nsString.h"
      35                 : #include "nsINameSpaceManager.h"
      36                 : #include "nsIContent.h"
      37                 : #include "nsTraceRefcnt.h"
      38                 : #include "jArray.h"
      39                 : #include "nsHtml5ArrayCopy.h"
      40                 : #include "nsAHtml5TreeBuilderState.h"
      41                 : #include "nsHtml5Atoms.h"
      42                 : #include "nsHtml5ByteReadable.h"
      43                 : #include "nsIUnicodeDecoder.h"
      44                 : #include "nsHtml5Macros.h"
      45                 : 
      46                 : #include "nsHtml5Tokenizer.h"
      47                 : #include "nsHtml5TreeBuilder.h"
      48                 : #include "nsHtml5AttributeName.h"
      49                 : #include "nsHtml5ElementName.h"
      50                 : #include "nsHtml5HtmlAttributes.h"
      51                 : #include "nsHtml5StackNode.h"
      52                 : #include "nsHtml5UTF16Buffer.h"
      53                 : #include "nsHtml5StateSnapshot.h"
      54                 : #include "nsHtml5Portability.h"
      55                 : 
      56                 : #include "nsHtml5MetaScanner.h"
      57                 : 
      58                 : static PRUnichar const CHARSET_DATA[] = { 'h', 'a', 'r', 's', 'e', 't' };
      59                 : staticJArray<PRUnichar,PRInt32> nsHtml5MetaScanner::CHARSET = { CHARSET_DATA, NS_ARRAY_LENGTH(CHARSET_DATA) };
      60                 : static PRUnichar const CONTENT_DATA[] = { 'o', 'n', 't', 'e', 'n', 't' };
      61                 : staticJArray<PRUnichar,PRInt32> nsHtml5MetaScanner::CONTENT = { CONTENT_DATA, NS_ARRAY_LENGTH(CONTENT_DATA) };
      62                 : static PRUnichar const HTTP_EQUIV_DATA[] = { 't', 't', 'p', '-', 'e', 'q', 'u', 'i', 'v' };
      63                 : staticJArray<PRUnichar,PRInt32> nsHtml5MetaScanner::HTTP_EQUIV = { HTTP_EQUIV_DATA, NS_ARRAY_LENGTH(HTTP_EQUIV_DATA) };
      64                 : static PRUnichar const CONTENT_TYPE_DATA[] = { 'c', 'o', 'n', 't', 'e', 'n', 't', '-', 't', 'y', 'p', 'e' };
      65                 : staticJArray<PRUnichar,PRInt32> nsHtml5MetaScanner::CONTENT_TYPE = { CONTENT_TYPE_DATA, NS_ARRAY_LENGTH(CONTENT_TYPE_DATA) };
      66                 : 
      67               0 : nsHtml5MetaScanner::nsHtml5MetaScanner()
      68                 :   : readable(nsnull),
      69                 :     metaState(NS_HTML5META_SCANNER_NO),
      70                 :     contentIndex(PR_INT32_MAX),
      71                 :     charsetIndex(PR_INT32_MAX),
      72                 :     httpEquivIndex(PR_INT32_MAX),
      73                 :     contentTypeIndex(PR_INT32_MAX),
      74                 :     stateSave(NS_HTML5META_SCANNER_DATA),
      75                 :     strBufLen(0),
      76                 :     strBuf(jArray<PRUnichar,PRInt32>::newJArray(36)),
      77                 :     content(nsnull),
      78                 :     charset(nsnull),
      79               0 :     httpEquivState(NS_HTML5META_SCANNER_HTTP_EQUIV_NOT_SEEN)
      80                 : {
      81               0 :   MOZ_COUNT_CTOR(nsHtml5MetaScanner);
      82               0 : }
      83                 : 
      84                 : 
      85               0 : nsHtml5MetaScanner::~nsHtml5MetaScanner()
      86                 : {
      87               0 :   MOZ_COUNT_DTOR(nsHtml5MetaScanner);
      88               0 :   nsHtml5Portability::releaseString(content);
      89               0 :   nsHtml5Portability::releaseString(charset);
      90               0 : }
      91                 : 
      92                 : void 
      93               0 : nsHtml5MetaScanner::stateLoop(PRInt32 state)
      94                 : {
      95               0 :   PRInt32 c = -1;
      96               0 :   bool reconsume = false;
      97               0 :   stateloop: for (; ; ) {
      98               0 :     switch(state) {
      99                 :       case NS_HTML5META_SCANNER_DATA: {
     100               0 :         for (; ; ) {
     101               0 :           if (reconsume) {
     102               0 :             reconsume = false;
     103                 :           } else {
     104               0 :             c = read();
     105                 :           }
     106               0 :           switch(c) {
     107                 :             case -1: {
     108               0 :               NS_HTML5_BREAK(stateloop);
     109                 :             }
     110                 :             case '<': {
     111               0 :               state = NS_HTML5META_SCANNER_TAG_OPEN;
     112               0 :               NS_HTML5_BREAK(dataloop);
     113                 :             }
     114                 :             default: {
     115               0 :               continue;
     116                 :             }
     117                 :           }
     118                 :         }
     119                 :         dataloop_end: ;
     120                 :       }
     121                 :       case NS_HTML5META_SCANNER_TAG_OPEN: {
     122                 :         for (; ; ) {
     123               0 :           c = read();
     124               0 :           switch(c) {
     125                 :             case -1: {
     126               0 :               NS_HTML5_BREAK(stateloop);
     127                 :             }
     128                 :             case 'm':
     129                 :             case 'M': {
     130               0 :               metaState = NS_HTML5META_SCANNER_M;
     131               0 :               state = NS_HTML5META_SCANNER_TAG_NAME;
     132               0 :               NS_HTML5_BREAK(tagopenloop);
     133                 :             }
     134                 :             case '!': {
     135               0 :               state = NS_HTML5META_SCANNER_MARKUP_DECLARATION_OPEN;
     136               0 :               NS_HTML5_CONTINUE(stateloop);
     137                 :             }
     138                 :             case '\?':
     139                 :             case '/': {
     140               0 :               state = NS_HTML5META_SCANNER_SCAN_UNTIL_GT;
     141               0 :               NS_HTML5_CONTINUE(stateloop);
     142                 :             }
     143                 :             case '>': {
     144               0 :               state = NS_HTML5META_SCANNER_DATA;
     145               0 :               NS_HTML5_CONTINUE(stateloop);
     146                 :             }
     147                 :             default: {
     148               0 :               if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
     149               0 :                 metaState = NS_HTML5META_SCANNER_NO;
     150               0 :                 state = NS_HTML5META_SCANNER_TAG_NAME;
     151               0 :                 NS_HTML5_BREAK(tagopenloop);
     152                 :               }
     153               0 :               state = NS_HTML5META_SCANNER_DATA;
     154               0 :               reconsume = true;
     155               0 :               NS_HTML5_CONTINUE(stateloop);
     156                 :             }
     157                 :           }
     158                 :         }
     159                 :         tagopenloop_end: ;
     160                 :       }
     161                 :       case NS_HTML5META_SCANNER_TAG_NAME: {
     162               0 :         for (; ; ) {
     163               0 :           c = read();
     164               0 :           switch(c) {
     165                 :             case -1: {
     166               0 :               NS_HTML5_BREAK(stateloop);
     167                 :             }
     168                 :             case ' ':
     169                 :             case '\t':
     170                 :             case '\n':
     171                 :             case '\f': {
     172               0 :               state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME;
     173               0 :               NS_HTML5_BREAK(tagnameloop);
     174                 :             }
     175                 :             case '/': {
     176               0 :               state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG;
     177               0 :               NS_HTML5_CONTINUE(stateloop);
     178                 :             }
     179                 :             case '>': {
     180               0 :               state = NS_HTML5META_SCANNER_DATA;
     181               0 :               NS_HTML5_CONTINUE(stateloop);
     182                 :             }
     183                 :             case 'e':
     184                 :             case 'E': {
     185               0 :               if (metaState == NS_HTML5META_SCANNER_M) {
     186               0 :                 metaState = NS_HTML5META_SCANNER_E;
     187                 :               } else {
     188               0 :                 metaState = NS_HTML5META_SCANNER_NO;
     189                 :               }
     190               0 :               continue;
     191                 :             }
     192                 :             case 't':
     193                 :             case 'T': {
     194               0 :               if (metaState == NS_HTML5META_SCANNER_E) {
     195               0 :                 metaState = NS_HTML5META_SCANNER_T;
     196                 :               } else {
     197               0 :                 metaState = NS_HTML5META_SCANNER_NO;
     198                 :               }
     199               0 :               continue;
     200                 :             }
     201                 :             case 'a':
     202                 :             case 'A': {
     203               0 :               if (metaState == NS_HTML5META_SCANNER_T) {
     204               0 :                 metaState = NS_HTML5META_SCANNER_A;
     205                 :               } else {
     206               0 :                 metaState = NS_HTML5META_SCANNER_NO;
     207                 :               }
     208               0 :               continue;
     209                 :             }
     210                 :             default: {
     211               0 :               metaState = NS_HTML5META_SCANNER_NO;
     212               0 :               continue;
     213                 :             }
     214                 :           }
     215                 :         }
     216                 :         tagnameloop_end: ;
     217                 :       }
     218                 :       case NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME: {
     219               0 :         for (; ; ) {
     220               0 :           if (reconsume) {
     221               0 :             reconsume = false;
     222                 :           } else {
     223               0 :             c = read();
     224                 :           }
     225               0 :           switch(c) {
     226                 :             case -1: {
     227               0 :               NS_HTML5_BREAK(stateloop);
     228                 :             }
     229                 :             case ' ':
     230                 :             case '\t':
     231                 :             case '\n':
     232                 :             case '\f': {
     233               0 :               continue;
     234                 :             }
     235                 :             case '/': {
     236               0 :               state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG;
     237               0 :               NS_HTML5_CONTINUE(stateloop);
     238                 :             }
     239                 :             case '>': {
     240               0 :               if (handleTag()) {
     241               0 :                 NS_HTML5_BREAK(stateloop);
     242                 :               }
     243               0 :               state = NS_HTML5META_SCANNER_DATA;
     244               0 :               NS_HTML5_CONTINUE(stateloop);
     245                 :             }
     246                 :             case 'c':
     247                 :             case 'C': {
     248               0 :               contentIndex = 0;
     249               0 :               charsetIndex = 0;
     250               0 :               httpEquivIndex = PR_INT32_MAX;
     251               0 :               contentTypeIndex = PR_INT32_MAX;
     252               0 :               state = NS_HTML5META_SCANNER_ATTRIBUTE_NAME;
     253               0 :               NS_HTML5_BREAK(beforeattributenameloop);
     254                 :             }
     255                 :             case 'h':
     256                 :             case 'H': {
     257               0 :               contentIndex = PR_INT32_MAX;
     258               0 :               charsetIndex = PR_INT32_MAX;
     259               0 :               httpEquivIndex = 0;
     260               0 :               contentTypeIndex = PR_INT32_MAX;
     261               0 :               state = NS_HTML5META_SCANNER_ATTRIBUTE_NAME;
     262               0 :               NS_HTML5_BREAK(beforeattributenameloop);
     263                 :             }
     264                 :             default: {
     265               0 :               contentIndex = PR_INT32_MAX;
     266               0 :               charsetIndex = PR_INT32_MAX;
     267               0 :               httpEquivIndex = PR_INT32_MAX;
     268               0 :               contentTypeIndex = PR_INT32_MAX;
     269               0 :               state = NS_HTML5META_SCANNER_ATTRIBUTE_NAME;
     270               0 :               NS_HTML5_BREAK(beforeattributenameloop);
     271                 :             }
     272                 :           }
     273                 :         }
     274                 :         beforeattributenameloop_end: ;
     275                 :       }
     276                 :       case NS_HTML5META_SCANNER_ATTRIBUTE_NAME: {
     277               0 :         for (; ; ) {
     278               0 :           c = read();
     279               0 :           switch(c) {
     280                 :             case -1: {
     281               0 :               NS_HTML5_BREAK(stateloop);
     282                 :             }
     283                 :             case ' ':
     284                 :             case '\t':
     285                 :             case '\n':
     286                 :             case '\f': {
     287               0 :               state = NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_NAME;
     288               0 :               NS_HTML5_CONTINUE(stateloop);
     289                 :             }
     290                 :             case '/': {
     291               0 :               state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG;
     292               0 :               NS_HTML5_CONTINUE(stateloop);
     293                 :             }
     294                 :             case '=': {
     295               0 :               strBufLen = 0;
     296               0 :               contentTypeIndex = 0;
     297               0 :               state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_VALUE;
     298               0 :               NS_HTML5_BREAK(attributenameloop);
     299                 :             }
     300                 :             case '>': {
     301               0 :               if (handleTag()) {
     302               0 :                 NS_HTML5_BREAK(stateloop);
     303                 :               }
     304               0 :               state = NS_HTML5META_SCANNER_DATA;
     305               0 :               NS_HTML5_CONTINUE(stateloop);
     306                 :             }
     307                 :             default: {
     308               0 :               if (metaState == NS_HTML5META_SCANNER_A) {
     309               0 :                 if (c >= 'A' && c <= 'Z') {
     310               0 :                   c += 0x20;
     311                 :                 }
     312               0 :                 if (contentIndex < CONTENT.length && c == CONTENT[contentIndex]) {
     313               0 :                   ++contentIndex;
     314                 :                 } else {
     315               0 :                   contentIndex = PR_INT32_MAX;
     316                 :                 }
     317               0 :                 if (charsetIndex < CHARSET.length && c == CHARSET[charsetIndex]) {
     318               0 :                   ++charsetIndex;
     319                 :                 } else {
     320               0 :                   charsetIndex = PR_INT32_MAX;
     321                 :                 }
     322               0 :                 if (httpEquivIndex < HTTP_EQUIV.length && c == HTTP_EQUIV[httpEquivIndex]) {
     323               0 :                   ++httpEquivIndex;
     324                 :                 } else {
     325               0 :                   httpEquivIndex = PR_INT32_MAX;
     326                 :                 }
     327                 :               }
     328               0 :               continue;
     329                 :             }
     330                 :           }
     331                 :         }
     332                 :         attributenameloop_end: ;
     333                 :       }
     334                 :       case NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_VALUE: {
     335               0 :         for (; ; ) {
     336               0 :           c = read();
     337               0 :           switch(c) {
     338                 :             case -1: {
     339               0 :               NS_HTML5_BREAK(stateloop);
     340                 :             }
     341                 :             case ' ':
     342                 :             case '\t':
     343                 :             case '\n':
     344                 :             case '\f': {
     345               0 :               continue;
     346                 :             }
     347                 :             case '\"': {
     348               0 :               state = NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_DOUBLE_QUOTED;
     349               0 :               NS_HTML5_BREAK(beforeattributevalueloop);
     350                 :             }
     351                 :             case '\'': {
     352               0 :               state = NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_SINGLE_QUOTED;
     353               0 :               NS_HTML5_CONTINUE(stateloop);
     354                 :             }
     355                 :             case '>': {
     356               0 :               if (handleTag()) {
     357               0 :                 NS_HTML5_BREAK(stateloop);
     358                 :               }
     359               0 :               state = NS_HTML5META_SCANNER_DATA;
     360               0 :               NS_HTML5_CONTINUE(stateloop);
     361                 :             }
     362                 :             default: {
     363               0 :               handleCharInAttributeValue(c);
     364               0 :               state = NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_UNQUOTED;
     365               0 :               NS_HTML5_CONTINUE(stateloop);
     366                 :             }
     367                 :           }
     368                 :         }
     369                 :         beforeattributevalueloop_end: ;
     370                 :       }
     371                 :       case NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_DOUBLE_QUOTED: {
     372               0 :         for (; ; ) {
     373               0 :           if (reconsume) {
     374               0 :             reconsume = false;
     375                 :           } else {
     376               0 :             c = read();
     377                 :           }
     378               0 :           switch(c) {
     379                 :             case -1: {
     380               0 :               NS_HTML5_BREAK(stateloop);
     381                 :             }
     382                 :             case '\"': {
     383               0 :               handleAttributeValue();
     384               0 :               state = NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_VALUE_QUOTED;
     385               0 :               NS_HTML5_BREAK(attributevaluedoublequotedloop);
     386                 :             }
     387                 :             default: {
     388               0 :               handleCharInAttributeValue(c);
     389               0 :               continue;
     390                 :             }
     391                 :           }
     392                 :         }
     393                 :         attributevaluedoublequotedloop_end: ;
     394                 :       }
     395                 :       case NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_VALUE_QUOTED: {
     396                 :         for (; ; ) {
     397               0 :           c = read();
     398               0 :           switch(c) {
     399                 :             case -1: {
     400               0 :               NS_HTML5_BREAK(stateloop);
     401                 :             }
     402                 :             case ' ':
     403                 :             case '\t':
     404                 :             case '\n':
     405                 :             case '\f': {
     406               0 :               state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME;
     407               0 :               NS_HTML5_CONTINUE(stateloop);
     408                 :             }
     409                 :             case '/': {
     410               0 :               state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG;
     411               0 :               NS_HTML5_BREAK(afterattributevaluequotedloop);
     412                 :             }
     413                 :             case '>': {
     414               0 :               if (handleTag()) {
     415               0 :                 NS_HTML5_BREAK(stateloop);
     416                 :               }
     417               0 :               state = NS_HTML5META_SCANNER_DATA;
     418               0 :               NS_HTML5_CONTINUE(stateloop);
     419                 :             }
     420                 :             default: {
     421               0 :               state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME;
     422               0 :               reconsume = true;
     423               0 :               NS_HTML5_CONTINUE(stateloop);
     424                 :             }
     425                 :           }
     426                 :         }
     427                 :         afterattributevaluequotedloop_end: ;
     428                 :       }
     429                 :       case NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG: {
     430               0 :         c = read();
     431               0 :         switch(c) {
     432                 :           case -1: {
     433               0 :             NS_HTML5_BREAK(stateloop);
     434                 :           }
     435                 :           case '>': {
     436               0 :             if (handleTag()) {
     437               0 :               NS_HTML5_BREAK(stateloop);
     438                 :             }
     439               0 :             state = NS_HTML5META_SCANNER_DATA;
     440               0 :             NS_HTML5_CONTINUE(stateloop);
     441                 :           }
     442                 :           default: {
     443               0 :             state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME;
     444               0 :             reconsume = true;
     445               0 :             NS_HTML5_CONTINUE(stateloop);
     446                 :           }
     447                 :         }
     448                 :       }
     449                 :       case NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_UNQUOTED: {
     450               0 :         for (; ; ) {
     451               0 :           if (reconsume) {
     452               0 :             reconsume = false;
     453                 :           } else {
     454               0 :             c = read();
     455                 :           }
     456               0 :           switch(c) {
     457                 :             case -1: {
     458               0 :               NS_HTML5_BREAK(stateloop);
     459                 :             }
     460                 :             case ' ':
     461                 :             case '\t':
     462                 :             case '\n':
     463                 :             case '\f': {
     464               0 :               handleAttributeValue();
     465               0 :               state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME;
     466               0 :               NS_HTML5_CONTINUE(stateloop);
     467                 :             }
     468                 :             case '>': {
     469               0 :               handleAttributeValue();
     470               0 :               if (handleTag()) {
     471               0 :                 NS_HTML5_BREAK(stateloop);
     472                 :               }
     473               0 :               state = NS_HTML5META_SCANNER_DATA;
     474               0 :               NS_HTML5_CONTINUE(stateloop);
     475                 :             }
     476                 :             default: {
     477               0 :               handleCharInAttributeValue(c);
     478               0 :               continue;
     479                 :             }
     480                 :           }
     481                 :         }
     482                 :       }
     483                 :       case NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_NAME: {
     484               0 :         for (; ; ) {
     485               0 :           c = read();
     486               0 :           switch(c) {
     487                 :             case -1: {
     488               0 :               NS_HTML5_BREAK(stateloop);
     489                 :             }
     490                 :             case ' ':
     491                 :             case '\t':
     492                 :             case '\n':
     493                 :             case '\f': {
     494               0 :               continue;
     495                 :             }
     496                 :             case '/': {
     497               0 :               handleAttributeValue();
     498               0 :               state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG;
     499               0 :               NS_HTML5_CONTINUE(stateloop);
     500                 :             }
     501                 :             case '=': {
     502               0 :               strBufLen = 0;
     503               0 :               contentTypeIndex = 0;
     504               0 :               state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_VALUE;
     505               0 :               NS_HTML5_CONTINUE(stateloop);
     506                 :             }
     507                 :             case '>': {
     508               0 :               handleAttributeValue();
     509               0 :               if (handleTag()) {
     510               0 :                 NS_HTML5_BREAK(stateloop);
     511                 :               }
     512               0 :               state = NS_HTML5META_SCANNER_DATA;
     513               0 :               NS_HTML5_CONTINUE(stateloop);
     514                 :             }
     515                 :             case 'c':
     516                 :             case 'C': {
     517               0 :               contentIndex = 0;
     518               0 :               charsetIndex = 0;
     519               0 :               state = NS_HTML5META_SCANNER_ATTRIBUTE_NAME;
     520               0 :               NS_HTML5_CONTINUE(stateloop);
     521                 :             }
     522                 :             default: {
     523               0 :               contentIndex = PR_INT32_MAX;
     524               0 :               charsetIndex = PR_INT32_MAX;
     525               0 :               state = NS_HTML5META_SCANNER_ATTRIBUTE_NAME;
     526               0 :               NS_HTML5_CONTINUE(stateloop);
     527                 :             }
     528                 :           }
     529                 :         }
     530                 :       }
     531                 :       case NS_HTML5META_SCANNER_MARKUP_DECLARATION_OPEN: {
     532                 :         for (; ; ) {
     533               0 :           c = read();
     534               0 :           switch(c) {
     535                 :             case -1: {
     536               0 :               NS_HTML5_BREAK(stateloop);
     537                 :             }
     538                 :             case '-': {
     539               0 :               state = NS_HTML5META_SCANNER_MARKUP_DECLARATION_HYPHEN;
     540               0 :               NS_HTML5_BREAK(markupdeclarationopenloop);
     541                 :             }
     542                 :             default: {
     543               0 :               state = NS_HTML5META_SCANNER_SCAN_UNTIL_GT;
     544               0 :               reconsume = true;
     545               0 :               NS_HTML5_CONTINUE(stateloop);
     546                 :             }
     547                 :           }
     548                 :         }
     549                 :         markupdeclarationopenloop_end: ;
     550                 :       }
     551                 :       case NS_HTML5META_SCANNER_MARKUP_DECLARATION_HYPHEN: {
     552                 :         for (; ; ) {
     553               0 :           c = read();
     554               0 :           switch(c) {
     555                 :             case -1: {
     556               0 :               NS_HTML5_BREAK(stateloop);
     557                 :             }
     558                 :             case '-': {
     559               0 :               state = NS_HTML5META_SCANNER_COMMENT_START;
     560               0 :               NS_HTML5_BREAK(markupdeclarationhyphenloop);
     561                 :             }
     562                 :             default: {
     563               0 :               state = NS_HTML5META_SCANNER_SCAN_UNTIL_GT;
     564               0 :               reconsume = true;
     565               0 :               NS_HTML5_CONTINUE(stateloop);
     566                 :             }
     567                 :           }
     568                 :         }
     569                 :         markupdeclarationhyphenloop_end: ;
     570                 :       }
     571                 :       case NS_HTML5META_SCANNER_COMMENT_START: {
     572                 :         for (; ; ) {
     573               0 :           c = read();
     574               0 :           switch(c) {
     575                 :             case -1: {
     576               0 :               NS_HTML5_BREAK(stateloop);
     577                 :             }
     578                 :             case '-': {
     579               0 :               state = NS_HTML5META_SCANNER_COMMENT_START_DASH;
     580               0 :               NS_HTML5_CONTINUE(stateloop);
     581                 :             }
     582                 :             case '>': {
     583               0 :               state = NS_HTML5META_SCANNER_DATA;
     584               0 :               NS_HTML5_CONTINUE(stateloop);
     585                 :             }
     586                 :             default: {
     587               0 :               state = NS_HTML5META_SCANNER_COMMENT;
     588               0 :               NS_HTML5_BREAK(commentstartloop);
     589                 :             }
     590                 :           }
     591                 :         }
     592                 :         commentstartloop_end: ;
     593                 :       }
     594                 :       case NS_HTML5META_SCANNER_COMMENT: {
     595               0 :         for (; ; ) {
     596               0 :           c = read();
     597               0 :           switch(c) {
     598                 :             case -1: {
     599               0 :               NS_HTML5_BREAK(stateloop);
     600                 :             }
     601                 :             case '-': {
     602               0 :               state = NS_HTML5META_SCANNER_COMMENT_END_DASH;
     603               0 :               NS_HTML5_BREAK(commentloop);
     604                 :             }
     605                 :             default: {
     606               0 :               continue;
     607                 :             }
     608                 :           }
     609                 :         }
     610                 :         commentloop_end: ;
     611                 :       }
     612                 :       case NS_HTML5META_SCANNER_COMMENT_END_DASH: {
     613                 :         for (; ; ) {
     614               0 :           c = read();
     615               0 :           switch(c) {
     616                 :             case -1: {
     617               0 :               NS_HTML5_BREAK(stateloop);
     618                 :             }
     619                 :             case '-': {
     620               0 :               state = NS_HTML5META_SCANNER_COMMENT_END;
     621               0 :               NS_HTML5_BREAK(commentenddashloop);
     622                 :             }
     623                 :             default: {
     624               0 :               state = NS_HTML5META_SCANNER_COMMENT;
     625               0 :               NS_HTML5_CONTINUE(stateloop);
     626                 :             }
     627                 :           }
     628                 :         }
     629                 :         commentenddashloop_end: ;
     630                 :       }
     631                 :       case NS_HTML5META_SCANNER_COMMENT_END: {
     632               0 :         for (; ; ) {
     633               0 :           c = read();
     634               0 :           switch(c) {
     635                 :             case -1: {
     636               0 :               NS_HTML5_BREAK(stateloop);
     637                 :             }
     638                 :             case '>': {
     639               0 :               state = NS_HTML5META_SCANNER_DATA;
     640               0 :               NS_HTML5_CONTINUE(stateloop);
     641                 :             }
     642                 :             case '-': {
     643               0 :               continue;
     644                 :             }
     645                 :             default: {
     646               0 :               state = NS_HTML5META_SCANNER_COMMENT;
     647               0 :               NS_HTML5_CONTINUE(stateloop);
     648                 :             }
     649                 :           }
     650                 :         }
     651                 :       }
     652                 :       case NS_HTML5META_SCANNER_COMMENT_START_DASH: {
     653               0 :         c = read();
     654               0 :         switch(c) {
     655                 :           case -1: {
     656               0 :             NS_HTML5_BREAK(stateloop);
     657                 :           }
     658                 :           case '-': {
     659               0 :             state = NS_HTML5META_SCANNER_COMMENT_END;
     660               0 :             NS_HTML5_CONTINUE(stateloop);
     661                 :           }
     662                 :           case '>': {
     663               0 :             state = NS_HTML5META_SCANNER_DATA;
     664               0 :             NS_HTML5_CONTINUE(stateloop);
     665                 :           }
     666                 :           default: {
     667               0 :             state = NS_HTML5META_SCANNER_COMMENT;
     668               0 :             NS_HTML5_CONTINUE(stateloop);
     669                 :           }
     670                 :         }
     671                 :       }
     672                 :       case NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_SINGLE_QUOTED: {
     673               0 :         for (; ; ) {
     674               0 :           if (reconsume) {
     675               0 :             reconsume = false;
     676                 :           } else {
     677               0 :             c = read();
     678                 :           }
     679               0 :           switch(c) {
     680                 :             case -1: {
     681               0 :               NS_HTML5_BREAK(stateloop);
     682                 :             }
     683                 :             case '\'': {
     684               0 :               handleAttributeValue();
     685               0 :               state = NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_VALUE_QUOTED;
     686               0 :               NS_HTML5_CONTINUE(stateloop);
     687                 :             }
     688                 :             default: {
     689               0 :               handleCharInAttributeValue(c);
     690               0 :               continue;
     691                 :             }
     692                 :           }
     693                 :         }
     694                 :       }
     695                 :       case NS_HTML5META_SCANNER_SCAN_UNTIL_GT: {
     696               0 :         for (; ; ) {
     697               0 :           if (reconsume) {
     698               0 :             reconsume = false;
     699                 :           } else {
     700               0 :             c = read();
     701                 :           }
     702               0 :           switch(c) {
     703                 :             case -1: {
     704               0 :               NS_HTML5_BREAK(stateloop);
     705                 :             }
     706                 :             case '>': {
     707               0 :               state = NS_HTML5META_SCANNER_DATA;
     708               0 :               NS_HTML5_CONTINUE(stateloop);
     709                 :             }
     710                 :             default: {
     711               0 :               continue;
     712                 :             }
     713                 :           }
     714                 :         }
     715                 :       }
     716                 :     }
     717                 :   }
     718                 :   stateloop_end: ;
     719               0 :   stateSave = state;
     720               0 : }
     721                 : 
     722                 : void 
     723               0 : nsHtml5MetaScanner::handleCharInAttributeValue(PRInt32 c)
     724                 : {
     725               0 :   if (metaState == NS_HTML5META_SCANNER_A) {
     726               0 :     if (contentIndex == CONTENT.length || charsetIndex == CHARSET.length) {
     727               0 :       addToBuffer(c);
     728               0 :     } else if (httpEquivIndex == HTTP_EQUIV.length) {
     729               0 :       if (contentTypeIndex < CONTENT_TYPE.length && toAsciiLowerCase(c) == CONTENT_TYPE[contentTypeIndex]) {
     730               0 :         ++contentTypeIndex;
     731                 :       } else {
     732               0 :         contentTypeIndex = PR_INT32_MAX;
     733                 :       }
     734                 :     }
     735                 :   }
     736               0 : }
     737                 : 
     738                 : void 
     739               0 : nsHtml5MetaScanner::addToBuffer(PRInt32 c)
     740                 : {
     741               0 :   if (strBufLen == strBuf.length) {
     742               0 :     jArray<PRUnichar,PRInt32> newBuf = jArray<PRUnichar,PRInt32>::newJArray(strBuf.length + (strBuf.length << 1));
     743               0 :     nsHtml5ArrayCopy::arraycopy(strBuf, newBuf, strBuf.length);
     744               0 :     strBuf = newBuf;
     745                 :   }
     746               0 :   strBuf[strBufLen++] = (PRUnichar) c;
     747               0 : }
     748                 : 
     749                 : void 
     750               0 : nsHtml5MetaScanner::handleAttributeValue()
     751                 : {
     752               0 :   if (metaState != NS_HTML5META_SCANNER_A) {
     753               0 :     return;
     754                 :   }
     755               0 :   if (contentIndex == CONTENT.length && !content) {
     756               0 :     content = nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen);
     757               0 :     return;
     758                 :   }
     759               0 :   if (charsetIndex == CHARSET.length && !charset) {
     760               0 :     charset = nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen);
     761               0 :     return;
     762                 :   }
     763               0 :   if (httpEquivIndex == HTTP_EQUIV.length && httpEquivState == NS_HTML5META_SCANNER_HTTP_EQUIV_NOT_SEEN) {
     764               0 :     httpEquivState = (contentTypeIndex == CONTENT_TYPE.length) ? NS_HTML5META_SCANNER_HTTP_EQUIV_CONTENT_TYPE : NS_HTML5META_SCANNER_HTTP_EQUIV_OTHER;
     765               0 :     return;
     766                 :   }
     767                 : }
     768                 : 
     769                 : bool 
     770               0 : nsHtml5MetaScanner::handleTag()
     771                 : {
     772               0 :   bool stop = handleTagInner();
     773               0 :   nsHtml5Portability::releaseString(content);
     774               0 :   content = nsnull;
     775               0 :   nsHtml5Portability::releaseString(charset);
     776               0 :   charset = nsnull;
     777               0 :   httpEquivState = NS_HTML5META_SCANNER_HTTP_EQUIV_NOT_SEEN;
     778               0 :   return stop;
     779                 : }
     780                 : 
     781                 : bool 
     782               0 : nsHtml5MetaScanner::handleTagInner()
     783                 : {
     784               0 :   if (!!charset && tryCharset(charset)) {
     785               0 :     return true;
     786                 :   }
     787               0 :   if (!!content && httpEquivState == NS_HTML5META_SCANNER_HTTP_EQUIV_CONTENT_TYPE) {
     788               0 :     nsString* extract = nsHtml5TreeBuilder::extractCharsetFromContent(content);
     789               0 :     if (!extract) {
     790               0 :       return false;
     791                 :     }
     792               0 :     bool success = tryCharset(extract);
     793               0 :     nsHtml5Portability::releaseString(extract);
     794               0 :     return success;
     795                 :   }
     796               0 :   return false;
     797                 : }
     798                 : 
     799                 : void
     800               0 : nsHtml5MetaScanner::initializeStatics()
     801                 : {
     802               0 : }
     803                 : 
     804                 : void
     805               0 : nsHtml5MetaScanner::releaseStatics()
     806                 : {
     807               0 : }
     808                 : 
     809                 : 
     810                 : #include "nsHtml5MetaScannerCppSupplement.h"
     811                 : 

Generated by: LCOV version 1.7