Bug 1352481 - Add searchkeywords attributes for subdialog buttons and search the keywords in the searchWithinNode method. draft
authorEvan Tseng <evan@tseng.io>
Tue, 09 May 2017 17:00:45 -0400
changeset 580989 db6226a1bbaa5b052d10f40edce04361e6bc85ba
parent 580850 183c3537157290d7ccef475651b6bc35db914924
child 629457 853e2f4d7052725ce1cf2347e83fad214225c046
push id59740
push userbmo:evan@tseng.io
push dateFri, 19 May 2017 06:55:25 +0000
bugs1352481
milestone55.0a1
Bug 1352481 - Add searchkeywords attributes for subdialog buttons and search the keywords in the searchWithinNode method. MozReview-Commit-ID: HM6HPLM5wPj
browser/components/preferences/in-content/advanced.xul
browser/components/preferences/in-content/findInPage.js
browser/components/preferences/in-content/main.xul
browser/components/preferences/in-content/preferences.xul
browser/components/preferences/in-content/privacy.js
browser/components/preferences/in-content/privacy.xul
--- a/browser/components/preferences/in-content/advanced.xul
+++ b/browser/components/preferences/in-content/advanced.xul
@@ -67,17 +67,18 @@
     </vbox>
 #ifdef MOZ_UPDATER
     <spacer flex="1"/>
     <vbox>
       <button id="showUpdateHistory"
               class="accessory-button"
               label="&updateHistory2.label;"
               accesskey="&updateHistory2.accesskey;"
-              preference="app.update.disable_button.showUpdateHistory"/>
+              preference="app.update.disable_button.showUpdateHistory"
+              searchkeywords="&history.title; &history.intro;"/>
     </vbox>
 #endif
   </hbox>
 #ifdef MOZ_UPDATER
   <vbox id="updateBox">
     <deck id="updateDeck" orient="vertical">
       <hbox id="checkForUpdates" align="center">
         <spacer flex="1"/>
