Bug 807326 - Context menu Search should be available in textareas/inputs as well. Port |Bug 565717|. r=Neil
This commit is contained in:
Родитель
64b96b3bfa
Коммит
f10c134a0a
|
@ -10,6 +10,7 @@ Browser context menu subtest.
|
||||||
<a id="test-link" href="http://mozilla.com">Click the monkey!</a>
|
<a id="test-link" href="http://mozilla.com">Click the monkey!</a>
|
||||||
<a id="test-mailto" href="mailto:codemonkey@mozilla.com">Mail the monkey!</a><br>
|
<a id="test-mailto" href="mailto:codemonkey@mozilla.com">Mail the monkey!</a><br>
|
||||||
<input id="test-input"><br>
|
<input id="test-input"><br>
|
||||||
|
<input id="test-input-select"><br>
|
||||||
<img id="test-image" src="ctxmenu-image.png">
|
<img id="test-image" src="ctxmenu-image.png">
|
||||||
<canvas id="test-canvas" width="100" height="100" style="background-color: blue"></canvas>
|
<canvas id="test-canvas" width="100" height="100" style="background-color: blue"></canvas>
|
||||||
<video controls id="test-video-ok" src="video.ogg" width="100" height="100" style="background-color: green"></video>
|
<video controls id="test-video-ok" src="video.ogg" width="100" height="100" style="background-color: green"></video>
|
||||||
|
@ -22,6 +23,7 @@ Browser context menu subtest.
|
||||||
<iframe id="test-video-in-iframe" src="video.ogg" width="98" height="98" style="border: 1px solid black"></iframe>
|
<iframe id="test-video-in-iframe" src="video.ogg" width="98" height="98" style="border: 1px solid black"></iframe>
|
||||||
<iframe id="test-image-in-iframe" src="ctxmenu-image.png" width="98" height="98" style="border: 1px solid black"></iframe>
|
<iframe id="test-image-in-iframe" src="ctxmenu-image.png" width="98" height="98" style="border: 1px solid black"></iframe>
|
||||||
<textarea id="test-textarea">chssseesbbbie</textarea> <!-- a weird word which generates only one suggestion -->
|
<textarea id="test-textarea">chssseesbbbie</textarea> <!-- a weird word which generates only one suggestion -->
|
||||||
|
<textarea id="test-textarea-sel">test</textarea>
|
||||||
<div id="test-contenteditable" contenteditable="true">chssseefsbbbie</div> <!-- a more weird word which generates no suggestions -->
|
<div id="test-contenteditable" contenteditable="true">chssseefsbbbie</div> <!-- a more weird word which generates no suggestions -->
|
||||||
<input id="test-input-spellcheck" type="text" spellcheck="true" autofocus value="prodkjfgigrty"> <!-- this one also generates one suggestion -->
|
<input id="test-input-spellcheck" type="text" spellcheck="true" autofocus value="prodkjfgigrty"> <!-- this one also generates one suggestion -->
|
||||||
<div contextmenu="myMenu">
|
<div contextmenu="myMenu">
|
||||||
|
|
|
@ -319,10 +319,32 @@ function runTest(testNum) {
|
||||||
"---", null,
|
"---", null,
|
||||||
"spell-check-enabled", true]);
|
"spell-check-enabled", true]);
|
||||||
closeContextMenu();
|
closeContextMenu();
|
||||||
openContextMenuFor(img); // Invoke context menu for next test.
|
input_sel.value = "test";
|
||||||
|
input_sel.select();
|
||||||
|
openContextMenuFor(input_sel); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
|
// Context menu for text input field with text
|
||||||
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
|
"---", null,
|
||||||
|
"context-undo", false,
|
||||||
|
"context-redo", false,
|
||||||
|
"---", null,
|
||||||
|
"context-cut", true,
|
||||||
|
"context-copy", true,
|
||||||
|
"context-paste", null, // ignore clipboard state
|
||||||
|
"context-delete", true,
|
||||||
|
"---", null,
|
||||||
|
"context-selectall", true,
|
||||||
|
"context-searchselect", true,
|
||||||
|
"---", null,
|
||||||
|
"spell-check-enabled", true]);
|
||||||
|
closeContextMenu();
|
||||||
|
openContextMenuFor(img); // Invoke context menu for next test.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7:
|
||||||
// Context menu for an image
|
// Context menu for an image
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
"---", null,
|
"---", null,
|
||||||
|
@ -345,7 +367,7 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(canvas); // Invoke context menu for next test.
|
openContextMenuFor(canvas); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 7:
|
case 8:
|
||||||
// Context menu for a canvas
|
// Context menu for a canvas
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
"---", null,
|
"---", null,
|
||||||
|
@ -358,7 +380,7 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(video_ok); // Invoke context menu for next test.
|
openContextMenuFor(video_ok); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 9:
|
||||||
// Context menu for a video (with a VALID media source)
|
// Context menu for a video (with a VALID media source)
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
"---", null,
|
"---", null,
|
||||||
|
@ -378,7 +400,7 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(audio_in_video); // Invoke context menu for next test.
|
openContextMenuFor(audio_in_video); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 9:
|
case 10:
|
||||||
// Context menu for a video (with an audio-only file)
|
// Context menu for a video (with an audio-only file)
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
"---", null,
|
"---", null,
|
||||||
|
@ -394,7 +416,7 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(video_bad); // Invoke context menu for next test.
|
openContextMenuFor(video_bad); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 10:
|
case 11:
|
||||||
// Context menu for a video (with an INVALID media source)
|
// Context menu for a video (with an INVALID media source)
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
"---", null,
|
"---", null,
|
||||||
|
@ -414,7 +436,7 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(video_bad2); // Invoke context menu for next test.
|
openContextMenuFor(video_bad2); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 11:
|
case 12:
|
||||||
// Context menu for a video (with an INVALID media source)
|
// Context menu for a video (with an INVALID media source)
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
"---", null,
|
"---", null,
|
||||||
|
@ -434,7 +456,7 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(iframe); // Invoke context menu for next test.
|
openContextMenuFor(iframe); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 12:
|
case 13:
|
||||||
// Context menu for an iframe
|
// Context menu for an iframe
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
"---", null,
|
"---", null,
|
||||||
|
@ -470,7 +492,7 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(video_in_iframe); // Invoke context menu for next test.
|
openContextMenuFor(video_in_iframe); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 13:
|
case 14:
|
||||||
// Context menu for a video in an iframe
|
// Context menu for a video in an iframe
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
"---", null,
|
"---", null,
|
||||||
|
@ -504,7 +526,7 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(image_in_iframe); // Invoke context menu for next test.
|
openContextMenuFor(image_in_iframe); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 14:
|
case 15:
|
||||||
// Context menu for an image in an iframe
|
// Context menu for an image in an iframe
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
"---", null,
|
"---", null,
|
||||||
|
@ -541,14 +563,39 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(text); // Invoke context menu for next test.
|
openContextMenuFor(text); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 15:
|
case 16:
|
||||||
// Re-check context menu for plain text to make sure it hasn't changed
|
// Re-check context menu for plain text to make sure it hasn't changed
|
||||||
checkContextMenu(plainTextItems);
|
checkContextMenu(plainTextItems);
|
||||||
closeContextMenu();
|
closeContextMenu();
|
||||||
|
textarea_sel.select();
|
||||||
|
openContextMenuFor(textarea_sel, false, true);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 17:
|
||||||
|
// search for text with text area's selected value
|
||||||
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
|
"---", null,
|
||||||
|
"context-undo", false,
|
||||||
|
"context-redo", false,
|
||||||
|
"---", null,
|
||||||
|
"context-cut", true,
|
||||||
|
"context-copy", true,
|
||||||
|
"context-paste", true, // ignore clipboard state
|
||||||
|
"context-delete", true,
|
||||||
|
"---", null,
|
||||||
|
"context-selectall", true,
|
||||||
|
"context-searchselect", true,
|
||||||
|
"---", null,
|
||||||
|
"spell-check-enabled", true,
|
||||||
|
"spell-dictionaries", true,
|
||||||
|
["spell-check-dictionary-en-US", true,
|
||||||
|
"---", null,
|
||||||
|
"spell-add-dictionaries", true], null]);
|
||||||
|
closeContextMenu();
|
||||||
openContextMenuFor(textarea, false, true); // Invoke context menu for next test, but wait for the spellcheck.
|
openContextMenuFor(textarea, false, true); // Invoke context menu for next test, but wait for the spellcheck.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 16:
|
case 18:
|
||||||
// Context menu for textarea
|
// Context menu for textarea
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
"---", null,
|
"---", null,
|
||||||
|
@ -578,7 +625,7 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(textarea, false, true); // Invoke context menu for next test.
|
openContextMenuFor(textarea, false, true); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 17:
|
case 19:
|
||||||
// Context menu for textarea after a word has been added
|
// Context menu for textarea after a word has been added
|
||||||
// to the dictionary
|
// to the dictionary
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
|
@ -607,7 +654,7 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(contenteditable);
|
openContextMenuFor(contenteditable);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 18:
|
case 20:
|
||||||
// Context menu for contenteditable
|
// Context menu for contenteditable
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
"---", null,
|
"---", null,
|
||||||
|
@ -636,7 +683,7 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(inputspell); // Invoke context menu for next test.
|
openContextMenuFor(inputspell); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 19:
|
case 21:
|
||||||
// Context menu for spell-check input
|
// Context menu for spell-check input
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
"---", null,
|
"---", null,
|
||||||
|
@ -665,13 +712,13 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(link); // Invoke context menu for next test.
|
openContextMenuFor(link); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 20:
|
case 22:
|
||||||
executeCopyCommand("cmd_copyLink", "http://mozilla.com/");
|
executeCopyCommand("cmd_copyLink", "http://mozilla.com/");
|
||||||
closeContextMenu();
|
closeContextMenu();
|
||||||
openContextMenuFor(pagemenu); // Invoke context menu for next test.
|
openContextMenuFor(pagemenu); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 21:
|
case 23:
|
||||||
// Context menu for element with assigned content context menu
|
// Context menu for element with assigned content context menu
|
||||||
checkContextMenu(["+Plain item", {type: "", icon: "", checked: false, disabled: false},
|
checkContextMenu(["+Plain item", {type: "", icon: "", checked: false, disabled: false},
|
||||||
"+Disabled item", {type: "", icon: "", checked: false, disabled: true},
|
"+Disabled item", {type: "", icon: "", checked: false, disabled: true},
|
||||||
|
@ -715,7 +762,7 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(pagemenu, true); // Invoke context menu for next test.
|
openContextMenuFor(pagemenu, true); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 22:
|
case 24:
|
||||||
// Context menu for element with assigned content context menu
|
// Context menu for element with assigned content context menu
|
||||||
// The shift key should bypass content context menu processing
|
// The shift key should bypass content context menu processing
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
|
@ -740,7 +787,7 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(img_link); // Invoke context menu for next test.
|
openContextMenuFor(img_link); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 23:
|
case 25:
|
||||||
// Context menu for an image with a link
|
// Context menu for an image with a link
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
"---", null,
|
"---", null,
|
||||||
|
@ -769,7 +816,7 @@ function runTest(testNum) {
|
||||||
openContextMenuFor(img_mailto); // Invoke context menu for next test.
|
openContextMenuFor(img_mailto); // Invoke context menu for next test.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 24:
|
case 26:
|
||||||
// Context menu for an image with a mailto: link
|
// Context menu for an image with a mailto: link
|
||||||
checkContextMenu(["popupwindow-reject", true,
|
checkContextMenu(["popupwindow-reject", true,
|
||||||
"---", null,
|
"---", null,
|
||||||
|
@ -846,6 +893,7 @@ function startTest() {
|
||||||
link = subwindow.document.getElementById("test-link");
|
link = subwindow.document.getElementById("test-link");
|
||||||
mailto = subwindow.document.getElementById("test-mailto");
|
mailto = subwindow.document.getElementById("test-mailto");
|
||||||
input = subwindow.document.getElementById("test-input");
|
input = subwindow.document.getElementById("test-input");
|
||||||
|
input_sel = subwindow.document.getElementById("test-input-select");
|
||||||
img = subwindow.document.getElementById("test-image");
|
img = subwindow.document.getElementById("test-image");
|
||||||
canvas = subwindow.document.getElementById("test-canvas");
|
canvas = subwindow.document.getElementById("test-canvas");
|
||||||
video_ok = subwindow.document.getElementById("test-video-ok");
|
video_ok = subwindow.document.getElementById("test-video-ok");
|
||||||
|
@ -858,6 +906,7 @@ function startTest() {
|
||||||
video_in_iframe.pause();
|
video_in_iframe.pause();
|
||||||
image_in_iframe = subwindow.document.getElementById("test-image-in-iframe").contentDocument.getElementsByTagName("img")[0];
|
image_in_iframe = subwindow.document.getElementById("test-image-in-iframe").contentDocument.getElementsByTagName("img")[0];
|
||||||
textarea = subwindow.document.getElementById("test-textarea");
|
textarea = subwindow.document.getElementById("test-textarea");
|
||||||
|
textarea_sel = subwindow.document.getElementById("test-textarea-sel");
|
||||||
contenteditable = subwindow.document.getElementById("test-contenteditable");
|
contenteditable = subwindow.document.getElementById("test-contenteditable");
|
||||||
contenteditable.focus(); // content editable needs to be focused to enable spellcheck
|
contenteditable.focus(); // content editable needs to be focused to enable spellcheck
|
||||||
inputspell = subwindow.document.getElementById("test-input-spellcheck");
|
inputspell = subwindow.document.getElementById("test-input-spellcheck");
|
||||||
|
|
|
@ -245,7 +245,7 @@ nsContextMenu.prototype = {
|
||||||
!(this.isContentSelected || this.onTextInput ||
|
!(this.isContentSelected || this.onTextInput ||
|
||||||
this.onStandaloneImage || this.onVideo || this.onAudio));
|
this.onStandaloneImage || this.onVideo || this.onAudio));
|
||||||
this.showItem("context-bookmarklink", this.onLink && !this.onMailtoLink);
|
this.showItem("context-bookmarklink", this.onLink && !this.onMailtoLink);
|
||||||
this.showItem("context-searchselect", this.isTextSelected && !this.onTextInput);
|
this.showItem("context-searchselect", this.isTextSelected);
|
||||||
this.showItem("context-keywordfield", this.onTextInput && this.onKeywordField);
|
this.showItem("context-keywordfield", this.onTextInput && this.onKeywordField);
|
||||||
this.showItem("frame", this.inFrame);
|
this.showItem("frame", this.inFrame);
|
||||||
this.showItem("frame-sep", this.inFrame);
|
this.showItem("frame-sep", this.inFrame);
|
||||||
|
@ -1251,6 +1251,7 @@ nsContextMenu.prototype = {
|
||||||
*/
|
*/
|
||||||
isTextSelection: function() {
|
isTextSelection: function() {
|
||||||
var searchSelectText = this.searchSelected(16);
|
var searchSelectText = this.searchSelected(16);
|
||||||
|
|
||||||
if (!searchSelectText)
|
if (!searchSelectText)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -1269,11 +1270,11 @@ nsContextMenu.prototype = {
|
||||||
|
|
||||||
// format "Search <engine> for <selection>" string to show in menu
|
// format "Search <engine> for <selection>" string to show in menu
|
||||||
const bundle = document.getElementById("contentAreaCommandsBundle");
|
const bundle = document.getElementById("contentAreaCommandsBundle");
|
||||||
var menuLabel = bundle.getFormattedString("contextMenuSearchText",
|
var menuLabel = bundle.getFormattedString("searchSelected",
|
||||||
[engineName, searchSelectText]);
|
[engineName, searchSelectText]);
|
||||||
this.setItemAttr("context-searchselect", "label", menuLabel);
|
this.setItemAttr("context-searchselect", "label", menuLabel);
|
||||||
this.setItemAttr("context-searchselect", "accesskey",
|
this.setItemAttr("context-searchselect", "accesskey",
|
||||||
bundle.getString("contextMenuSearchText.accesskey"));
|
bundle.getString("searchSelected.accesskey"));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
@ -1282,6 +1283,16 @@ nsContextMenu.prototype = {
|
||||||
var focusedWindow = document.commandDispatcher.focusedWindow;
|
var focusedWindow = document.commandDispatcher.focusedWindow;
|
||||||
var searchStr = focusedWindow.getSelection();
|
var searchStr = focusedWindow.getSelection();
|
||||||
searchStr = searchStr.toString();
|
searchStr = searchStr.toString();
|
||||||
|
|
||||||
|
if (this.onTextInput) {
|
||||||
|
var fElem = this.target;
|
||||||
|
if ((fElem instanceof HTMLInputElement &&
|
||||||
|
fElem.mozIsTextField(true)) ||
|
||||||
|
fElem instanceof HTMLTextAreaElement) {
|
||||||
|
searchStr = fElem.value.substring(fElem.selectionStart, fElem.selectionEnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// searching for more than 150 chars makes no sense
|
// searching for more than 150 chars makes no sense
|
||||||
if (!aCharlen)
|
if (!aCharlen)
|
||||||
aCharlen = 150;
|
aCharlen = 150;
|
||||||
|
|
|
@ -4,10 +4,10 @@
|
||||||
|
|
||||||
# context menu strings
|
# context menu strings
|
||||||
|
|
||||||
# LOCALIZATION NOTE (contextMenuSearchText): %1$S is the search engine,
|
# LOCALIZATION NOTE (searchSelected): %1$S is the search engine,
|
||||||
# %2$S is the selection string.
|
# %2$S is the selection string.
|
||||||
contextMenuSearchText=Search %1$S for "%2$S"
|
searchSelected=Search %1$S for "%2$S"
|
||||||
contextMenuSearchText.accesskey=S
|
searchSelected.accesskey=e
|
||||||
|
|
||||||
blockImage=Block Images from %S
|
blockImage=Block Images from %S
|
||||||
blockImage.accesskey=c
|
blockImage.accesskey=c
|
||||||
|
|
Загрузка…
Ссылка в новой задаче