dom/browser-element/mochitest/browserElement_Metachange.js

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /* Any copyright is dedicated to the public domain.
     2    http://creativecommons.org/publicdomain/zero/1.0/ */
     4 // Test that the onmozbrowsermetachange event works.
     5 "use strict";
     7 SimpleTest.waitForExplicitFinish();
     8 browserElementTestHelpers.setEnabledPref(true);
     9 browserElementTestHelpers.addPermission();
    11 function createHtml(meta) {
    12   return 'data:text/html,<html xmlns:xml="http://www.w3.org/XML/1998/namespace"><head>' + meta + '<body></body></html>';
    13 }
    15 function createHtmlWithLang(meta, lang) {
    16   return 'data:text/html,<html xmlns:xml="http://www.w3.org/XML/1998/namespace" lang="' + lang + '"><head>' + meta + '<body></body></html>';
    17 }
    19 function createMeta(name, content) {
    20   return '<meta name="' + name + '" content="' + content + '">';
    21 }
    23 function createMetaWithLang(name, content, lang) {
    24   return '<meta name="' + name + '" content="' + content + '" lang="' + lang + '">';
    25 }
    27 function runTest() {
    28   var iframe1 = document.createElement('iframe');
    29   SpecialPowers.wrap(iframe1).mozbrowser = true;
    30   document.body.appendChild(iframe1);
    32   // iframe2 is a red herring; we modify its meta elements but don't listen for
    33   // metachanges; we want to make sure that its metachange events aren't
    34   // picked up by the listener on iframe1.
    35   var iframe2 = document.createElement('iframe');
    36   SpecialPowers.wrap(iframe2).mozbrowser = true;
    37   document.body.appendChild(iframe2);
    39   // iframe3 is another red herring.  It's not a mozbrowser, so we shouldn't
    40   // get any metachange events on it.
    41   var iframe3 = document.createElement('iframe');
    42   document.body.appendChild(iframe3);
    44   var numMetaChanges = 0;
    46   iframe1.addEventListener('mozbrowsermetachange', function(e) {
    48     numMetaChanges++;
    50     if (numMetaChanges == 1) {
    51       is(e.detail.name, 'application-name');
    52       is(e.detail.content, 'foobar');
    54       // We should recieve metachange events when the user creates new metas
    55       SpecialPowers.getBrowserFrameMessageManager(iframe1)
    56                    .loadFrameScript("data:,content.document.title='New title';",
    57                                     /* allowDelayedLoad = */ false);
    59       SpecialPowers.getBrowserFrameMessageManager(iframe1)
    60                    .loadFrameScript("data:,content.document.head.insertAdjacentHTML('beforeend', '<meta name=application-name content=new_foobar>')",
    61                                     /* allowDelayedLoad = */ false);
    63       SpecialPowers.getBrowserFrameMessageManager(iframe2)
    64                    .loadFrameScript("data:,content.document.head.insertAdjacentHTML('beforeend', '<meta name=application-name content=new_foobar>')",
    65                                     /* allowDelayedLoad = */ false);
    66     }
    67     else if (numMetaChanges == 2) {
    68       is(e.detail.name, 'application-name', 'name matches');
    69       is(e.detail.content, 'new_foobar', 'content matches');
    70       ok(!("lang" in e.detail), 'lang not present');
    72       // Full new pages should trigger metachange events
    73       iframe1.src = createHtml(createMeta('application-name', '3rd_foobar'));
    74     }
    75     else if (numMetaChanges == 3) {
    76       is(e.detail.name, 'application-name', 'name matches');
    77       is(e.detail.content, '3rd_foobar', 'content matches');
    78       ok(!("lang" in e.detail), 'lang not present');
    80       // Test setting a page with multiple meta elements
    81       iframe1.src = createHtml(createMeta('application-name', 'foobar_1') + createMeta('application-name', 'foobar_2'));
    82     }
    83     else if (numMetaChanges == 4) {
    84       is(e.detail.name, 'application-name', 'name matches');
    85       is(e.detail.content, 'foobar_1', 'content matches');
    86       ok(!("lang" in e.detail), 'lang not present');
    87       // 2 events will be triggered by previous test, wait for next
    88     }
    89     else if (numMetaChanges == 5) {
    90       is(e.detail.name, 'application-name', 'name matches');
    91       is(e.detail.content, 'foobar_2', 'content matches');
    92       ok(!("lang" in e.detail), 'lang not present');
    94       // Test the language
    95       iframe1.src = createHtml(createMetaWithLang('application-name', 'foobar_lang_1', 'en'));
    96     }
    97     else if (numMetaChanges == 6) {
    98       is(e.detail.name, 'application-name', 'name matches');
    99       is(e.detail.content, 'foobar_lang_1', 'content matches');
   100       is(e.detail.lang, 'en', 'language matches');
   102       // Test the language in the ancestor element
   103       iframe1.src = createHtmlWithLang(createMeta('application-name', 'foobar_lang_2'), 'es');
   104     }
   105     else if (numMetaChanges == 7) {
   106       is(e.detail.name, 'application-name', 'name matches');
   107       is(e.detail.content, 'foobar_lang_2', 'content matches');
   108       is(e.detail.lang, 'es', 'language matches');
   110       // Test the language in the ancestor element
   111       iframe1.src = createHtmlWithLang(createMetaWithLang('application-name', 'foobar_lang_3', 'it'), 'fi');
   112     }
   113     else if (numMetaChanges == 8) {
   114       is(e.detail.name, 'application-name', 'name matches');
   115       is(e.detail.content, 'foobar_lang_3', 'content matches');
   116       is(e.detail.lang, 'it', 'language matches');
   118       // Test the content-language
   119       iframe1.src = "http://test/tests/dom/browser-element/mochitest/file_browserElement_Metachange.sjs?ru";
   120     }
   121     else if (numMetaChanges == 9) {
   122       is(e.detail.name, 'application-name', 'name matches');
   123       is(e.detail.content, 'sjs', 'content matches');
   124       is(e.detail.lang, 'ru', 'language matches');
   126       // Test the content-language
   127       iframe1.src = "http://test/tests/dom/browser-element/mochitest/file_browserElement_Metachange.sjs?ru|dk";
   128     }
   129     else if (numMetaChanges == 10) {
   130       is(e.detail.name, 'application-name', 'name matches');
   131       is(e.detail.content, 'sjs', 'content matches');
   132       is(e.detail.lang, 'dk', 'language matches');
   134       // Test the language
   135       SimpleTest.finish();
   136     } else {
   137       ok(false, 'Too many metachange events.');
   138     }
   139   });
   141   iframe3.addEventListener('mozbrowsermetachange', function(e) {
   142     ok(false, 'Should not get a metachange event for iframe3.');
   143   });
   146   iframe1.src = createHtml(createMeta('application-name', 'foobar'));
   147   // We should not recieve meta change events for either of the below iframes
   148   iframe2.src = createHtml(createMeta('application-name', 'foobar'));
   149   iframe3.src = createHtml(createMeta('application-name', 'foobar'));
   151 }
   153 addEventListener('testready', runTest);

mercurial