Blame dom/base/test/test_navigator_language.html

Packit f0b94e
Packit f0b94e
<html>
Packit f0b94e
Packit f0b94e
https://bugzilla.mozilla.org/show_bug.cgi?id=889335
Packit f0b94e
-->
Packit f0b94e
<head>
Packit f0b94e
  <meta charset="utf-8">
Packit f0b94e
  <title>Test for NavigatorLanguage</title>
Packit f0b94e
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
Packit f0b94e
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
Packit f0b94e
</head>
Packit f0b94e
<body>
Packit f0b94e
Mozilla Bug 889335
Packit f0b94e

Packit f0b94e
Packit f0b94e
Packit f0b94e
Packit f0b94e
Packit f0b94e
<script type="application/javascript">
Packit f0b94e
  "use strict";
Packit f0b94e
Packit f0b94e
  SimpleTest.waitForExplicitFinish();
Packit f0b94e
Packit f0b94e
  /** Test for NavigatorLanguage **/
Packit f0b94e
  var actualLanguageChangesFromHandler = 0;
Packit f0b94e
  var actualLanguageChangesFromAVL = 0;
Packit f0b94e
  var expectedLanguageChanges = 0;
Packit f0b94e
Packit f0b94e
  var testValues = [
Packit f0b94e
    { accept_languages: 'foo', language: 'foo', languages: ['foo'] },
Packit f0b94e
    { accept_languages: '', language: '', languages: [] },
Packit f0b94e
    { accept_languages: 'foo,bar', language: 'foo', languages: [ 'foo', 'bar' ] },
Packit f0b94e
    { accept_languages: '  foo , bar ', language: 'foo', languages: [ 'foo', 'bar' ] },
Packit f0b94e
    { accept_languages: '  foo ; bar ', language: 'foo ; bar', languages: [ 'foo ; bar' ] },
Packit f0b94e
    { accept_languages: '_foo_', language: '_foo_', languages: ['_foo_'] },
Packit f0b94e
    { accept_languages: 'en_', language: 'en-', languages: ['en-'] },
Packit f0b94e
    { accept_languages: 'en__', language: 'en-_', languages: ['en-_'] },
Packit f0b94e
    { accept_languages: 'en_US, fr_FR', language: 'en-US', languages: ['en-US', 'fr-FR'] },
Packit f0b94e
    { accept_languages: 'en_US_CA', language: 'en-US_CA', languages: ['en-US_CA'] },
Packit f0b94e
    { accept_languages: 'en_us-ca', language: 'en-US-CA', languages: ['en-US-CA'] },
Packit f0b94e
    { accept_languages: 'en_us-cal, en_us-c', language: 'en-US-cal', languages: ['en-US-cal', 'en-US-c'] },
Packit f0b94e
  ];
Packit f0b94e
Packit f0b94e
  var currentTestIdx = 0;
Packit f0b94e
  var tests = [];
