Skip to content

Commit e73b834

Browse files
josepharharChromium LUCI CQ
authored andcommitted
Update SelectParserRelaxation for HTML spec PR
The HTML spec PR has gotten some feedback which I am implementing: whatwg/html#10557 Most notably this disallows the parsing of nested optgroups, but actually supporting nested optgroups would require additional work anyway, so I'm ok not supporting that in the parser for now. Change-Id: If1d9b8be30a299b7e32a53ef0231b611fd7e2510 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5874579 Reviewed-by: David Baron <[email protected]> Commit-Queue: Joey Arhar <[email protected]> Cr-Commit-Position: refs/heads/main@{#1367813}
1 parent 7506f0c commit e73b834

11 files changed

+42
-167
lines changed

third_party/blink/renderer/core/html/parser/html_tree_builder.cc

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -893,6 +893,12 @@ void HTMLTreeBuilder::ProcessStartTagForInBody(AtomicHTMLToken* token) {
893893
break;
894894
case HTMLTag::kHr:
895895
ProcessFakePEndTagIfPInButtonScope();
896+
if (RuntimeEnabledFeatures::SelectParserRelaxationEnabled()) {
897+
if (tree_.OpenElements()->InScope(HTMLTag::kSelect)) {
898+
tree_.GenerateImpliedEndTagsWithExclusion(
899+
HTMLTokenName(HTMLTag::kOptgroup));
900+
}
901+
}
896902
tree_.InsertSelfClosingHTMLElementDestroyingToken(token);
897903
frameset_ok_ = false;
898904
break;
@@ -959,11 +965,30 @@ void HTMLTreeBuilder::ProcessStartTagForInBody(AtomicHTMLToken* token) {
959965
break;
960966
case HTMLTag::kOptgroup:
961967
case HTMLTag::kOption:
962-
if (tree_.CurrentStackItem()->MatchesHTMLTag(HTMLTag::kOption)) {
963-
AtomicHTMLToken end_option(HTMLToken::kEndTag, HTMLTag::kOption);
964-
ProcessEndTag(&end_option);
968+
if (RuntimeEnabledFeatures::SelectParserRelaxationEnabled() &&
969+
tree_.OpenElements()->InScope(HTMLTag::kSelect)) {
970+
// TODO(crbug.com/1511354): Remove this if by separating the optgroup
971+
// and option cases when the SelectParserRelaxation flag is removed.
972+
if (token->GetHTMLTag() == HTMLTag::kOption) {
973+
tree_.GenerateImpliedEndTagsWithExclusion(
974+
HTMLTokenName(HTMLTag::kOptgroup));
975+
if (tree_.OpenElements()->InScope(HTMLTag::kOption)) {
976+
ParseError(token);
977+
}
978+
} else {
979+
tree_.GenerateImpliedEndTags();
980+
if (tree_.OpenElements()->InScope(HTMLTag::kOption) ||
981+
tree_.OpenElements()->InScope(HTMLTag::kOptgroup)) {
982+
ParseError(token);
983+
}
984+
}
985+
} else {
986+
if (tree_.CurrentStackItem()->MatchesHTMLTag(HTMLTag::kOption)) {
987+
AtomicHTMLToken end_option(HTMLToken::kEndTag, HTMLTag::kOption);
988+
ProcessEndTag(&end_option);
989+
}
990+
tree_.ReconstructTheActiveFormattingElements();
965991
}
966-
tree_.ReconstructTheActiveFormattingElements();
967992
tree_.InsertHTMLElement(token);
968993
break;
969994
case HTMLTag::kRb:
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
This is a testharness.js-based test.
2-
Found 2 FAIL, 0 TIMEOUT, 0 NOTRUN.
2+
Found 1 FAIL, 0 TIMEOUT, 0 NOTRUN.
33
[FAIL] html5lib_tests2.html 3067a820b0195f9c08b8d0fe1dd7f8d800e10779
44
assert_equals: expected "#document\\n| <!DOCTYPE html>\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <option>\\n| <option>" but got "#document\\n| <!DOCTYPE html>\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <option>\\n| <select>\\n| <option>"
5-
[FAIL] html5lib_tests2.html e1011849d36ebf9d1577c53d940a75c462dcb1e7
6-
assert_equals: expected "#document\\n| <!DOCTYPE html>\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <optgroup>" but got "#document\\n| <!DOCTYPE html>\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <optgroup>"
75
Harness: the test ran to completion.
86

Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
This is a testharness.js-based test.
2-
Found 2 FAIL, 0 TIMEOUT, 0 NOTRUN.
2+
Found 1 FAIL, 0 TIMEOUT, 0 NOTRUN.
33
[FAIL] html5lib_tests2.html 3067a820b0195f9c08b8d0fe1dd7f8d800e10779
44
assert_equals: expected "#document\\n| <!DOCTYPE html>\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <option>\\n| <option>" but got "#document\\n| <!DOCTYPE html>\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <option>\\n| <select>\\n| <option>"
5-
[FAIL] html5lib_tests2.html e1011849d36ebf9d1577c53d940a75c462dcb1e7
6-
assert_equals: expected "#document\\n| <!DOCTYPE html>\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <optgroup>" but got "#document\\n| <!DOCTYPE html>\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <optgroup>"
75
Harness: the test ran to completion.
86

Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
This is a testharness.js-based test.
2-
Found 2 FAIL, 0 TIMEOUT, 0 NOTRUN.
2+
Found 1 FAIL, 0 TIMEOUT, 0 NOTRUN.
33
[FAIL] html5lib_tests2.html 3067a820b0195f9c08b8d0fe1dd7f8d800e10779
44
assert_equals: expected "#document\\n| <!DOCTYPE html>\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <option>\\n| <option>" but got "#document\\n| <!DOCTYPE html>\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <option>\\n| <select>\\n| <option>"
5-
[FAIL] html5lib_tests2.html e1011849d36ebf9d1577c53d940a75c462dcb1e7
6-
assert_equals: expected "#document\\n| <!DOCTYPE html>\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <optgroup>" but got "#document\\n| <!DOCTYPE html>\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <optgroup>"
75
Harness: the test ran to completion.
86

third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_webkit02_run_type=uri-expected.txt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
This is a testharness.js-based test.
22
[FAIL] html5lib_webkit02.html 6e33515b4dc011dd390d433a6358bf68b786b1fd
33
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <b>\\n| <em>\\n| <foo>\\n| <foo>\\n| <foo>\\n| <aside>\\n| <b>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <b>\\n| <em>\\n| <foo>\\n| <foo>\\n| <foo>\\n| <aside>\\n| <em>\\n| <b>"
4-
[FAIL] html5lib_webkit02.html 4879f476053094cf5602d325724675378856a902
5-
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <option>\\n| <hr>"
64
[FAIL] html5lib_webkit02.html 44c88b90236f01ebc8e0123363b527640a07070c
7-
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>"
5+
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>"
86
[FAIL] html5lib_webkit02.html cfb304e8f2d3cbdecc362226e7775cab452d5489
97
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <hr>"
108
[FAIL] html5lib_webkit02.html 3fc625e7cb9b6ea72a9e252ede84c6fdd9680d87
119
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <option>\\n| <optgroup>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <option>\\n| <optgroup>\\n| <hr>"
12-
[FAIL] html5lib_webkit02.html cee2230c74671c594a1140a68d16e3d3e5ae005a
13-
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <option>\\n| <hr>"
1410
[FAIL] html5lib_webkit02.html 22b9fe36797d70a3b71a6aadc6ad7cff23c3fc90
15-
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>"
11+
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>"
1612
[FAIL] html5lib_webkit02.html a82c3bf49c381b5f58c5c8a4bbbe0cef2458e28a
1713
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <hr>"
1814
[FAIL] html5lib_webkit02.html 61f8d527795dc8044a95a3e2437de81e16597ceb

third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_webkit02_run_type=write-expected.txt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
This is a testharness.js-based test.
22
[FAIL] html5lib_webkit02.html 6e33515b4dc011dd390d433a6358bf68b786b1fd
33
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <b>\\n| <em>\\n| <foo>\\n| <foo>\\n| <foo>\\n| <aside>\\n| <b>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <b>\\n| <em>\\n| <foo>\\n| <foo>\\n| <foo>\\n| <aside>\\n| <em>\\n| <b>"
4-
[FAIL] html5lib_webkit02.html 4879f476053094cf5602d325724675378856a902
5-
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <option>\\n| <hr>"
64
[FAIL] html5lib_webkit02.html 44c88b90236f01ebc8e0123363b527640a07070c
7-
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>"
5+
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>"
86
[FAIL] html5lib_webkit02.html cfb304e8f2d3cbdecc362226e7775cab452d5489
97
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <hr>"
108
[FAIL] html5lib_webkit02.html 3fc625e7cb9b6ea72a9e252ede84c6fdd9680d87
119
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <option>\\n| <optgroup>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <option>\\n| <optgroup>\\n| <hr>"
12-
[FAIL] html5lib_webkit02.html cee2230c74671c594a1140a68d16e3d3e5ae005a
13-
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <option>\\n| <hr>"
1410
[FAIL] html5lib_webkit02.html 22b9fe36797d70a3b71a6aadc6ad7cff23c3fc90
15-
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>"
11+
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>"
1612
[FAIL] html5lib_webkit02.html a82c3bf49c381b5f58c5c8a4bbbe0cef2458e28a
1713
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <hr>"
1814
[FAIL] html5lib_webkit02.html 61f8d527795dc8044a95a3e2437de81e16597ceb

third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_webkit02_run_type=write_single-expected.txt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
This is a testharness.js-based test.
22
[FAIL] html5lib_webkit02.html 6e33515b4dc011dd390d433a6358bf68b786b1fd
33
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <b>\\n| <em>\\n| <foo>\\n| <foo>\\n| <foo>\\n| <aside>\\n| <b>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <b>\\n| <em>\\n| <foo>\\n| <foo>\\n| <foo>\\n| <aside>\\n| <em>\\n| <b>"
4-
[FAIL] html5lib_webkit02.html 4879f476053094cf5602d325724675378856a902
5-
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <option>\\n| <hr>"
64
[FAIL] html5lib_webkit02.html 44c88b90236f01ebc8e0123363b527640a07070c
7-
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>"
5+
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>"
86
[FAIL] html5lib_webkit02.html cfb304e8f2d3cbdecc362226e7775cab452d5489
97
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <optgroup>\\n| <hr>"
108
[FAIL] html5lib_webkit02.html 3fc625e7cb9b6ea72a9e252ede84c6fdd9680d87
119
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <option>\\n| <optgroup>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <select>\\n| <option>\\n| <optgroup>\\n| <hr>"
12-
[FAIL] html5lib_webkit02.html cee2230c74671c594a1140a68d16e3d3e5ae005a
13-
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <option>\\n| <hr>"
1410
[FAIL] html5lib_webkit02.html 22b9fe36797d70a3b71a6aadc6ad7cff23c3fc90
15-
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>"
11+
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <option>\\n| <hr>"
1612
[FAIL] html5lib_webkit02.html a82c3bf49c381b5f58c5c8a4bbbe0cef2458e28a
1713
assert_equals: expected "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <hr>" but got "#document\\n| <html>\\n| <head>\\n| <body>\\n| <table>\\n| <tbody>\\n| <tr>\\n| <td>\\n| <select>\\n| <optgroup>\\n| <hr>"
1814
[FAIL] html5lib_webkit02.html 61f8d527795dc8044a95a3e2437de81e16597ceb
Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
CONSOLE WARNING: A <select> tag was parsed within another <select> tag and was converted into </select><select>. Please add the missing </select> end tag.
22
../resources/tests2.dat:
33
38
4-
39
54

65
Test 38 of 63 in ../resources/tests2.dat failed. Input:
76
<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option>
@@ -26,24 +25,3 @@ Expected:
2625
| <option>
2726
| <option>
2827
| <option>
29-
30-
Test 39 of 63 in ../resources/tests2.dat failed. Input:
31-
<!DOCTYPE html><select><optgroup><option><optgroup>
32-
Got:
33-
| <!DOCTYPE html>
34-
| <html>
35-
| <head>
36-
| <body>
37-
| <select>
38-
| <optgroup>
39-
| <option>
40-
| <optgroup>
41-
Expected:
42-
| <!DOCTYPE html>
43-
| <html>
44-
| <head>
45-
| <body>
46-
| <select>
47-
| <optgroup>
48-
| <option>
49-
| <optgroup>
Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
CONSOLE WARNING: A <select> tag was parsed within another <select> tag and was converted into </select><select>. Please add the missing </select> end tag.
22
../resources/tests2.dat:
33
38
4-
39
54

65
Test 38 of 63 in ../resources/tests2.dat failed. Input:
76
<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option>
@@ -26,24 +25,3 @@ Expected:
2625
| <option>
2726
| <option>
2827
| <option>
29-
30-
Test 39 of 63 in ../resources/tests2.dat failed. Input:
31-
<!DOCTYPE html><select><optgroup><option><optgroup>
32-
Got:
33-
| <!DOCTYPE html>
34-
| <html>
35-
| <head>
36-
| <body>
37-
| <select>
38-
| <optgroup>
39-
| <option>
40-
| <optgroup>
41-
Expected:
42-
| <!DOCTYPE html>
43-
| <html>
44-
| <head>
45-
| <body>
46-
| <select>
47-
| <optgroup>
48-
| <option>
49-
| <optgroup>

0 commit comments

Comments
 (0)