Wed, 31 Dec 2014 06:55:50 +0100
Added tag UPSTREAM_283F7C6 for changeset ca08bd8f51b2
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);