mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-28 20:55:39 +00:00
Bug 1301315 - Add support for chrome_settings_overrides search engine. r=mixedpuppy
MozReview-Commit-ID: IkpigS3wqs1 --HG-- extra : rebase_source : 2f2de6653f9b0041a535099175f7f795a4014597
This commit is contained in:
parent
b9c12b59fb
commit
e4bbbc7291
@ -7,8 +7,25 @@
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "ExtensionPreferencesManager",
|
||||
"resource://gre/modules/ExtensionPreferencesManager.jsm");
|
||||
|
||||
function searchInitialized() {
|
||||
return new Promise(resolve => {
|
||||
if (Services.search.isInitialized) {
|
||||
resolve();
|
||||
}
|
||||
const SEARCH_SERVICE_TOPIC = "browser-search-service";
|
||||
Services.obs.addObserver(function observer(subject, topic, data) {
|
||||
if (data != "init-complete") {
|
||||
return;
|
||||
}
|
||||
|
||||
Services.obs.removeObserver(observer, SEARCH_SERVICE_TOPIC);
|
||||
resolve();
|
||||
}, SEARCH_SERVICE_TOPIC);
|
||||
});
|
||||
}
|
||||
|
||||
this.chrome_settings_overrides = class extends ExtensionAPI {
|
||||
onManifestEntry(entryName) {
|
||||
async onManifestEntry(entryName) {
|
||||
let {extension} = this;
|
||||
let {manifest} = extension;
|
||||
|
||||
@ -16,6 +33,57 @@ this.chrome_settings_overrides = class extends ExtensionAPI {
|
||||
ExtensionPreferencesManager.setSetting(extension, "homepage_override",
|
||||
manifest.chrome_settings_overrides.homepage);
|
||||
}
|
||||
if (manifest.chrome_settings_overrides.search_provider) {
|
||||
await searchInitialized();
|
||||
let searchProvider = manifest.chrome_settings_overrides.search_provider;
|
||||
let isCurrent = false;
|
||||
let index = -1;
|
||||
if (extension.startupReason === "ADDON_UPGRADE") {
|
||||
let engines = Services.search.getEnginesByExtensionID(extension.id);
|
||||
if (engines.length > 0) {
|
||||
// There can be only one engine right now
|
||||
isCurrent = Services.search.currentEngine == engines[0];
|
||||
// Get position of engine and store it
|
||||
index = Services.search.getEngines().indexOf(engines[0]);
|
||||
Services.search.removeEngine(engines[0]);
|
||||
}
|
||||
}
|
||||
try {
|
||||
Services.search.addEngineWithDetails(searchProvider.name.trim(),
|
||||
searchProvider.favicon_url,
|
||||
searchProvider.keyword, null,
|
||||
"GET", searchProvider.search_url,
|
||||
extension.id);
|
||||
if (extension.startupReason === "ADDON_UPGRADE") {
|
||||
let engine = Services.search.getEngineByName(searchProvider.name.trim());
|
||||
if (isCurrent) {
|
||||
Services.search.currentEngine = engine;
|
||||
}
|
||||
if (index != -1) {
|
||||
Services.search.moveEngine(engine, index);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
Components.utils.reportError(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
async onShutdown(reason) {
|
||||
let {extension} = this;
|
||||
if (reason == "ADDON_DISABLE" ||
|
||||
reason == "ADDON_UNINSTALL") {
|
||||
if (extension.manifest.chrome_settings_overrides.search_provider) {
|
||||
await searchInitialized();
|
||||
let engines = Services.search.getEnginesByExtensionID(extension.id);
|
||||
for (let engine of engines) {
|
||||
try {
|
||||
Services.search.removeEngine(engine);
|
||||
} catch (e) {
|
||||
Components.utils.reportError(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -15,6 +15,93 @@
|
||||
"format": "relativeUrl",
|
||||
"optional": true,
|
||||
"preprocess": "localize"
|
||||
},
|
||||
"search_provider": {
|
||||
"type": "object",
|
||||
"optional": true,
|
||||
"additionalProperties": { "$ref": "UnrecognizedProperty" },
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"preprocess": "localize"
|
||||
},
|
||||
"keyword": {
|
||||
"type": "string",
|
||||
"optional": true,
|
||||
"preprocess": "localize"
|
||||
},
|
||||
"search_url": {
|
||||
"type": "string",
|
||||
"format": "url",
|
||||
"pattern": "^https://.*$",
|
||||
"preprocess": "localize"
|
||||
},
|
||||
"favicon_url": {
|
||||
"type": "string",
|
||||
"optional": true,
|
||||
"format": "url",
|
||||
"preprocess": "localize"
|
||||
},
|
||||
"suggest_url": {
|
||||
"type": "string",
|
||||
"optional": true,
|
||||
"format": "url",
|
||||
"preprocess": "localize",
|
||||
"deprecated": "Unsupported on Firefox at this time."
|
||||
},
|
||||
"instant_url": {
|
||||
"type": "string",
|
||||
"optional": true,
|
||||
"format": "url",
|
||||
"preprocess": "localize",
|
||||
"deprecated": "Unsupported on Firefox at this time."
|
||||
},
|
||||
"image_url": {
|
||||
"type": "string",
|
||||
"optional": true,
|
||||
"format": "url",
|
||||
"preprocess": "localize",
|
||||
"deprecated": "Unsupported on Firefox at this time."
|
||||
},
|
||||
"search_url_post_params": {
|
||||
"type": "string",
|
||||
"optional": true,
|
||||
"preprocess": "localize",
|
||||
"deprecated": "Unsupported on Firefox at this time."
|
||||
},
|
||||
"instant_url_post_params": {
|
||||
"type": "string",
|
||||
"optional": true,
|
||||
"preprocess": "localize",
|
||||
"deprecated": "Unsupported on Firefox at this time."
|
||||
},
|
||||
"image_url_post_params": {
|
||||
"type": "string",
|
||||
"optional": true,
|
||||
"preprocess": "localize",
|
||||
"deprecated": "Unsupported on Firefox at this time."
|
||||
},
|
||||
"alternate_urls": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"format": "url",
|
||||
"preprocess": "localize"
|
||||
},
|
||||
"optional": true,
|
||||
"deprecated": "Unsupported on Firefox at this time."
|
||||
},
|
||||
"prepopulated_id": {
|
||||
"type": "integer",
|
||||
"optional": true,
|
||||
"deprecated": "Unsupported on Firefox."
|
||||
},
|
||||
"is_default": {
|
||||
"type": "boolean",
|
||||
"optional": true,
|
||||
"deprecated": "Unsupported on Firefox at this time."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -96,6 +96,7 @@ skip-if = debug || asan # Bug 1354681
|
||||
[browser_ext_sessions_getRecentlyClosed_private.js]
|
||||
[browser_ext_sessions_getRecentlyClosed_tabs.js]
|
||||
[browser_ext_sessions_restore.js]
|
||||
[browser_ext_settings_overrides_search.js]
|
||||
[browser_ext_sidebarAction.js]
|
||||
[browser_ext_sidebarAction_browser_style.js]
|
||||
[browser_ext_sidebarAction_context.js]
|
||||
|
@ -0,0 +1,114 @@
|
||||
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set sts=2 sw=2 et tw=80: */
|
||||
|
||||
"use strict";
|
||||
|
||||
add_task(async function test_extension_adding_engine() {
|
||||
let ext1 = ExtensionTestUtils.loadExtension({
|
||||
manifest: {
|
||||
"chrome_settings_overrides": {
|
||||
"search_provider": {
|
||||
"name": "MozSearch",
|
||||
"keyword": "MozSearch",
|
||||
"search_url": "https://example.com/?q={searchTerms}",
|
||||
},
|
||||
},
|
||||
},
|
||||
useAddonManager: "temporary",
|
||||
});
|
||||
|
||||
await ext1.startup();
|
||||
|
||||
let engine = Services.search.getEngineByName("MozSearch");
|
||||
ok(engine, "Engine should exist.");
|
||||
|
||||
await ext1.unload();
|
||||
|
||||
engine = Services.search.getEngineByName("MozSearch");
|
||||
ok(!engine, "Engine should not exist");
|
||||
});
|
||||
|
||||
add_task(async function test_extension_adding_engine_with_spaces() {
|
||||
let ext1 = ExtensionTestUtils.loadExtension({
|
||||
manifest: {
|
||||
"chrome_settings_overrides": {
|
||||
"search_provider": {
|
||||
"name": "MozSearch ",
|
||||
"keyword": "MozSearch",
|
||||
"search_url": "https://example.com/?q={searchTerms}",
|
||||
},
|
||||
},
|
||||
},
|
||||
useAddonManager: "temporary",
|
||||
});
|
||||
|
||||
await ext1.startup();
|
||||
|
||||
let engine = Services.search.getEngineByName("MozSearch");
|
||||
ok(engine, "Engine should exist.");
|
||||
|
||||
await ext1.unload();
|
||||
|
||||
engine = Services.search.getEngineByName("MozSearch");
|
||||
ok(!engine, "Engine should not exist");
|
||||
});
|
||||
|
||||
|
||||
add_task(async function test_upgrade_default_position_engine() {
|
||||
let ext1 = ExtensionTestUtils.loadExtension({
|
||||
manifest: {
|
||||
"chrome_settings_overrides": {
|
||||
"search_provider": {
|
||||
"name": "MozSearch",
|
||||
"keyword": "MozSearch",
|
||||
"search_url": "https://example.com/?q={searchTerms}",
|
||||
},
|
||||
},
|
||||
"applications": {
|
||||
"gecko": {
|
||||
"id": "testengine@mozilla.com",
|
||||
},
|
||||
},
|
||||
"version": "0.1",
|
||||
},
|
||||
useAddonManager: "temporary",
|
||||
});
|
||||
|
||||
let ext2 = ExtensionTestUtils.loadExtension({
|
||||
manifest: {
|
||||
"chrome_settings_overrides": {
|
||||
"search_provider": {
|
||||
"name": "MozSearch",
|
||||
"keyword": "MozSearch",
|
||||
"search_url": "https://example.com/?q={searchTerms}",
|
||||
},
|
||||
},
|
||||
"applications": {
|
||||
"gecko": {
|
||||
"id": "testengine@mozilla.com",
|
||||
},
|
||||
},
|
||||
"version": "0.2",
|
||||
},
|
||||
useAddonManager: "temporary",
|
||||
});
|
||||
|
||||
await ext1.startup();
|
||||
|
||||
let engine = Services.search.getEngineByName("MozSearch");
|
||||
Services.search.currentEngine = engine;
|
||||
Services.search.moveEngine(engine, 1);
|
||||
|
||||
await ext2.startup();
|
||||
|
||||
engine = Services.search.getEngineByName("MozSearch");
|
||||
is(Services.search.currentEngine, engine, "Default engine should still be MozSearch");
|
||||
is(Services.search.getEngines().indexOf(engine), 1, "Engine is in position 1");
|
||||
|
||||
await ext2.unload();
|
||||
await ext1.unload();
|
||||
|
||||
engine = Services.search.getEngineByName("MozSearch");
|
||||
ok(!engine, "Engine should not exist");
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user