Bug 1892041 - Part 1: Update test262 features. r=spidermonkey-reviewers,dminor
[gecko.git] / dom / base / test / test_navigator_language.html
blob4fc7e47865fc1fb0894094ee88bc5b972c268c30
1 <!DOCTYPE HTML>
2 <html>
3 <!--
4 https://bugzilla.mozilla.org/show_bug.cgi?id=889335
5 -->
6 <head>
7 <meta charset="utf-8">
8 <title>Test for NavigatorLanguage</title>
9 <script src="/tests/SimpleTest/SimpleTest.js"></script>
10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
11 </head>
12 <body>
13 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=889335">Mozilla Bug 889335</a>
14 <p id="display"></p>
15 <div id="content" style="display: none">
16 </div>
17 <pre id="test">
18 </pre>
19 <script type="application/javascript">
20 "use strict";
22 SimpleTest.waitForExplicitFinish();
24 /** Test for NavigatorLanguage **/
25 var actualLanguageChangesFromHandler = 0;
26 var actualLanguageChangesFromAVL = 0;
27 var expectedLanguageChanges = 0;
28 var emptyLocale = SpecialPowers.Services.locale.webExposedLocales[0];
30 var testValues = [
31 { accept_languages: 'foo', language: 'foo', languages: ['foo'] },
32 { accept_languages: '', language: emptyLocale, languages: [emptyLocale] },
33 { accept_languages: 'foo,bar', language: 'foo', languages: [ 'foo', 'bar' ] },
34 { accept_languages: ' foo , bar ', language: 'foo', languages: [ 'foo', 'bar' ] },
35 { accept_languages: ' foo ; bar ', language: 'foo ; bar', languages: [ 'foo ; bar' ] },
36 { accept_languages: '_foo_', language: '_foo_', languages: ['_foo_'] },
37 { accept_languages: 'en_', language: 'en-', languages: ['en-'] },
38 { accept_languages: 'en__', language: 'en-_', languages: ['en-_'] },
39 { accept_languages: 'en_US, fr_FR', language: 'en-US', languages: ['en-US', 'fr-FR'] },
40 { accept_languages: 'en_US_CA', language: 'en-US_CA', languages: ['en-US_CA'] },
41 { accept_languages: 'en_us-ca', language: 'en-US-CA', languages: ['en-US-CA'] },
42 { accept_languages: 'en_us-cal, en_us-c', language: 'en-US-cal', languages: ['en-US-cal', 'en-US-c'] },
45 var currentTestIdx = 0;
46 var tests = [];
47 function nextTest() {
48 currentTestIdx++;
49 if (currentTestIdx >= tests.length) {
50 SimpleTest.finish();
51 return;
54 tests[currentTestIdx]();
57 // Check that the API is there.
58 tests.push(function testAPIPresence() {
59 ok('language' in window.navigator);
60 ok('languages' in window.navigator);
61 ok('onlanguagechange' in window);
63 nextTest();
64 });
66 // Check that calling navigator.languages return the same array, unless there
67 // was a change.
68 tests.push(function testArrayCached() {
69 var previous = navigator.languages;
70 is(navigator.languages, navigator.languages, "navigator.languages is cached");
71 is(navigator.languages, previous, "navigator.languages is cached");
73 window.onlanguagechange = function() {
74 isnot(navigator.languages, previous, "navigator.languages cached value was updated");
75 window.onlanguagechange = null;
77 nextTest();
80 setTimeout(function() {
81 SpecialPowers.pushPrefEnv({"set": [['intl.accept_languages', 'testArrayCached']]});
82 }, 0);
83 });
85 // Test that event handler inside the <body> works as expected and that the
86 // event has the expected properties.
87 tests.push(function testEventProperties() {
88 document.body.setAttribute('onlanguagechange',
89 "document.body.removeAttribute('onlanguagechange');" +
90 "is(event.cancelable, false); is(event.bubbles, false);" +
91 "nextTest();");
93 setTimeout(function() {
94 SpecialPowers.pushPrefEnv({"set": [['intl.accept_languages', 'testEventProperties']]}, function() {});
95 }, 0);
96 });
98 // Check that the returned values such as the behavior when the underlying
99 // languages change.
100 tests.push(function testBasicBehaviour() {
101 function checkIfDoneAndProceed() {
102 if (actualLanguageChangesFromHandler == actualLanguageChangesFromAVL) {
103 if (genEvents.next().done) {
104 window.onlanguagechange = null;
105 window.removeEventListener('languagechange', languageChangeAVL);
106 nextTest();
110 window.onlanguagechange = function() {
111 actualLanguageChangesFromHandler++;
112 checkIfDoneAndProceed();
114 function languageChangeAVL() {
115 actualLanguageChangesFromAVL++;
116 checkIfDoneAndProceed();
118 window.addEventListener('languagechange', languageChangeAVL);
120 function* testEvents() {
121 for (var i = 0; i < testValues.length; ++i) {
122 var data = testValues[i];
123 setTimeout(function(d) {
124 SpecialPowers.pushPrefEnv({"set": [['intl.accept_languages', d.accept_languages]]});
125 }, 0, data);
126 expectedLanguageChanges++;
127 yield undefined;
129 is(actualLanguageChangesFromAVL, expectedLanguageChanges);
130 is(actualLanguageChangesFromHandler, expectedLanguageChanges);
132 is(navigator.language, data.language);
133 is(navigator.languages.length, data.languages.length);
134 if (navigator.languages.length) {
135 is(navigator.languages[0], navigator.language)
137 for (var j = 0; j < navigator.languages.length; ++j) {
138 is(navigator.languages[j], data.languages[j]);
143 var genEvents = testEvents();
144 genEvents.next();
147 // Check that the languagechange event isn't sent twice if the preference
148 // is set to the same value.
149 tests.push(function testOnlyFireIfRealChange() {
150 function* changeLanguage() {
151 setTimeout(function() {
152 SpecialPowers.pushPrefEnv({"set": [['intl.accept_languages', 'fr-CA']]});
154 yield undefined;
156 setTimeout(function() {
157 // Twice the same change, should fire only one event.
158 SpecialPowers.pushPrefEnv({"set": [['intl.accept_languages', 'fr-CA']]});
159 setTimeout(function() {
160 // A real change to tell the test it should now count how many changes were
161 // received until now.
162 SpecialPowers.pushPrefEnv({"set": [['intl.accept_languages', 'fr-FR']]});
165 yield undefined;
168 var genChanges = changeLanguage();
170 var doubleEventCount = 0;
171 window.onlanguagechange = function() {
172 if (navigator.language == 'fr-FR') {
173 is(1, doubleEventCount);
174 window.onlanguagechange = null;
175 nextTest();
176 return;
179 if (navigator.language == 'fr-CA') {
180 doubleEventCount++;
182 genChanges.next();
185 genChanges.next();
188 // Check that there is no crash when a change happen after a window listening
189 // to them is killed.
190 tests.push(function testThatAddingAnEventDoesNotHaveSideEffects() {
191 var frame = document.createElement('iframe');
192 frame.srcdoc = '<script>window.onlanguagechange=function(){}<\/script>';
193 document.body.appendChild(frame);
195 frame.contentWindow.onload = function() {
196 document.body.removeChild(frame);
197 frame = null;
199 SpecialPowers.exactGC(function() {
200 // This should not crash.
201 SpecialPowers.pushPrefEnv({"set": [['intl.accept_languages', 'en-GB']]}, nextTest);
206 // There is one test using document.body.
207 addLoadEvent(function() {
208 tests[0]();
211 </script>
212 </body>
213 </html>