Bug 1303384 - Allow changing command shortcuts on extension detail page draft
authorMark Striemer <mstriemer@mozilla.com>
Thu, 14 Jun 2018 17:06:37 -0700
changeset 819347 9f5708d280e2dadc7b7233b40e62166de42120b9
parent 819346 a8b97e4b687ed950229e7d226773841370888914
child 819348 7bc76fa8acc7285a81d6a3a29a0d78986d102efc
push id116524
push userbmo:mstriemer@mozilla.com
push dateTue, 17 Jul 2018 17:54:26 +0000
bugs1303384
milestone63.0a1
Bug 1303384 - Allow changing command shortcuts on extension detail page MozReview-Commit-ID: KeZsoB6qj88
toolkit/mozapps/extensions/content/extensions.js
toolkit/mozapps/extensions/content/extensions.xul
--- a/toolkit/mozapps/extensions/content/extensions.js
+++ b/toolkit/mozapps/extensions/content/extensions.js
@@ -19,16 +19,18 @@ ChromeUtils.import("resource://gre/modul
 
 ChromeUtils.defineModuleGetter(this, "E10SUtils", "resource://gre/modules/E10SUtils.jsm");
 ChromeUtils.defineModuleGetter(this, "Extension",
                                "resource://gre/modules/Extension.jsm");
 ChromeUtils.defineModuleGetter(this, "ExtensionParent",
                                "resource://gre/modules/ExtensionParent.jsm");
 ChromeUtils.defineModuleGetter(this, "Preferences",
                                "resource://gre/modules/Preferences.jsm");
+ChromeUtils.defineModuleGetter(this, "ShortcutUtils",
+                               "resource://gre/modules/ShortcutUtils.jsm");
 
 
 ChromeUtils.defineModuleGetter(this, "PluralForm",
                                "resource://gre/modules/PluralForm.jsm");
 ChromeUtils.defineModuleGetter(this, "Preferences",
                                "resource://gre/modules/Preferences.jsm");
 
 XPCOMUtils.defineLazyPreferenceGetter(this, "WEBEXT_PERMISSION_PROMPTS",
@@ -2715,16 +2717,62 @@ var gDetailView = {
         gridRow.removeAttribute("first-row");
       }
     }
 
     this.fillSettingsRows(aScrollToPreferences, () => {
       this.updateState();
       gViewController.notifyViewChanged();
     });
+
+    if (aAddon.isWebExtension) {
+      let extension = ExtensionParent.GlobalManager.extensionMap.get(aAddon.id);
+      let {shortcuts} = extension;
+      let commandsSection = document.getElementById("commands-grid");
+      let commandsRows = document.getElementById("commands-rows");
+      commandsRows.textContent = "";
+      let setPlaceholder = (input, name, value) => {
+        let placeholder;
+        if (value) {
+          let key = shortcuts.buildKeyFromShortcut(document, name, value);
+          placeholder = ShortcutUtils.prettifyShortcut(key);
+        } else {
+          placeholder = "Not set";
+        }
+        input.setAttribute("placeholder", placeholder);
+      };
+      shortcuts.allCommands().then(commands => {
+        commandsSection.hidden = commands.length == 0;
+        for (let command of commands) {
+          let row = document.createElement("row");
+          // FIXME: Update the class names.
+          row.setAttribute("class", "detail-row-complex");
+
+          let label = document.createElement("label");
+          label.setAttribute("class", "detail-row-label");
+          label.setAttribute("value", command.description || command.name);
+          row.appendChild(label);
+
+          let shortcut = document.createElement("textbox");
+          setPlaceholder(shortcut, command.name, command.shortcut);
+          shortcut.addEventListener("keydown", async (e) => {
+            if (e.key != "Enter") return;
+            let value = e.target.value;
+
+            shortcut.value = "";
+            setPlaceholder(shortcut, command.name, value);
+
+            await shortcuts.updateCommand({name: command.name, shortcut: value});
+          });
+          row.appendChild(shortcut);
+
+          commandsRows.appendChild(row);
+        }
+      });
+    }
   },
 
   async show(aAddonId, aRequest) {
     let index = aAddonId.indexOf("/preferences");
     let scrollToPreferences = false;
     if (index >= 0) {
       aAddonId = aAddonId.substring(0, index);
       scrollToPreferences = true;
--- a/toolkit/mozapps/extensions/content/extensions.xul
+++ b/toolkit/mozapps/extensions/content/extensions.xul
@@ -556,16 +556,23 @@
                             <hbox>
                               <label id="detail-rating" class="meta-value meta-rating"
                                      showrating="average"/>
                               <label id="detail-reviews" class="text-link"/>
                             </hbox>
                           </row>
                         </rows>
                       </grid>
+                      <grid id="commands-grid">
+                        <columns>
+                           <column flex="1"/>
+                           <column flex="2"/>
+                        </columns>
+                        <rows id="commands-rows"/>
+                      </grid>
                       <hbox id="detail-controls">
                         <button id="detail-prefs-btn" class="addon-control preferences"
 #ifdef XP_WIN
                                 label="&detail.showPreferencesWin.label;"
                                 accesskey="&detail.showPreferencesWin.accesskey;"
                                 tooltiptext="&detail.showPreferencesWin.tooltip;"
 #else
                                 label="&detail.showPreferencesUnix.label;"