diff options
Diffstat (limited to 'browser/base/content/test/social/browser_share.js')
-rw-r--r-- | browser/base/content/test/social/browser_share.js | 396 |
1 files changed, 396 insertions, 0 deletions
diff --git a/browser/base/content/test/social/browser_share.js b/browser/base/content/test/social/browser_share.js new file mode 100644 index 000000000..19dca519b --- /dev/null +++ b/browser/base/content/test/social/browser_share.js @@ -0,0 +1,396 @@ + +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: function(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: function(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: function(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: function(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: function(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: function(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 hidden(evt) { + SocialShare.panel.removeEventListener("popuphidden", hidden); + let topwin = Services.wm.getMostRecentWindow(null); + is(topwin, window, "no dialog is open"); + + BrowserTestUtils.removeTab(testTab).then(() => { + SocialService.disableProvider(manifest.origin, next); + }); + }); + 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(); + }); + }); + } +} |