--- a/browser/components/preferences/in-content/findInPage.js
+++ b/browser/components/preferences/in-content/findInPage.js
@@ -38,17 +38,17 @@ var gSearchResultsPane = {
    *    to search for filter words in.
    * @param String filter
    *    is a string containing all of the words to filter on.
    * @returns boolean
    *    true when match in string else false
    */
   stringMatchesFilters(str, filter) {
     if (!filter || !str) {
-      return true;
+      return false;
     }
     let searchStr = str.toLowerCase();
     let filterStrings = filter.toLowerCase().split(/\s+/);
     return !filterStrings.some(f => searchStr.indexOf(f) == -1);
   },
 
   categoriesInitialized: false,
 
@@ -265,42 +265,42 @@ var gSearchResultsPane = {
       }
 
       //  Collecting data from boxObject
       let nodeSizes = [];
       let allNodeText = "";
       let runningSize = 0;
       let labelResult = false;
       let valueResult = false;
+      let keywordsResult = false;
       let accessKeyTextNodes = this.textNodeDescendants(nodeObject.boxObject);
 
       for (let node of accessKeyTextNodes) {
         runningSize += node.textContent.length;
         allNodeText += node.textContent;
         nodeSizes.push(runningSize);
       }
 
       // Access key are presented
       let complexTextNodesResult = this.highlightMatches(accessKeyTextNodes, nodeSizes, allNodeText.toLowerCase(), searchPhrase);
 
-      //  Searching some elements, such as xul:button, have a 'label' attribute that contains the user-visible text.
-      if (nodeObject.getAttribute("label")) {
-        labelResult = this.stringMatchesFilters(nodeObject.getAttribute("label"), searchPhrase);
-      }
+      // Searching some elements, such as xul:button, have a 'label' attribute that contains the user-visible text.
+      labelResult = this.stringMatchesFilters(nodeObject.getAttribute("label"), searchPhrase);
 
-      //  Searching some elements, such as xul:label, store their user-visible text in a "value" attribute.
-      if (nodeObject.getAttribute("value")) {
-        valueResult = this.stringMatchesFilters(nodeObject.getAttribute("value"), searchPhrase);
-      }
+      // Searching some elements, such as xul:label, store their user-visible text in a "value" attribute.
+      valueResult = this.stringMatchesFilters(nodeObject.getAttribute("value"), searchPhrase);
 
-      if (nodeObject.tagName == "button" && (labelResult || valueResult)) {
+      // Searching some elements, such as xul:button, buttons to open subdialogs.
+      keywordsResult = this.stringMatchesFilters(nodeObject.getAttribute("searchkeywords"), searchPhrase);
+
+      if (nodeObject.tagName == "button" && (labelResult || valueResult || keywordsResult)) {
         nodeObject.setAttribute("highlightable", "true");
       }
 
-      matchesFound = matchesFound || complexTextNodesResult || labelResult || valueResult;
+      matchesFound = matchesFound || complexTextNodesResult || labelResult || valueResult || keywordsResult;
     }
 
     for (let i = 0; i < nodeObject.childNodes.length; i++) {
       // Search only if child node is not hidden
       if (!nodeObject.childNodes[i].hidden && nodeObject.getAttribute("data-hidden-from-search") !== "true") {
         let result = this.searchWithinNode(nodeObject.childNodes[i], searchPhrase);
         matchesFound = matchesFound || result;
       }
--- a/browser/components/preferences/in-content/main.xul
+++ b/browser/components/preferences/in-content/main.xul
@@ -310,17 +310,18 @@
                 accesskey="&useCurrentPage.accesskey;"
                 label1="&useCurrentPage.label;"
                 label2="&useMultiple.label;"
                 preference="pref.browser.homepage.disable_button.current_page"/>
         <button id="useBookmark"
                 class="content-cell-item"
                 label="&chooseBookmark.label;"
                 accesskey="&chooseBookmark.accesskey;"
-                preference="pref.browser.homepage.disable_button.bookmark_page"/>
+                preference="pref.browser.homepage.disable_button.bookmark_page"
+                searchkeywords="&selectBookmark.title; &selectBookmark.label;"/>
         <button id="restoreDefaultHomePage"
                 class="content-cell-item"
                 label="&restoreDefault.label;"
                 accesskey="&restoreDefault.accesskey;"
                 preference="pref.browser.homepage.disable_button.restore_default"/>
       </html:td>
     </html:tr>
   </html:table>
@@ -447,17 +448,24 @@
 <groupbox id="languagesGroup" data-category="paneGeneral" hidden="true">
   <caption><label>&languages.label;</label></caption>
 
   <hbox id="languagesBox" align="center">
     <description flex="1" control="chooseLanguage">&chooseLanguage.label;</description>
     <button id="chooseLanguage"
             class="accessory-button"
             label="&chooseButton.label;"
-            accesskey="&chooseButton.accesskey;"/>
+            accesskey="&chooseButton.accesskey;"
+            searchkeywords="&languages.customize.Header;
+                            &languages.customize.description;
+                            &languages.customize.moveUp.label;
+                            &languages.customize.moveDown.label;
+                            &languages.customize.deleteButton.label;
+                            &languages.customize.selectLanguage.label;
+                            &languages.customize.addButton.label;"/>
   </hbox>
 
   <hbox id="translationBox" hidden="true">
     <hbox align="center" flex="1">
       <checkbox id="translate" preference="browser.translation.detectLanguage"
                 label="&translateWebPages.label;." accesskey="&translateWebPages.accesskey;"
                 onsyncfrompreference="return gMainPane.updateButtons('translateButton',
                                               'browser.translation.detectLanguage');"/>
@@ -528,25 +536,93 @@
               <menuitem value="72" label="72"/>
             </menupopup>
           </menulist>
         </hbox>
         <button id="advancedFonts"
                 class="accessory-button"
                 icon="select-font"
                 label="&advancedFonts.label;"
-                accesskey="&advancedFonts.accesskey;"/>
+                accesskey="&advancedFonts.accesskey;"
+                searchkeywords="&fontsDialog.title;
+                                &language.label;
+                                &size.label;
+                                &proportional.label;
+                                &serif.label;
+                                &sans-serif.label;
+                                &monospace.label;
+                                &font.langGroup.latin;
+                                &font.langGroup.japanese;
+                                &font.langGroup.trad-chinese;
+                                &font.langGroup.simpl-chinese;
+                                &font.langGroup.trad-chinese-hk;
+                                &font.langGroup.korean;
+                                &font.langGroup.cyrillic;
+                                &font.langGroup.el;
+                                &font.langGroup.other;
+                                &font.langGroup.thai;
+                                &font.langGroup.hebrew;
+                                &font.langGroup.arabic;
+                                &font.langGroup.devanagari;
+                                &font.langGroup.tamil;
+                                &font.langGroup.armenian;
+                                &font.langGroup.bengali;
+                                &font.langGroup.canadian;
+                                &font.langGroup.ethiopic;
+                                &font.langGroup.georgian;
+                                &font.langGroup.gujarati;
+                                &font.langGroup.gurmukhi;
+                                &font.langGroup.khmer;
+                                &font.langGroup.malayalam;
+                                &font.langGroup.math;
+                                &font.langGroup.odia;
+                                &font.langGroup.telugu;
+                                &font.langGroup.kannada;
+                                &font.langGroup.sinhala;
+                                &font.langGroup.tibetan;
+                                &minSize.label;
+                                &minSize.none;
+                                &useDefaultFontSerif.label;
+                                &useDefaultFontSansSerif.label;
+                                &allowPagesToUseOwn.label;
+                                &languages.customize.Fallback2.grouplabel;
+                                &languages.customize.Fallback2.label;
+                                &languages.customize.Fallback2.desc;
+                                &languages.customize.Fallback.auto;
+                                &languages.customize.Fallback.arabic;
+                                &languages.customize.Fallback.baltic;
+                                &languages.customize.Fallback.ceiso;
+                                &languages.customize.Fallback.cewindows;
+                                &languages.customize.Fallback.simplified;
+                                &languages.customize.Fallback.traditional;
+                                &languages.customize.Fallback.cyrillic;
+                                &languages.customize.Fallback.greek;
+                                &languages.customize.Fallback.hebrew;
+                                &languages.customize.Fallback.japanese;
+                                &languages.customize.Fallback.korean;
+                                &languages.customize.Fallback.thai;
+                                &languages.customize.Fallback.turkish;
+                                &languages.customize.Fallback.vietnamese;
+                                &languages.customize.Fallback.other;"/>
       </row>
       <row id="colorsRow">
         <hbox/>
         <button id="colors"
                 class="accessory-button"
                 icon="select-color"
                 label="&colors.label;"
-                accesskey="&colors.accesskey;"/>
+                accesskey="&colors.accesskey;"
+                searchkeywords="&overrideDefaultPageColors.label;
+                                &overrideDefaultPageColors.always.label;
+                                &overrideDefaultPageColors.auto.label;
+                                &overrideDefaultPageColors.never.label;
+                                &useSystemColors.label;
+                                &underlineLinks.label;
+                                &linkColor.label;
+                                &visitedLinkColor.label;"/>
       </row>
     </rows>
   </grid>
 </groupbox>
 
 <!-- Browsing -->
 <groupbox id="browsingGroup" data-category="paneGeneral">
   <caption><label>&browsing.label;</label></caption>
--- a/browser/components/preferences/in-content/preferences.xul
+++ b/browser/components/preferences/in-content/preferences.xul
@@ -15,16 +15,29 @@
 <?xml-stylesheet href="chrome://browser/skin/preferences/in-content/search.css"?>
 <?xml-stylesheet href="chrome://browser/skin/preferences/in-content/containers.css"?>
 
 <!DOCTYPE page [
 <!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd">
 <!ENTITY % globalPreferencesDTD SYSTEM "chrome://global/locale/preferences.dtd">
 <!ENTITY % preferencesDTD SYSTEM
   "chrome://browser/locale/preferences/preferences.dtd">
+<!ENTITY % selectBookmarkDTD SYSTEM
+  "chrome://browser/locale/preferences/selectBookmark.dtd">
+<!ENTITY % languagesDTD SYSTEM "chrome://browser/locale/preferences/languages.dtd">
+<!ENTITY % fontDTD SYSTEM "chrome://browser/locale/preferences/fonts.dtd">
+<!ENTITY % colorsDTD SYSTEM "chrome://browser/locale/preferences/colors.dtd">
+<!ENTITY % permissionsDTD SYSTEM "chrome://browser/locale/preferences/permissions.dtd">
+<!ENTITY % passwordManagerDTD SYSTEM "chrome://passwordmgr/locale/passwordManager.dtd">
+<!ENTITY % historyDTD SYSTEM "chrome://mozapps/locale/update/history.dtd">
+<!ENTITY % certManagerDTD SYSTEM "chrome://pippki/locale/certManager.dtd">
+<!ENTITY % deviceManangerDTD SYSTEM "chrome://pippki/locale/deviceManager.dtd">
+<!ENTITY % connectionDTD SYSTEM "chrome://browser/locale/preferences/connection.dtd">
+<!ENTITY % siteDataSettingsDTD SYSTEM
+  "chrome://browser/locale/preferences/siteDataSettings.dtd" >
 <!ENTITY % privacyDTD SYSTEM "chrome://browser/locale/preferences/privacy.dtd">
 <!ENTITY % tabsDTD SYSTEM "chrome://browser/locale/preferences/tabs.dtd">
 <!ENTITY % searchDTD SYSTEM "chrome://browser/locale/preferences/search.dtd">
 <!ENTITY % syncBrandDTD SYSTEM "chrome://browser/locale/syncBrand.dtd">
 <!ENTITY % syncDTD SYSTEM "chrome://browser/locale/preferences/sync.dtd">
 <!ENTITY % securityDTD SYSTEM
   "chrome://browser/locale/preferences/security.dtd">
 <!ENTITY % containersDTD SYSTEM
@@ -37,16 +50,27 @@
   "chrome://browser/locale/preferences/applications.dtd">
 <!ENTITY % advancedDTD SYSTEM
   "chrome://browser/locale/preferences/advanced.dtd">
 <!ENTITY % aboutDialogDTD SYSTEM "chrome://browser/locale/aboutDialog.dtd" >
 %aboutDialogDTD;
 %brandDTD;
 %globalPreferencesDTD;
 %preferencesDTD;
+%selectBookmarkDTD;
+%languagesDTD;
+%fontDTD;
+%colorsDTD;
+%permissionsDTD;
+%passwordManagerDTD;
+%historyDTD;
+%certManagerDTD;
+%deviceManangerDTD;
+%connectionDTD;
+%siteDataSettingsDTD;
 %privacyDTD;
 %tabsDTD;
 %searchDTD;
 %syncBrandDTD;
 %syncDTD;
 %securityDTD;
 %containersDTD;
 %sanitizeDTD;
@@ -79,16 +103,20 @@
           src="chrome://browser/content/preferences/in-content/preferences.js"/>
   <script src="chrome://browser/content/preferences/in-content/findInPage.js"/>
   <script src="chrome://browser/content/preferences/in-content/subdialogs.js"/>
 
   <stringbundle id="bundleBrand"
                 src="chrome://branding/locale/brand.properties"/>
   <stringbundle id="bundlePreferences"
                 src="chrome://browser/locale/preferences/preferences.properties"/>
+  <stringbundle id="pkiBundle"
+                src="chrome://pippki/locale/pippki.properties"/>
+  <stringbundle id="browserBundle"
+                src="chrome://browser/locale/browser.properties"/>
 
   <stringbundleset id="appManagerBundleset">
     <stringbundle id="appManagerBundle"
                   src="chrome://browser/locale/preferences/applicationManager.properties"/>
   </stringbundleset>
 
   <stack flex="1">
   <hbox flex="1">
--- a/browser/components/preferences/in-content/privacy.js
+++ b/browser/components/preferences/in-content/privacy.js
@@ -143,17 +143,24 @@ var gPrivacyPane = {
   /**
    * Sets up the UI for the number of days of history to keep, and updates the
    * label of the "Clear Now..." button.
    */
   init() {
     function setEventListener(aId, aEventType, aCallback) {
       document.getElementById(aId)
               .addEventListener(aEventType, aCallback.bind(gPrivacyPane));
-    }
+    };
+
+    function appendSearchKeywors(aId, keywords) {
+      let element = document.getElementById(aId);
+      let searchKeywords = element.getAttribute("searchkeywords");
+      searchKeywords && keywords.push(searchKeywords);
+      element.setAttribute("searchkeywords", keywords.join(' '));
+    };
 
     this._updateSanitizeSettingsButton();
     this.initializeHistoryMode();
     this.updateHistoryModePane();
     this.updatePrivacyMicroControls();
     this.initAutoStartPrivateBrowsingReverter();
     this._initTrackingProtection();
     this._initTrackingProtectionPBM();
@@ -314,16 +321,63 @@ var gPrivacyPane = {
       this.initSubmitCrashes();
     }
     this.initTelemetry();
     if (AppConstants.MOZ_TELEMETRY_REPORTING) {
       this.initSubmitHealthReport();
       setEventListener("submitHealthReportBox", "command",
                        gPrivacyPane.updateSubmitHealthReport);
     }
+
+    // Append search keywords into the elements could open sub-dialogs.
+    let bundlePrefs = document.getElementById("bundlePreferences");
+    let signonBundle = document.getElementById("signonBundle");
+    let pkiBundle = document.getElementById("pkiBundle");
+    let browserBundle = document.getElementById("browserBundle");
+    appendSearchKeywors("passwordExceptions", [
+      bundlePrefs.getString("savedLoginsExceptions_title"),
+      bundlePrefs.getString("savedLoginsExceptions_desc"),
+    ]);
+    appendSearchKeywors("showPasswords", [
+      signonBundle.getString("loginsDescriptionAll"),
+    ]);
+    appendSearchKeywors("trackingProtectionExceptions", [
+      bundlePrefs.getString("trackingprotectionpermissionstitle"),
+      bundlePrefs.getString("trackingprotectionpermissionstext"),
+    ]);
+    appendSearchKeywors("changeBlockList", [
+      bundlePrefs.getString("blockliststitle"),
+      bundlePrefs.getString("blockliststext"),
+    ]);
+    appendSearchKeywors("popupPolicyButton", [
+      bundlePrefs.getString("popuppermissionstitle"),
+      bundlePrefs.getString("popuppermissionstext"),
+    ]);
+    appendSearchKeywors("notificationsPolicyButton", [
+      bundlePrefs.getString("notificationspermissionstitle"),
+      bundlePrefs.getString("notificationspermissionstext4"),
+    ]);
+    appendSearchKeywors("addonExceptions", [
+      bundlePrefs.getString("addons_permissions_title"),
+      bundlePrefs.getString("addonspermissionstext"),
+    ]);
+    appendSearchKeywors("viewSecurityDevicesButton", [
+      pkiBundle.getString("enable_fips"),
+    ]);
+    appendSearchKeywors("browserContainersSettings", [
+      browserBundle.getString("userContextPersonal.label"),
+      browserBundle.getString("userContextWork.label"),
+      browserBundle.getString("userContextBanking.label"),
+      browserBundle.getString("userContextShopping.label"),
+    ]);
+    appendSearchKeywors("siteDataSettings", [
+      bundlePrefs.getString("siteDataSettings.description"),
+      bundlePrefs.getString("removeAllCookies.label"),
+      bundlePrefs.getString("removeSelectedCookies.label"),
+    ]);
   },
 
   // TRACKING PROTECTION MODE
 
   /**
    * Selects the right item of the Tracking Protection radiogroup.
    */
   trackingProtectionReadPrefs() {
--- a/browser/components/preferences/in-content/privacy.xul
+++ b/browser/components/preferences/in-content/privacy.xul
@@ -166,16 +166,17 @@
   <preference id="browser.crashReports.unsubmittedCheck.autoSubmit"
               name="browser.crashReports.unsubmittedCheck.autoSubmit"
               type="bool"/>
 #endif
 
 </preferences>
 
 <stringbundle id="bundlePreferences" src="chrome://browser/locale/preferences/preferences.properties"/>
+<stringbundle id="signonBundle" src="chrome://passwordmgr/locale/passwordmgr.properties"/>
 
 <hbox id="header-privacy"
       class="header"
       hidden="true"
       data-category="panePrivacy">
   <label class="header-name" flex="1">&panePrivacySecurity.title;</label>
 </hbox>
 
@@ -317,32 +318,34 @@
                   label="&rememberLogins1.label;" accesskey="&rememberLogins1.accesskey;"
                   preference="signon.rememberSignons"
                   onsyncfrompreference="return gPrivacyPane.readSavePasswords();"
                   flex="1" />
         <button id="passwordExceptions"
                 class="accessory-button"
                 label="&passwordExceptions.label;"
                 accesskey="&passwordExceptions.accesskey;"
-                preference="pref.privacy.disable_button.view_passwords_exceptions"/>
+                preference="pref.privacy.disable_button.view_passwords_exceptions"
+                searchkeywords="&address.label;"/>
       </row>
       <row id="showPasswordRow">
         <hbox id="showPasswordsBox"/>
         <button id="showPasswords"
                 class="accessory-button"
                 label="&savedLogins.label;" accesskey="&savedLogins.accesskey;"
-                preference="pref.privacy.disable_button.view_passwords"/>
+                preference="pref.privacy.disable_button.view_passwords"
+                searchkeywords="&savedLogins.title;"/>
       </row>
     </rows>
   </grid>
   <hbox id="masterPasswordRow">
     <checkbox id="useMasterPassword"
               label="&useMasterPassword.label;"
               accesskey="&useMasterPassword.accesskey;"
-              flex="1" />
+              flex="1"/>
     <button id="changeMasterPassword"
             class="accessory-button"
             label="&changeMasterPassword.label;"
             accesskey="&changeMasterPassword.accesskey;"/>
   </hbox>
 </groupbox>
 
 <!-- Tracking -->
@@ -361,22 +364,27 @@
         </description>
       </vbox>
       <spacer flex="1"/>
       <vbox id="trackingProtectionAdvancedSettings">
         <button id="trackingProtectionExceptions"
                 class="accessory-button"
                 label="&trackingProtectionExceptions.label;"
                 accesskey="&trackingProtectionExceptions.accesskey;"
-                preference="pref.privacy.disable_button.tracking_protection_exceptions"/>
+                preference="pref.privacy.disable_button.tracking_protection_exceptions"
+                searchkeywords="&removepermission.label;
+                                &removeallpermissions.label;
+                                &button.cancel.label;
+                                &button.ok.label;"/>
         <button id="changeBlockList"
                 class="accessory-button"
                 label="&changeBlockList.label;"
                 accesskey="&changeBlockList.accesskey;"
-                preference="pref.privacy.disable_button.change_blocklist"/>
+                preference="pref.privacy.disable_button.change_blocklist"
+                searchkeywords="&button.cancel.label; &button.ok.label;"/>
       </vbox>
     </hbox>
     <radiogroup id="trackingProtectionRadioGroup" aria-labelledby="trackingProtectionDesc">
       <radio value="always"
              label="&trackingProtectionAlways.label;"
              accesskey="&trackingProtectionAlways.accesskey;"/>
       <radio value="private"
              label="&trackingProtectionPrivate.label;"
@@ -415,17 +423,18 @@
     <checkbox id="popupPolicy" preference="dom.disable_open_during_load"
               label="&blockPopups.label;" accesskey="&blockPopups.accesskey;"
               onsyncfrompreference="return gPrivacyPane.updateButtons('popupPolicyButton',
                                          'dom.disable_open_during_load');"
               flex="1" />
     <button id="popupPolicyButton"
             class="accessory-button"
             label="&popupExceptions.label;"
-            accesskey="&popupExceptions.accesskey;"/>
+            accesskey="&popupExceptions.accesskey;"
+            searchkeywords="&address.label; &button.cancel.label; &button.ok.label;"/>
   </hbox>
 </groupbox>
 
 <!-- Notifications -->
 <groupbox id="notificationsGroup" data-category="panePrivacy" hidden="true">
   <caption><label>&notificationsPolicy.label;</label></caption>
   <grid>
     <columns>
@@ -438,17 +447,21 @@
           <label id="notificationsPolicy">&notificationsPolicyDesc3.label;</label>
           <label id="notificationsPolicyLearnMore"
                  class="learnMore text-link">&notificationsPolicyLearnMore.label;</label>
         </hbox>
         <hbox pack="end">
           <button id="notificationsPolicyButton"
                   class="accessory-button"
                   label="&notificationsPolicyButton.label;"
-                  accesskey="&notificationsPolicyButton.accesskey;"/>
+                  accesskey="&notificationsPolicyButton.accesskey;"
+                  searchkeywords="&removepermission.label;
+                                  &removeallpermissions.label;
+                                  &button.cancel.label;
+                                  &button.ok.label;"/>
         </hbox>
       </row>
     </rows>
   </grid>
   <vbox id="notificationsDoNotDisturbBox" hidden="true">
     <checkbox id="notificationsDoNotDisturb" label="&notificationsDoNotDisturb.label;"
               accesskey="&notificationsDoNotDisturb.accesskey;"/>
     <label id="notificationsDoNotDisturbDetails"
@@ -485,17 +498,23 @@
               label="&warnOnAddonInstall.label;"
               accesskey="&warnOnAddonInstall.accesskey;"
               preference="xpinstall.whitelist.required"
               onsyncfrompreference="return gPrivacyPane.readWarnAddonInstall();"
               flex="1" />
     <button id="addonExceptions"
             class="accessory-button"
             label="&addonExceptions.label;"
-            accesskey="&addonExceptions.accesskey;"/>
+            accesskey="&addonExceptions.accesskey;"
+            searchkeywords="&address.label;
+                            &allow.label;
+                            &removepermission.label;
+                            &removeallpermissions.label;
+                            &button.cancel.label;
+                            &button.ok.label;"/>
   </hbox>
 
   <separator class="thin"/>
   <checkbox id="enableSafeBrowsing"
             label="&enableSafeBrowsing.label;"
             accesskey="&enableSafeBrowsing.accesskey;" />
   <vbox class="indent">
     <checkbox id="blockDownloads"
@@ -536,22 +555,46 @@
               onsynctopreference="return gPrivacyPane.writeEnableOCSP();"
               preference="security.OCSP.enabled"
               flex="1" />
     <vbox>
       <button id="viewCertificatesButton"
               class="accessory-button"
               label="&viewCerts.label;"
               accesskey="&viewCerts.accesskey;"
-              preference="security.disable_button.openCertManager"/>
+              preference="security.disable_button.openCertManager"
+              searchkeywords="&certmgr.tab.mine;
+                              &certmgr.tab.others2;
+                              &certmgr.tab.websites3;
+                              &certmgr.tab.ca;
+                              &certmgr.tab.orphan2;
+                              &certmgr.mine;
+                              &certmgr.others;
+                              &certmgr.websites2;
+                              &certmgr.cas;
+                              &certmgr.orphans;
+                              &certmgr.certname;
+                              &certmgr.tokenname;
+                              &certmgr.view2.label;
+                              &certmgr.export.label;
+                              &certmgr.delete2.label;"/>
       <button id="viewSecurityDevicesButton"
               class="accessory-button"
               label="&viewSecurityDevices.label;"
               accesskey="&viewSecurityDevices.accesskey;"
-              preference="security.disable_button.openDeviceManager"/>
+              preference="security.disable_button.openDeviceManager"
+              searchkeywords="&devmgr.title;
+                              &devmgr.devlist.label;
+                              &devmgr.details.title;
+                              &devmgr.details.title2;
+                              &devmgr.button.login.label;
+                              &devmgr.button.logout.label;
+                              &devmgr.button.changepw.label;
+                              &devmgr.button.load.label;
+                              &devmgr.button.unload.label;"/>
     </vbox>
   </hbox>
 </groupbox>
 
 <!-- DRM Content -->
 <groupbox id="drmGroup" data-category="panePrivacy" hidden="true">
   <caption><label>&drmContent.label;</label></caption>
   <grid id="contentGrid2">
@@ -585,33 +628,54 @@
                 onsyncfrompreference="return gPrivacyPane.readBrowserContainersCheckbox();"/>
       <label id="browserContainersLearnMore" class="learnMore text-link">
         &browserContainersLearnMore.label;
       </label>
       <spacer flex="1"/>
       <button id="browserContainersSettings"
               class="accessory-button"
               label="&browserContainersSettings.label;"
-              accesskey="&browserContainersSettings.accesskey;"/>
+              accesskey="&browserContainersSettings.accesskey;"
+              searchkeywords="&addButton.label;
+                              &preferencesButton.label;
+                              &removeButton.label;"/>
     </hbox>
   </vbox>
 </groupbox>
 
 <!-- Network -->
 <!-- Connection -->
 <groupbox id="connectionGroup" data-category="panePrivacy" hidden="true">
   <caption><label>&connection.label;</label></caption>
 
   <hbox align="center">
     <description flex="1" control="connectionSettings">&connectionDesc.label;</description>
     <button id="connectionSettings"
             class="accessory-button"
             icon="network"
             label="&connectionSettings.label;"
-            accesskey="&connectionSettings.accesskey;"/>
+            accesskey="&connectionSettings.accesskey;"
+            searchkeywords="&connectionsDialog.title;
+                            &noProxyTypeRadio.label;
+                            &WPADTypeRadio.label;
+                            &systemTypeRadio.label;
+                            &manualTypeRadio.label;
+                            &http.label;
+                            &ssl.label;
+                            &ftp.label;
+                            &socks.label;
+                            &socks4.label;
+                            &socks5.label;
+                            &noproxy.label;
+                            &noproxyExplain.label;
+                            &shareproxy.label;
+                            &autoTypeRadio.label;
+                            &reload.label;
+                            &autologinproxy.label;
+                            &socksRemoteDNS.label2;"/>
   </hbox>
 </groupbox>
 
 <!-- Cache -->
 <groupbox id="cacheGroup" data-category="panePrivacy" hidden="true">
   <caption><label>&httpCache.label;</label></caption>
 
   <hbox align="center">
@@ -689,17 +753,21 @@
             class="accessory-button"
             icon="clear"
             label="&clearSiteData.label;" accesskey="&clearSiteData.accesskey;"/>
   </hbox>
   <vbox align="end">
     <button id="siteDataSettings"
             class="accessory-button"
             label="&siteDataSettings.label;"
-            accesskey="&siteDataSettings.accesskey;"/>
+            accesskey="&siteDataSettings.accesskey;"
+            searchkeywords="&window.title;
+                            &hostCol.label;
+                            &statusCol.label;
+                            &usageCol.label;"/>
   </vbox>
 </groupbox>
 
 <!-- Data Choices -->
 #ifdef MOZ_TELEMETRY_REPORTING
 <groupbox id="historyGroup" data-category="panePrivacy" data-subcategory="reports" hidden="true">
 <caption><label>&reports.label;</label></caption>
   <hbox align="center">