@@ -54,8 +54,6 @@ enum InsertionMode {
5454 IN_TABLE_BODY ,
5555 IN_ROW ,
5656 IN_CELL ,
57- IN_SELECT ,
58- IN_SELECT_IN_TABLE ,
5957 IN_TEMPLATE ,
6058 AFTER_BODY ,
6159 IN_FRAMESET ,
@@ -706,10 +704,6 @@ export class Parser<T extends TreeAdapterTypeMap> implements TokenHandler, Stack
706704 this . insertionMode = InsertionMode . IN_FRAMESET ;
707705 return ;
708706 }
709- case $ . SELECT : {
710- this . _resetInsertionModeForSelect ( i ) ;
711- return ;
712- }
713707 case $ . TEMPLATE : {
714708 this . insertionMode = this . tmplInsertionModeStack [ 0 ] ;
715709 return ;
@@ -739,24 +733,6 @@ export class Parser<T extends TreeAdapterTypeMap> implements TokenHandler, Stack
739733 this . insertionMode = InsertionMode . IN_BODY ;
740734 }
741735
742- /** @protected */
743- _resetInsertionModeForSelect ( selectIdx : number ) : void {
744- if ( selectIdx > 0 ) {
745- for ( let i = selectIdx - 1 ; i > 0 ; i -- ) {
746- const tn = this . openElements . tagIDs [ i ] ;
747-
748- if ( tn === $ . TEMPLATE ) {
749- break ;
750- } else if ( tn === $ . TABLE ) {
751- this . insertionMode = InsertionMode . IN_SELECT_IN_TABLE ;
752- return ;
753- }
754- }
755- }
756-
757- this . insertionMode = InsertionMode . IN_SELECT ;
758- }
759-
760736 //Foster parenting
761737
762738 /** @protected */
@@ -859,9 +835,7 @@ export class Parser<T extends TreeAdapterTypeMap> implements TokenHandler, Stack
859835 characterInBody ( this , token ) ;
860836 break ;
861837 }
862- case InsertionMode . TEXT :
863- case InsertionMode . IN_SELECT :
864- case InsertionMode . IN_SELECT_IN_TABLE : {
838+ case InsertionMode . TEXT : {
865839 this . _insertCharacters ( token ) ;
866840 break ;
867841 }
@@ -974,8 +948,6 @@ export class Parser<T extends TreeAdapterTypeMap> implements TokenHandler, Stack
974948 case InsertionMode . IN_TABLE_BODY :
975949 case InsertionMode . IN_ROW :
976950 case InsertionMode . IN_CELL :
977- case InsertionMode . IN_SELECT :
978- case InsertionMode . IN_SELECT_IN_TABLE :
979951 case InsertionMode . IN_TEMPLATE :
980952 case InsertionMode . IN_FRAMESET :
981953 case InsertionMode . AFTER_FRAMESET : {
@@ -1110,14 +1082,6 @@ export class Parser<T extends TreeAdapterTypeMap> implements TokenHandler, Stack
11101082 startTagInCell ( this , token ) ;
11111083 break ;
11121084 }
1113- case InsertionMode . IN_SELECT : {
1114- startTagInSelect ( this , token ) ;
1115- break ;
1116- }
1117- case InsertionMode . IN_SELECT_IN_TABLE : {
1118- startTagInSelectInTable ( this , token ) ;
1119- break ;
1120- }
11211085 case InsertionMode . IN_TEMPLATE : {
11221086 startTagInTemplate ( this , token ) ;
11231087 break ;
@@ -1220,14 +1184,6 @@ export class Parser<T extends TreeAdapterTypeMap> implements TokenHandler, Stack
12201184 endTagInCell ( this , token ) ;
12211185 break ;
12221186 }
1223- case InsertionMode . IN_SELECT : {
1224- endTagInSelect ( this , token ) ;
1225- break ;
1226- }
1227- case InsertionMode . IN_SELECT_IN_TABLE : {
1228- endTagInSelectInTable ( this , token ) ;
1229- break ;
1230- }
12311187 case InsertionMode . IN_TEMPLATE : {
12321188 endTagInTemplate ( this , token ) ;
12331189 break ;
@@ -1285,9 +1241,7 @@ export class Parser<T extends TreeAdapterTypeMap> implements TokenHandler, Stack
12851241 case InsertionMode . IN_COLUMN_GROUP :
12861242 case InsertionMode . IN_TABLE_BODY :
12871243 case InsertionMode . IN_ROW :
1288- case InsertionMode . IN_CELL :
1289- case InsertionMode . IN_SELECT :
1290- case InsertionMode . IN_SELECT_IN_TABLE : {
1244+ case InsertionMode . IN_CELL : {
12911245 eofInBody ( this , token ) ;
12921246 break ;
12931247 }
@@ -1340,8 +1294,6 @@ export class Parser<T extends TreeAdapterTypeMap> implements TokenHandler, Stack
13401294 case InsertionMode . AFTER_HEAD :
13411295 case InsertionMode . TEXT :
13421296 case InsertionMode . IN_COLUMN_GROUP :
1343- case InsertionMode . IN_SELECT :
1344- case InsertionMode . IN_SELECT_IN_TABLE :
13451297 case InsertionMode . IN_FRAMESET :
13461298 case InsertionMode . AFTER_FRAMESET : {
13471299 this . _insertCharacters ( token ) ;
@@ -2158,6 +2110,13 @@ function hrStartTagInBody<T extends TreeAdapterTypeMap>(p: Parser<T>, token: Tag
21582110 p . _closePElement ( ) ;
21592111 }
21602112
2113+ if ( p . openElements . hasInScope ( $ . SELECT ) ) {
2114+ p . openElements . generateImpliedEndTagsWithExclusion ( $ . OPTGROUP ) ;
2115+ if ( p . openElements . hasInScope ( $ . OPTION ) ) {
2116+ p . _err ( token , ERR . characterReferenceOutsideUnicodeRange ) ; // TODO correct error type
2117+ }
2118+ }
2119+
21612120 p . _appendElement ( token , NS . HTML ) ;
21622121 p . framesetOk = false ;
21632122 token . ackSelfClosing = true ;
@@ -2202,26 +2161,45 @@ function rawTextStartTagInBody<T extends TreeAdapterTypeMap>(p: Parser<T>, token
22022161}
22032162
22042163function selectStartTagInBody < T extends TreeAdapterTypeMap > ( p : Parser < T > , token : TagToken ) : void {
2164+ if ( p . openElements . hasInScope ( $ . SELECT ) ) {
2165+ p . _err ( token , ERR . characterReferenceOutsideUnicodeRange ) ; // TODO correct error type
2166+ p . openElements . popUntilTagNamePopped ( $ . SELECT ) ;
2167+ }
2168+
22052169 p . _reconstructActiveFormattingElements ( ) ;
22062170 p . _insertElement ( token , NS . HTML ) ;
22072171 p . framesetOk = false ;
2172+ }
2173+
2174+ function optionStartTagInBody < T extends TreeAdapterTypeMap > ( p : Parser < T > , token : TagToken ) : void {
2175+ if ( p . openElements . hasInScope ( $ . SELECT ) ) {
2176+ p . openElements . generateImpliedEndTagsWithExclusion ( $ . OPTGROUP ) ;
2177+ if ( p . openElements . hasInScope ( $ . OPTION ) ) {
2178+ p . _err ( token , ERR . characterReferenceOutsideUnicodeRange ) ; // TODO correct error type
2179+ }
2180+ } else {
2181+ if ( p . openElements . currentTagId === $ . OPTION ) {
2182+ p . openElements . pop ( ) ;
2183+ }
2184+ p . _reconstructActiveFormattingElements ( ) ;
2185+ }
22082186
2209- p . insertionMode =
2210- p . insertionMode === InsertionMode . IN_TABLE ||
2211- p . insertionMode === InsertionMode . IN_CAPTION ||
2212- p . insertionMode === InsertionMode . IN_TABLE_BODY ||
2213- p . insertionMode === InsertionMode . IN_ROW ||
2214- p . insertionMode === InsertionMode . IN_CELL
2215- ? InsertionMode . IN_SELECT_IN_TABLE
2216- : InsertionMode . IN_SELECT ;
2187+ p . _insertElement ( token , NS . HTML ) ;
22172188}
22182189
22192190function optgroupStartTagInBody < T extends TreeAdapterTypeMap > ( p : Parser < T > , token : TagToken ) : void {
2220- if ( p . openElements . currentTagId === $ . OPTION ) {
2221- p . openElements . pop ( ) ;
2191+ if ( p . openElements . hasInScope ( $ . SELECT ) ) {
2192+ p . openElements . generateImpliedEndTags ( ) ;
2193+ if ( p . openElements . hasInScope ( $ . OPTION ) || p . openElements . hasInScope ( $ . OPTGROUP ) ) {
2194+ p . _err ( token , ERR . characterReferenceOutsideUnicodeRange ) ; // TODO correct error type
2195+ }
2196+ } else {
2197+ if ( p . openElements . currentTagId == $ . OPTION ) {
2198+ p . openElements . pop ( ) ;
2199+ }
2200+ p . _reconstructActiveFormattingElements ( ) ;
22222201 }
22232202
2224- p . _reconstructActiveFormattingElements ( ) ;
22252203 p . _insertElement ( token , NS . HTML ) ;
22262204}
22272205
@@ -2444,7 +2422,10 @@ function startTagInBody<T extends TreeAdapterTypeMap>(p: Parser<T>, token: TagTo
24442422 selectStartTagInBody ( p , token ) ;
24452423 break ;
24462424 }
2447- case $ . OPTION :
2425+ case $ . OPTION : {
2426+ optionStartTagInBody ( p , token ) ;
2427+ break ;
2428+ }
24482429 case $ . OPTGROUP : {
24492430 optgroupStartTagInBody ( p , token ) ;
24502431 break ;
@@ -3269,155 +3250,6 @@ function endTagInCell<T extends TreeAdapterTypeMap>(p: Parser<T>, token: TagToke
32693250 }
32703251}
32713252
3272- // The "in select" insertion mode
3273- //------------------------------------------------------------------
3274- function startTagInSelect < T extends TreeAdapterTypeMap > ( p : Parser < T > , token : TagToken ) : void {
3275- switch ( token . tagID ) {
3276- case $ . HTML : {
3277- startTagInBody ( p , token ) ;
3278- break ;
3279- }
3280- case $ . OPTION : {
3281- if ( p . openElements . currentTagId === $ . OPTION ) {
3282- p . openElements . pop ( ) ;
3283- }
3284-
3285- p . _insertElement ( token , NS . HTML ) ;
3286- break ;
3287- }
3288- case $ . OPTGROUP : {
3289- if ( p . openElements . currentTagId === $ . OPTION ) {
3290- p . openElements . pop ( ) ;
3291- }
3292-
3293- if ( p . openElements . currentTagId === $ . OPTGROUP ) {
3294- p . openElements . pop ( ) ;
3295- }
3296-
3297- p . _insertElement ( token , NS . HTML ) ;
3298- break ;
3299- }
3300- case $ . HR : {
3301- if ( p . openElements . currentTagId === $ . OPTION ) {
3302- p . openElements . pop ( ) ;
3303- }
3304-
3305- if ( p . openElements . currentTagId === $ . OPTGROUP ) {
3306- p . openElements . pop ( ) ;
3307- }
3308-
3309- p . _appendElement ( token , NS . HTML ) ;
3310- token . ackSelfClosing = true ;
3311- break ;
3312- }
3313- case $ . INPUT :
3314- case $ . KEYGEN :
3315- case $ . TEXTAREA :
3316- case $ . SELECT : {
3317- if ( p . openElements . hasInSelectScope ( $ . SELECT ) ) {
3318- p . openElements . popUntilTagNamePopped ( $ . SELECT ) ;
3319- p . _resetInsertionMode ( ) ;
3320-
3321- if ( token . tagID !== $ . SELECT ) {
3322- p . _processStartTag ( token ) ;
3323- }
3324- }
3325- break ;
3326- }
3327- case $ . SCRIPT :
3328- case $ . TEMPLATE : {
3329- startTagInHead ( p , token ) ;
3330- break ;
3331- }
3332- default :
3333- // Do nothing
3334- }
3335- }
3336-
3337- function endTagInSelect < T extends TreeAdapterTypeMap > ( p : Parser < T > , token : TagToken ) : void {
3338- switch ( token . tagID ) {
3339- case $ . OPTGROUP : {
3340- if (
3341- p . openElements . stackTop > 0 &&
3342- p . openElements . currentTagId === $ . OPTION &&
3343- p . openElements . tagIDs [ p . openElements . stackTop - 1 ] === $ . OPTGROUP
3344- ) {
3345- p . openElements . pop ( ) ;
3346- }
3347-
3348- if ( p . openElements . currentTagId === $ . OPTGROUP ) {
3349- p . openElements . pop ( ) ;
3350- }
3351- break ;
3352- }
3353- case $ . OPTION : {
3354- if ( p . openElements . currentTagId === $ . OPTION ) {
3355- p . openElements . pop ( ) ;
3356- }
3357- break ;
3358- }
3359- case $ . SELECT : {
3360- if ( p . openElements . hasInSelectScope ( $ . SELECT ) ) {
3361- p . openElements . popUntilTagNamePopped ( $ . SELECT ) ;
3362- p . _resetInsertionMode ( ) ;
3363- }
3364- break ;
3365- }
3366- case $ . TEMPLATE : {
3367- templateEndTagInHead ( p , token ) ;
3368- break ;
3369- }
3370- default :
3371- // Do nothing
3372- }
3373- }
3374-
3375- // The "in select in table" insertion mode
3376- //------------------------------------------------------------------
3377- function startTagInSelectInTable < T extends TreeAdapterTypeMap > ( p : Parser < T > , token : TagToken ) : void {
3378- const tn = token . tagID ;
3379-
3380- if (
3381- tn === $ . CAPTION ||
3382- tn === $ . TABLE ||
3383- tn === $ . TBODY ||
3384- tn === $ . TFOOT ||
3385- tn === $ . THEAD ||
3386- tn === $ . TR ||
3387- tn === $ . TD ||
3388- tn === $ . TH
3389- ) {
3390- p . openElements . popUntilTagNamePopped ( $ . SELECT ) ;
3391- p . _resetInsertionMode ( ) ;
3392- p . _processStartTag ( token ) ;
3393- } else {
3394- startTagInSelect ( p , token ) ;
3395- }
3396- }
3397-
3398- function endTagInSelectInTable < T extends TreeAdapterTypeMap > ( p : Parser < T > , token : TagToken ) : void {
3399- const tn = token . tagID ;
3400-
3401- if (
3402- tn === $ . CAPTION ||
3403- tn === $ . TABLE ||
3404- tn === $ . TBODY ||
3405- tn === $ . TFOOT ||
3406- tn === $ . THEAD ||
3407- tn === $ . TR ||
3408- tn === $ . TD ||
3409- tn === $ . TH
3410- ) {
3411- if ( p . openElements . hasInTableScope ( tn ) ) {
3412- p . openElements . popUntilTagNamePopped ( $ . SELECT ) ;
3413- p . _resetInsertionMode ( ) ;
3414- p . onEndTag ( token ) ;
3415- }
3416- } else {
3417- endTagInSelect ( p , token ) ;
3418- }
3419- }
3420-
34213253// The "in template" insertion mode
34223254//------------------------------------------------------------------
34233255function startTagInTemplate < T extends TreeAdapterTypeMap > ( p : Parser < T > , token : TagToken ) : void {
0 commit comments