summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/semantics/forms/the-input-element/radio.html
blob: 6681b350692ee1bc53aed100aedb3f938155c35f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<!DOCTYPE html>
<meta charset=utf-8>
<title>input type radio</title>
<link rel="author" title="Denis Ah-Kang" href="mailto:denis@w3.org">
<link rel=help href="https://html.spec.whatwg.org/multipage/#radio-button-state-(type=radio)">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<input type=radio name=group1 id=radio1>
<input type=radio name=group1 id=radio2>

<input type=radio name=groüp2 id=radio3>
<input type=radio name=groÜp2 id=radio4>

<input type=radio id=radio5>
<input type=radio id=radio6 disabled>

<input type=radio name="group5" id=radio71 checked>
<input type=radio name="group5" id=radio72>

<input type=radio name=group3 id=radio8 checked>
<input type=radio name=group3 id=radio9>
<input type=radio name=group4 id=radio10>
<input type=radio name=group4 id=radio11 checked>


<script>
  var radio1 = document.getElementById('radio1'),
      radio2 = document.getElementById('radio2'),
      radio3 = document.getElementById('radio3'),
      radio4 = document.getElementById('radio4'),
      radio5 = document.getElementById('radio5'),
      radio6 = document.getElementById('radio6'),
      radio71 = document.getElementById('radio71'),
      radio72 = document.getElementById('radio72'),
      radio8 = document.getElementById('radio8'),
      radio9 = document.getElementById('radio9'),
      radio10 = document.getElementById('radio10'),
      radio11 = document.getElementById('radio11'),
      t1 = async_test("click on mutable radio fires click event, then input event, then change event"),
      t3 = async_test("click on non-mutable radio doesn't fire the input event"),
      t4 = async_test("click on non-mutable radio doesn't fire the change event"),
      t5 = async_test("canceled activation steps on unchecked radio"),
      input_fired = false,
      change_fired = false;

  test(function(){
    assert_false(radio1.checked);
    assert_false(radio2.checked);
    radio1.checked = true;
    assert_true(radio1.checked);
    assert_false(radio2.checked);
    radio2.checked = true;
    assert_false(radio1.checked);
    assert_true(radio2.checked);
  }, "only one control of a radio button group can have its checkedness set to true");

  test(function(){
    assert_false(radio3.checked);
    assert_false(radio4.checked);
    radio3.checked = true;
    assert_true(radio3.checked);
    assert_false(radio4.checked);
    radio4.checked = true;
    assert_false(radio3.checked);
    assert_true(radio4.checked);
  }, "radio inputs with name attributes groüp2 and groÜp2 belong to the same radio button group");

  test(function(){
    assert_true(radio8.checked);
    assert_false(radio9.checked);
    assert_false(radio10.checked);
    assert_true(radio11.checked);
    radio9.name="group4";
    radio9.checked = true;
    assert_true(radio8.checked);
    assert_true(radio9.checked);
    assert_false(radio10.checked);
    assert_false(radio11.checked);
  }, "changing the name of a radio input element and setting its checkedness to true makes all the other elements' checkedness in the same radio button group be set to false");

  radio5.onclick = t1.step_func(function(e) {
    click_fired = true;
    assert_false(input_fired, "click event should fire before input event");
    assert_false(change_fired, "click event should fire before change event");
    assert_false(e.isTrusted, "click()-initiated click event shouldn't be trusted");
  });

  radio5.oninput = t1.step_func(function(e) {
    input_fired = true;
    assert_true(click_fired, "input event should fire after click event");
    assert_false(change_fired, "input event should fire before change event");
    assert_true(e.bubbles, "input event should bubble")
    assert_true(e.isTrusted, "input event should be trusted");
    assert_false(e.cancelable, "input event should not be cancelable");
  });

  radio5.onchange = t1.step_func(function(e) {
    change_fired = true;
    assert_true(click_fired, "change event should fire after click event");
    assert_true(input_fired, "change event should fire after input event");
    assert_true(e.bubbles, "change event should bubble")
    assert_true(e.isTrusted, "change event should be trusted");
    assert_false(e.cancelable, "change event should not be cancelable");
  });

  radio6.oninput= t3.step_func_done(function(e) {
    assert_unreached("event input fired");
  });

  radio6.onchange = t4.step_func_done(function(e) {
    assert_unreached("event change fired");
  });

  t1.step(function() {
    radio5.click();
    assert_true(input_fired);
    t1.done();
  });

  t3.step(function(){
    radio6.click();
    t3.done();
    t4.done();
  });

  radio72.onclick = t5.step_func_done(function(e){
    assert_false(radio71.checked, "click on radio should uncheck other radio in same group");
    assert_true(radio72.checked, "click on radio should check that radio");
    e.preventDefault();
    // The cancelation of the click doesn't have an effect until after all the click event handlers have been run.
    assert_false(radio71.checked, "radio remains unchecked immediately after click event on other radio in same group is canceled");
    assert_true(radio72.checked, "clicked radio remains checked immediately after click event is canceled");
  });

  t5.step(function(){
    assert_true(radio71.checked, "initially checked radio should be checked");
    assert_false(radio72.checked, "other radios in same group as initially-checked radio should be unchecked");
    radio72.click();
    // Now that the click event has been fully dispatched, its cancelation has taken effect.
    assert_true(radio71.checked, "canceled click event on radio should leave the previously-checked radio checked");
    assert_false(radio72.checked, "canceled click event on previously-unchecked radio should leave that radio unchecked");
  });
</script>