Bug 1275116 - Fix {document|target}UrlPatterns by passing in the correct arguments to SingleMatchPattern.match. r=kmag

MozReview-Commit-ID: LLNu7jNfUZq


G: changed browser/components/extensions/test/browser/head.js

--HG--
extra : transplant_source : %88%06%94%11%B5l%3B%9F%26%9CjGL%A3%F3%11%7F%40%D4Q
This commit is contained in:
Matthew Wein 2016-07-14 14:41:03 -07:00
parent a2c5415c76
commit 7ea866f07e
4 changed files with 203 additions and 9 deletions

View File

@ -440,15 +440,22 @@ MenuItem.prototype = {
}
let docPattern = this.documentUrlMatchPattern;
if (docPattern && !docPattern.matches(contextData.pageUrl)) {
let pageURI = Services.io.newURI(contextData.pageUrl, null, null);
if (docPattern && !docPattern.matches(pageURI)) {
return false;
}
let isMedia = contextData.onImage || contextData.onAudio || contextData.onVideo;
let targetPattern = this.targetUrlMatchPattern;
if (isMedia && targetPattern && !targetPattern.matches(contextData.srcURL)) {
// TODO: double check if mediaURL is always set when we need it
return false;
if (targetPattern) {
let isMedia = contextData.onImage || contextData.onAudio || contextData.onVideo;
if (!isMedia) {
return false;
}
let srcURI = Services.io.newURI(contextData.srcUrl, null, null);
if (!targetPattern.matches(srcURI)) {
// TODO: double check if mediaURL is always set when we need it
return false;
}
}
return true;

View File

@ -32,6 +32,7 @@ support-files =
[browser_ext_contextMenus_icons.js]
[browser_ext_contextMenus_radioGroups.js]
[browser_ext_contextMenus_uninstall.js]
[browser_ext_contextMenus_urlPatterns.js]
[browser_ext_currentWindow.js]
[browser_ext_getViews.js]
[browser_ext_history.js]

View File

@ -0,0 +1,186 @@
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
add_task(function* () {
let tab1 = yield BrowserTestUtils.openNewForegroundTab(gBrowser,
"http://mochi.test:8888/browser/browser/components/extensions/test/browser/context.html");
let extension = ExtensionTestUtils.loadExtension({
manifest: {
"permissions": ["contextMenus"],
},
background: function() {
// Test menu items using targetUrlPatterns.
browser.contextMenus.create({
title: "targetUrlPatterns-patternMatches-contextAll",
targetUrlPatterns: ["*://*/*ctxmenu-image.png"],
contexts: ["all"],
});
browser.contextMenus.create({
title: "targetUrlPatterns-patternMatches-contextImage",
targetUrlPatterns: ["*://*/*ctxmenu-image.png"],
contexts: ["image"],
});
browser.contextMenus.create({
title: "targetUrlPatterns-patternDoesNotMatch-contextAll",
targetUrlPatterns: ["*://*/does-not-match"],
contexts: ["all"],
});
browser.contextMenus.create({
title: "targetUrlPatterns-patternDoesNotMatch-contextImage",
targetUrlPatterns: ["*://*/does-not-match"],
contexts: ["image"],
});
// Test menu items using documentUrlPatterns.
browser.contextMenus.create({
title: "documentUrlPatterns-patternMatches-contextAll",
documentUrlPatterns: ["*://*/*context.html"],
contexts: ["all"],
});
browser.contextMenus.create({
title: "documentUrlPatterns-patternMatches-contextImage",
documentUrlPatterns: ["*://*/*context.html", "http://*/url-that-does-not-match"],
contexts: ["image"],
});
browser.contextMenus.create({
title: "documentUrlPatterns-patternDoesNotMatch-contextAll",
documentUrlPatterns: ["*://*/does-not-match"],
contexts: ["all"],
});
browser.contextMenus.create({
title: "documentUrlPatterns-patternDoesNotMatch-contextImage",
documentUrlPatterns: ["*://*/does-not-match"],
contexts: ["image"],
});
// Test menu items using both targetUrlPatterns and documentUrlPatterns.
browser.contextMenus.create({
title: "documentUrlPatterns-patternMatches-targetUrlPatterns-patternMatches-contextAll",
documentUrlPatterns: ["*://*/*context.html"],
targetUrlPatterns: ["*://*/*ctxmenu-image.png"],
contexts: ["all"],
});
browser.contextMenus.create({
title: "documentUrlPatterns-patternDoesNotMatch-targetUrlPatterns-patternMatches-contextAll",
documentUrlPatterns: ["*://does-not-match"],
targetUrlPatterns: ["*://*/*ctxmenu-image.png"],
contexts: ["all"],
});
browser.contextMenus.create({
title: "documentUrlPatterns-patternMatches-targetUrlPatterns-patternDoesNotMatch-contextAll",
documentUrlPatterns: ["*://*/*context.html"],
targetUrlPatterns: ["*://does-not-match"],
contexts: ["all"],
});
browser.contextMenus.create({
title: "documentUrlPatterns-patternDoesNotMatch-targetUrlPatterns-patternDoesNotMatch-contextAll",
documentUrlPatterns: ["*://does-not-match"],
targetUrlPatterns: ["*://does-not-match"],
contexts: ["all"],
});
browser.contextMenus.create({
title: "documentUrlPatterns-patternMatches-targetUrlPatterns-patternMatches-contextImage",
documentUrlPatterns: ["*://*/*context.html"],
targetUrlPatterns: ["*://*/*ctxmenu-image.png"],
contexts: ["image"],
});
browser.contextMenus.create({
title: "documentUrlPatterns-patternDoesNotMatch-targetUrlPatterns-patternMatches-contextImage",
documentUrlPatterns: ["*://does-not-match"],
targetUrlPatterns: ["*://*/*ctxmenu-image.png"],
contexts: ["image"],
});
browser.contextMenus.create({
title: "documentUrlPatterns-patternMatches-targetUrlPatterns-patternDoesNotMatch-contextImage",
documentUrlPatterns: ["*://*/*context.html"],
targetUrlPatterns: ["*://does-not-match"],
contexts: ["image"],
});
browser.contextMenus.create({
title: "documentUrlPatterns-patternDoesNotMatch-targetUrlPatterns-patternDoesNotMatch-contextImage",
documentUrlPatterns: ["*://does-not-match"],
targetUrlPatterns: ["*://does-not-match"],
contexts: ["image"],
});
browser.test.notifyPass("contextmenus-urlPatterns");
},
});
function* confirmContextMenuItems(menu, expected) {
for (let [label, shouldShow] of expected) {
let items = menu.getElementsByAttribute("label", label);
if (shouldShow) {
is(items.length, 1, `The menu item for label ${label} was correctly shown`);
} else {
is(items.length, 0, `The menu item for label ${label} was correctly not shown`);
}
}
}
yield extension.startup();
yield extension.awaitFinish("contextmenus-urlPatterns");
let extensionContextMenu = yield openExtensionContextMenu("#img1");
let expected = [
["targetUrlPatterns-patternMatches-contextAll", true],
["targetUrlPatterns-patternMatches-contextImage", true],
["targetUrlPatterns-patternDoesNotMatch-contextAll", false],
["targetUrlPatterns-patternDoesNotMatch-contextImage", false],
["documentUrlPatterns-patternMatches-contextAll", true],
["documentUrlPatterns-patternMatches-contextImage", true],
["documentUrlPatterns-patternDoesNotMatch-contextAll", false],
["documentUrlPatterns-patternDoesNotMatch-contextImage", false],
["documentUrlPatterns-patternMatches-targetUrlPatterns-patternMatches-contextAll", true],
["documentUrlPatterns-patternDoesNotMatch-targetUrlPatterns-patternMatches-contextAll", false],
["documentUrlPatterns-patternMatches-targetUrlPatterns-patternDoesNotMatch-contextAll", false],
["documentUrlPatterns-patternDoesNotMatch-targetUrlPatterns-patternDoesNotMatch-contextAll", false],
["documentUrlPatterns-patternMatches-targetUrlPatterns-patternMatches-contextImage", true],
["documentUrlPatterns-patternDoesNotMatch-targetUrlPatterns-patternMatches-contextImage", false],
["documentUrlPatterns-patternMatches-targetUrlPatterns-patternDoesNotMatch-contextImage", false],
["documentUrlPatterns-patternDoesNotMatch-targetUrlPatterns-patternDoesNotMatch-contextImage", false],
];
yield confirmContextMenuItems(extensionContextMenu, expected);
yield closeContextMenu();
let contextMenu = yield openContextMenu("body");
expected = [
["targetUrlPatterns-patternMatches-contextAll", false],
["targetUrlPatterns-patternMatches-contextImage", false],
["targetUrlPatterns-patternDoesNotMatch-contextAll", false],
["targetUrlPatterns-patternDoesNotMatch-contextImage", false],
["documentUrlPatterns-patternMatches-contextAll", true],
["documentUrlPatterns-patternMatches-contextImage", false],
["documentUrlPatterns-patternDoesNotMatch-contextAll", false],
["documentUrlPatterns-patternDoesNotMatch-contextImage", false],
["documentUrlPatterns-patternMatches-targetUrlPatterns-patternMatches-contextAll", false],
["documentUrlPatterns-patternDoesNotMatch-targetUrlPatterns-patternMatches-contextAll", false],
["documentUrlPatterns-patternMatches-targetUrlPatterns-patternDoesNotMatch-contextAll", false],
["documentUrlPatterns-patternDoesNotMatch-targetUrlPatterns-patternDoesNotMatch-contextAll", false],
["documentUrlPatterns-patternMatches-targetUrlPatterns-patternMatches-contextImage", false],
["documentUrlPatterns-patternDoesNotMatch-targetUrlPatterns-patternMatches-contextImage", false],
["documentUrlPatterns-patternMatches-targetUrlPatterns-patternDoesNotMatch-contextImage", false],
["documentUrlPatterns-patternDoesNotMatch-targetUrlPatterns-patternDoesNotMatch-contextImage", false],
];
yield confirmContextMenuItems(contextMenu, expected);
yield closeContextMenu();
yield extension.unload();
yield BrowserTestUtils.removeTab(tab1);
});

View File

@ -124,10 +124,10 @@ function closeBrowserAction(extension, win = window) {
return Promise.resolve();
}
function* openContextMenu(id) {
function* openContextMenu(selector="#img1") {
let contentAreaContextMenu = document.getElementById("contentAreaContextMenu");
let popupShownPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popupshown");
yield BrowserTestUtils.synthesizeMouseAtCenter(id, {type: "contextmenu", button: 2}, gBrowser.selectedBrowser);
yield BrowserTestUtils.synthesizeMouseAtCenter(selector, {type: "contextmenu"}, gBrowser.selectedBrowser);
yield popupShownPromise;
return contentAreaContextMenu;
}
@ -139,8 +139,8 @@ function* closeContextMenu() {
yield popupHiddenPromise;
}
function* openExtensionContextMenu() {
let contextMenu = yield openContextMenu("#img1");
function* openExtensionContextMenu(selector="#img1") {
let contextMenu = yield openContextMenu(selector);
let topLevelMenu = contextMenu.getElementsByAttribute("ext-type", "top-level-menu");
// Return null if the extension only has one item and therefore no extension menu.