michael@0: /* Any copyright is dedicated to the public domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: // Test that the onmozbrowsermetachange event works. michael@0: "use strict"; michael@0: michael@0: SimpleTest.waitForExplicitFinish(); michael@0: browserElementTestHelpers.setEnabledPref(true); michael@0: browserElementTestHelpers.addPermission(); michael@0: michael@0: function createHtml(meta) { michael@0: return 'data:text/html,' + meta + ''; michael@0: } michael@0: michael@0: function createHtmlWithLang(meta, lang) { michael@0: return 'data:text/html,' + meta + ''; michael@0: } michael@0: michael@0: function createMeta(name, content) { michael@0: return ''; michael@0: } michael@0: michael@0: function createMetaWithLang(name, content, lang) { michael@0: return ''; michael@0: } michael@0: michael@0: function runTest() { michael@0: var iframe1 = document.createElement('iframe'); michael@0: SpecialPowers.wrap(iframe1).mozbrowser = true; michael@0: document.body.appendChild(iframe1); michael@0: michael@0: // iframe2 is a red herring; we modify its meta elements but don't listen for michael@0: // metachanges; we want to make sure that its metachange events aren't michael@0: // picked up by the listener on iframe1. michael@0: var iframe2 = document.createElement('iframe'); michael@0: SpecialPowers.wrap(iframe2).mozbrowser = true; michael@0: document.body.appendChild(iframe2); michael@0: michael@0: // iframe3 is another red herring. It's not a mozbrowser, so we shouldn't michael@0: // get any metachange events on it. michael@0: var iframe3 = document.createElement('iframe'); michael@0: document.body.appendChild(iframe3); michael@0: michael@0: var numMetaChanges = 0; michael@0: michael@0: iframe1.addEventListener('mozbrowsermetachange', function(e) { michael@0: michael@0: numMetaChanges++; michael@0: michael@0: if (numMetaChanges == 1) { michael@0: is(e.detail.name, 'application-name'); michael@0: is(e.detail.content, 'foobar'); michael@0: michael@0: // We should recieve metachange events when the user creates new metas michael@0: SpecialPowers.getBrowserFrameMessageManager(iframe1) michael@0: .loadFrameScript("data:,content.document.title='New title';", michael@0: /* allowDelayedLoad = */ false); michael@0: michael@0: SpecialPowers.getBrowserFrameMessageManager(iframe1) michael@0: .loadFrameScript("data:,content.document.head.insertAdjacentHTML('beforeend', '')", michael@0: /* allowDelayedLoad = */ false); michael@0: michael@0: SpecialPowers.getBrowserFrameMessageManager(iframe2) michael@0: .loadFrameScript("data:,content.document.head.insertAdjacentHTML('beforeend', '')", michael@0: /* allowDelayedLoad = */ false); michael@0: } michael@0: else if (numMetaChanges == 2) { michael@0: is(e.detail.name, 'application-name', 'name matches'); michael@0: is(e.detail.content, 'new_foobar', 'content matches'); michael@0: ok(!("lang" in e.detail), 'lang not present'); michael@0: michael@0: // Full new pages should trigger metachange events michael@0: iframe1.src = createHtml(createMeta('application-name', '3rd_foobar')); michael@0: } michael@0: else if (numMetaChanges == 3) { michael@0: is(e.detail.name, 'application-name', 'name matches'); michael@0: is(e.detail.content, '3rd_foobar', 'content matches'); michael@0: ok(!("lang" in e.detail), 'lang not present'); michael@0: michael@0: // Test setting a page with multiple meta elements michael@0: iframe1.src = createHtml(createMeta('application-name', 'foobar_1') + createMeta('application-name', 'foobar_2')); michael@0: } michael@0: else if (numMetaChanges == 4) { michael@0: is(e.detail.name, 'application-name', 'name matches'); michael@0: is(e.detail.content, 'foobar_1', 'content matches'); michael@0: ok(!("lang" in e.detail), 'lang not present'); michael@0: // 2 events will be triggered by previous test, wait for next michael@0: } michael@0: else if (numMetaChanges == 5) { michael@0: is(e.detail.name, 'application-name', 'name matches'); michael@0: is(e.detail.content, 'foobar_2', 'content matches'); michael@0: ok(!("lang" in e.detail), 'lang not present'); michael@0: michael@0: // Test the language michael@0: iframe1.src = createHtml(createMetaWithLang('application-name', 'foobar_lang_1', 'en')); michael@0: } michael@0: else if (numMetaChanges == 6) { michael@0: is(e.detail.name, 'application-name', 'name matches'); michael@0: is(e.detail.content, 'foobar_lang_1', 'content matches'); michael@0: is(e.detail.lang, 'en', 'language matches'); michael@0: michael@0: // Test the language in the ancestor element michael@0: iframe1.src = createHtmlWithLang(createMeta('application-name', 'foobar_lang_2'), 'es'); michael@0: } michael@0: else if (numMetaChanges == 7) { michael@0: is(e.detail.name, 'application-name', 'name matches'); michael@0: is(e.detail.content, 'foobar_lang_2', 'content matches'); michael@0: is(e.detail.lang, 'es', 'language matches'); michael@0: michael@0: // Test the language in the ancestor element michael@0: iframe1.src = createHtmlWithLang(createMetaWithLang('application-name', 'foobar_lang_3', 'it'), 'fi'); michael@0: } michael@0: else if (numMetaChanges == 8) { michael@0: is(e.detail.name, 'application-name', 'name matches'); michael@0: is(e.detail.content, 'foobar_lang_3', 'content matches'); michael@0: is(e.detail.lang, 'it', 'language matches'); michael@0: michael@0: // Test the content-language michael@0: iframe1.src = "http://test/tests/dom/browser-element/mochitest/file_browserElement_Metachange.sjs?ru"; michael@0: } michael@0: else if (numMetaChanges == 9) { michael@0: is(e.detail.name, 'application-name', 'name matches'); michael@0: is(e.detail.content, 'sjs', 'content matches'); michael@0: is(e.detail.lang, 'ru', 'language matches'); michael@0: michael@0: // Test the content-language michael@0: iframe1.src = "http://test/tests/dom/browser-element/mochitest/file_browserElement_Metachange.sjs?ru|dk"; michael@0: } michael@0: else if (numMetaChanges == 10) { michael@0: is(e.detail.name, 'application-name', 'name matches'); michael@0: is(e.detail.content, 'sjs', 'content matches'); michael@0: is(e.detail.lang, 'dk', 'language matches'); michael@0: michael@0: // Test the language michael@0: SimpleTest.finish(); michael@0: } else { michael@0: ok(false, 'Too many metachange events.'); michael@0: } michael@0: }); michael@0: michael@0: iframe3.addEventListener('mozbrowsermetachange', function(e) { michael@0: ok(false, 'Should not get a metachange event for iframe3.'); michael@0: }); michael@0: michael@0: michael@0: iframe1.src = createHtml(createMeta('application-name', 'foobar')); michael@0: // We should not recieve meta change events for either of the below iframes michael@0: iframe2.src = createHtml(createMeta('application-name', 'foobar')); michael@0: iframe3.src = createHtml(createMeta('application-name', 'foobar')); michael@0: michael@0: } michael@0: michael@0: addEventListener('testready', runTest);