Bumping manifests a=b2g-bump
[gecko.git] / dom / base / test / test_navigator_language.html
blobc569e458c1ac74c0c852b3d60f896a08b80b384f
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 type="application/javascript" 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;version=1.7">
20 "use strict";
22 SimpleTest.waitForExplicitFinish();
24 /** Test for NavigatorLanguage **/
25 var prefValue = null;
26 var actualLanguageChangesFromHandler = 0;
27 var actualLanguageChangesFromAVL = 0;
28 var expectedLanguageChanges = 0;
30 function setUp() {
31 try {
32 prefValue = SpecialPowers.getCharPref('intl.accept_languages');
33 } catch (e) {
37 function tearDown() {
38 SpecialPowers.setCharPref('intl.accept_languages', prefValue);
41 var testValues = [
42 { accept_languages: 'foo', language: 'foo', languages: ['foo'] },
43 { accept_languages: '', language: '', languages: [] },
44 { accept_languages: 'foo,bar', language: 'foo', languages: [ 'foo', 'bar' ] },
45 { accept_languages: ' foo , bar ', language: 'foo', languages: [ 'foo', 'bar' ] },
46 { accept_languages: ' foo ; bar ', language: 'foo ; bar', languages: [ 'foo ; bar' ] },
47 { accept_languages: '_foo_', language: '_foo_', languages: ['_foo_'] },
48 { accept_languages: 'en_', language: 'en-', languages: ['en-'] },
49 { accept_languages: 'en__', language: 'en-_', languages: ['en-_'] },
50 { accept_languages: 'en_US, fr_FR', language: 'en-US', languages: ['en-US', 'fr-FR'] },
51 { accept_languages: 'en_US_CA', language: 'en-US_CA', languages: ['en-US_CA'] },
52 { accept_languages: 'en_us-ca', language: 'en-US-CA', languages: ['en-US-CA'] },
53 { accept_languages: 'en_us-cal, en_us-c', language: 'en-US-cal', languages: ['en-US-cal', 'en-US-c'] },
56 var currentTestIdx = 0;
57 var tests = [];
58 function nextTest() {
59 currentTestIdx++;
60 if (currentTestIdx >= tests.length) {
61 tearDown();
62 SimpleTest.finish();
63 return;
66 tests[currentTestIdx]();
69 // Check that the API is there.
70 tests.push(function testAPIPresence() {
71 ok('language' in window.navigator);
72 ok('languages' in window.navigator);
73 ok('onlanguagechange' in window);
75 nextTest();
76 });
78 // Check that calling navigator.languages return the same array, unless there
79 // was a change.
80 tests.push(function testArrayCached() {
81 var previous = navigator.languages;
82 is(navigator.languages, navigator.languages, "navigator.languages is cached");
83 is(navigator.languages, previous, "navigator.languages is cached");
85 window.onlanguagechange = function() {
86 isnot(navigator.languages, previous, "navigator.languages cached value was updated");
87 window.onlanguagechange = null;
89 nextTest();
92 setTimeout(function() {
93 SpecialPowers.setCharPref('intl.accept_languages', 'testArrayCached');
94 }, 0);
95 });
97 // Test that event handler inside the <body> works as expected and that the
98 // event has the expected properties.
99 tests.push(function testEventProperties() {
100 document.body.setAttribute('onlanguagechange',
101 "document.body.removeAttribute('onlanguagechange');" +
102 "is(event.cancelable, false); is(event.bubbles, false);" +
103 "nextTest();");
105 setTimeout(function() {
106 SpecialPowers.setCharPref('intl.accept_languages', 'testEventProperties');
107 }, 0);
110 // Check that the returned values such as the behavior when the underlying
111 // languages change.
112 tests.push(function testBasicBehaviour() {
113 function checkIfDoneAndProceed() {
114 if (actualLanguageChangesFromHandler == actualLanguageChangesFromAVL) {
115 if (genEvents.next().done) {
116 window.onlanguagechange = null;
117 window.removeEventListener('languagechange', languageChangeAVL);
118 nextTest();
122 window.onlanguagechange = function() {
123 actualLanguageChangesFromHandler++;
124 checkIfDoneAndProceed();
126 function languageChangeAVL() {
127 actualLanguageChangesFromAVL++;
128 checkIfDoneAndProceed();
130 window.addEventListener('languagechange', languageChangeAVL);
132 function* testEvents() {
133 for (var i = 0; i < testValues.length; ++i) {
134 var data = testValues[i];
135 setTimeout(function(data) {
136 SpecialPowers.setCharPref('intl.accept_languages', data.accept_languages);
137 }, 0, data);
138 expectedLanguageChanges++;
139 yield undefined;
141 is(actualLanguageChangesFromAVL, expectedLanguageChanges);
142 is(actualLanguageChangesFromHandler, expectedLanguageChanges);
144 is(navigator.language, data.language);
145 is(navigator.languages.length, data.languages.length);
146 if (navigator.languages.length > 0) {
147 is(navigator.languages[0], navigator.language)
149 for (var j = 0; j < navigator.languages.length; ++j) {
150 is(navigator.languages[j], data.languages[j]);
155 var genEvents = testEvents();
156 genEvents.next();
159 // Check that the orientationchange event isn't sent twice if the preference
160 // is set to the same value.
161 tests.push(function testOnlyFireIfRealChange() {
162 function* changeLanguage() {
163 setTimeout(function() {
164 SpecialPowers.setCharPref('intl.accept_languages', 'fr-CA');
166 yield undefined;
168 setTimeout(function() {
169 // Twice the same change, should fire only one event.
170 SpecialPowers.setCharPref('intl.accept_languages', 'fr-CA');
171 setTimeout(function() {
172 // A real change to tell the test it should now count how many changes were
173 // received until now.
174 SpecialPowers.setCharPref('intl.accept_languages', 'fr-FR');
177 yield undefined;
180 var genChanges = changeLanguage();
182 var doubleEventCount = 0;
183 window.onlanguagechange = function() {
184 if (navigator.language == 'fr-FR') {
185 is(1, doubleEventCount);
186 window.onlanguagechange = null;
187 nextTest();
188 return;
191 if (navigator.language == 'fr-CA') {
192 doubleEventCount++;
194 genChanges.next();
197 genChanges.next();
200 // Check that there is no crash when a change happen after a window listening
201 // to them is killed.
202 tests.push(function testThatAddingAnEventDoesNotHaveSideEffects() {
203 var frame = document.createElement('iframe');
204 frame.src = 'data:text/html,<script>window.onlanguagechange=function(){}<\/script>';
205 document.body.appendChild(frame);
207 frame.contentWindow.onload = function() {
208 document.body.removeChild(frame);
209 frame = null;
211 SpecialPowers.exactGC(window, function() {
212 // This should not crash.
213 SpecialPowers.setCharPref('intl.accept_languages', 'en-GB');
215 nextTest();
220 // There is one test using document.body.
221 addLoadEvent(function() {
222 setUp();
223 tests[0]();
226 </script>
227 </body>
228 </html>