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 584944 596643dec01e2a73731d1a9e5e5d10de657bf515
parent 584835 862e534ade6d17176b09aeeb5dae63fdb53eddeb
child 630579 c224aac6bcb1d57a9b527075a6563fdc7780b801
push id60950
push userbmo:evan@tseng.io
push dateFri, 26 May 2017 08:52:41 +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
browser/components/preferences/in-content/tests/browser.ini
browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_1.js
browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_2.js
browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_3.js
browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_4.js
browser/components/preferences/in-content/tests/browser_search_within_preferences.js
browser/components/preferences/in-content/tests/head.js
--- 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
@@ -39,17 +39,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,
 
@@ -277,54 +277,56 @@ var gSearchResultsPane = {
         let result = this.highlightMatches([node], [node.length], node.textContent.toLowerCase(), searchPhrase);
         matchesFound = matchesFound || result;
       }
 
       // Collecting data from boxObject
       let nodeSizes = [];
       let allNodeText = "";
       let runningSize = 0;
-      let labelResult = false;
-      let valueResult = 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);
-      }
+      let labelResult = this.stringMatchesFilters(nodeObject.getAttribute("label"), searchPhrase);
 
       // Creating tooltips for buttons
       if (labelResult && nodeObject.tagName === "button") {
         this.listSearchTooltips.push(nodeObject);
       }
 
       // 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);
-      }
-
-      if (nodeObject.tagName == "button" && (labelResult || valueResult)) {
-        nodeObject.setAttribute("highlightable", "true");
-      }
+      let valueResult = this.stringMatchesFilters(nodeObject.getAttribute("value"), searchPhrase);
 
       // Creating tooltips for buttons
       if (valueResult && nodeObject.tagName === "button") {
         this.listSearchTooltips.push(nodeObject);
       }
 
