gecko-dev/dom/browser-element/mochitest/browserElement_Metachange.js

199 строки
7.3 KiB
JavaScript

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