|
1 /* Any copyright is dedicated to the public domain. |
|
2 http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 // Test that the onmozbrowsermetachange event works. |
|
5 "use strict"; |
|
6 |
|
7 SimpleTest.waitForExplicitFinish(); |
|
8 browserElementTestHelpers.setEnabledPref(true); |
|
9 browserElementTestHelpers.addPermission(); |
|
10 |
|
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 } |
|
14 |
|
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 } |
|
18 |
|
19 function createMeta(name, content) { |
|
20 return '<meta name="' + name + '" content="' + content + '">'; |
|
21 } |
|
22 |
|
23 function createMetaWithLang(name, content, lang) { |
|
24 return '<meta name="' + name + '" content="' + content + '" lang="' + lang + '">'; |
|
25 } |
|
26 |
|
27 function runTest() { |
|
28 var iframe1 = document.createElement('iframe'); |
|
29 SpecialPowers.wrap(iframe1).mozbrowser = true; |
|
30 document.body.appendChild(iframe1); |
|
31 |
|
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); |
|
38 |
|
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); |
|
43 |
|
44 var numMetaChanges = 0; |
|
45 |
|
46 iframe1.addEventListener('mozbrowsermetachange', function(e) { |
|
47 |
|
48 numMetaChanges++; |
|
49 |
|
50 if (numMetaChanges == 1) { |
|
51 is(e.detail.name, 'application-name'); |
|
52 is(e.detail.content, 'foobar'); |
|
53 |
|
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); |
|
58 |
|
59 SpecialPowers.getBrowserFrameMessageManager(iframe1) |
|
60 .loadFrameScript("data:,content.document.head.insertAdjacentHTML('beforeend', '<meta name=application-name content=new_foobar>')", |
|
61 /* allowDelayedLoad = */ false); |
|
62 |
|
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'); |
|
71 |
|
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'); |
|
79 |
|
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'); |
|
93 |
|
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'); |
|
101 |
|
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'); |
|
109 |
|
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'); |
|
117 |
|
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'); |
|
125 |
|
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'); |
|
133 |
|
134 // Test the language |
|
135 SimpleTest.finish(); |
|
136 } else { |
|
137 ok(false, 'Too many metachange events.'); |
|
138 } |
|
139 }); |
|
140 |
|
141 iframe3.addEventListener('mozbrowsermetachange', function(e) { |
|
142 ok(false, 'Should not get a metachange event for iframe3.'); |
|
143 }); |
|
144 |
|
145 |
|
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')); |
|
150 |
|
151 } |
|
152 |
|
153 addEventListener('testready', runTest); |