Bug 720023 - Context menus for selected domains should be the identical as for links. r=jwein

This commit is contained in:
Chad Freeman 2012-03-16 12:41:37 -07:00
Родитель 49d849f10b
Коммит f76c95b0e1
3 изменённых файлов: 76 добавлений и 11 удалений

Просмотреть файл

@ -92,6 +92,7 @@ nsContextMenu.prototype = {
} catch (e) { }
this.isTextSelected = this.isTextSelection();
this.isContentSelected = this.isContentSelection();
this.onPlainTextLink = false;
// Initialize (disable/remove) menu items.
this.initItems();
@ -132,7 +133,6 @@ nsContextMenu.prototype = {
// Time to do some bad things and see if we've highlighted a URL that
// isn't actually linked.
var onPlainTextLink = false;
if (this.isTextSelected && !this.onLink) {
// Ok, we have some text, let's figure out if it looks like a URL.
let selection = document.commandDispatcher.focusedWindow
@ -190,14 +190,14 @@ nsContextMenu.prototype = {
if (uri && uri.host) {
this.linkURI = uri;
this.linkURL = this.linkURI.spec;
onPlainTextLink = true;
this.onPlainTextLink = true;
}
}
var shouldShow = this.onSaveableLink || isMailtoInternal || onPlainTextLink;
var shouldShow = this.onSaveableLink || isMailtoInternal || this.onPlainTextLink;
this.showItem("context-openlink", shouldShow);
this.showItem("context-openlinkintab", shouldShow);
this.showItem("context-openlinkincurrent", onPlainTextLink);
this.showItem("context-openlinkincurrent", this.onPlainTextLink);
this.showItem("context-sep-open", shouldShow);
},
@ -222,9 +222,9 @@ nsContextMenu.prototype = {
this.showItem("context-savepage", shouldShow);
this.showItem("context-sendpage", shouldShow);
// Save+Send link depends on whether we're in a link.
this.showItem("context-savelink", this.onSaveableLink);
this.showItem("context-sendlink", this.onSaveableLink);
// Save+Send link depends on whether we're in a link, or selected text matches valid URL pattern.
this.showItem("context-savelink", this.onSaveableLink || this.onPlainTextLink);
this.showItem("context-sendlink", this.onSaveableLink || this.onPlainTextLink);
// Save image depends on having loaded its content, video and audio don't.
this.showItem("context-saveimage", this.onLoadedImage || this.onCanvas);
@ -310,7 +310,7 @@ nsContextMenu.prototype = {
this.showItem("context-bookmarkpage",
!(this.isContentSelected || this.onTextInput || this.onLink ||
this.onImage || this.onVideo || this.onAudio));
this.showItem("context-bookmarklink", this.onLink && !this.onMailtoLink);
this.showItem("context-bookmarklink", (this.onLink && !this.onMailtoLink) || this.onPlainTextLink);
this.showItem("context-searchselect", isTextSelected);
this.showItem("context-keywordfield",
this.onTextInput && this.onKeywordField);
@ -1073,9 +1073,15 @@ nsContextMenu.prototype = {
// Save URL of clicked-on link.
saveLink: function() {
var doc = this.target.ownerDocument;
var linkText;
// If selected text is found to match valid URL pattern.
if (this.onPlainTextLink)
linkText = document.commandDispatcher.focusedWindow.getSelection().toString().trim();
else
linkText = this.linkText();
urlSecurityCheck(this.linkURL, doc.nodePrincipal);
this.saveHelper(this.linkURL, this.linkText(), null, true, doc);
this.saveHelper(this.linkURL, linkText, null, true, doc);
},
sendLink: function() {
@ -1390,8 +1396,14 @@ nsContextMenu.prototype = {
},
bookmarkLink: function CM_bookmarkLink() {
var linkText;
// If selected text is found to match valid URL pattern.
if (this.onPlainTextLink)
linkText = document.commandDispatcher.focusedWindow.getSelection().toString().trim();
else
linkText = this.linkText();
window.top.PlacesCommandHook.bookmarkLink(PlacesUtils.bookmarksMenuFolderId, this.linkURL,
this.linkText());
linkText);
},
addBookmarkForFrame: function CM_addBookmarkForFrame() {

Просмотреть файл

@ -58,6 +58,8 @@ Browser context menu subtest.
<menuitem></menuitem>
</menu>
</div>
<div id="test-select-text">Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</div>
<div id="test-select-text-link">http://mozilla.com</div>
</body>
</html>

Просмотреть файл

@ -20,6 +20,7 @@ Browser context menu tests.
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
Components.utils.import("resource://gre/modules/InlineSpellChecker.jsm");
Components.utils.import("resource://gre/modules/Services.jsm");
const Cc = Components.classes;
const Ci = Components.interfaces;
@ -72,6 +73,16 @@ function invokeItemAction(generatedItemId)
ok(!pagemenu.hasAttribute("hopeless"), "attribute got removed");
}
function selectText(element) {
// Clear any previous selections before selecting new element.
subwindow.getSelection().removeAllRanges();
var div = subwindow.document.createRange();
div.setStartBefore(element);
div.setEndAfter(element);
subwindow.getSelection().addRange(div);
}
function getVisibleMenuItems(aMenu, aData) {
var items = [];
var accessKeys = {};
@ -667,6 +678,45 @@ function runTest(testNum) {
"context-viewinfo", true
].concat(inspectItems));
closeContextMenu();
selectText(selecttext); // Select text prior to opening context menu.
openContextMenuFor(selecttext); // Invoke context menu for next test.
return;
case 22:
// Context menu for selected text
if (Services.appinfo.OS == "Darwin") {
// This test is only enabled on Mac due to bug 736399.
checkContextMenu(["context-copy", true,
"context-selectall", true,
"---", null,
"context-searchselect", true,
"context-viewpartialsource-selection", true
].concat(inspectItems));
}
closeContextMenu();
selectText(selecttextlink); // Select text prior to opening context menu.
openContextMenuFor(selecttextlink); // Invoke context menu for next test.
return;
case 23:
// Context menu for selected text which matches valid URL pattern
if (Services.appinfo.OS == "Darwin") {
// This test is only enabled on Mac due to bug 736399.
checkContextMenu(["context-openlinkincurrent", true,
"context-openlinkintab", true,
"context-openlink", true,
"---", null,
"context-bookmarklink", true,
"context-savelink", true,
"context-sendlink", true,
"context-copy", true,
"context-selectall", true,
"---", null,
"context-searchselect", true,
"context-viewpartialsource-selection", true
].concat(inspectItems));
}
closeContextMenu();
subwindow.close();
SimpleTest.finish();
@ -674,7 +724,6 @@ function runTest(testNum) {
/*
* Other things that would be nice to test:
* - selected text
* - spelling / misspelled word (in text input?)
* - check state of disabled items
* - test execution of menu items (maybe as a separate test?)
@ -734,6 +783,8 @@ function startTest() {
contenteditable.focus(); // content editable needs to be focused to enable spellcheck
inputspell = subwindow.document.getElementById("test-input-spellcheck");
pagemenu = subwindow.document.getElementById("test-pagemenu");
selecttext = subwindow.document.getElementById("test-select-text");
selecttextlink = subwindow.document.getElementById("test-select-text-link");
contextMenu.addEventListener("popupshown", function() { runTest(++testNum); }, false);
runTest(1);