@@ -624,6 +624,13 @@ where
624
624
625
625
tag @ <hr> => {
626
626
self . close_p_element_in_button_scope( ) ;
627
+ if self . in_scope_named( default_scope, local_name!( "select" ) ) {
628
+ self . generate_implied_end_except( local_name!( "optgroup" ) ) ;
629
+ if self . in_scope_named( default_scope, local_name!( "option" ) ) {
630
+ self . sink. parse_error( Borrowed ( "hr in option" ) ) ;
631
+ }
632
+ }
633
+
627
634
self . insert_and_pop_element_for( tag) ;
628
635
self . frameset_ok. set( false ) ;
629
636
DoneAckSelfClosing
@@ -662,28 +669,50 @@ where
662
669
// <noscript> handled in wildcard case below
663
670
664
671
tag @ <select> => {
672
+ if self . in_scope_named( default_scope, local_name!( "select" ) ) {
673
+ self . sink. parse_error( Borrowed ( "nested select" ) ) ;
674
+ self . pop_until_named( local_name!( "select" ) ) ;
675
+ }
676
+
665
677
self . reconstruct_formatting( ) ;
666
678
self . insert_element_for( tag) ;
667
679
self . frameset_ok. set( false ) ;
668
- // NB: mode == InBody but possibly self.mode != mode, if
669
- // we're processing "as in the rules for InBody".
670
- self . mode. set( match self . mode. get( ) {
671
- InTable | InCaption | InTableBody
672
- | InRow | InCell => InSelectInTable ,
673
- _ => InSelect ,
674
- } ) ;
675
680
Done
676
681
}
677
682
678
- tag @ <optgroup> <option> => {
679
- if self . current_node_named( local_name!( "option" ) ) {
680
- self . pop( ) ;
683
+ tag @ <option> => {
684
+ if self . in_scope_named( default_scope, local_name!( "select" ) ) {
685
+ self . generate_implied_end_except( local_name!( "optgroup" ) ) ;
686
+ if self . in_scope_named( default_scope, local_name!( "option" ) ) {
687
+ self . sink. parse_error( Borrowed ( "nested options" ) ) ;
688
+ }
689
+ } else {
690
+ if self . current_node_named( local_name!( "option" ) ) {
691
+ self . pop( ) ;
692
+ }
693
+ self . reconstruct_formatting( ) ;
681
694
}
682
- self . reconstruct_formatting ( ) ;
695
+
683
696
self . insert_element_for( tag) ;
684
697
Done
685
698
}
686
699
700
+ tag @ <optgroup> => {
701
+ if self . in_scope_named( default_scope, local_name!( "select" ) ) {
702
+ self . generate_implied_end( cursory_implied_end) ;
703
+ // XXX: perf
704
+ if self . in_scope_named( default_scope, local_name!( "option" ) ) || self . in_scope_named( default_scope, local_name!( "optgroup" ) ) {
705
+ self . sink. parse_error( Borrowed ( "nested options" ) ) ;
706
+ }
707
+ } else {
708
+ if self . current_node_named( local_name!( "option" ) ) {
709
+ self . pop( ) ;
710
+ }
711
+ self . reconstruct_formatting( ) ;
712
+ }
713
+ Done
714
+ }
715
+
687
716
tag @ <rb> <rtc> => {
688
717
if self . in_scope_named( default_scope, local_name!( "ruby" ) ) {
689
718
self . generate_implied_end( cursory_implied_end) ;
@@ -1100,121 +1129,6 @@ where
1100
1129
token => self . step( InBody , token) ,
1101
1130
} ) ,
1102
1131
1103
- //§ parsing-main-inselect
1104
- InSelect => match_token ! ( token {
1105
- NullCharacterToken => self . unexpected( & token) ,
1106
- CharacterTokens ( _, text) => self . append_text( text) ,
1107
- CommentToken ( text) => self . append_comment( text) ,
1108
-
1109
- <html> => self . step( InBody , token) ,
1110
-
1111
- tag @ <option> => {
1112
- if self . current_node_named( local_name!( "option" ) ) {
1113
- self . pop( ) ;
1114
- }
1115
- self . insert_element_for( tag) ;
1116
- Done
1117
- }
1118
-
1119
- tag @ <optgroup> => {
1120
- if self . current_node_named( local_name!( "option" ) ) {
1121
- self . pop( ) ;
1122
- }
1123
- if self . current_node_named( local_name!( "optgroup" ) ) {
1124
- self . pop( ) ;
1125
- }
1126
- self . insert_element_for( tag) ;
1127
- Done
1128
- }
1129
-
1130
- tag @ <hr> => {
1131
- if self . current_node_named( local_name!( "option" ) ) {
1132
- self . pop( ) ;
1133
- }
1134
- if self . current_node_named( local_name!( "optgroup" ) ) {
1135
- self . pop( ) ;
1136
- }
1137
- self . insert_element_for( tag) ;
1138
- self . pop( ) ;
1139
- DoneAckSelfClosing
1140
- }
1141
-
1142
- </optgroup> => {
1143
- if self . open_elems. borrow( ) . len( ) >= 2
1144
- && self . current_node_named( local_name!( "option" ) )
1145
- && self . html_elem_named( & self . open_elems. borrow( ) [ self . open_elems. borrow( ) . len( ) - 2 ] ,
1146
- local_name!( "optgroup" ) ) {
1147
- self . pop( ) ;
1148
- }
1149
- if self . current_node_named( local_name!( "optgroup" ) ) {
1150
- self . pop( ) ;
1151
- } else {
1152
- self . unexpected( & token) ;
1153
- }
1154
- Done
1155
- }
1156
-
1157
- </option> => {
1158
- if self . current_node_named( local_name!( "option" ) ) {
1159
- self . pop( ) ;
1160
- } else {
1161
- self . unexpected( & token) ;
1162
- }
1163
- Done
1164
- }
1165
-
1166
- tag @ <select> </select> => {
1167
- let in_scope = self . in_scope_named( select_scope, local_name!( "select" ) ) ;
1168
-
1169
- if !in_scope || tag. kind == StartTag {
1170
- self . unexpected( & tag) ;
1171
- }
1172
-
1173
- if in_scope {
1174
- self . pop_until_named( local_name!( "select" ) ) ;
1175
- self . mode. set( self . reset_insertion_mode( ) ) ;
1176
- }
1177
- Done
1178
- }
1179
-
1180
- <input> <keygen> <textarea> => {
1181
- self . unexpected( & token) ;
1182
- if self . in_scope_named( select_scope, local_name!( "select" ) ) {
1183
- self . pop_until_named( local_name!( "select" ) ) ;
1184
- Reprocess ( self . reset_insertion_mode( ) , token)
1185
- } else {
1186
- Done
1187
- }
1188
- }
1189
-
1190
- <script> <template> </template> => self . step( InHead , token) ,
1191
-
1192
- EOFToken => self . step( InBody , token) ,
1193
-
1194
- token => self . unexpected( & token) ,
1195
- } ) ,
1196
-
1197
- //§ parsing-main-inselectintable
1198
- InSelectInTable => match_token ! ( token {
1199
- <caption> <table> <tbody> <tfoot> <thead> <tr> <td> <th> => {
1200
- self . unexpected( & token) ;
1201
- self . pop_until_named( local_name!( "select" ) ) ;
1202
- Reprocess ( self . reset_insertion_mode( ) , token)
1203
- }
1204
-
1205
- tag @ </caption> </table> </tbody> </tfoot> </thead> </tr> </td> </th> => {
1206
- self . unexpected( & tag) ;
1207
- if self . in_scope_named( table_scope, tag. name. clone( ) ) {
1208
- self . pop_until_named( local_name!( "select" ) ) ;
1209
- Reprocess ( self . reset_insertion_mode( ) , TagToken ( tag) )
1210
- } else {
1211
- Done
1212
- }
1213
- }
1214
-
1215
- token => self . step( InSelect , token) ,
1216
- } ) ,
1217
-
1218
1132
//§ parsing-main-intemplate
1219
1133
InTemplate => match_token ! ( token {
1220
1134
CharacterTokens ( _, _) => self . step( InBody , token) ,
0 commit comments