Bug 46555 - "Select All" should only be enabled when editor is non-empty. r=ehsan, gavin
authorGraeme McCutcheon <graememcc_firefox@graeme-online.co.uk>
Fri, 23 Sep 2011 22:44:53 +0100
changeset 77439 4297a90d3beab95f18357ebb281fe21c1a0d9ae6
parent 77438 bec0a80ff952f3b5ed83ef1218bf0a57e77f71da
child 77440 c7122998435301a0d116867024a94558dc109e0f
child 77453 cba5d081f15dd48082f17a9de987f43284432cfd
push id21200
push userbmo@edmorley.co.uk
push dateSat, 24 Sep 2011 03:35:53 +0000
treeherdermozilla-central@c71229984353 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersehsan, gavin
bugs46555
milestone9.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 46555 - "Select All" should only be enabled when editor is non-empty. r=ehsan, gavin
browser/base/content/test/test_contextmenu.html
editor/libeditor/base/nsEditorCommands.cpp
editor/libeditor/base/tests/Makefile.in
editor/libeditor/base/tests/test_bug46555.html
--- a/browser/base/content/test/test_contextmenu.html
+++ b/browser/base/content/test/test_contextmenu.html
@@ -280,17 +280,17 @@ function runTest(testNum) {
         // Context menu for text input field
         checkContextMenu(["context-undo",        false,
                           "---",                 null,
                           "context-cut",         false,
                           "context-copy",        false,
                           "context-paste",       null, // ignore clipboard state
                           "context-delete",      false,
                           "---",                 null,
-                          "context-selectall",   true,
+                          "context-selectall",   false,
                           "---",                 null,
                           "spell-check-enabled", true]);
         closeContextMenu();
         openContextMenuFor(img); // Invoke context menu for next test.
         break;
 
     case 6:
         // Context menu for an image
--- a/editor/libeditor/base/nsEditorCommands.cpp
+++ b/editor/libeditor/base/nsEditorCommands.cpp
@@ -656,24 +656,34 @@ nsDeleteCommand::GetCommandStateParams(c
 
 NS_IMETHODIMP
 nsSelectAllCommand::IsCommandEnabled(const char * aCommandName,
                                      nsISupports *aCommandRefCon,
                                      PRBool *outCmdEnabled)
 {
   NS_ENSURE_ARG_POINTER(outCmdEnabled);
 
-  // you can select all if there is an editor (and potentially no contents)
-  // some day we may want to change this
+  nsresult rv = NS_OK;
+  *outCmdEnabled = PR_FALSE;
+  PRBool docIsEmpty, selectionIsEditable;
+ 
+  // you can select all if there is an editor which is non-empty
   nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
-  if (editor)
-    return editor->GetIsSelectionEditable(outCmdEnabled);
+  if (editor) {
+    rv = editor->GetIsSelectionEditable(&selectionIsEditable);
+    NS_ENSURE_SUCCESS(rv, rv);
 
-  *outCmdEnabled = PR_FALSE;
-  return NS_OK;
+    if (selectionIsEditable) {
+      rv = editor->GetDocumentIsEmpty(&docIsEmpty);
+      NS_ENSURE_SUCCESS(rv, rv);
+      *outCmdEnabled = !docIsEmpty;
+    }
+  } 
+
+  return rv;
 }
 
 
 NS_IMETHODIMP
 nsSelectAllCommand::DoCommand(const char *aCommandName,
                               nsISupports *aCommandRefCon)
 {
   nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon);
--- a/editor/libeditor/base/tests/Makefile.in
+++ b/editor/libeditor/base/tests/Makefile.in
@@ -49,16 +49,17 @@ include $(topsrcdir)/config/rules.mk
 		test_bug514156.html \
 		test_bug567213.html \
 		file_bug586662.html \
 		test_bug586662.html \
 		$(NULL)
 
 _CHROME_TEST_FILES = \
 		test_selection_move_commands.xul \
+                test_bug46555.html \
 		test_bug646194.xul \
 		$(NULL)
 
 libs:: $(_TEST_FILES)
 	$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)
 
 libs:: $(_CHROME_TEST_FILES)
 	$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/chrome/$(relativesrcdir)
new file mode 100644
--- /dev/null
+++ b/editor/libeditor/base/tests/test_bug46555.html
@@ -0,0 +1,80 @@
+<!DOCTYPE HTML>
+<!-- ***** BEGIN LICENSE BLOCK *****
+   - Version: MPL 1.1/GPL 2.0/LGPL 2.1
+   -
+   - The contents of this file are subject to the Mozilla Public License Version
+   - 1.1 (the "License"); you may not use this file except in compliance with
+   - the License. You may obtain a copy of the License at
+   - http://www.mozilla.org/MPL/
+   -
+   - Software distributed under the License is distributed on an "AS IS" basis,
+   - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+   - for the specific language governing rights and limitations under the
+   - License.
+   -
+   - The Original Code is Editor Test code
+   -
+   - The Initial Developer of the Original Code is
+   - Graeme McCutcheon <graememcc_firefox@graeme-online.co.uk>.
+   - Portions created by the Initial Developer are Copyright (C) 2011
+   - the Initial Developer. All Rights Reserved.
+   -
+   - Contributor(s):
+   -
+   -
+   - Alternatively, the contents of this file may be used under the terms of
+   - either the GNU General Public License Version 2 or later (the "GPL"), or
+   - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+   - in which case the provisions of the GPL or the LGPL are applicable instead
+   - of those above. If you wish to allow use of your version of this file only
+   - under the terms of either the GPL or the LGPL, and not to allow others to
+   - use your version of this file under the terms of the MPL, indicate your
+   - decision by deleting the provisions above and replace them with the notice
+   - and other provisions required by the GPL or the LGPL. If you do not delete
+   - the provisions above, a recipient may use your version of this file under
+   - the terms of any one of the MPL, the GPL or the LGPL.
+   -
+   - ***** END LICENSE BLOCK ***** -->
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=46555
+-->
+
+<head>
+  <title>Test for Bug 46555</title>
+  <script type="application/javascript"
+          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
+</head>
+
+<body>
+  <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=46555">Mozilla Bug 46555</a>
+  <p id="display"></p>
+  <div id="content" style="display: none">
+  </div>
+
+  <input type="text" value="" id="t1" />
+
+  <pre id="test">
+    <script type="application/javascript">
+
+      /** Test for Bug 46555 **/
+      SimpleTest.waitForExplicitFinish();
+      SimpleTest.waitForFocus(function() {
+        const kCmd = "cmd_selectAll";
+
+        var input = document.getElementById("t1");
+        input.focus();
+        var controller = input.controllers.getControllerForCommand(kCmd);
+
+        // Test 1: Select All should be disabled if editor is empty
+        is(controller.isCommandEnabled(kCmd), false,
+           "Select All command disabled when editor is empty");
+
+        SimpleTest.finish();
+      });
+   </script>
+  </pre>
+
+</body>
+</html>