Bug 1413298 - Allow search encoding to be specifed by WebExtension. r?florian draft
authorMichael Kaply <mozilla@kaply.com>
Tue, 31 Oct 2017 20:15:49 -0500
changeset 690074 b6deaf2bb469f90e88f979c75e125acec8fd943c
parent 689820 ee21e5f7f1c1726e0ed2697eb45df54cdceedd36
child 693799 691edaf5132c384a8c2ad9c483fb218090a2394e
child 693820 7a2ad109cc2d25cc077af375ad982220ab41888b
child 693823 8f3d3c4a3a75d1d619ffc28f560ab8808454badd
child 693837 0beca6ce393b46fa40a9c873fe58b1f8f0ae4834
push id87199
push usermozilla@kaply.com
push dateWed, 01 Nov 2017 13:23:14 +0000
reviewersflorian
bugs1413298
milestone58.0a1
Bug 1413298 - Allow search encoding to be specifed by WebExtension. r?florian MozReview-Commit-ID: 4O73NlqIfjm
browser/components/extensions/ext-chrome-settings-overrides.js
browser/components/extensions/test/browser/browser_ext_settings_overrides_search.js
toolkit/components/search/nsSearchService.js
--- a/browser/components/extensions/ext-chrome-settings-overrides.js
+++ b/browser/components/extensions/ext-chrome-settings-overrides.js
@@ -179,16 +179,17 @@ this.chrome_settings_overrides = class e
     }
     try {
       let params = {
         template: searchProvider.search_url,
         iconURL: searchProvider.favicon_url,
         alias: searchProvider.keyword,
         extensionID: extension.id,
         suggestURL: searchProvider.suggest_url,
+        queryCharset: "UTF-8",
       };
       Services.search.addEngineWithDetails(searchProvider.name.trim(), params);
       if (extension.startupReason === "ADDON_UPGRADE") {
         let engine = Services.search.getEngineByName(searchProvider.name.trim());
         if (isCurrent) {
           Services.search.currentEngine = engine;
         }
         if (index != -1) {
--- a/browser/components/extensions/test/browser/browser_ext_settings_overrides_search.js
+++ b/browser/components/extensions/test/browser/browser_ext_settings_overrides_search.js
@@ -2,16 +2,17 @@
 /* vim: set sts=2 sw=2 et tw=80: */
 
 "use strict";
 
 
 const kSearchEngineURL = "https://example.com/?search={searchTerms}";
 const kSearchSuggestURL = "http://example.com/?suggest={searchTerms}";
 const kSearchTerm = "foo";
+const kSearchTermIntl = "日";
 const URLTYPE_SUGGEST_JSON = "application/x-suggestions+json";
 
 add_task(async function test_extension_adding_engine() {
   let ext1 = ExtensionTestUtils.loadExtension({
     manifest: {
       "chrome_settings_overrides": {
         "search_provider": {
              "name": "MozSearch",
@@ -26,16 +27,20 @@ add_task(async function test_extension_a
 
   await ext1.startup();
 
   let engine = Services.search.getEngineByName("MozSearch");
   ok(engine, "Engine should exist.");
 
   let expectedSuggestURL = kSearchSuggestURL.replace("{searchTerms}", kSearchTerm);
   let submissionSuggest = engine.getSubmission(kSearchTerm, URLTYPE_SUGGEST_JSON);
+  let encodedSubmissionURL = engine.getSubmission(kSearchTermIntl).uri.spec;
+  let testSubmissionURL = kSearchEngineURL.replace("{searchTerms}", encodeURIComponent(kSearchTermIntl));
+  is(encodedSubmissionURL, testSubmissionURL, "Encoded UTF-8 URLs should match");
+
   is(submissionSuggest.uri.spec, expectedSuggestURL, "Suggest URLs should match");
 
   await ext1.unload();
 
   engine = Services.search.getEngineByName("MozSearch");
   ok(!engine, "Engine should not exist");
 });
 
--- a/toolkit/components/search/nsSearchService.js
+++ b/toolkit/components/search/nsSearchService.js
@@ -1807,16 +1807,19 @@ Engine.prototype = {
                 "Can't call _initFromMetaData on a readonly engine!",
                 Cr.NS_ERROR_FAILURE);
 
     let method = aParams.method || "GET";
     this._urls.push(new EngineURL(URLTYPE_SEARCH_HTML, method, aParams.template));
     if (aParams.suggestURL) {
       this._urls.push(new EngineURL(URLTYPE_SUGGEST_JSON, "GET", aParams.suggestURL));
     }
+    if (aParams.queryCharset) {
+      this._queryCharset = aParams.queryCharset;
+    }
 
     this._name = aName;
     this.alias = aParams.alias;
     this._description = aParams.description;
     this._setIcon(aParams.iconURL, true);
     this._extensionID = aParams.extensionID;
   },