forked from mirrors/gecko-dev
395 lines
15 KiB
JavaScript
395 lines
15 KiB
JavaScript
|
|
var SocialService = Cu.import("resource:///modules/SocialService.jsm", {}).SocialService;
|
|
|
|
var baseURL = "https://example.com/browser/browser/base/content/test/social/";
|
|
|
|
var manifest = { // normal provider
|
|
name: "provider 1",
|
|
origin: "https://example.com",
|
|
iconURL: "https://example.com/browser/browser/base/content/test/general/moz.png",
|
|
shareURL: "https://example.com/browser/browser/base/content/test/social/share.html"
|
|
};
|
|
var activationPage = "https://example.com/browser/browser/base/content/test/social/share_activate.html";
|
|
|
|
function sendActivationEvent(subframe) {
|
|
// hack Social.lastEventReceived so we don't hit the "too many events" check.
|
|
Social.lastEventReceived = 0;
|
|
let doc = subframe.contentDocument;
|
|
// if our test has a frame, use it
|
|
let button = doc.getElementById("activation");
|
|
ok(!!button, "got the activation button");
|
|
EventUtils.synthesizeMouseAtCenter(button, {}, doc.defaultView);
|
|
}
|
|
|
|
function test() {
|
|
waitForExplicitFinish();
|
|
Services.prefs.setCharPref("social.shareDirectory", activationPage);
|
|
|
|
let frameScript = "data:,(" + function frame_script() {
|
|
addEventListener("OpenGraphData", function(aEvent) {
|
|
sendAsyncMessage("sharedata", aEvent.detail);
|
|
}, true, true);
|
|
/* bug 1042991, ensure history is available by calling history.back on close */
|
|
addMessageListener("closeself", function(e) {
|
|
content.history.back();
|
|
content.close();
|
|
}, true);
|
|
/* if text is entered into field, onbeforeunload will cause a modal dialog
|
|
unless dialogs have been disabled for the iframe. */
|
|
content.onbeforeunload = function(e) {
|
|
return "FAIL.";
|
|
};
|
|
}.toString() + ")();";
|
|
let mm = getGroupMessageManager("social");
|
|
mm.loadFrameScript(frameScript, true);
|
|
|
|
// Animation on the panel can cause intermittent failures such as bug 1115131.
|
|
SocialShare.panel.setAttribute("animate", "false");
|
|
registerCleanupFunction(function() {
|
|
SocialShare.panel.removeAttribute("animate");
|
|
mm.removeDelayedFrameScript(frameScript);
|
|
Services.prefs.clearUserPref("social.directories");
|
|
Services.prefs.clearUserPref("social.shareDirectory");
|
|
Services.prefs.clearUserPref("social.share.activationPanelEnabled");
|
|
});
|
|
runSocialTests(tests, undefined, function(next) {
|
|
let shareButton = SocialShare.shareButton;
|
|
if (shareButton) {
|
|
CustomizableUI.removeWidgetFromArea("social-share-button", CustomizableUI.AREA_NAVBAR)
|
|
shareButton.remove();
|
|
}
|
|
next();
|
|
});
|
|
}
|
|
|
|
var corpus = [
|
|
{
|
|
url: baseURL + "opengraph/opengraph.html",
|
|
options: {
|
|
// og:title
|
|
title: ">This is my title<",
|
|
// og:description
|
|
description: "A test corpus file for open graph tags we care about",
|
|
// medium: this.getPageMedium(),
|
|
// source: this.getSourceURL(),
|
|
// og:url
|
|
url: "https://www.mozilla.org/",
|
|
// shortUrl: this.getShortURL(),
|
|
// og:image
|
|
previews:["https://www.mozilla.org/favicon.png"],
|
|
// og:site_name
|
|
siteName: ">My simple test page<"
|
|
}
|
|
},
|
|
{
|
|
// tests that og:url doesn't override the page url if it is bad
|
|
url: baseURL + "opengraph/og_invalid_url.html",
|
|
options: {
|
|
description: "A test corpus file for open graph tags passing a bad url",
|
|
url: baseURL + "opengraph/og_invalid_url.html",
|
|
previews: [],
|
|
siteName: "Evil chrome delivering website"
|
|
}
|
|
},
|
|
{
|
|
url: baseURL + "opengraph/shorturl_link.html",
|
|
options: {
|
|
previews: ["http://example.com/1234/56789.jpg"],
|
|
url: "http://www.example.com/photos/56789/",
|
|
shortUrl: "http://imshort/p/abcde"
|
|
}
|
|
},
|
|
{
|
|
url: baseURL + "opengraph/shorturl_linkrel.html",
|
|
options: {
|
|
previews: ["http://example.com/1234/56789.jpg"],
|
|
url: "http://www.example.com/photos/56789/",
|
|
shortUrl: "http://imshort/p/abcde"
|
|
}
|
|
},
|
|
{
|
|
url: baseURL + "opengraph/shortlink_linkrel.html",
|
|
options: {
|
|
previews: ["http://example.com/1234/56789.jpg"],
|
|
url: "http://www.example.com/photos/56789/",
|
|
shortUrl: "http://imshort/p/abcde"
|
|
}
|
|
}
|
|
];
|
|
|
|
function hasoptions(testOptions, options) {
|
|
for (let option in testOptions) {
|
|
let data = testOptions[option];
|
|
info("data: " + JSON.stringify(data));
|
|
let message_data = options[option];
|
|
info("message_data: " + JSON.stringify(message_data));
|
|
if (Array.isArray(data)) {
|
|
// the message may have more array elements than we are testing for, this
|
|
// is ok since some of those are hard to test. So we just test that
|
|
// anything in our test data IS in the message.
|
|
ok(Array.every(data, function(item) { return message_data.indexOf(item) >= 0 }), "option " + option);
|
|
} else {
|
|
is(message_data, data, "option " + option);
|
|
}
|
|
}
|
|
}
|
|
|
|
var tests = {
|
|
testShareDisabledOnActivation(next) {
|
|
// starting on about:blank page, share should be visible but disabled when
|
|
// adding provider
|
|
is(gBrowser.currentURI.spec, "about:blank");
|
|
|
|
// initialize the button into the navbar
|
|
CustomizableUI.addWidgetToArea("social-share-button", CustomizableUI.AREA_NAVBAR);
|
|
// ensure correct state
|
|
SocialUI.onCustomizeEnd(window);
|
|
|
|
SocialService.addProvider(manifest, function(provider) {
|
|
is(SocialUI.enabled, true, "SocialUI is enabled");
|
|
checkSocialUI();
|
|
// share should not be enabled since we only have about:blank page
|
|
let shareButton = SocialShare.shareButton;
|
|
// verify the attribute for proper css
|
|
is(shareButton.getAttribute("disabled"), "true", "share button attribute is disabled");
|
|
// button should be visible
|
|
is(shareButton.hidden, false, "share button is visible");
|
|
SocialService.disableProvider(manifest.origin, next);
|
|
});
|
|
},
|
|
testShareEnabledOnActivation(next) {
|
|
// starting from *some* page, share should be visible and enabled when
|
|
// activating provider
|
|
// initialize the button into the navbar
|
|
CustomizableUI.addWidgetToArea("social-share-button", CustomizableUI.AREA_NAVBAR);
|
|
// ensure correct state
|
|
SocialUI.onCustomizeEnd(window);
|
|
|
|
let testData = corpus[0];
|
|
BrowserTestUtils.openNewForegroundTab(gBrowser, testData.url).then(tab => {
|
|
SocialService.addProvider(manifest, function(provider) {
|
|
is(SocialUI.enabled, true, "SocialUI is enabled");
|
|
checkSocialUI();
|
|
// share should not be enabled since we only have about:blank page
|
|
let shareButton = SocialShare.shareButton;
|
|
// verify the attribute for proper css
|
|
ok(!shareButton.hasAttribute("disabled"), "share button is enabled");
|
|
// button should be visible
|
|
is(shareButton.hidden, false, "share button is visible");
|
|
BrowserTestUtils.removeTab(tab).then(next);
|
|
});
|
|
});
|
|
},
|
|
testSharePage(next) {
|
|
let testTab;
|
|
let testIndex = 0;
|
|
let testData = corpus[testIndex++];
|
|
|
|
// initialize the button into the navbar
|
|
CustomizableUI.addWidgetToArea("social-share-button", CustomizableUI.AREA_NAVBAR);
|
|
// ensure correct state
|
|
SocialUI.onCustomizeEnd(window);
|
|
|
|
let mm = getGroupMessageManager("social");
|
|
mm.addMessageListener("sharedata", function handler(msg) {
|
|
BrowserTestUtils.removeTab(testTab).then(() => {
|
|
hasoptions(testData.options, JSON.parse(msg.data));
|
|
testData = corpus[testIndex++];
|
|
BrowserTestUtils.waitForCondition(() => { return SocialShare.currentShare == null; }, "share panel closed").then(() => {
|
|
if (testData) {
|
|
runOneTest();
|
|
} else {
|
|
mm.removeMessageListener("sharedata", handler);
|
|
SocialService.disableProvider(manifest.origin, next);
|
|
}
|
|
});
|
|
SocialShare.iframe.messageManager.sendAsyncMessage("closeself", {});
|
|
});
|
|
});
|
|
|
|
function runOneTest() {
|
|
BrowserTestUtils.openNewForegroundTab(gBrowser, testData.url).then(tab => {
|
|
testTab = tab;
|
|
|
|
let shareButton = SocialShare.shareButton;
|
|
// verify the attribute for proper css
|
|
ok(!shareButton.hasAttribute("disabled"), "share button is enabled");
|
|
// button should be visible
|
|
is(shareButton.hidden, false, "share button is visible");
|
|
|
|
SocialShare.sharePage(manifest.origin);
|
|
});
|
|
}
|
|
executeSoon(runOneTest);
|
|
},
|
|
testShareMicroformats(next) {
|
|
// initialize the button into the navbar
|
|
CustomizableUI.addWidgetToArea("social-share-button", CustomizableUI.AREA_NAVBAR);
|
|
// ensure correct state
|
|
SocialUI.onCustomizeEnd(window);
|
|
|
|
SocialService.addProvider(manifest, function(provider) {
|
|
let target, testTab;
|
|
|
|
let expecting = JSON.stringify({
|
|
"url": "https://example.com/browser/browser/base/content/test/social/microformats.html",
|
|
"title": "Raspberry Pi Page",
|
|
"previews": ["https://example.com/someimage.jpg"],
|
|
"microformats": {
|
|
"items": [{
|
|
"type": ["h-product"],
|
|
"properties": {
|
|
"name": ["Raspberry Pi"],
|
|
"photo": ["https://example.com/someimage.jpg"],
|
|
"description": [{
|
|
"value": "The Raspberry Pi is a credit-card sized computer that plugs into your TV and a keyboard. It's a capable little PC which can be used for many of the things that your desktop PC does, like spreadsheets, word-processing and games. It also plays high-definition video. We want to see it being used by kids all over the world to learn programming.",
|
|
"html": "The Raspberry Pi is a credit-card sized computer that plugs into your TV and a keyboard. It's a capable little PC which can be used for many of the things that your desktop PC does, like spreadsheets, word-processing and games. It also plays high-definition video. We want to see it being used by kids all over the world to learn programming."
|
|
}
|
|
],
|
|
"url": ["https://example.com/"],
|
|
"price": ["29.95"],
|
|
"review": [{
|
|
"value": "4.5 out of 5",
|
|
"type": ["h-review"],
|
|
"properties": {
|
|
"rating": ["4.5"]
|
|
}
|
|
}
|
|
],
|
|
"category": ["Computer", "Education"]
|
|
}
|
|
}
|
|
],
|
|
"rels": {
|
|
"tag": ["https://example.com/wiki/computer", "https://example.com/wiki/education"]
|
|
},
|
|
"rel-urls": {
|
|
"https://example.com/wiki/computer": {
|
|
"text": "Computer",
|
|
"rels": ["tag"]
|
|
},
|
|
"https://example.com/wiki/education": {
|
|
"text": "Education",
|
|
"rels": ["tag"]
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
let mm = getGroupMessageManager("social");
|
|
mm.addMessageListener("sharedata", function handler(msg) {
|
|
is(msg.data, expecting, "microformats data ok");
|
|
BrowserTestUtils.waitForCondition(() => { return SocialShare.currentShare == null; },
|
|
"share panel closed").then(() => {
|
|
mm.removeMessageListener("sharedata", handler);
|
|
BrowserTestUtils.removeTab(testTab).then(() => {
|
|
SocialService.disableProvider(manifest.origin, next);
|
|
});
|
|
});
|
|
SocialShare.iframe.messageManager.sendAsyncMessage("closeself", {});
|
|
});
|
|
|
|
let url = "https://example.com/browser/browser/base/content/test/social/microformats.html"
|
|
BrowserTestUtils.openNewForegroundTab(gBrowser, url).then(tab => {
|
|
testTab = tab;
|
|
|
|
let shareButton = SocialShare.shareButton;
|
|
// verify the attribute for proper css
|
|
ok(!shareButton.hasAttribute("disabled"), "share button is enabled");
|
|
// button should be visible
|
|
is(shareButton.hidden, false, "share button is visible");
|
|
|
|
let doc = tab.linkedBrowser.contentDocument;
|
|
target = doc.getElementById("simple-hcard");
|
|
SocialShare.sharePage(manifest.origin, null, target);
|
|
});
|
|
});
|
|
},
|
|
testSharePanelActivation(next) {
|
|
let testTab;
|
|
// cleared in the cleanup function
|
|
Services.prefs.setCharPref("social.directories", "https://example.com");
|
|
Services.prefs.setBoolPref("social.share.activationPanelEnabled", true);
|
|
// make the iframe so we can wait on the load
|
|
SocialShare._createFrame();
|
|
let iframe = SocialShare.iframe;
|
|
|
|
// initialize the button into the navbar
|
|
CustomizableUI.addWidgetToArea("social-share-button", CustomizableUI.AREA_NAVBAR);
|
|
// ensure correct state
|
|
SocialUI.onCustomizeEnd(window);
|
|
|
|
ensureFrameLoaded(iframe).then(() => {
|
|
let subframe = iframe.contentDocument.getElementById("activation-frame");
|
|
ensureFrameLoaded(subframe, activationPage).then(() => {
|
|
is(subframe.contentDocument.location.href, activationPage, "activation page loaded");
|
|
promiseObserverNotified("social:provider-enabled").then(() => {
|
|
let mm = getGroupMessageManager("social");
|
|
mm.addMessageListener("sharedata", function handler(msg) {
|
|
ok(true, "share completed");
|
|
|
|
BrowserTestUtils.waitForCondition(() => { return SocialShare.currentShare == null; },
|
|
"share panel closed").then(() => {
|
|
BrowserTestUtils.removeTab(testTab).then(() => {
|
|
mm.removeMessageListener("sharedata", handler);
|
|
SocialService.uninstallProvider(manifest.origin, next);
|
|
});
|
|
});
|
|
SocialShare.iframe.messageManager.sendAsyncMessage("closeself", {});
|
|
});
|
|
});
|
|
sendActivationEvent(subframe);
|
|
});
|
|
});
|
|
BrowserTestUtils.openNewForegroundTab(gBrowser, activationPage).then(tab => {
|
|
let shareButton = SocialShare.shareButton;
|
|
// verify the attribute for proper css
|
|
ok(!shareButton.hasAttribute("disabled"), "share button is enabled");
|
|
// button should be visible
|
|
is(shareButton.hidden, false, "share button is visible");
|
|
|
|
testTab = tab;
|
|
SocialShare.sharePage();
|
|
});
|
|
},
|
|
testSharePanelDialog(next) {
|
|
let testTab;
|
|
// initialize the button into the navbar
|
|
CustomizableUI.addWidgetToArea("social-share-button", CustomizableUI.AREA_NAVBAR);
|
|
// ensure correct state
|
|
SocialUI.onCustomizeEnd(window);
|
|
SocialShare._createFrame();
|
|
|
|
SocialService.addProvider(manifest, () => {
|
|
BrowserTestUtils.openNewForegroundTab(gBrowser, activationPage).then(tab => {
|
|
ensureFrameLoaded(SocialShare.iframe).then(() => {
|
|
// send keys to the input field. An unexpected failure will happen
|
|
// if the onbeforeunload handler is fired.
|
|
EventUtils.sendKey("f");
|
|
EventUtils.sendKey("a");
|
|
EventUtils.sendKey("i");
|
|
EventUtils.sendKey("l");
|
|
|
|
SocialShare.panel.addEventListener("popuphidden", function(evt) {
|
|
let topwin = Services.wm.getMostRecentWindow(null);
|
|
is(topwin, window, "no dialog is open");
|
|
|
|
BrowserTestUtils.removeTab(testTab).then(() => {
|
|
SocialService.disableProvider(manifest.origin, next);
|
|
});
|
|
}, {once: true});
|
|
SocialShare.iframe.messageManager.sendAsyncMessage("closeself", {});
|
|
});
|
|
|
|
let shareButton = SocialShare.shareButton;
|
|
// verify the attribute for proper css
|
|
ok(!shareButton.hasAttribute("disabled"), "share button is enabled");
|
|
// button should be visible
|
|
is(shareButton.hidden, false, "share button is visible");
|
|
|
|
testTab = tab;
|
|
SocialShare.sharePage();
|
|
});
|
|
});
|
|
}
|
|
}
|