Packit f0b94e
  function nextTest() {
Packit f0b94e
    currentTestIdx++;
Packit f0b94e
    if (currentTestIdx >= tests.length) {
Packit f0b94e
      SimpleTest.finish();
Packit f0b94e
      return;
Packit f0b94e
    }
Packit f0b94e
Packit f0b94e
    tests[currentTestIdx]();
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  // Check that the API is there.
Packit f0b94e
  tests.push(function testAPIPresence() {
Packit f0b94e
    ok('language' in window.navigator);
Packit f0b94e
    ok('languages' in window.navigator);
Packit f0b94e
    ok('onlanguagechange' in window);
Packit f0b94e
Packit f0b94e
    nextTest();
Packit f0b94e
  });
Packit f0b94e
Packit f0b94e
  // Check that calling navigator.languages return the same array, unless there
Packit f0b94e
  // was a change.
Packit f0b94e
  tests.push(function testArrayCached() {
Packit f0b94e
    var previous = navigator.languages;
Packit f0b94e
    is(navigator.languages, navigator.languages, "navigator.languages is cached");
Packit f0b94e
    is(navigator.languages, previous, "navigator.languages is cached");
Packit f0b94e
Packit f0b94e
    window.onlanguagechange = function() {
Packit f0b94e
      isnot(navigator.languages, previous, "navigator.languages cached value was updated");
Packit f0b94e
      window.onlanguagechange = null;
Packit f0b94e
Packit f0b94e
      nextTest();
Packit f0b94e
    }
Packit f0b94e
Packit f0b94e
    setTimeout(function() {
Packit f0b94e
      SpecialPowers.pushPrefEnv({"set": [['intl.accept_languages', 'testArrayCached']]});
Packit f0b94e
    }, 0);
Packit f0b94e
  });
Packit f0b94e
Packit f0b94e
  // Test that event handler inside the <body> works as expected and that the
Packit f0b94e
  // event has the expected properties.
Packit f0b94e
  tests.push(function testEventProperties() {
Packit f0b94e
    document.body.setAttribute('onlanguagechange',
Packit f0b94e
      "document.body.removeAttribute('onlanguagechange');" +
Packit f0b94e
      "is(event.cancelable, false); is(event.bubbles, false);" +
Packit f0b94e
      "nextTest();");
Packit f0b94e
Packit f0b94e
    setTimeout(function() {
Packit f0b94e
      SpecialPowers.pushPrefEnv({"set": [['intl.accept_languages', 'testEventProperties']]}, function() {});
Packit f0b94e
    }, 0);
Packit f0b94e
  });
Packit f0b94e
Packit f0b94e
  // Check that the returned values such as the behavior when the underlying
Packit f0b94e
  // languages change.
Packit f0b94e
  tests.push(function testBasicBehaviour() {
Packit f0b94e
    function checkIfDoneAndProceed() {
Packit f0b94e
      if (actualLanguageChangesFromHandler == actualLanguageChangesFromAVL) {
Packit f0b94e
        if (genEvents.next().done) {
Packit f0b94e
          window.onlanguagechange = null;
Packit f0b94e
          window.removeEventListener('languagechange', languageChangeAVL);
Packit f0b94e
          nextTest();
Packit f0b94e
        }
Packit f0b94e
      }
Packit f0b94e
    }
Packit f0b94e
    window.onlanguagechange = function() {
Packit f0b94e
      actualLanguageChangesFromHandler++;
Packit f0b94e
      checkIfDoneAndProceed();
Packit f0b94e
    }
Packit f0b94e
    function languageChangeAVL() {
Packit f0b94e
      actualLanguageChangesFromAVL++;
Packit f0b94e
      checkIfDoneAndProceed();
Packit f0b94e
    }
Packit f0b94e
    window.addEventListener('languagechange', languageChangeAVL);
Packit f0b94e
Packit f0b94e
    function* testEvents() {
Packit f0b94e
      for (var i = 0; i < testValues.length; ++i) {
Packit f0b94e
        var data = testValues[i];
Packit f0b94e
        setTimeout(function(data) {
Packit f0b94e
          SpecialPowers.pushPrefEnv({"set": [['intl.accept_languages', data.accept_languages]]});
Packit f0b94e
        }, 0, data);
Packit f0b94e
        expectedLanguageChanges++;
Packit f0b94e
        yield undefined;
Packit f0b94e
Packit f0b94e
        is(actualLanguageChangesFromAVL, expectedLanguageChanges);
Packit f0b94e
        is(actualLanguageChangesFromHandler, expectedLanguageChanges);
Packit f0b94e
Packit f0b94e
        is(navigator.language, data.language);
Packit f0b94e
        is(navigator.languages.length, data.languages.length);
Packit f0b94e
        if (navigator.languages.length > 0) {
Packit f0b94e
          is(navigator.languages[0], navigator.language)
Packit f0b94e
        }
Packit f0b94e
        for (var j = 0; j < navigator.languages.length; ++j) {
Packit f0b94e
          is(navigator.languages[j], data.languages[j]);
Packit f0b94e
        }
Packit f0b94e
      }
Packit f0b94e
    }
Packit f0b94e
Packit f0b94e
    var genEvents = testEvents();
Packit f0b94e
    genEvents.next();
Packit f0b94e
  });
Packit f0b94e
Packit f0b94e
  // Check that the languagechange event isn't sent twice if the preference
Packit f0b94e
  // is set to the same value.
Packit f0b94e
  tests.push(function testOnlyFireIfRealChange() {
Packit f0b94e
    function* changeLanguage() {
Packit f0b94e
      setTimeout(function() {
Packit f0b94e
        SpecialPowers.pushPrefEnv({"set": [['intl.accept_languages', 'fr-CA']]});
Packit f0b94e
      });
Packit f0b94e
      yield undefined;
Packit f0b94e
Packit f0b94e
      setTimeout(function() {
Packit f0b94e
        // Twice the same change, should fire only one event.
Packit f0b94e
        SpecialPowers.pushPrefEnv({"set": [['intl.accept_languages', 'fr-CA']]});
Packit f0b94e
        setTimeout(function() {
Packit f0b94e
          // A real change to tell the test it should now count how many changes were
Packit f0b94e
          // received until now.
Packit f0b94e
          SpecialPowers.pushPrefEnv({"set": [['intl.accept_languages', 'fr-FR']]});
Packit f0b94e
        });
Packit f0b94e
      });
Packit f0b94e
      yield undefined;
Packit f0b94e
    }
Packit f0b94e
Packit f0b94e
    var genChanges = changeLanguage();
Packit f0b94e
Packit f0b94e
    var doubleEventCount = 0;
Packit f0b94e
    window.onlanguagechange = function() {
Packit f0b94e
      if (navigator.language == 'fr-FR') {
Packit f0b94e
        is(1, doubleEventCount);
Packit f0b94e
        window.onlanguagechange = null;
Packit f0b94e
        nextTest();
Packit f0b94e
        return;
Packit f0b94e
      }
Packit f0b94e
Packit f0b94e
      if (navigator.language == 'fr-CA') {
Packit f0b94e
        doubleEventCount++;
Packit f0b94e
      }
Packit f0b94e
      genChanges.next();
Packit f0b94e
    }
Packit f0b94e
Packit f0b94e
    genChanges.next();
Packit f0b94e
  });
Packit f0b94e
Packit f0b94e
  // Check that there is no crash when a change happen after a window listening
Packit f0b94e
  // to them is killed.
Packit f0b94e
  tests.push(function testThatAddingAnEventDoesNotHaveSideEffects() {
Packit f0b94e
    var frame = document.createElement('iframe');
Packit f0b94e
    frame.srcdoc = '<script>window.onlanguagechange=function(){}<\/script>';
Packit f0b94e
    document.body.appendChild(frame);
Packit f0b94e
Packit f0b94e
    frame.contentWindow.onload = function() {
Packit f0b94e
      document.body.removeChild(frame);
Packit f0b94e
      frame = null;
Packit f0b94e
Packit f0b94e
      SpecialPowers.exactGC(function() {
Packit f0b94e
        // This should not crash.
Packit f0b94e
        SpecialPowers.pushPrefEnv({"set": [['intl.accept_languages', 'en-GB']]}, nextTest);
Packit f0b94e
      });
Packit f0b94e
    }
Packit f0b94e
  });
Packit f0b94e
Packit f0b94e
  // There is one test using document.body.
Packit f0b94e
  addLoadEvent(function() {
Packit f0b94e
    tests[0]();
Packit f0b94e
  });
Packit f0b94e
Packit f0b94e
</script>
Packit f0b94e
</body>
Packit f0b94e
</html>