Bug 1397366 - restore source-editor commands controller for scratchpad & styleeditor menus;r=ochameau
authorJulian Descottes <jdescottes@mozilla.com>
Wed, 03 Jan 2018 20:52:58 +0100
changeset 452704 b51eda5903d55316bbe4a253c65b91a8433f0701
parent 452703 d9afc5417979939d64843b12458ada9f64445f4f
child 452705 fe793fde11177f3e8f3c934c82753e8fbe1b31ed
push id1648
push usermtabara@mozilla.com
push dateThu, 01 Mar 2018 12:45:47 +0000
treeherdermozilla-release@cbb9688c2eeb [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersochameau
bugs1397366
milestone59.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 1397366 - restore source-editor commands controller for scratchpad & styleeditor menus;r=ochameau MozReview-Commit-ID: Cfgws8fqgvp
devtools/client/scratchpad/scratchpad.js
devtools/client/sourceeditor/editor-commands-controller.js
devtools/client/sourceeditor/editor.js
devtools/client/sourceeditor/moz.build
devtools/client/styleeditor/StyleSheetEditor.jsm
--- a/devtools/client/scratchpad/scratchpad.js
+++ b/devtools/client/scratchpad/scratchpad.js
@@ -1727,16 +1727,19 @@ var Scratchpad = {
                                                       document.querySelector("#scratchpad-notificationbox"),
                                                       msg, okstring);
       editorElement.addEventListener("paste", this._onPaste, true);
       editorElement.addEventListener("drop", this._onPaste);
       this.editor.on("saveRequested", () => this.saveFile());
       this.editor.focus();
       this.editor.setCursor({ line: lines.length, ch: lines.pop().length });
 
+      // Add the commands controller for the source-editor.
+      this.editor.insertCommandsController();
+
       if (state)
         this.dirty = !state.saved;
 
       this.initialized = true;
       this._triggerObservers("Ready");
       this.populateRecentFilesMenu();
       PreferenceObserver.init();
       CloseObserver.init();
new file mode 100644
--- /dev/null
+++ b/devtools/client/sourceeditor/editor-commands-controller.js
@@ -0,0 +1,97 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+/**
+ * The source editor exposes XUL commands that can be used when embedded in a XUL
+ * document. This controller drives the availability and behavior of the commands. When
+ * the editor input field is focused, this controller will update the matching menu item
+ * entries found in application menus or context menus.
+ */
+
+/**
+ * Returns a controller object that can be used for editor-specific commands:
+ * - find
+ * - find again
+ * - go to line
+ * - undo
+ * - redo
+ * - delete
+ * - select all
+ */
+function createController(ed) {
+  return {
+    supportsCommand: function (cmd) {
+      switch (cmd) {
+        case "cmd_find":
+        case "cmd_findAgain":
+        case "cmd_gotoLine":
+        case "cmd_undo":
+        case "cmd_redo":
+        case "cmd_delete":
+        case "cmd_selectAll":
+          return true;
+      }
+
+      return false;
+    },
+
+    isCommandEnabled: function (cmd) {
+      let cm = ed.codeMirror;
+
+      switch (cmd) {
+        case "cmd_find":
+        case "cmd_gotoLine":
+        case "cmd_selectAll":
+          return true;
+        case "cmd_findAgain":
+          return cm.state.search != null && cm.state.search.query != null;
+        case "cmd_undo":
+          return ed.canUndo();
+        case "cmd_redo":
+          return ed.canRedo();
+        case "cmd_delete":
+          return ed.somethingSelected();
+      }
+
+      return false;
+    },
+
+    doCommand: function (cmd) {
+      let cm = ed.codeMirror;
+
+      let map = {
+        "cmd_selectAll": "selectAll",
+        "cmd_find": "find",
+        "cmd_undo": "undo",
+        "cmd_redo": "redo",
+        "cmd_delete": "delCharAfter",
+        "cmd_findAgain": "findNext"
+      };
+
+      if (map[cmd]) {
+        cm.execCommand(map[cmd]);
+        return;
+      }
+
+      if (cmd == "cmd_gotoLine") {
+        ed.jumpToLine();
+      }
+    },
+
+    onEvent: function () {}
+  };
+}
+
+/**
+ * Create and insert a commands controller for the provided SourceEditor instance.
+ */
+function insertCommandsController(sourceEditor) {
+  let input = sourceEditor.codeMirror.getInputField();
+  let controller = createController(sourceEditor);
+  input.controllers.insertControllerAt(0, controller);
+}
+
+module.exports = { insertCommandsController };
--- a/devtools/client/sourceeditor/editor.js
+++ b/devtools/client/sourceeditor/editor.js
@@ -479,16 +479,26 @@ Editor.prototype = {
     // turn it off and back on again so the proper mode can be used.
     if (this.config.autocomplete) {
       this.setOption("autocomplete", false);
       this.setOption("autocomplete", true);
     }
   },
 
   /**
+   * The source editor can expose several commands linked from system and context menus.
+   * Kept for backward compatibility with scratchpad and styleeditor.
+   */
+  insertCommandsController: function () {
+    const { insertCommandsController } =
+      require("devtools/client/sourceeditor/editor-commands-controller");
+    insertCommandsController(this);
+  },
+
+  /**
    * Returns text from the text area. If line argument is provided
    * the method returns only that line.
    */
   getText: function (line) {
     let cm = editors.get(this);
 
     if (line == null) {
       return cm.getValue();
--- a/devtools/client/sourceeditor/moz.build
+++ b/devtools/client/sourceeditor/moz.build
@@ -7,16 +7,17 @@
 DIRS += [
     'tern',
 ]
 
 DevToolsModules(
     'autocomplete.js',
     'css-autocompleter.js',
     'debugger.js',
+    'editor-commands-controller.js',
     'editor.js',
     'wasm.js'
 )
 
 BROWSER_CHROME_MANIFESTS += ['test/browser.ini']
 
-with Files('**'):
-    BUG_COMPONENT = ('Firefox', 'Developer Tools: Source Editor')
+with Files('**'):
+    BUG_COMPONENT = ('Firefox', 'Developer Tools: Source Editor')
--- a/devtools/client/styleeditor/StyleSheetEditor.jsm
+++ b/devtools/client/styleeditor/StyleSheetEditor.jsm
@@ -464,16 +464,19 @@ StyleSheetEditor.prototype = {
 
       sourceEditor.setSelection(this._state.selection.start,
                                 this._state.selection.end);
 
       if (this.highlighter && this.walker) {
         sourceEditor.container.addEventListener("mousemove", this._onMouseMove);
       }
 
+      // Add the commands controller for the source-editor.
+      sourceEditor.insertCommandsController();
+
       this.emit("source-editor-load");
     });
   },
 
   /**
    * Get the source editor for this editor.
    *
    * @return {Promise}