-      matchesFound = matchesFound || complexTextNodesResult || labelResult || valueResult;
+      // Searching some elements, such as xul:button, buttons to open subdialogs.
+      let keywordsResult = this.stringMatchesFilters(nodeObject.getAttribute("searchkeywords"), searchPhrase);
+
+      // Creating tooltips for buttons
+      if (keywordsResult && nodeObject.tagName === "button") {
+        this.listSearchTooltips.push(nodeObject);
+      }
+
+      if (nodeObject.tagName == "button" && (labelResult || valueResult || keywordsResult)) {
+        nodeObject.setAttribute("highlightable", "true");
+      }
+
+      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);
         // Creating tooltips for menulist element
         if (result && nodeObject.tagName === "menulist") {
--- 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');"/>
@@ -524,25 +532,93 @@
           </menupopup>
         </menulist>
       </hbox>
       <spacer flex="1" />
       <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;"/>
     </hbox>
     <hbox id="colorsSettings">
       <spacer flex="1" />
       <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;"/>
     </hbox>
   </vbox>
 </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 appendSearchKeywords(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 subdialogs.
+    let bundlePrefs = document.getElementById("bundlePreferences");
+    let signonBundle = document.getElementById("signonBundle");
+    let pkiBundle = document.getElementById("pkiBundle");
+    let browserBundle = document.getElementById("browserBundle");
+    appendSearchKeywords("passwordExceptions", [
+      bundlePrefs.getString("savedLoginsExceptions_title"),
+      bundlePrefs.getString("savedLoginsExceptions_desc"),
+    ]);
+    appendSearchKeywords("showPasswords", [
+      signonBundle.getString("loginsDescriptionAll"),
+    ]);
+    appendSearchKeywords("trackingProtectionExceptions", [
+      bundlePrefs.getString("trackingprotectionpermissionstitle"),
+      bundlePrefs.getString("trackingprotectionpermissionstext"),
+    ]);
+    appendSearchKeywords("changeBlockList", [
+      bundlePrefs.getString("blockliststitle"),
+      bundlePrefs.getString("blockliststext"),
+    ]);
+    appendSearchKeywords("popupPolicyButton", [
+      bundlePrefs.getString("popuppermissionstitle"),
+      bundlePrefs.getString("popuppermissionstext"),
+    ]);
+    appendSearchKeywords("notificationsPolicyButton", [
+      bundlePrefs.getString("notificationspermissionstitle"),
+      bundlePrefs.getString("notificationspermissionstext4"),
+    ]);
+    appendSearchKeywords("addonExceptions", [
+      bundlePrefs.getString("addons_permissions_title"),
+      bundlePrefs.getString("addonspermissionstext"),
+    ]);
+    appendSearchKeywords("viewSecurityDevicesButton", [
+      pkiBundle.getString("enable_fips"),
+    ]);
+    appendSearchKeywords("browserContainersSettings", [
+      browserBundle.getString("userContextPersonal.label"),
+      browserBundle.getString("userContextWork.label"),
+      browserBundle.getString("userContextBanking.label"),
+      browserBundle.getString("userContextShopping.label"),
+    ]);
+    appendSearchKeywords("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>
 
@@ -312,30 +313,32 @@
                 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;"/>
     </hbox>
     <hbox id="showPasswordBox" pack="end">
       <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;"/>
     </hbox>
   </vbox>
   <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 -->
@@ -354,22 +357,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;"
@@ -408,17 +416,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>
@@ -431,17 +440,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"
@@ -478,17 +491,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"
@@ -529,22 +548,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">
@@ -578,33 +621,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">
@@ -682,17 +746,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">
--- a/browser/components/preferences/in-content/tests/browser.ini
+++ b/browser/components/preferences/in-content/tests/browser.ini
@@ -9,16 +9,20 @@ support-files =
 [browser_applications_selection.js]
 [browser_advanced_update.js]
 skip-if = !updater
 [browser_basic_rebuild_fonts_test.js]
 [browser_bug410900.js]
 [browser_bug705422.js]
 [browser_bug731866.js]
 [browser_search_within_preferences.js]
+[browser_search_subdialogs_within_preferences_1.js]
+[browser_search_subdialogs_within_preferences_2.js]
+[browser_search_subdialogs_within_preferences_3.js]
+[browser_search_subdialogs_within_preferences_4.js]
 [browser_bug795764_cachedisabled.js]
 [browser_bug1018066_resetScrollPosition.js]
 [browser_bug1020245_openPreferences_to_paneContent.js]
 [browser_bug1184989_prevent_scrolling_when_preferences_flipped.js]
 [browser_engines.js]
 support-files =
   browser_bug1184989_prevent_scrolling_when_preferences_flipped.xul
 [browser_change_app_handler.js]
new file mode 100644
--- /dev/null
+++ b/browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_1.js
@@ -0,0 +1,53 @@
+/*
+* This file contains tests for the Preferences search bar.
+*/
+
+// Enabling Searching functionatily. Will display search bar form this testcase forward.
+add_task(async function() {
+  await SpecialPowers.pushPrefEnv({"set": [["browser.preferences.search", true]]});
+});
+
+/**
+ * Test for searching for the "Set Home Page" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("Set Home Page", "startupGroup");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/**
+ * Test for searching for the "Languages" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("Choose languages", "languagesGroup");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/**
+ * Test for searching for the "Fonts" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("Text Encoding", "fontsGroup");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/**
+ * Test for searching for the "Colors" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("Link Colors", "fontsGroup");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/**
+ * Test for searching for the "Exceptions - Saved Logins" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("sites will not be saved", "passwordsGroup");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_2.js
@@ -0,0 +1,53 @@
+/*
+* This file contains tests for the Preferences search bar.
+*/
+
+// Enabling Searching functionatily. Will display search bar form this testcase forward.
+add_task(async function() {
+  await SpecialPowers.pushPrefEnv({"set": [["browser.preferences.search", true]]});
+});
+
+/**
+ * Test for searching for the "Saved Logins" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("sites are stored", "passwordsGroup");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/**
+ * Test for searching for the "Exceptions - Tracking Protection" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("disabled Tracking Protection", "trackingGroup");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/**
+ * Test for searching for the "Block Lists" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("block Web elements", "trackingGroup");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/**
+ * Test for searching for the "Allowed Sites - Pop-ups" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("open pop-up windows", "miscGroup");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/**
+ * Test for searching for the "Notification Permissions" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("request permission again", "notificationsGroup");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_3.js
@@ -0,0 +1,53 @@
+/*
+* This file contains tests for the Preferences search bar.
+*/
+
+// Enabling Searching functionatily. Will display search bar form this testcase forward.
+add_task(async function() {
+  await SpecialPowers.pushPrefEnv({"set": [["browser.preferences.search", true]]});
+});
+
+/**
+ * Test for searching for the "Allowed Sites - Add-ons Installation" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("allowed to install add-ons", "addonsPhishingGroup");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/**
+ * Test for searching for the "Certificate Manager" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("identify these certificate authorities", "certSelection");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/**
+ * Test for searching for the "Device Manager" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("Security Modules and Devices", "certSelection");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/**
+ * Test for searching for the "Connection Settings" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("Use system proxy settings", "connectionGroup");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/**
+ * Test for searching for the "Settings - Site Data" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("store site data on your computer", "siteDataGroup");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_4.js
@@ -0,0 +1,17 @@
+/*
+* This file contains tests for the Preferences search bar.
+*/
+
+// Enabling Searching functionatily. Will display search bar form this testcase forward.
+add_task(async function() {
+  await SpecialPowers.pushPrefEnv({"set": [["browser.preferences.search", true]]});
+});
+
+/**
+ * Test for searching for the "Update History" subdialog.
+ */
+add_task(async function() {
+  await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
+  evaluateSearchResults("updates have been installed", "updateApp");
+  await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
--- a/browser/components/preferences/in-content/tests/browser_search_within_preferences.js
+++ b/browser/components/preferences/in-content/tests/browser_search_within_preferences.js
@@ -84,17 +84,21 @@ add_task(async function() {
   searchInput.focus();
   searchInput.value = "password";
   searchInput.doCommand();
 
   let mainPrefTag = gBrowser.contentDocument.getElementById("mainPrefPane");
 
   for (let i = 0; i < mainPrefTag.childElementCount; i++) {
     let child = mainPrefTag.children[i]
-    if (child.id == "passwordsGroup" || child.id == "weavePrefsDeck" || child.id == "header-searchResults") {
+    if (child.id == "passwordsGroup" ||
+        child.id == "weavePrefsDeck" ||
+        child.id == "header-searchResults" ||
+        child.id == "certSelection" ||
+        child.id == "connectionGroup") {
       is_element_visible(child, "Should be in search results");
     } else if (child.id) {
       is_element_hidden(child, "Should not be in search results");
     }
   }
 
   // Takes search off
   searchInput.value = "";
--- a/browser/components/preferences/in-content/tests/head.js
+++ b/browser/components/preferences/in-content/tests/head.js
@@ -213,16 +213,36 @@ function assertSitesListed(doc, hosts) {
   hosts.forEach(host => {
     let site = sitesList.querySelector(`richlistitem[host="${host}"]`);
     ok(site, `Should list the site of ${host}`);
   });
   is(removeBtn.disabled, false, "Should enable the removeSelected button");
   is(removeAllBtn.disabled, false, "Should enable the removeAllBtn button");
 }
 
+function evaluateSearchResults(keyword, searchReults) {
+  searchReults = Array.isArray(searchReults) ? searchReults : [searchReults];
+  searchReults.push("header-searchResults");
+
+  let searchInput = gBrowser.contentDocument.getElementById("searchInput");
+  searchInput.focus();
+  searchInput.value = keyword;
+  searchInput.doCommand();
+
+  let mainPrefTag = gBrowser.contentDocument.getElementById("mainPrefPane");
+  for (let i = 0; i < mainPrefTag.childElementCount; i++) {
+    let child = mainPrefTag.children[i];
+    if (searchReults.includes(child.id)) {
+      is_element_visible(child, "Should be in search results");
+    } else if (child.id) {
+      is_element_hidden(child, "Should not be in search results");
+    }
+  }
+}
+
 const mockSiteDataManager = {
 
   _SiteDataManager: null,
   _originalGetQuotaUsage: null,
   _originalRemoveQuotaUsage: null,
 
   _getQuotaUsage() {
     let results = [];