diff --git a/browser/base/content/test/general/browser_aboutHome.js b/browser/base/content/test/general/browser_aboutHome.js
index 9ff76dab8744..35cde141d537 100644
--- a/browser/base/content/test/general/browser_aboutHome.js
+++ b/browser/base/content/test/general/browser_aboutHome.js
@@ -275,7 +275,7 @@ var gTests = [
Services.obs.removeObserver(searchObserver, "browser-search-engine-modified");
});
Services.search.addEngine("http://test:80/browser/browser/base/content/test/general/POSTSearchEngine.xml",
- Ci.nsISearchEngine.DATA_XML, null, false);
+ null, null, false);
return deferred.promise;
}
},
@@ -659,7 +659,7 @@ function promiseNewEngine(basename) {
info("Waiting for engine to be added: " + basename);
let addDeferred = Promise.defer();
let url = getRootDirectory(gTestPath) + basename;
- Services.search.addEngine(url, Ci.nsISearchEngine.TYPE_MOZSEARCH, "", false, {
+ Services.search.addEngine(url, null, "", false, {
onSuccess: function (engine) {
info("Search engine added: " + basename);
registerCleanupFunction(() => {
diff --git a/browser/base/content/test/general/browser_contentSearchUI.js b/browser/base/content/test/general/browser_contentSearchUI.js
index e6b10fc72214..bd34981567fe 100644
--- a/browser/base/content/test/general/browser_contentSearchUI.js
+++ b/browser/base/content/test/general/browser_contentSearchUI.js
@@ -194,32 +194,32 @@ add_task(function* cycleSuggestions() {
shiftKey: true,
accelKey: true,
};
-
+
let state = yield msg("key", { key: "VK_DOWN", modifiers: modifiers });
checkState(state, "xfoo", ["xfoo", "xbar"], 0, aSelectedButtonIndex);
-
+
state = yield msg("key", { key: "VK_DOWN", modifiers: modifiers });
checkState(state, "xbar", ["xfoo", "xbar"], 1, aSelectedButtonIndex);
-
+
state = yield msg("key", { key: "VK_DOWN", modifiers: modifiers });
checkState(state, "x", ["xfoo", "xbar"], -1, aSelectedButtonIndex);
-
+
state = yield msg("key", { key: "VK_DOWN", modifiers: modifiers });
checkState(state, "xfoo", ["xfoo", "xbar"], 0, aSelectedButtonIndex);
-
+
state = yield msg("key", { key: "VK_UP", modifiers: modifiers });
checkState(state, "x", ["xfoo", "xbar"], -1, aSelectedButtonIndex);
-
+
state = yield msg("key", { key: "VK_UP", modifiers: modifiers });
checkState(state, "xbar", ["xfoo", "xbar"], 1, aSelectedButtonIndex);
-
+
state = yield msg("key", { key: "VK_UP", modifiers: modifiers });
checkState(state, "xfoo", ["xfoo", "xbar"], 0, aSelectedButtonIndex);
-
+
state = yield msg("key", { key: "VK_UP", modifiers: modifiers });
checkState(state, "x", ["xfoo", "xbar"], -1, aSelectedButtonIndex);
});
-
+
yield cycle();
// Repeat with a one-off selected.
@@ -689,7 +689,7 @@ function checkState(actualState, expectedInputVal, expectedSuggestions,
if (expectedSelectedIdx == -1 && expectedSelectedButtonIdx != undefined) {
expectedSelectedIdx = expectedSuggestions.length + expectedSelectedButtonIdx;
}
-
+
let expectedState = {
selectedIndex: expectedSelectedIdx,
numSuggestions: expectedSuggestions.length,
@@ -759,34 +759,15 @@ function setUpEngines() {
let currentEngineName = Services.search.currentEngine.name;
let currentEngines = Services.search.getVisibleEngines();
info("Adding test search engines");
- let engine1 = yield promiseNewEngine(TEST_ENGINE_BASENAME);
- let engine2 = yield promiseNewEngine(TEST_ENGINE_2_BASENAME);
+ let engine1 = yield promiseNewSearchEngine(TEST_ENGINE_BASENAME);
+ let engine2 = yield promiseNewSearchEngine(TEST_ENGINE_2_BASENAME);
Services.search.currentEngine = engine1;
for (let engine of currentEngines) {
Services.search.removeEngine(engine);
}
registerCleanupFunction(() => {
Services.search.restoreDefaultEngines();
- Services.search.removeEngine(engine1);
- Services.search.removeEngine(engine2);
Services.search.currentEngine = Services.search.getEngineByName(currentEngineName);
});
});
}
-
-function promiseNewEngine(basename) {
- info("Waiting for engine to be added: " + basename);
- let addDeferred = Promise.defer();
- let url = getRootDirectory(gTestPath) + basename;
- Services.search.addEngine(url, Ci.nsISearchEngine.TYPE_MOZSEARCH, "", false, {
- onSuccess: function (engine) {
- info("Search engine added: " + basename);
- addDeferred.resolve(engine);
- },
- onError: function (errCode) {
- ok(false, "addEngine failed with error code " + errCode);
- addDeferred.reject();
- },
- });
- return addDeferred.promise;
-}
diff --git a/browser/base/content/test/general/browser_keywordSearch_postData.js b/browser/base/content/test/general/browser_keywordSearch_postData.js
index 3a8666725ada..3f700fa586c5 100644
--- a/browser/base/content/test/general/browser_keywordSearch_postData.js
+++ b/browser/base/content/test/general/browser_keywordSearch_postData.js
@@ -50,7 +50,7 @@ function test() {
});
Services.search.addEngine("http://test:80/browser/browser/base/content/test/general/POSTSearchEngine.xml",
- Ci.nsISearchEngine.DATA_XML, null, false);
+ null, null, false);
}
var gCurrTest;
diff --git a/browser/base/content/test/general/browser_parsable_css.js b/browser/base/content/test/general/browser_parsable_css.js
index 56c8947506f4..bbde6a28d3a8 100644
--- a/browser/base/content/test/general/browser_parsable_css.js
+++ b/browser/base/content/test/general/browser_parsable_css.js
@@ -65,6 +65,76 @@ function once(target, name) {
});
}
+function fetchFile(uri) {
+ return new Promise((resolve, reject) => {
+ let xhr = new XMLHttpRequest();
+ xhr.open("GET", uri, true);
+ xhr.onreadystatechange = function() {
+ if (this.readyState != this.DONE) {
+ return;
+ }
+ try {
+ resolve(this.responseText);
+ } catch (ex) {
+ ok(false, `Script error reading ${uri}: ${ex}`);
+ resolve("");
+ }
+ };
+ xhr.onerror = error => {
+ ok(false, `XHR error reading ${uri}: ${error}`);
+ resolve("");
+ };
+ xhr.send(null);
+ });
+}
+
+var gChromeReg = Cc["@mozilla.org/chrome/chrome-registry;1"]
+ .getService(Ci.nsIChromeRegistry);
+var gChromeMap = new Map();
+
+function getBaseUriForChromeUri(chromeUri) {
+ let chromeFile = chromeUri + "gobbledygooknonexistentfile.reallynothere";
+ let uri = Services.io.newURI(chromeFile, null, null);
+ let fileUri = gChromeReg.convertChromeURL(uri);
+ return fileUri.resolve(".");
+}
+
+function parseManifest(manifestUri) {
+ return fetchFile(manifestUri.spec).then(data => {
+ for (let line of data.split('\n')) {
+ let [type, ...argv] = line.split(/\s+/);
+ let component;
+ if (type == "content" || type == "skin") {
+ [component] = argv;
+ } else {
+ // skip unrelated lines
+ continue;
+ }
+ let chromeUri = `chrome://${component}/${type}/`;
+ gChromeMap.set(getBaseUriForChromeUri(chromeUri), chromeUri);
+ }
+ });
+}
+
+function convertToChromeUri(fileUri) {
+ let baseUri = fileUri.spec;
+ let path = "";
+ while (true) {
+ let slashPos = baseUri.lastIndexOf("/", baseUri.length - 2);
+ if (slashPos < 0) {
+ info(`File not accessible from chrome protocol: ${fileUri.path}`);
+ return fileUri;
+ }
+ path = baseUri.slice(slashPos + 1) + path;
+ baseUri = baseUri.slice(0, slashPos + 1);
+ if (gChromeMap.has(baseUri)) {
+ let chromeBaseUri = gChromeMap.get(baseUri);
+ let chromeUri = `${chromeBaseUri}${path}`;
+ return Services.io.newURI(chromeUri, null, null);
+ }
+ }
+}
+
function messageIsCSSError(msg, innerWindowID, outerWindowID) {
// Only care about CSS errors generated by our iframe:
if ((msg instanceof Ci.nsIScriptError) &&
@@ -85,15 +155,11 @@ add_task(function checkAllTheCSS() {
// This asynchronously produces a list of URLs (sadly, mostly sync on our
// test infrastructure because it runs against jarfiles there, and
// our zipreader APIs are all sync)
- let uris = yield generateURIsFromDirTree(appDir, ".css");
+ let uris = yield generateURIsFromDirTree(appDir, [".css", ".manifest"]);
// Create a clean iframe to load all the files into. This needs to live at a
- // file or jar URI (depending on whether we're using a packaged build or not)
- // so that it's allowed to load other same-scheme URIs (i.e. the browser css).
- let resHandler = Services.io.getProtocolHandler("resource")
- .QueryInterface(Ci.nsISubstitutingProtocolHandler);
- let resURI = Services.io.newURI('resource://testing-common/resource_test_file.html', null, null);
- let testFile = resHandler.resolveURI(resURI);
+ // chrome URI so that it's allowed to load and parse any styles.
+ let testFile = getRootDirectory(gTestPath) + "dummy_page.html";
let windowless = Services.appShell.createWindowlessBrowser();
let iframe = windowless.document.createElementNS("http://www.w3.org/1999/xhtml", "html:iframe");
windowless.document.documentElement.appendChild(iframe);
@@ -106,6 +172,20 @@ add_task(function checkAllTheCSS() {
let innerWindowID = windowUtils.currentInnerWindowID;
let outerWindowID = windowUtils.outerWindowID;
+ // Parse and remove all manifests from the list.
+ // NOTE that this must be done before filtering out devtools paths
+ // so that all chrome paths can be recorded.
+ let manifestPromises = [];
+ uris = uris.filter(uri => {
+ if (uri.path.endsWith(".manifest")) {
+ manifestPromises.push(parseManifest(uri));
+ return false;
+ }
+ return true;
+ });
+ // Wait for all manifest to be parsed
+ yield Promise.all(manifestPromises);
+
// We build a list of promises that get resolved when their respective
// files have loaded and produced no errors.
let allPromises = [];
@@ -133,7 +213,8 @@ add_task(function checkAllTheCSS() {
linkEl.addEventListener("load", onLoad);
linkEl.addEventListener("error", onError);
linkEl.setAttribute("type", "text/css");
- linkEl.setAttribute("href", uri.spec);
+ let chromeUri = convertToChromeUri(uri);
+ linkEl.setAttribute("href", chromeUri.spec);
allPromises.push(promiseForThisSpec.promise);
doc.head.appendChild(linkEl);
}
diff --git a/browser/base/content/test/general/head.js b/browser/base/content/test/general/head.js
index 903812bb67c5..3f7d08dbdadb 100644
--- a/browser/base/content/test/general/head.js
+++ b/browser/base/content/test/general/head.js
@@ -1033,8 +1033,7 @@ function promiseNewSearchEngine(basename) {
return new Promise((resolve, reject) => {
info("Waiting for engine to be added: " + basename);
let url = getRootDirectory(gTestPath) + basename;
- Services.search.addEngine(url, Ci.nsISearchEngine.TYPE_MOZSEARCH, "",
- false, {
+ Services.search.addEngine(url, null, "", false, {
onSuccess: function (engine) {
info("Search engine added: " + basename);
registerCleanupFunction(() => Services.search.removeEngine(engine));
diff --git a/browser/base/content/test/newtab/browser_newtab_search.js b/browser/base/content/test/newtab/browser_newtab_search.js
index 61d382a95550..46cf4ba0779c 100644
--- a/browser/base/content/test/newtab/browser_newtab_search.js
+++ b/browser/base/content/test/newtab/browser_newtab_search.js
@@ -237,7 +237,7 @@ function promiseNewSearchEngine({name: basename, numLogos}) {
// Wait for addEngine().
let addDeferred = Promise.defer();
let url = getRootDirectory(gTestPath) + basename;
- Services.search.addEngine(url, Ci.nsISearchEngine.TYPE_MOZSEARCH, "", false, {
+ Services.search.addEngine(url, null, "", false, {
onSuccess: function (engine) {
info("Search engine added: " + basename);
gNewEngines.push(engine);
diff --git a/browser/components/loop/content/shared/js/otSdkDriver.js b/browser/components/loop/content/shared/js/otSdkDriver.js
index 95c94f296d69..d74bcc0e0e53 100644
--- a/browser/components/loop/content/shared/js/otSdkDriver.js
+++ b/browser/components/loop/content/shared/js/otSdkDriver.js
@@ -930,6 +930,10 @@ loop.OTSdkDriver = (function() {
this.dispatcher.dispatch(new sharedActions.ConnectionFailure({
reason: FAILURE_DETAILS.UNABLE_TO_PUBLISH_MEDIA
}));
+ } else if (event.code === OT.ExceptionCodes.UNABLE_TO_PUBLISH) {
+ // We need to log the message so that we can understand where the exception
+ // is coming from. Potentially a temporary addition.
+ this._notifyMetricsEvent("sdk.exception." + event.code + "." + event.message);
} else {
this._notifyMetricsEvent("sdk.exception." + event.code);
}
diff --git a/browser/components/loop/test/shared/otSdkDriver_test.js b/browser/components/loop/test/shared/otSdkDriver_test.js
index 457e5dbceee2..6acb65899060 100644
--- a/browser/components/loop/test/shared/otSdkDriver_test.js
+++ b/browser/components/loop/test/shared/otSdkDriver_test.js
@@ -1537,6 +1537,26 @@ describe("loop.OTSdkDriver", function () {
}));
});
+ describe("Unable to publish (not GetUserMedia)", function() {
+ it("should notify metrics", function() {
+ sdk.trigger("exception", {
+ code: OT.ExceptionCodes.UNABLE_TO_PUBLISH,
+ message: "Fake",
+ title: "Connect Failed"
+ });
+
+ sinon.assert.calledOnce(dispatcher.dispatch);
+ sinon.assert.calledWithExactly(dispatcher.dispatch,
+ new sharedActions.ConnectionStatus({
+ event: "sdk.exception." + OT.ExceptionCodes.UNABLE_TO_PUBLISH + ".Fake",
+ state: "starting",
+ connections: 0,
+ sendStreams: 0,
+ recvStreams: 0
+ }));
+ });
+ });
+
describe("Unable to publish (GetUserMedia)", function() {
it("should destroy the publisher", function() {
sdk.trigger("exception", {
diff --git a/browser/components/search/content/search.xml b/browser/components/search/content/search.xml
index 4d53ef903010..bac6f9777ddf 100644
--- a/browser/components/search/content/search.xml
+++ b/browser/components/search/content/search.xml
@@ -446,13 +446,11 @@
if (target.engine) {
this.currentEngine = target.engine;
} else if (target.classList.contains("addengine-item")) {
- // We only detect OpenSearch files
- var type = Ci.nsISearchEngine.DATA_XML;
// Select the installed engine if the installation succeeds
var installCallback = {
onSuccess: engine => this.currentEngine = engine
}
- Services.search.addEngine(target.getAttribute("uri"), type,
+ Services.search.addEngine(target.getAttribute("uri"), null,
target.getAttribute("src"), false,
installCallback);
}
@@ -1432,8 +1430,7 @@
Components.utils.reportError("Error adding search engine: " + errorCode);
}
}
- Services.search.addEngine(target.getAttribute("uri"),
- Ci.nsISearchEngine.DATA_XML,
+ Services.search.addEngine(target.getAttribute("uri"), null,
target.getAttribute("image"), false,
installCallback);
}
diff --git a/browser/components/search/test/browser.ini b/browser/components/search/test/browser.ini
index df150f96623e..2225fe2efa53 100644
--- a/browser/components/search/test/browser.ini
+++ b/browser/components/search/test/browser.ini
@@ -7,7 +7,6 @@ support-files =
head.js
opensearch.html
test.html
- testEngine.src
testEngine.xml
testEngine_diacritics.xml
testEngine_dupe.xml
diff --git a/browser/components/search/test/browser_426329.js b/browser/components/search/test/browser_426329.js
index e9c1a7fef3b5..717ba18c99f6 100644
--- a/browser/components/search/test/browser_426329.js
+++ b/browser/components/search/test/browser_426329.js
@@ -99,8 +99,7 @@ function* promiseSetEngine() {
Services.obs.addObserver(observer, "browser-search-engine-modified", false);
ss.addEngine("http://mochi.test:8888/browser/browser/components/search/test/426329.xml",
- Ci.nsISearchEngine.DATA_XML, "data:image/x-icon,%00",
- false);
+ null, "data:image/x-icon,%00", false);
return deferred.promise;
}
diff --git a/browser/components/search/test/browser_483086.js b/browser/components/search/test/browser_483086.js
index ef1f69dfcede..208add867c2c 100644
--- a/browser/components/search/test/browser_483086.js
+++ b/browser/components/search/test/browser_483086.js
@@ -24,8 +24,7 @@ function test() {
Services.obs.addObserver(observer, "browser-search-engine-modified", false);
gSS.addEngine("http://mochi.test:8888/browser/browser/components/search/test/483086-1.xml",
- Ci.nsISearchEngine.DATA_XML, "data:image/x-icon;%00",
- false);
+ null, "data:image/x-icon;%00", false);
}
function test2() {
@@ -37,7 +36,7 @@ function test2() {
is(engine.searchForm, "http://example.com", "SearchForm is correct");
gSS.removeEngine(engine);
break;
- case "engine-removed":
+ case "engine-removed":
Services.obs.removeObserver(observer, "browser-search-engine-modified");
finish();
break;
@@ -46,6 +45,5 @@ function test2() {
Services.obs.addObserver(observer, "browser-search-engine-modified", false);
gSS.addEngine("http://mochi.test:8888/browser/browser/components/search/test/483086-2.xml",
- Ci.nsISearchEngine.DATA_XML, "data:image/x-icon;%00",
- false);
+ null, "data:image/x-icon;%00", false);
}
diff --git a/browser/components/search/test/browser_addEngine.js b/browser/components/search/test/browser_addEngine.js
index f546aead6440..44819b70df0f 100644
--- a/browser/components/search/test/browser_addEngine.js
+++ b/browser/components/search/test/browser_addEngine.js
@@ -44,12 +44,11 @@ var gTests = [
name: "Foo",
alias: null,
description: "Foo Search",
- searchForm: "http://mochi.test:8888/browser/browser/components/search/test/",
- type: Ci.nsISearchEngine.TYPE_OPENSEARCH
+ searchForm: "http://mochi.test:8888/browser/browser/components/search/test/"
},
run: function () {
gSS.addEngine("http://mochi.test:8888/browser/browser/components/search/test/testEngine.xml",
- Ci.nsISearchEngine.DATA_XML, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABGklEQVQoz2NgGB6AnZ1dUlJSXl4eSDIyMhLW4Ovr%2B%2Fr168uXL69Zs4YoG%2BLi4i5dusTExMTGxsbNzd3f37937976%2BnpmZmagbHR09J49e5YvX66kpATVEBYW9ubNm2nTphkbG7e2tp44cQLIuHfvXm5urpaWFlDKysqqu7v73LlzECMYIiIiHj58mJCQoKKicvXq1bS0NKBgW1vbjh074uPjgeqAXE1NzSdPnvDz84M0AEUvXLgAsW379u1z5swBen3jxo2zZ892cHB4%2BvQp0KlAfwI1cHJyghQFBwfv2rULokFXV%2FfixYu7d%2B8GGqGgoMDKyrpu3br9%2B%2FcDuXl5eVA%2FAEWBfoWHAdAYoNuAYQ0XAeoUERFhGDYAAPoUaT2dfWJuAAAAAElFTkSuQmCC",
+ null, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABGklEQVQoz2NgGB6AnZ1dUlJSXl4eSDIyMhLW4Ovr%2B%2Fr168uXL69Zs4YoG%2BLi4i5dusTExMTGxsbNzd3f37937976%2BnpmZmagbHR09J49e5YvX66kpATVEBYW9ubNm2nTphkbG7e2tp44cQLIuHfvXm5urpaWFlDKysqqu7v73LlzECMYIiIiHj58mJCQoKKicvXq1bS0NKBgW1vbjh074uPjgeqAXE1NzSdPnvDz84M0AEUvXLgAsW379u1z5swBen3jxo2zZ892cHB4%2BvQp0KlAfwI1cHJyghQFBwfv2rULokFXV%2FfixYu7d%2B8GGqGgoMDKyrpu3br9%2B%2FcDuXl5eVA%2FAEWBfoWHAdAYoNuAYQ0XAeoUERFhGDYAAPoUaT2dfWJuAAAAAElFTkSuQmCC",
false);
},
added: function (engine) {
@@ -77,37 +76,6 @@ var gTests = [
ok(currentEngine, "An engine is present.");
isnot(currentEngine.name, this.engine.name, "Current engine reset after removal");
- nextTest();
- }
- },
- {
- name: "sherlock install",
- engine: {
- name: "Test Sherlock",
- alias: null,
- description: "Test Description",
- searchForm: "http://example.com/searchform",
- type: Ci.nsISearchEngine.TYPE_SHERLOCK
- },
- run: function () {
- gSS.addEngine("http://mochi.test:8888/browser/browser/components/search/test/testEngine.src",
- Ci.nsISearchEngine.DATA_TEXT, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABGklEQVQoz2NgGB6AnZ1dUlJSXl4eSDIyMhLW4Ovr%2B%2Fr168uXL69Zs4YoG%2BLi4i5dusTExMTGxsbNzd3f37937976%2BnpmZmagbHR09J49e5YvX66kpATVEBYW9ubNm2nTphkbG7e2tp44cQLIuHfvXm5urpaWFlDKysqqu7v73LlzECMYIiIiHj58mJCQoKKicvXq1bS0NKBgW1vbjh074uPjgeqAXE1NzSdPnvDz84M0AEUvXLgAsW379u1z5swBen3jxo2zZ892cHB4%2BvQp0KlAfwI1cHJyghQFBwfv2rULokFXV%2FfixYu7d%2B8GGqGgoMDKyrpu3br9%2B%2FcDuXl5eVA%2FAEWBfoWHAdAYoNuAYQ0XAeoUERFhGDYAAPoUaT2dfWJuAAAAAElFTkSuQmCC",
- false);
- },
- added: function (engine) {
- ok(engine, "engine was added.");
- checkEngine(this.engine, engine);
-
- let engineFromSS = gSS.getEngineByName(this.engine.name);
- is(engineFromSS, engine, "engine is obtainable via getEngineByName");
-
- gSS.removeEngine(engine);
- },
- removed: function (engine) {
- let currentEngine = gSS.currentEngine;
- ok(currentEngine, "An engine is present.");
- isnot(currentEngine.name, this.engine.name, "Current engine reset after removal");
-
nextTest();
}
}
diff --git a/browser/components/search/test/browser_amazon.js b/browser/components/search/test/browser_amazon.js
index 02a168f1fe5c..e1048a0a72b5 100644
--- a/browser/components/search/test/browser_amazon.js
+++ b/browser/components/search/test/browser_amazon.js
@@ -30,7 +30,6 @@ function test() {
alias: null,
description: "Amazon.com Search",
searchForm: "https://www.amazon.com/exec/obidos/external-search/?field-keywords=&mode=blended&tag=mozilla-20&sourceid=Mozilla-search",
- type: Ci.nsISearchEngine.TYPE_MOZSEARCH,
hidden: false,
wrappedJSObject: {
queryCharset: "UTF-8",
diff --git a/browser/components/search/test/browser_bing.js b/browser/components/search/test/browser_bing.js
index 63c63b05a7ab..6327036e11dd 100644
--- a/browser/components/search/test/browser_bing.js
+++ b/browser/components/search/test/browser_bing.js
@@ -40,7 +40,6 @@ function test() {
alias: null,
description: "Bing. Search by Microsoft.",
searchForm: "https://www.bing.com/search?q=&pc=MOZI",
- type: Ci.nsISearchEngine.TYPE_MOZSEARCH,
hidden: false,
wrappedJSObject: {
queryCharset: "UTF-8",
diff --git a/browser/components/search/test/browser_contextmenu.js b/browser/components/search/test/browser_contextmenu.js
index f34bbc60bb6e..34fce26873fa 100644
--- a/browser/components/search/test/browser_contextmenu.js
+++ b/browser/components/search/test/browser_contextmenu.js
@@ -31,8 +31,7 @@ function test() {
Services.obs.addObserver(observer, "browser-search-engine-modified", false);
ss.addEngine("http://mochi.test:8888/browser/browser/components/search/test/testEngine_mozsearch.xml",
- Ci.nsISearchEngine.DATA_XML, "data:image/x-icon,%00",
- false);
+ null, "data:image/x-icon,%00", false);
function startTest() {
contextMenu = document.getElementById("contentAreaContextMenu");
diff --git a/browser/components/search/test/browser_eBay.js b/browser/components/search/test/browser_eBay.js
index 7b9a13c09c0e..490fbe8c299b 100644
--- a/browser/components/search/test/browser_eBay.js
+++ b/browser/components/search/test/browser_eBay.js
@@ -30,7 +30,6 @@ function test() {
alias: null,
description: "eBay - Online auctions",
searchForm: "http://search.ebay.com/",
- type: Ci.nsISearchEngine.TYPE_MOZSEARCH,
hidden: false,
wrappedJSObject: {
queryCharset: "ISO-8859-1",
diff --git a/browser/components/search/test/browser_google.js b/browser/components/search/test/browser_google.js
index e54b03a33b31..2b0eb830a421 100644
--- a/browser/components/search/test/browser_google.js
+++ b/browser/components/search/test/browser_google.js
@@ -46,7 +46,6 @@ function test() {
alias: null,
description: "Google Search",
searchForm: "https://www.google.com/search?q=&ie=utf-8&oe=utf-8",
- type: Ci.nsISearchEngine.TYPE_MOZSEARCH,
hidden: false,
wrappedJSObject: {
queryCharset: "UTF-8",
diff --git a/browser/components/search/test/browser_healthreport.js b/browser/components/search/test/browser_healthreport.js
index 98c2def1db18..5dd953b93471 100644
--- a/browser/components/search/test/browser_healthreport.js
+++ b/browser/components/search/test/browser_healthreport.js
@@ -96,9 +96,7 @@ function test() {
Services.obs.addObserver(observer, "browser-search-engine-modified", false);
Services.search.addEngine("http://mochi.test:8888/browser/browser/components/search/test/testEngine.xml",
- Ci.nsISearchEngine.DATA_XML,
- "data:image/x-icon,%00",
- false);
+ null, "data:image/x-icon,%00", false);
}
diff --git a/browser/components/search/test/browser_hiddenOneOffs_cleanup.js b/browser/components/search/test/browser_hiddenOneOffs_cleanup.js
index 96c18f770811..9a584feb6f6a 100644
--- a/browser/components/search/test/browser_hiddenOneOffs_cleanup.js
+++ b/browser/components/search/test/browser_hiddenOneOffs_cleanup.js
@@ -9,7 +9,7 @@ function promiseNewEngine(basename) {
Services.search.init({
onInitComplete: function() {
let url = getRootDirectory(gTestPath) + basename;
- Services.search.addEngine(url, Ci.nsISearchEngine.TYPE_MOZSEARCH, "", false, {
+ Services.search.addEngine(url, null, "", false, {
onSuccess: function (engine) {
info("Search engine added: " + basename);
resolve(engine);
diff --git a/browser/components/search/test/browser_private_search_perwindowpb.js b/browser/components/search/test/browser_private_search_perwindowpb.js
index ee1f3aa07324..395cbd99ee0b 100644
--- a/browser/components/search/test/browser_private_search_perwindowpb.js
+++ b/browser/components/search/test/browser_private_search_perwindowpb.js
@@ -51,8 +51,7 @@ function test() {
ok(false, "failed to install engine: " + errorCode);
}
};
- Services.search.addEngine(engineURL + "426329.xml",
- Ci.nsISearchEngine.DATA_XML,
+ Services.search.addEngine(engineURL + "426329.xml", null,
"data:image/x-icon,%00", false, installCallback);
}
diff --git a/browser/components/search/test/browser_webapi.js b/browser/components/search/test/browser_webapi.js
index bfdc5ec15991..d8161ffbe528 100644
--- a/browser/components/search/test/browser_webapi.js
+++ b/browser/components/search/test/browser_webapi.js
@@ -8,11 +8,7 @@ function getString(key, ...params) {
}
function AddSearchProvider(...args) {
- return gBrowser.addTab(ROOT + "webapi.html?AddSearchProvider:" + encodeURIComponent(JSON.stringify(args)));
-}
-
-function addSearchEngine(...args) {
- return gBrowser.addTab(ROOT + "webapi.html?addSearchEngine:" + encodeURIComponent(JSON.stringify(args)));
+ return gBrowser.addTab(ROOT + "webapi.html?" + encodeURIComponent(JSON.stringify(args)));
}
function promiseDialogOpened() {
@@ -34,7 +30,7 @@ function promiseDialogOpened() {
});
}
-add_task(function* test_working_AddSearchProvider() {
+add_task(function* test_working() {
gBrowser.selectedTab = AddSearchProvider(ROOT + "testEngine.xml");
let dialog = yield promiseDialogOpened();
@@ -46,7 +42,7 @@ add_task(function* test_working_AddSearchProvider() {
gBrowser.removeCurrentTab();
});
-add_task(function* test_HTTP_AddSearchProvider() {
+add_task(function* test_HTTP() {
gBrowser.selectedTab = AddSearchProvider(ROOT.replace("http:", "HTTP:") + "testEngine.xml");
let dialog = yield promiseDialogOpened();
@@ -58,7 +54,7 @@ add_task(function* test_HTTP_AddSearchProvider() {
gBrowser.removeCurrentTab();
});
-add_task(function* test_relative_AddSearchProvider() {
+add_task(function* test_relative() {
gBrowser.selectedTab = AddSearchProvider("testEngine.xml");
let dialog = yield promiseDialogOpened();
@@ -70,7 +66,7 @@ add_task(function* test_relative_AddSearchProvider() {
gBrowser.removeCurrentTab();
});
-add_task(function* test_invalid_AddSearchProvider() {
+add_task(function* test_invalid() {
gBrowser.selectedTab = AddSearchProvider("z://foobar");
let dialog = yield promiseDialogOpened();
@@ -82,7 +78,7 @@ add_task(function* test_invalid_AddSearchProvider() {
gBrowser.removeCurrentTab();
});
-add_task(function* test_missing_AddSearchProvider() {
+add_task(function* test_missing() {
let url = ROOT + "foobar.xml";
gBrowser.selectedTab = AddSearchProvider(url);
@@ -94,88 +90,3 @@ add_task(function* test_missing_AddSearchProvider() {
gBrowser.removeCurrentTab();
});
-
-add_task(function* test_working_addSearchEngine_xml() {
- gBrowser.selectedTab = addSearchEngine(ROOT + "testEngine.xml", "", "", "");
-
- let dialog = yield promiseDialogOpened();
- is(dialog.args.promptType, "confirmEx", "Should see the confirmation dialog.");
- is(dialog.args.text, getString("addEngineConfirmation", "Foo", "example.com"),
- "Should have seen the right install message");
- dialog.document.documentElement.cancelDialog();
-
- gBrowser.removeCurrentTab();
-});
-
-add_task(function* test_working_addSearchEngine_src() {
- gBrowser.selectedTab = addSearchEngine(ROOT + "testEngine.src", "", "", "");
-
- let dialog = yield promiseDialogOpened();
- is(dialog.args.promptType, "confirmEx", "Should see the confirmation dialog.");
- is(dialog.args.text, getString("addEngineConfirmation", "Test Sherlock", "example.com"),
- "Should have seen the right install message");
- dialog.document.documentElement.cancelDialog();
-
- gBrowser.removeCurrentTab();
-});
-
-add_task(function* test_relative_addSearchEngine_xml() {
- gBrowser.selectedTab = addSearchEngine("testEngine.xml", "", "", "");
-
- let dialog = yield promiseDialogOpened();
- is(dialog.args.promptType, "confirmEx", "Should see the confirmation dialog.");
- is(dialog.args.text, getString("addEngineConfirmation", "Foo", "example.com"),
- "Should have seen the right install message");
- dialog.document.documentElement.cancelDialog();
-
- gBrowser.removeCurrentTab();
-});
-
-add_task(function* test_relative_addSearchEngine_src() {
- gBrowser.selectedTab = addSearchEngine("testEngine.src", "", "", "");
-
- let dialog = yield promiseDialogOpened();
- is(dialog.args.promptType, "confirmEx", "Should see the confirmation dialog.");
- is(dialog.args.text, getString("addEngineConfirmation", "Test Sherlock", "example.com"),
- "Should have seen the right install message");
- dialog.document.documentElement.cancelDialog();
-
- gBrowser.removeCurrentTab();
-});
-
-add_task(function* test_invalid_addSearchEngine() {
- gBrowser.selectedTab = addSearchEngine("z://foobar", "", "", "");
-
- let dialog = yield promiseDialogOpened();
- is(dialog.args.promptType, "alert", "Should see the alert dialog.");
- is(dialog.args.text, getString("error_invalid_engine_msg", brandName),
- "Should have seen the right error message")
- dialog.document.documentElement.acceptDialog();
-
- gBrowser.removeCurrentTab();
-});
-
-add_task(function* test_invalid_icon_addSearchEngine() {
- gBrowser.selectedTab = addSearchEngine(ROOT + "testEngine.src", "z://foobar", "", "");
-
- let dialog = yield promiseDialogOpened();
- is(dialog.args.promptType, "alert", "Should see the alert dialog.");
- is(dialog.args.text, getString("error_invalid_engine_msg", brandName),
- "Should have seen the right error message")
- dialog.document.documentElement.acceptDialog();
-
- gBrowser.removeCurrentTab();
-});
-
-add_task(function* test_missing_addSearchEngine() {
- let url = ROOT + "foobar.xml";
- gBrowser.selectedTab = addSearchEngine(url, "", "", "");
-
- let dialog = yield promiseDialogOpened();
- is(dialog.args.promptType, "alert", "Should see the alert dialog.");
- is(dialog.args.text, getString("error_loading_engine_msg2", brandName, url),
- "Should have seen the right error message")
- dialog.document.documentElement.acceptDialog();
-
- gBrowser.removeCurrentTab();
-});
diff --git a/browser/components/search/test/browser_yahoo.js b/browser/components/search/test/browser_yahoo.js
index 1c411099e799..8d5ec501b490 100644
--- a/browser/components/search/test/browser_yahoo.js
+++ b/browser/components/search/test/browser_yahoo.js
@@ -30,7 +30,6 @@ function test() {
alias: null,
description: "Yahoo Search",
searchForm: "https://search.yahoo.com/yhs/search?p=&ei=UTF-8&hspart=mozilla",
- type: Ci.nsISearchEngine.TYPE_MOZSEARCH,
hidden: false,
wrappedJSObject: {
queryCharset: "UTF-8",
diff --git a/browser/components/search/test/head.js b/browser/components/search/test/head.js
index 5d6a2526c08f..982b546668b7 100644
--- a/browser/components/search/test/head.js
+++ b/browser/components/search/test/head.js
@@ -146,7 +146,7 @@ function promiseNewEngine(basename, options = {}) {
onInitComplete: function() {
let url = getRootDirectory(gTestPath) + basename;
let current = Services.search.currentEngine;
- Services.search.addEngine(url, Ci.nsISearchEngine.TYPE_MOZSEARCH, "", false, {
+ Services.search.addEngine(url, null, "", false, {
onSuccess: function (engine) {
info("Search engine added: " + basename);
if (setAsCurrent) {
diff --git a/browser/components/search/test/testEngine.src b/browser/components/search/test/testEngine.src
deleted file mode 100644
index eb39fe8260e5..000000000000
--- a/browser/components/search/test/testEngine.src
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
diff --git a/browser/components/search/test/webapi.html b/browser/components/search/test/webapi.html
index 746eae2d9db1..1ef38b895168 100644
--- a/browser/components/search/test/webapi.html
+++ b/browser/components/search/test/webapi.html
@@ -4,14 +4,10 @@
diff --git a/browser/modules/test/browser_ContentSearch.js b/browser/modules/test/browser_ContentSearch.js
index c9b6ef6cc2f1..5f1e27068f27 100644
--- a/browser/modules/test/browser_ContentSearch.js
+++ b/browser/modules/test/browser_ContentSearch.js
@@ -317,7 +317,7 @@ function waitForNewEngine(basename, numImages) {
// Wait for addEngine().
let addDeferred = Promise.defer();
let url = getRootDirectory(gTestPath) + basename;
- Services.search.addEngine(url, Ci.nsISearchEngine.TYPE_MOZSEARCH, "", false, {
+ Services.search.addEngine(url, null, "", false, {
onSuccess: function (engine) {
info("Search engine added: " + basename);
addDeferred.resolve(engine);
diff --git a/devtools/client/themes/floating-scrollbars-light.css b/devtools/client/themes/floating-scrollbars-light.css
index 287e8880ef6e..7e38611f6628 100644
--- a/devtools/client/themes/floating-scrollbars-light.css
+++ b/devtools/client/themes/floating-scrollbars-light.css
@@ -3,7 +3,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-@import url("chrome://devtools/skin/themes/floating-scrollbars.css");
+@import url("floating-scrollbars.css");
scrollbar thumb {
background-color: rgba(170,170,170,0.2) !important;
diff --git a/dom/base/UseCounters.conf b/dom/base/UseCounters.conf
index 7287b3afb400..91261c0a827f 100644
--- a/dom/base/UseCounters.conf
+++ b/dom/base/UseCounters.conf
@@ -46,3 +46,7 @@ property FillOpacity
// Push API
method PushManager.subscribe
method PushSubscription.unsubscribe
+
+// window.sidebar.addSearchEngine
+attribute Window.sidebar
+method External.addSearchEngine
diff --git a/dom/webidl/External.webidl b/dom/webidl/External.webidl
index ef8017949343..890dff306e35 100644
--- a/dom/webidl/External.webidl
+++ b/dom/webidl/External.webidl
@@ -13,6 +13,7 @@ interface External
// Mozilla extension
partial interface External {
- [UnsafeInPrerendering] void addSearchEngine(DOMString engineURL, DOMString iconURL,
- DOMString suggestedTitle, DOMString suggestedCategory);
+ [UnsafeInPrerendering, UseCounter]
+ void addSearchEngine(DOMString engineURL, DOMString iconURL,
+ DOMString suggestedTitle, DOMString suggestedCategory);
};
diff --git a/dom/webidl/Window.webidl b/dom/webidl/Window.webidl
index 05c984a4e0c4..d6e756e00a99 100644
--- a/dom/webidl/Window.webidl
+++ b/dom/webidl/Window.webidl
@@ -407,7 +407,7 @@ partial interface Window {
#ifdef HAVE_SIDEBAR
// Mozilla extension
partial interface Window {
- [Replaceable, Throws]
+ [Replaceable, Throws, UseCounter]
readonly attribute (External or WindowProxy) sidebar;
};
#endif
diff --git a/mobile/android/base/tabs/TabsGridLayout.java b/mobile/android/base/tabs/TabsGridLayout.java
index cae82f835f22..11f03020e1cb 100644
--- a/mobile/android/base/tabs/TabsGridLayout.java
+++ b/mobile/android/base/tabs/TabsGridLayout.java
@@ -271,9 +271,9 @@ class TabsGridLayout extends GridView
post(new Runnable() {
@Override
public void run() {
- final int displayCount = getChildCount();
+ final int displayCount = tabsAdapter.getCount();
- for (int i = getFirstVisiblePosition(); i <= getLastVisiblePosition(); i++) {
+ for (int i = 0; i < displayCount; i++) {
final Tab tab = tabsAdapter.getItem(i);
final boolean checked = displayCount == 1 || i == selected;
final View tabView = getViewForTab(tab);
diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js
index 61e678feb27e..08665022de89 100644
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -4775,7 +4775,7 @@ pref("urlclassifier.disallow_completions", "test-malware-simple,test-phish-simpl
pref("urlclassifier.trackingTable", "test-track-simple,mozstd-track-digest256");
pref("urlclassifier.trackingWhitelistTable", "test-trackwhite-simple,mozstd-trackwhite-digest256");
-pref("browser.safebrowsing.provider.mozilla.lists", "mozstd-track-digest256,mozstd-trackwhite-digest256");
+pref("browser.safebrowsing.provider.mozilla.lists", "mozstd-track-digest256,mozstd-trackwhite-digest256,mozfull-track-digest256");
pref("browser.safebrowsing.provider.mozilla.updateURL", "https://shavar.services.mozilla.com/downloads?client=SAFEBROWSING_ID&appver=%VERSION%&pver=2.2");
pref("browser.safebrowsing.provider.mozilla.gethashURL", "https://shavar.services.mozilla.com/gethash?client=SAFEBROWSING_ID&appver=%VERSION%&pver=2.2");
// Block lists for tracking protection. The name values will be used as the keys
diff --git a/netwerk/base/nsIBrowserSearchService.idl b/netwerk/base/nsIBrowserSearchService.idl
index e8539a2021e9..b8273dc47846 100644
--- a/netwerk/base/nsIBrowserSearchService.idl
+++ b/netwerk/base/nsIBrowserSearchService.idl
@@ -22,7 +22,7 @@ interface nsISearchSubmission : nsISupports
readonly attribute nsIURI uri;
};
-[scriptable, uuid(65fd517b-6bda-4bac-bbe1-42de1b3a7df6)]
+[scriptable, uuid(620bd920-0491-48c8-99a8-d6047e64802d)]
interface nsISearchEngine : nsISupports
{
/**
@@ -115,19 +115,6 @@ interface nsISearchEngine : nsISupports
*/
void speculativeConnect(in jsval options);
- /**
- * Supported search engine types.
- */
- const unsigned long TYPE_MOZSEARCH = 1;
- const unsigned long TYPE_SHERLOCK = 2;
- const unsigned long TYPE_OPENSEARCH = 3;
-
- /**
- * Supported search engine data types.
- */
- const unsigned long DATA_XML = 1;
- const unsigned long DATA_TEXT = 2;
-
/**
* An optional shortcut alias for the engine.
* When non-null, this is a unique identifier.
@@ -159,11 +146,6 @@ interface nsISearchEngine : nsISupports
*/
readonly attribute AString searchForm;
- /**
- * The search engine type.
- */
- readonly attribute long type;
-
/**
* An optional unique identifier for this search engine within the context of
* the distribution, as provided by the distributing entity.
@@ -296,8 +278,7 @@ interface nsIBrowserSearchService : nsISupports
* The URL to the search engine's description file.
*
* @param dataType
- * An integer representing the plugin file format. Must be one
- * of the supported search engine data types defined above.
+ * Obsolete, the value is ignored.
*
* @param iconURL
* A URL string to an icon file to be used as the search engine's
@@ -315,8 +296,8 @@ interface nsIBrowserSearchService : nsISupports
* addition is complete, or if the addition fails. It will not be
* called if addEngine throws an exception.
*
- * @throws NS_ERROR_FAILURE if the type is invalid, or if the description
- * file cannot be successfully loaded.
+ * @throws NS_ERROR_FAILURE if the description file cannot be successfully
+ * loaded.
*/
void addEngine(in AString engineURL, in long dataType, in AString iconURL,
in boolean confirm, [optional] in nsISearchInstallCallback callback);
diff --git a/toolkit/components/places/tests/unifiedcomplete/head_autocomplete.js b/toolkit/components/places/tests/unifiedcomplete/head_autocomplete.js
index 78e403a455e8..38d48e0f9724 100644
--- a/toolkit/components/places/tests/unifiedcomplete/head_autocomplete.js
+++ b/toolkit/components/places/tests/unifiedcomplete/head_autocomplete.js
@@ -442,8 +442,7 @@ function* addTestEngine(basename, httpServer=undefined) {
}, "browser-search-engine-modified", false);
do_print("Adding engine from URL: " + dataUrl + basename);
- Services.search.addEngine(dataUrl + basename,
- Ci.nsISearchEngine.DATA_XML, null, false);
+ Services.search.addEngine(dataUrl + basename, null, null, false);
});
}
diff --git a/toolkit/components/processsingleton/MainProcessSingleton.js b/toolkit/components/processsingleton/MainProcessSingleton.js
index 76a0c14330bd..3c2d12c6cdf9 100644
--- a/toolkit/components/processsingleton/MainProcessSingleton.js
+++ b/toolkit/components/processsingleton/MainProcessSingleton.js
@@ -24,20 +24,15 @@ MainProcessSingleton.prototype = {
Services.obs.notifyObservers(logMsg, "console-api-log-event", null);
},
- // Called when a webpage calls either window.external.AddSearchProvider or
- // window.sidebar.addSearchEngine
- addSearchEngine: function({ target: browser, data: { pageURL, engineURL, iconURL, type } }) {
+ // Called when a webpage calls window.external.AddSearchProvider
+ addSearchEngine: function({ target: browser, data: { pageURL, engineURL } }) {
pageURL = NetUtil.newURI(pageURL);
engineURL = NetUtil.newURI(engineURL, null, pageURL);
- if (iconURL) {
- iconURL = NetUtil.newURI(iconURL, null, pageURL);
- }
- else {
- let tabbrowser = browser.getTabBrowser();
- if (browser.mIconURL && (!tabbrowser || tabbrowser.shouldLoadFavIcon(pageURL)))
- iconURL = NetUtil.newURI(browser.mIconURL);
- }
+ let iconURL;
+ let tabbrowser = browser.getTabBrowser();
+ if (browser.mIconURL && (!tabbrowser || tabbrowser.shouldLoadFavIcon(pageURL)))
+ iconURL = NetUtil.newURI(browser.mIconURL);
try {
// Make sure the URLs are HTTP, HTTPS, or FTP.
@@ -50,7 +45,7 @@ MainProcessSingleton.prototype = {
throw "Unsupported search icon URL: " + iconURL;
}
catch(ex) {
- Cu.reportError("Invalid argument passed to window.sidebar.addSearchEngine: " + ex);
+ Cu.reportError("Invalid argument passed to window.external.AddSearchProvider: " + ex);
var searchBundle = Services.strings.createBundle("chrome://global/locale/search/search.properties");
var brandBundle = Services.strings.createBundle("chrome://branding/locale/brand.properties");
@@ -66,7 +61,7 @@ MainProcessSingleton.prototype = {
if (status != Cr.NS_OK)
return;
- Services.search.addEngine(engineURL.spec, type, iconURL ? iconURL.spec : null, true);
+ Services.search.addEngine(engineURL.spec, null, iconURL ? iconURL.spec : null, true);
})
},
diff --git a/toolkit/components/search/nsSearchService.js b/toolkit/components/search/nsSearchService.js
index bcf6f43a0d72..fcb25c824511 100644
--- a/toolkit/components/search/nsSearchService.js
+++ b/toolkit/components/search/nsSearchService.js
@@ -97,13 +97,6 @@ const SEARCH_SERVICE_METADATA_WRITTEN = "write-metadata-to-disk-complete";
*/
const SEARCH_SERVICE_CACHE_WRITTEN = "write-cache-to-disk-complete";
-const SEARCH_TYPE_MOZSEARCH = Ci.nsISearchEngine.TYPE_MOZSEARCH;
-const SEARCH_TYPE_OPENSEARCH = Ci.nsISearchEngine.TYPE_OPENSEARCH;
-const SEARCH_TYPE_SHERLOCK = Ci.nsISearchEngine.TYPE_SHERLOCK;
-
-const SEARCH_DATA_XML = Ci.nsISearchEngine.DATA_XML;
-const SEARCH_DATA_TEXT = Ci.nsISearchEngine.DATA_TEXT;
-
// Delay for lazy serialization (ms)
const LAZY_SERIALIZE_DELAY = 100;
@@ -220,12 +213,6 @@ const SEARCH_DEFAULT_UPDATE_INTERVAL = 7;
// from the server doesn't specify an interval.
const SEARCH_GEO_DEFAULT_UPDATE_INTERVAL = 2592000; // 30 days.
-// Returns false for whitespace-only or commented out lines in a
-// Sherlock file, true otherwise.
-function isUsefulLine(aLine) {
- return !(/^\s*($|#)/i.test(aLine));
-}
-
this.__defineGetter__("FileUtils", function() {
delete this.FileUtils;
Components.utils.import("resource://gre/modules/FileUtils.jsm");
@@ -873,29 +860,6 @@ function getVerificationHash(aName) {
return hasher.finish(true);
}
-
-/**
- * Used to verify a given DOM node's localName and namespaceURI.
- * @param aElement
- * The element to verify.
- * @param aLocalNameArray
- * An array of strings to compare against aElement's localName.
- * @param aNameSpaceArray
- * An array of strings to compare against aElement's namespaceURI.
- *
- * @returns false if aElement is null, or if its localName or namespaceURI
- * does not match one of the elements in the aLocalNameArray or
- * aNameSpaceArray arrays, respectively.
- * @throws NS_ERROR_INVALID_ARG if aLocalNameArray or aNameSpaceArray are null.
- */
-function checkNameSpace(aElement, aLocalNameArray, aNameSpaceArray) {
- if (!aLocalNameArray || !aNameSpaceArray)
- FAIL("missing aLocalNameArray or aNameSpaceArray for checkNameSpace");
- return (aElement &&
- (aLocalNameArray.indexOf(aElement.localName) != -1) &&
- (aNameSpaceArray.indexOf(aElement.namespaceURI) != -1));
-}
-
/**
* Safely close a nsISafeOutputStream.
* @param aFOS
@@ -951,128 +915,6 @@ function getDir(aKey, aIFace) {
return Services.dirsvc.get(aKey, aIFace || Ci.nsIFile);
}
-/**
- * The following two functions are essentially copied from
- * nsInternetSearchService. They are required for backwards compatibility.
- */
-function queryCharsetFromCode(aCode) {
- const codes = [];
- codes[0] = "macintosh";
- codes[6] = "x-mac-greek";
- codes[35] = "x-mac-turkish";
- codes[513] = "ISO-8859-1";
- codes[514] = "ISO-8859-2";
- codes[517] = "ISO-8859-5";
- codes[518] = "ISO-8859-6";
- codes[519] = "ISO-8859-7";
- codes[520] = "ISO-8859-8";
- codes[521] = "ISO-8859-9";
- codes[1280] = "windows-1252";
- codes[1281] = "windows-1250";
- codes[1282] = "windows-1251";
- codes[1283] = "windows-1253";
- codes[1284] = "windows-1254";
- codes[1285] = "windows-1255";
- codes[1286] = "windows-1256";
- codes[1584] = "GB2312";
- codes[1585] = "gbk";
- codes[1600] = "EUC-KR";
- codes[2080] = "ISO-2022-JP";
- codes[2096] = "ISO-2022-CN";
- codes[2112] = "ISO-2022-KR";
- codes[2336] = "EUC-JP";
- codes[2352] = "GB2312";
- codes[2353] = "x-euc-tw";
- codes[2368] = "EUC-KR";
- codes[2561] = "Shift_JIS";
- codes[2562] = "KOI8-R";
- codes[2563] = "Big5";
- codes[2565] = "HZ-GB-2312";
-
- if (codes[aCode])
- return codes[aCode];
-
- // Don't bother being fancy about what to return in the failure case.
- return "windows-1252";
-}
-function fileCharsetFromCode(aCode) {
- const codes = [
- "macintosh", // 0
- "Shift_JIS", // 1
- "Big5", // 2
- "EUC-KR", // 3
- "X-MAC-ARABIC", // 4
- "X-MAC-HEBREW", // 5
- "X-MAC-GREEK", // 6
- "X-MAC-CYRILLIC", // 7
- "X-MAC-DEVANAGARI" , // 9
- "X-MAC-GURMUKHI", // 10
- "X-MAC-GUJARATI", // 11
- "X-MAC-ORIYA", // 12
- "X-MAC-BENGALI", // 13
- "X-MAC-TAMIL", // 14
- "X-MAC-TELUGU", // 15
- "X-MAC-KANNADA", // 16
- "X-MAC-MALAYALAM", // 17
- "X-MAC-SINHALESE", // 18
- "X-MAC-BURMESE", // 19
- "X-MAC-KHMER", // 20
- "X-MAC-THAI", // 21
- "X-MAC-LAOTIAN", // 22
- "X-MAC-GEORGIAN", // 23
- "X-MAC-ARMENIAN", // 24
- "GB2312", // 25
- "X-MAC-TIBETAN", // 26
- "X-MAC-MONGOLIAN", // 27
- "X-MAC-ETHIOPIC", // 28
- "X-MAC-CENTRALEURROMAN", // 29
- "X-MAC-VIETNAMESE", // 30
- "X-MAC-EXTARABIC" // 31
- ];
- // Sherlock files have always defaulted to macintosh, so do that here too
- return codes[aCode] || codes[0];
-}
-
-/**
- * Returns a string interpretation of aBytes using aCharset, or null on
- * failure.
- */
-function bytesToString(aBytes, aCharset) {
- var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
- createInstance(Ci.nsIScriptableUnicodeConverter);
- LOG("bytesToString: converting using charset: " + aCharset);
-
- try {
- converter.charset = aCharset;
- return converter.convertFromByteArray(aBytes, aBytes.length);
- } catch (ex) {}
-
- return null;
-}
-
-/**
- * Converts an array of bytes representing a Sherlock file into an array of
- * lines representing the useful data from the file.
- *
- * @param aBytes
- * The array of bytes representing the Sherlock file.
- * @param aCharsetCode
- * An integer value representing a character set code to be passed to
- * fileCharsetFromCode, or null for the default Sherlock encoding.
- */
-function sherlockBytesToLines(aBytes, aCharsetCode) {
- // fileCharsetFromCode returns the default encoding if aCharsetCode is null
- var charset = fileCharsetFromCode(aCharsetCode);
-
- var dataString = bytesToString(aBytes, charset);
- if (!dataString)
- FAIL("sherlockBytesToLines: Couldn't convert byte array!", Cr.NS_ERROR_FAILURE);
-
- // Split the string into lines, and filter out comments and
- // whitespace-only lines
- return dataString.split(NEW_LINES).filter(isUsefulLine);
-}
-
/**
* Gets the current value of the locale. It's possible for this preference to
* be localized, so we have to do a little extra work here. Similar code
@@ -1486,15 +1328,11 @@ EngineURL.prototype = {
* @param aLocation
* A nsILocalFile or nsIURI object representing the location of the
* search engine data file.
- * @param aSourceDataType
- * The data type of the file used to describe the engine. Must be either
- * DATA_XML or DATA_TEXT.
* @param aIsReadOnly
* Boolean indicating whether the engine should be treated as read-only.
* Read only engines cannot be serialized to file.
*/
-function Engine(aLocation, aSourceDataType, aIsReadOnly) {
- this._dataType = aSourceDataType;
+function Engine(aLocation, aIsReadOnly) {
this._readOnly = aIsReadOnly;
this._urls = [];
@@ -1533,11 +1371,8 @@ Engine.prototype = {
// A distribution-unique identifier for the engine. Either null or set
// when loaded. See getter.
_identifier: undefined,
- // The data describing the engine. Is either an array of bytes, for Sherlock
- // files, or an XML document element, for XML plugins.
+ // The data describing the engine, in the form of an XML document element.
_data: null,
- // The engine's data type. See data types (DATA_) defined above.
- _dataType: null,
// Whether or not the engine is readonly.
_readOnly: true,
// The engine's description
@@ -1565,8 +1400,6 @@ Engine.prototype = {
_hidden: null,
// The engine's name.
_name: null,
- // The engine type. See engine types (TYPE_) defined above.
- _type: null,
// The name of the charset used to submit the search terms.
_queryCharset: null,
// The engine's raw SearchForm value (URL string pointing to a search form).
@@ -1618,10 +1451,8 @@ Engine.prototype = {
_extensionID: null,
/**
- * Retrieves the data from the engine's file. If the engine's dataType is
- * XML, the document element is placed in the engine's data field. For text
- * engines, the data is just read directly from file and placed as an array
- * of lines in the engine's data field.
+ * Retrieves the data from the engine's file.
+ * The document element is placed in the engine's data field.
*/
_initFromFile: function SRCH_ENG_initFromFile() {
if (!this._file || !this._file.exists())
@@ -1632,19 +1463,13 @@ Engine.prototype = {
fileInStream.init(this._file, MODE_RDONLY, FileUtils.PERMS_FILE, false);
- if (this._dataType == SEARCH_DATA_XML) {
- var domParser = Cc["@mozilla.org/xmlextras/domparser;1"].
- createInstance(Ci.nsIDOMParser);
- var doc = domParser.parseFromStream(fileInStream, "UTF-8",
- this._file.fileSize,
- "text/xml");
+ var domParser = Cc["@mozilla.org/xmlextras/domparser;1"].
+ createInstance(Ci.nsIDOMParser);
+ var doc = domParser.parseFromStream(fileInStream, "UTF-8",
+ this._file.fileSize,
+ "text/xml");
- this._data = doc.documentElement;
- } else {
- ERROR("Unsuppored engine _dataType in _initFromFile: \"" +
- this._dataType + "\"",
- Cr.NS_ERROR_UNEXPECTED);
- }
+ this._data = doc.documentElement;
fileInStream.close();
// Now that the data is loaded, initialize the engine object
@@ -1652,8 +1477,8 @@ Engine.prototype = {
},
/**
- * Retrieves the data from the engine's file asynchronously. If the engine's
- * dataType is XML, the document element is placed in the engine's data field.
+ * Retrieves the data from the engine's file asynchronously.
+ * The document element is placed in the engine's data field.
*
* @returns {Promise} A promise, resolved successfully if initializing from
* data succeeds, rejected if it fails.
@@ -1663,14 +1488,8 @@ Engine.prototype = {
if (!this._file || !(yield OS.File.exists(this._file.path)))
FAIL("File must exist before calling initFromFile!", Cr.NS_ERROR_UNEXPECTED);
- if (this._dataType == SEARCH_DATA_XML) {
- let fileURI = NetUtil.ioService.newFileURI(this._file);
- yield this._retrieveSearchXMLData(fileURI.spec);
- } else {
- ERROR("Unsuppored engine _dataType in _initFromFile: \"" +
- this._dataType + "\"",
- Cr.NS_ERROR_UNEXPECTED);
- }
+ let fileURI = NetUtil.ioService.newFileURI(this._file);
+ yield this._retrieveSearchXMLData(fileURI.spec);
// Now that the data is loaded, initialize the engine object
this._initFromData();
@@ -1880,21 +1699,10 @@ Engine.prototype = {
aEngine._file = engineToUpdate._file;
}
- switch (aEngine._dataType) {
- case SEARCH_DATA_XML:
- var parser = Cc["@mozilla.org/xmlextras/domparser;1"].
- createInstance(Ci.nsIDOMParser);
- var doc = parser.parseFromBuffer(aBytes, aBytes.length, "text/xml");
- aEngine._data = doc.documentElement;
- break;
- case SEARCH_DATA_TEXT:
- aEngine._data = aBytes;
- break;
- default:
- promptError();
- LOG("_onLoad: Bogus engine _dataType: \"" + this._dataType + "\"");
- return;
- }
+ var parser = Cc["@mozilla.org/xmlextras/domparser;1"].
+ createInstance(Ci.nsIDOMParser);
+ var doc = parser.parseFromBuffer(aBytes, aBytes.length, "text/xml");
+ aEngine._data = doc.documentElement;
try {
// Initialize the engine from the obtained data
@@ -2133,36 +1941,18 @@ Engine.prototype = {
ENSURE_WARN(this._data, "Can't init an engine with no data!",
Cr.NS_ERROR_UNEXPECTED);
- // Find out what type of engine we are
- switch (this._dataType) {
- case SEARCH_DATA_XML:
- if (checkNameSpace(this._data, [MOZSEARCH_LOCALNAME],
- [MOZSEARCH_NS_10])) {
+ // Ensure we have a supported engine type before attempting to parse it.
+ let element = this._data;
+ if ((element.localName == MOZSEARCH_LOCALNAME &&
+ element.namespaceURI == MOZSEARCH_NS_10) ||
+ (element.localName == OPENSEARCH_LOCALNAME &&
+ OPENSEARCH_NAMESPACES.indexOf(element.namespaceURI) != -1)) {
+ LOG("_init: Initing search plugin from " + this._location);
- LOG("_init: Initing MozSearch plugin from " + this._location);
+ this._parse();
- this._type = SEARCH_TYPE_MOZSEARCH;
- this._parseAsMozSearch();
-
- } else if (checkNameSpace(this._data, [OPENSEARCH_LOCALNAME],
- OPENSEARCH_NAMESPACES)) {
-
- LOG("_init: Initing OpenSearch plugin from " + this._location);
-
- this._type = SEARCH_TYPE_OPENSEARCH;
- this._parseAsOpenSearch();
-
- } else
- FAIL(this._location + " is not a valid search plugin.", Cr.NS_ERROR_FAILURE);
-
- break;
- case SEARCH_DATA_TEXT:
- LOG("_init: Initing Sherlock plugin from " + this._location);
-
- // the only text-based format we support is Sherlock
- this._type = SEARCH_TYPE_SHERLOCK;
- this._parseAsSherlock();
- }
+ } else
+ FAIL(this._location + " is not a valid search plugin.", Cr.NS_ERROR_FAILURE);
// No need to keep a ref to our data (which in some cases can be a document
// element) past this point
@@ -2312,16 +2102,11 @@ Engine.prototype = {
this._setIcon(aElement.textContent, isPrefered, width, height);
},
- _parseAsMozSearch: function SRCH_ENG_parseAsMoz() {
- //forward to the OpenSearch parser
- this._parseAsOpenSearch();
- },
-
/**
* Extract search engine information from the collected data to initialize
* the engine object.
*/
- _parseAsOpenSearch: function SRCH_ENG_parseAsOS() {
+ _parse: function SRCH_ENG_parse() {
var doc = this._data;
// The OpenSearch spec sets a default value for the input encoding.
@@ -2341,7 +2126,7 @@ Engine.prototype = {
this._parseURL(child);
} catch (ex) {
// Parsing of the element failed, just skip it.
- LOG("_parseAsOpenSearch: failed to parse URL child: " + ex);
+ LOG("_parse: failed to parse URL child: " + ex);
}
break;
case "Image":
@@ -2366,324 +2151,13 @@ Engine.prototype = {
break;
case "ExtensionID":
this._extensionID = child.textContent;
- breakk;
+ break;
}
}
if (!this.name || (this._urls.length == 0))
- FAIL("_parseAsOpenSearch: No name, or missing URL!", Cr.NS_ERROR_FAILURE);
+ FAIL("_parse: No name, or missing URL!", Cr.NS_ERROR_FAILURE);
if (!this.supportsResponseType(URLTYPE_SEARCH_HTML))
- FAIL("_parseAsOpenSearch: No text/html result type!", Cr.NS_ERROR_FAILURE);
- },
-
- /**
- * Extract search engine information from the collected data to initialize
- * the engine object.
- */
- _parseAsSherlock: function SRCH_ENG_parseAsSherlock() {
- /**
- * Extracts one Sherlock "section" from aSource. A section is essentially
- * an HTML element with attributes, but each attribute must be on a new
- * line, by definition.
- *
- * @param aLines
- * An array of lines from the sherlock file.
- * @param aSection
- * The name of the section (e.g. "search" or "browser"). This value
- * is not case sensitive.
- * @returns an object whose properties correspond to the section's
- * attributes.
- */
- function getSection(aLines, aSection) {
- LOG("_parseAsSherlock::getSection: Sherlock lines:\n" +
- aLines.join("\n"));
- var lines = aLines;
- var startMark = new RegExp("^\\s*<" + aSection.toLowerCase() + "\\s*",
- "gi");
- var endMark = /\s*>\s*$/gi;
-
- var foundStart = false;
- var startLine, numberOfLines;
- // Find the beginning and end of the section
- for (var i = 0; i < lines.length; i++) {
- if (foundStart) {
- if (endMark.test(lines[i])) {
- numberOfLines = i - startLine;
- // Remove the end marker
- lines[i] = lines[i].replace(endMark, "");
- // If the endmarker was not the only thing on the line, include
- // this line in the results
- if (lines[i])
- numberOfLines++;
- break;
- }
- } else {
- if (startMark.test(lines[i])) {
- foundStart = true;
- // Remove the start marker
- lines[i] = lines[i].replace(startMark, "");
- startLine = i;
- // If the line is empty, don't include it in the result
- if (!lines[i])
- startLine++;
- }
- }
- }
- LOG("_parseAsSherlock::getSection: Start index: " + startLine +
- "\nNumber of lines: " + numberOfLines);
- lines = lines.splice(startLine, numberOfLines);
- LOG("_parseAsSherlock::getSection: Section lines:\n" +
- lines.join("\n"));
-
- var section = {};
- for (var i = 0; i < lines.length; i++) {
- var line = lines[i].trim();
-
- var els = line.split("=");
- var name = els.shift().trim().toLowerCase();
- var value = els.join("=").trim();
-
- if (!name || !value)
- continue;
-
- // Strip leading and trailing whitespace, remove quotes from the
- // value, and remove any trailing slashes or ">" characters
- value = value.replace(/^["']/, "")
- .replace(/["']\s*[\\\/]?>?\s*$/, "") || "";
- value = value.trim();
-
- // Don't clobber existing attributes
- if (!(name in section))
- section[name] = value;
- }
- return section;
- }
-
- /**
- * Returns an array of name-value pair arrays representing the Sherlock
- * file's input elements. User defined inputs return USER_DEFINED
- * as the value. Elements are returned in the order they appear in the
- * source file.
- *
- * Example:
- *
- *
- * Returns:
- * [["foo", "bar"], ["foopy", "{searchTerms}"]]
- *
- * @param aLines
- * An array of lines from the source file.
- */
- function getInputs(aLines) {
-
- /**
- * Extracts an attribute value from a given a line of text.
- * Example:
- * Extracts the string |foo| or |bar| given an input aAttr of
- * |value| or |name|.
- * Attributes may be quoted or unquoted. If unquoted, any whitespace
- * indicates the end of the attribute value.
- * Example: < value=22 33 name=44\334 >
- * Returns |22| for "value" and |44\334| for "name".
- *
- * @param aAttr
- * The name of the attribute for which to obtain the value. This
- * value is not case sensitive.
- * @param aLine
- * The line containing the attribute.
- *
- * @returns the attribute value, or an empty string if the attribute
- * doesn't exist.
- */
- function getAttr(aAttr, aLine) {
- // Used to determine whether an "input" line from a Sherlock file is a
- // "user defined" input.
- const userInput = /(\s|["'=])user(\s|[>="'\/\\+]|$)/i;
-
- LOG("_parseAsSherlock::getAttr: Getting attr: \"" +
- aAttr + "\" for line: \"" + aLine + "\"");
- // We're not case sensitive, but we want to return the attribute value
- // in its original case, so create a copy of the source
- var lLine = aLine.toLowerCase();
- var attr = aAttr.toLowerCase();
-
- var attrStart = lLine.search(new RegExp("\\s" + attr, "i"));
- if (attrStart == -1) {
-
- // If this is the "user defined input" (i.e. contains the empty
- // "user" attribute), return our special keyword
- if (userInput.test(lLine) && attr == "value") {
- LOG("_parseAsSherlock::getAttr: Found user input!\nLine:\"" + lLine
- + "\"");
- return USER_DEFINED;
- }
- // The attribute doesn't exist - ignore
- LOG("_parseAsSherlock::getAttr: Failed to find attribute:\nLine:\""
- + lLine + "\"\nAttr:\"" + attr + "\"");
- return "";
- }
-
- var valueStart = lLine.indexOf("=", attrStart) + "=".length;
- if (valueStart == -1)
- return "";
-
- var quoteStart = lLine.indexOf("\"", valueStart);
- if (quoteStart == -1) {
-
- // Unquoted attribute, get the rest of the line, trimmed at the first
- // sign of whitespace. If the rest of the line is only whitespace,
- // returns a blank string.
- return lLine.substr(valueStart).replace(/\s.*$/, "");
-
- } else {
- // Make sure that there's only whitespace between the start of the
- // value and the first quote. If there is, end the attribute value at
- // the first sign of whitespace. This prevents us from falling into
- // the next attribute if this is an unquoted attribute followed by a
- // quoted attribute.
- var betweenEqualAndQuote = lLine.substring(valueStart, quoteStart);
- if (/\S/.test(betweenEqualAndQuote))
- return lLine.substr(valueStart).replace(/\s.*$/, "");
-
- // Adjust the start index to account for the opening quote
- valueStart = quoteStart + "\"".length;
- // Find the closing quote
- var valueEnd = lLine.indexOf("\"", valueStart);
- // If there is no closing quote, just go to the end of the line
- if (valueEnd == -1)
- valueEnd = aLine.length;
- }
- return aLine.substring(valueStart, valueEnd);
- }
-
- var inputs = [];
-
- LOG("_parseAsSherlock::getInputs: Lines:\n" + aLines);
- // Filter out everything but non-inputs
- let lines = aLines.filter(function (line) {
- return /^\s*")
- line = line.trim().replace(/^$/, "");
-
- // If this is one of the "directional" inputs (/)
- const directionalInput = /^(prev|next)/i;
- if (directionalInput.test(line)) {
-
- // Make it look like a normal input by removing "prev" or "next"
- line = line.replace(directionalInput, "");
-
- // If it has a name, give it a dummy value to match previous
- // nsInternetSearchService behavior
- if (/name\s*=/i.test(line)) {
- line += " value=\"0\"";
- } else
- return; // Line has no name, skip it
- }
-
- var attrName = getAttr("name", line);
- var attrValue = getAttr("value", line);
- LOG("_parseAsSherlock::getInputs: Got input:\nName:\"" + attrName +
- "\"\nValue:\"" + attrValue + "\"");
- if (attrValue)
- inputs.push([attrName, attrValue]);
- });
- return inputs;
- }
-
- function err(aErr) {
- FAIL("_parseAsSherlock::err: Sherlock param error:\n" + aErr,
- Cr.NS_ERROR_FAILURE);
- }
-
- // First try converting our byte array using the default Sherlock encoding.
- // If this fails, or if we find a sourceTextEncoding attribute, we need to
- // reconvert the byte array using the specified encoding.
- var sherlockLines, searchSection, sourceTextEncoding, browserSection;
- try {
- sherlockLines = sherlockBytesToLines(this._data);
- searchSection = getSection(sherlockLines, "search");
- browserSection = getSection(sherlockLines, "browser");
- sourceTextEncoding = parseInt(searchSection["sourcetextencoding"]);
- if (sourceTextEncoding) {
- // Re-convert the bytes using the found sourceTextEncoding
- sherlockLines = sherlockBytesToLines(this._data, sourceTextEncoding);
- searchSection = getSection(sherlockLines, "search");
- browserSection = getSection(sherlockLines, "browser");
- }
- } catch (ex) {
- // The conversion using the default charset failed. Remove any non-ascii
- // bytes and try to find a sourceTextEncoding.
- var asciiBytes = this._data.filter(function (n) {return !(0x80 & n);});
- var asciiString = String.fromCharCode.apply(null, asciiBytes);
- sherlockLines = asciiString.split(NEW_LINES).filter(isUsefulLine);
- searchSection = getSection(sherlockLines, "search");
- sourceTextEncoding = parseInt(searchSection["sourcetextencoding"]);
- if (sourceTextEncoding) {
- sherlockLines = sherlockBytesToLines(this._data, sourceTextEncoding);
- searchSection = getSection(sherlockLines, "search");
- browserSection = getSection(sherlockLines, "browser");
- } else
- ERROR("Couldn't find a working charset", Cr.NS_ERROR_FAILURE);
- }
-
- LOG("_parseAsSherlock: Search section:\n" + searchSection.toSource());
-
- this._name = searchSection["name"] || err("Missing name!");
- this._description = searchSection["description"] || "";
- this._queryCharset = searchSection["querycharset"] ||
- queryCharsetFromCode(searchSection["queryencoding"]);
- this._searchForm = searchSection["searchform"];
-
- this._updateInterval = parseInt(browserSection["updatecheckdays"]);
-
- this._updateURL = browserSection["update"];
- this._iconUpdateURL = browserSection["updateicon"];
-
- var method = (searchSection["method"] || "GET").toUpperCase();
- var template = searchSection["action"] || err("Missing action!");
-
- var inputs = getInputs(sherlockLines);
- LOG("_parseAsSherlock: Inputs:\n" + inputs.toSource());
-
- var url = null;
-
- if (method == "GET") {
- // Here's how we construct the input string:
- // is first: Name Attr: Prefix Data Example:
- // YES EMPTY None TEMPLATE
- // YES NON-EMPTY ? = TEMPLATE?=
- // NO EMPTY ------------- --------------
- // NO NON-EMPTY & = TEMPLATE?=&=
- for (var i = 0; i < inputs.length; i++) {
- var name = inputs[i][0];
- var value = inputs[i][1];
- if (i==0) {
- if (name == "")
- template += USER_DEFINED;
- else
- template += "?" + name + "=" + value;
- } else if (name != "")
- template += "&" + name + "=" + value;
- }
- url = new EngineURL(URLTYPE_SEARCH_HTML, method, template);
-
- } else if (method == "POST") {
- // Create the URL object and just add the parameters directly
- url = new EngineURL(URLTYPE_SEARCH_HTML, method, template);
- for (var i = 0; i < inputs.length; i++) {
- var name = inputs[i][0];
- var value = inputs[i][1];
- if (name)
- url.addParam(name, value);
- }
- } else
- err("Invalid method!");
-
- this._urls.push(url);
+ FAIL("_parse: No text/html result type!", Cr.NS_ERROR_FAILURE);
},
/**
@@ -2698,7 +2172,6 @@ Engine.prototype = {
else
this._hasPreferredIcon = false;
this._hidden = aJson._hidden;
- this._type = aJson.type || SEARCH_TYPE_MOZSEARCH;
this._queryCharset = aJson.queryCharset || DEFAULT_QUERY_CHARSET;
this.__searchForm = aJson.__searchForm;
this.__installLocation = aJson._installLocation || SEARCH_APP_DIR;
@@ -2757,12 +2230,8 @@ Engine.prototype = {
json._iconUpdateURL = this._iconUpdateURL;
if (!this._hasPreferredIcon || !aFilter)
json._hasPreferredIcon = this._hasPreferredIcon;
- if (this.type != SEARCH_TYPE_MOZSEARCH || !aFilter)
- json.type = this.type;
if (this.queryCharset != DEFAULT_QUERY_CHARSET || !aFilter)
json.queryCharset = this.queryCharset;
- if (this._dataType != SEARCH_DATA_XML || !aFilter)
- json._dataType = this._dataType;
if (!this._readOnly || !aFilter)
json._readOnly = this._readOnly;
if (this._extensionID) {
@@ -3144,10 +2613,6 @@ Engine.prototype = {
return this._name;
},
- get type() {
- return this._type;
- },
-
get searchForm() {
return this._getSearchFormWithPurpose();
},
@@ -3178,7 +2643,7 @@ Engine.prototype = {
get queryCharset() {
if (this._queryCharset)
return this._queryCharset;
- return this._queryCharset = queryCharsetFromCode(/* get the default */);
+ return this._queryCharset = "windows-1252"; // the default
},
// from nsISearchEngine
@@ -4041,15 +3506,6 @@ SearchService.prototype = {
// Schedule the engine's next update, if it isn't already.
if (!engineMetadataService.getAttr(aEngine, "updateexpir"))
engineUpdateService.scheduleNextUpdate(aEngine);
-
- // We need to save the engine's _dataType, if this is the first time the
- // engine is added to the dataStore, since ._dataType isn't persisted
- // and will change on the next startup (since the engine will then be
- // XML). We need this so that we know how to load any future updates from
- // this engine.
- if (!engineMetadataService.getAttr(aEngine, "updatedatatype"))
- engineMetadataService.setAttr(aEngine, "updatedatatype",
- aEngine._dataType);
}
},
@@ -4062,10 +3518,10 @@ SearchService.prototype = {
try {
let engine;
if (json.filePath)
- engine = new Engine({type: "filePath", value: json.filePath}, json._dataType,
+ engine = new Engine({type: "filePath", value: json.filePath},
json._readOnly);
else if (json._url)
- engine = new Engine({type: "uri", value: json._url}, json._dataType, json._readOnly);
+ engine = new Engine({type: "uri", value: json._url}, json._readOnly);
engine._initWithJSON(json);
this._addEngineToStore(engine);
@@ -4103,7 +3559,7 @@ SearchService.prototype = {
var addedEngine = null;
try {
- addedEngine = new Engine(file, SEARCH_DATA_XML, !isWritable);
+ addedEngine = new Engine(file, !isWritable);
addedEngine._initFromFile();
} catch (ex) {
LOG("_loadEnginesFromDir: Failed to load " + file.path + "!\n" + ex);
@@ -4151,7 +3607,7 @@ SearchService.prototype = {
try {
let file = new FileUtils.File(osfile.path);
let isWritable = isInProfile;
- addedEngine = new Engine(file, SEARCH_DATA_XML, !isWritable);
+ addedEngine = new Engine(file, !isWritable);
yield checkForSyncCompletion(addedEngine._asyncInitFromFile());
} catch (ex if ex.result != Cr.NS_ERROR_ALREADY_INITIALIZED) {
LOG("_asyncLoadEnginesFromDir: Failed to load " + osfile.path + "!\n" + ex);
@@ -4168,7 +3624,7 @@ SearchService.prototype = {
try {
LOG("_loadFromChromeURLs: loading engine from chrome url: " + url);
- let engine = new Engine(makeURI(url), SEARCH_DATA_XML, true);
+ let engine = new Engine(makeURI(url), true);
engine._initFromURISync();
@@ -4193,7 +3649,7 @@ SearchService.prototype = {
for (let url of aURLs) {
try {
LOG("_asyncLoadFromChromeURLs: loading engine from chrome url: " + url);
- let engine = new Engine(NetUtil.newURI(url), SEARCH_DATA_XML, true);
+ let engine = new Engine(NetUtil.newURI(url), true);
yield checkForSyncCompletion(engine._asyncInitFromURI());
engines.push(engine);
} catch (ex if ex.result != Cr.NS_ERROR_ALREADY_INITIALIZED) {
@@ -4640,7 +4096,7 @@ SearchService.prototype = {
if (this._engines[aName])
FAIL("An engine with that name already exists!", Cr.NS_ERROR_FILE_ALREADY_EXISTS);
- var engine = new Engine(getSanitizedFile(aName), SEARCH_DATA_XML, false);
+ var engine = new Engine(getSanitizedFile(aName), false);
engine._initFromMetadata(aName, aIconURL, aAlias, aDescription,
aMethod, aTemplate, aExtensionID);
this._addEngineToStore(engine);
@@ -4652,7 +4108,7 @@ SearchService.prototype = {
this._ensureInitialized();
try {
var uri = makeURI(aEngineURL);
- var engine = new Engine(uri, aDataType, false);
+ var engine = new Engine(uri, false);
if (aCallback) {
engine._installCallback = function (errorCode) {
try {
@@ -5542,14 +4998,8 @@ var engineUpdateService = {
return;
}
- let dataType = engineMetadataService.getAttr(engine, "updatedatatype");
- if (!dataType) {
- ULOG("No loadtype to update engine!");
- return;
- }
-
ULOG("updating " + engine.name + " from " + updateURI.spec);
- testEngine = new Engine(updateURI, dataType, false);
+ testEngine = new Engine(updateURI, false);
testEngine._engineToUpdate = engine;
testEngine._initFromURIAndLoad();
} else
diff --git a/toolkit/components/search/nsSidebar.js b/toolkit/components/search/nsSidebar.js
index b2a47cf3213c..deb455734f3b 100644
--- a/toolkit/components/search/nsSidebar.js
+++ b/toolkit/components/search/nsSidebar.js
@@ -22,29 +22,23 @@ nsSidebar.prototype = {
.getInterface(Ci.nsIContentFrameMessageManager);
},
- // The suggestedTitle and suggestedCategory parameters are ignored, but remain
- // for backward compatibility.
+ // Deprecated, only left here to avoid breaking old browser-detection scripts.
addSearchEngine: function(engineURL, iconURL, suggestedTitle, suggestedCategory) {
- let dataType = SHERLOCK_FILE_EXT_REGEXP.test(engineURL) ?
- Ci.nsISearchEngine.DATA_TEXT :
- Ci.nsISearchEngine.DATA_XML;
+ if (SHERLOCK_FILE_EXT_REGEXP.test(engineURL)) {
+ Cu.reportError("Installing Sherlock search plugins is no longer supported.");
+ return;
+ }
- this.mm.sendAsyncMessage("Search:AddEngine", {
- pageURL: this.window.document.documentURIObject.spec,
- engineURL,
- type: dataType,
- iconURL
- });
+ this.AddSearchProvider(engineURL);
},
- // This function exists largely to implement window.external.AddSearchProvider(),
- // to match other browsers' APIs. The capitalization, although nonstandard here,
- // is therefore important.
+ // This function implements window.external.AddSearchProvider().
+ // The capitalization, although nonstandard here, is to match other browsers'
+ // APIs and is therefore important.
AddSearchProvider: function(engineURL) {
this.mm.sendAsyncMessage("Search:AddEngine", {
pageURL: this.window.document.documentURIObject.spec,
- engineURL,
- type: Ci.nsISearchEngine.DATA_XML
+ engineURL
});
},
diff --git a/toolkit/components/search/tests/xpcshell/data/engine.src b/toolkit/components/search/tests/xpcshell/data/engine.src
deleted file mode 100644
index bd5fff1793d4..000000000000
--- a/toolkit/components/search/tests/xpcshell/data/engine.src
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
diff --git a/toolkit/components/search/tests/xpcshell/data/engineMaker.sjs b/toolkit/components/search/tests/xpcshell/data/engineMaker.sjs
index 285737c26df0..4c432e7ee256 100644
--- a/toolkit/components/search/tests/xpcshell/data/engineMaker.sjs
+++ b/toolkit/components/search/tests/xpcshell/data/engineMaker.sjs
@@ -17,21 +17,12 @@ function handleRequest(request, response) {
return;
}
- engineData.engineType = engineData.engineType || Ci.nsISearchEngine.TYPE_OPENSEARCH;
engineData.name = engineData.name || "Generated test engine";
engineData.description = engineData.description || "Generated test engine description";
engineData.method = engineData.method || "GET";
response.setStatusLine(request.httpVersion, 200, "OK");
-
- switch (engineData.engineType) {
- case Ci.nsISearchEngine.TYPE_OPENSEARCH:
- createOpenSearchEngine(response, engineData);
- break;
- default:
- response.setStatusLine(request.httpVersion, 404, "Unsupported engine type");
- break;
- }
+ createOpenSearchEngine(response, engineData);
}
/**
diff --git a/toolkit/components/search/tests/xpcshell/head_search.js b/toolkit/components/search/tests/xpcshell/head_search.js
index b0704d3b1e2c..0519333a36d5 100644
--- a/toolkit/components/search/tests/xpcshell/head_search.js
+++ b/toolkit/components/search/tests/xpcshell/head_search.js
@@ -391,8 +391,6 @@ function useHttpServer() {
* {
* name: Engine name, used to wait for it to be loaded.
* xmlFileName: Name of the XML file in the "data" folder.
- * srcFileName: Name of the SRC file in the "data" folder.
- * iconFileName: Name of the icon associated to the SRC file.
* details: Array containing the parameters of addEngineWithDetails,
* except for the engine name. Alternative to xmlFileName.
* }
@@ -425,11 +423,7 @@ var addTestEngines = Task.async(function* (aItems) {
if (item.xmlFileName) {
Services.search.addEngine(gDataUrl + item.xmlFileName,
- Ci.nsISearchEngine.DATA_XML, null, false);
- } else if (item.srcFileName) {
- Services.search.addEngine(gDataUrl + item.srcFileName,
- Ci.nsISearchEngine.DATA_TEXT,
- gDataUrl + item.iconFileName, false);
+ null, null, false);
} else {
Services.search.addEngineWithDetails(item.name, ...item.details);
}
diff --git a/toolkit/components/search/tests/xpcshell/test_addEngine_callback.js b/toolkit/components/search/tests/xpcshell/test_addEngine_callback.js
index 16fd93b2bc74..55789d000249 100644
--- a/toolkit/components/search/tests/xpcshell/test_addEngine_callback.js
+++ b/toolkit/components/search/tests/xpcshell/test_addEngine_callback.js
@@ -47,8 +47,7 @@ add_test(function simple_callback_test() {
do_throw("search callback returned error: " + errorCode);
}
}
- Services.search.addEngine(gDataUrl + "engine.xml",
- Ci.nsISearchEngine.DATA_XML,
+ Services.search.addEngine(gDataUrl + "engine.xml", null,
null, false, searchCallback);
});
@@ -65,8 +64,7 @@ add_test(function duplicate_failure_test() {
}
}
// Re-add the same engine added in the previous test
- Services.search.addEngine(gDataUrl + "engine.xml",
- Ci.nsISearchEngine.DATA_XML,
+ Services.search.addEngine(gDataUrl + "engine.xml", null,
null, false, searchCallback);
});
@@ -83,8 +81,7 @@ add_test(function load_failure_test() {
}
}
// Try adding an engine that doesn't exist
- Services.search.addEngine("http://invalid/data/engine.xml",
- Ci.nsISearchEngine.DATA_XML,
+ Services.search.addEngine("http://invalid/data/engine.xml", null,
null, false, searchCallback);
});
diff --git a/toolkit/components/search/tests/xpcshell/test_json_cache.js b/toolkit/components/search/tests/xpcshell/test_json_cache.js
index d9ff15e1c54f..bb3ed834fbbc 100644
--- a/toolkit/components/search/tests/xpcshell/test_json_cache.js
+++ b/toolkit/components/search/tests/xpcshell/test_json_cache.js
@@ -236,7 +236,6 @@ var EXPECTED_ENGINE = {
alias: null,
description: "A test search engine (based on Google search)",
searchForm: "http://www.google.com/",
- type: Ci.nsISearchEngine.TYPE_MOZSEARCH,
wrappedJSObject: {
_extensionID: "test-addon-id@mozilla.org",
"_iconURL": "data:image/png;base64,AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs9Pt8xetPtu9FsfFNtu%2BTzvb2%2B%2Fne4dFJeBw0egA%2FfAJAfAA8ewBBegAAAAD%2B%2FPtft98Mp%2BwWsfAVsvEbs%2FQeqvF8xO7%2F%2F%2F63yqkxdgM7gwE%2FggM%2BfQA%2BegBDeQDe7PIbotgQufcMufEPtfIPsvAbs%2FQvq%2Bfz%2Bf%2F%2B%2B%2FZKhR05hgBBhQI8hgBAgAI9ewD0%2B%2Fg3pswAtO8Cxf4Kw%2FsJvvYAqupKsNv%2B%2Fv7%2F%2FP5VkSU0iQA7jQA9hgBDgQU%2BfQH%2F%2Ff%2FQ6fM4sM4KsN8AteMCruIqqdbZ7PH8%2Fv%2Fg6Nc%2Fhg05kAA8jAM9iQI%2BhQA%2BgQDQu6b97uv%2F%2F%2F7V8Pqw3eiWz97q8%2Ff%2F%2F%2F%2F7%2FPptpkkqjQE4kwA7kAA5iwI8iAA8hQCOSSKdXjiyflbAkG7u2s%2F%2B%2F%2F39%2F%2F7r8utrqEYtjQE8lgA7kwA7kwA9jwA9igA9hACiWSekVRyeSgiYSBHx6N%2F%2B%2Fv7k7OFRmiYtlAA5lwI7lwI4lAA7kgI9jwE9iwI4iQCoVhWcTxCmb0K%2BooT8%2Fv%2F7%2F%2F%2FJ2r8fdwI1mwA3mQA3mgA8lAE8lAE4jwA9iwE%2BhwGfXifWvqz%2B%2Ff%2F58u%2Fev6Dt4tr%2B%2F%2F2ZuIUsggA7mgM6mAM3lgA5lgA6kQE%2FkwBChwHt4dv%2F%2F%2F728ei1bCi7VAC5XQ7kz7n%2F%2F%2F6bsZkgcB03lQA9lgM7kwA2iQktZToPK4r9%2F%2F%2F9%2F%2F%2FSqYK5UwDKZAS9WALIkFn%2B%2F%2F3%2F%2BP8oKccGGcIRJrERILYFEMwAAuEAAdX%2F%2Ff7%2F%2FP%2B%2BfDvGXQLIZgLEWgLOjlf7%2F%2F%2F%2F%2F%2F9QU90EAPQAAf8DAP0AAfMAAOUDAtr%2F%2F%2F%2F7%2B%2Fu2bCTIYwDPZgDBWQDSr4P%2F%2Fv%2F%2F%2FP5GRuABAPkAA%2FwBAfkDAPAAAesAAN%2F%2F%2B%2Fz%2F%2F%2F64g1C5VwDMYwK8Yg7y5tz8%2Fv%2FV1PYKDOcAAP0DAf4AAf0AAfYEAOwAAuAAAAD%2F%2FPvi28ymXyChTATRrIb8%2F%2F3v8fk6P8MAAdUCAvoAAP0CAP0AAfYAAO4AAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAA",
diff --git a/toolkit/components/search/tests/xpcshell/test_nodb_pluschanges.js b/toolkit/components/search/tests/xpcshell/test_nodb_pluschanges.js
index 09bdb978c745..dddeccb16108 100644
--- a/toolkit/components/search/tests/xpcshell/test_nodb_pluschanges.js
+++ b/toolkit/components/search/tests/xpcshell/test_nodb_pluschanges.js
@@ -31,8 +31,7 @@ function run_test() {
add_task(function* test_nodb_pluschanges() {
let [engine1, engine2] = yield addTestEngines([
{ name: "Test search engine", xmlFileName: "engine.xml" },
- { name: "Sherlock test search engine", srcFileName: "engine.src",
- iconFileName: "ico-size-16x16-png.ico" },
+ { name: "A second test engine", xmlFileName: "engine2.xml"},
]);
let search = Services.search;
@@ -54,7 +53,7 @@ add_task(function* test_nodb_pluschanges() {
// Check that the entries are placed as specified correctly
let json = getSearchMetadata();
do_check_eq(json["[app]/test-search-engine.xml"].order, 1);
- do_check_eq(json["[profile]/sherlock-test-search-engine.xml"].order, 2);
+ do_check_eq(json["[profile]/a-second-test-engine.xml"].order, 2);
do_print("Cleaning up");
removeMetadata();
diff --git a/toolkit/components/search/tests/xpcshell/test_notifications.js b/toolkit/components/search/tests/xpcshell/test_notifications.js
index f35880da1f81..3eecbf8b16a5 100644
--- a/toolkit/components/search/tests/xpcshell/test_notifications.js
+++ b/toolkit/components/search/tests/xpcshell/test_notifications.js
@@ -68,7 +68,5 @@ function run_test() {
Services.obs.addObserver(search_observer, "browser-search-engine-modified", false);
- Services.search.addEngine(gDataUrl + "engine.xml",
- Ci.nsISearchEngine.DATA_XML,
- null, false);
+ Services.search.addEngine(gDataUrl + "engine.xml", null, null, false);
}
diff --git a/toolkit/components/search/tests/xpcshell/test_parseSubmissionURL.js b/toolkit/components/search/tests/xpcshell/test_parseSubmissionURL.js
index 4ccd312c4ab2..d6e21fc61b01 100644
--- a/toolkit/components/search/tests/xpcshell/test_parseSubmissionURL.js
+++ b/toolkit/components/search/tests/xpcshell/test_parseSubmissionURL.js
@@ -30,8 +30,6 @@ add_task(function* test_parseSubmissionURL() {
"GET", "http://www.xn--bcher-kva.ch/search"] },
// The following engines cannot identify the search parameter.
{ name: "A second test engine", xmlFileName: "engine2.xml" },
- { name: "Sherlock test search engine", srcFileName: "engine.src",
- iconFileName: "ico-size-16x16-png.ico" },
{ name: "bacon", details: ["", "bacon", "Search Bacon", "GET",
"http://www.bacon.moz/search?q={searchTerms}"] },
]);
@@ -107,12 +105,6 @@ add_task(function* test_parseSubmissionURL() {
do_check_eq(Services.search.parseSubmissionURL(
"https://duckduckgo.com/?q=test").engine, null);
- // Sherlock engines are not supported.
- do_check_eq(Services.search.parseSubmissionURL(
- "http://getfirefox.com?q=test").engine, null);
- do_check_eq(Services.search.parseSubmissionURL(
- "http://getfirefox.com/?q=test").engine, null);
-
// HTTP and HTTPS schemes are interchangeable.
url = "https://www.google.com/search?q=caff%C3%A8";
result = Services.search.parseSubmissionURL(url);
diff --git a/toolkit/components/search/tests/xpcshell/test_save_sorted_engines.js b/toolkit/components/search/tests/xpcshell/test_save_sorted_engines.js
index 36ed7893be5d..8e71808d4942 100644
--- a/toolkit/components/search/tests/xpcshell/test_save_sorted_engines.js
+++ b/toolkit/components/search/tests/xpcshell/test_save_sorted_engines.js
@@ -28,8 +28,7 @@ function run_test() {
add_task(function* test_save_sorted_engines() {
let [engine1, engine2] = yield addTestEngines([
{ name: "Test search engine", xmlFileName: "engine.xml" },
- { name: "Sherlock test search engine", srcFileName: "engine.src",
- iconFileName: "ico-size-16x16-png.ico" },
+ { name: "A second test engine", xmlFileName: "engine2.xml"},
]);
let search = Services.search;
@@ -45,7 +44,7 @@ add_task(function* test_save_sorted_engines() {
// Check that the entries are placed as specified correctly
let json = getSearchMetadata();
do_check_eq(json["[app]/test-search-engine.xml"].order, 1);
- do_check_eq(json["[profile]/sherlock-test-search-engine.xml"].order, 2);
+ do_check_eq(json["[profile]/a-second-test-engine.xml"].order, 2);
// Test removing an engine
search.removeEngine(engine1);
@@ -54,7 +53,7 @@ add_task(function* test_save_sorted_engines() {
// Check that the order of the remaining engine was updated correctly
json = getSearchMetadata();
- do_check_eq(json["[profile]/sherlock-test-search-engine.xml"].order, 1);
+ do_check_eq(json["[profile]/a-second-test-engine.xml"].order, 1);
// Test adding a new engine
search.addEngineWithDetails("foo", "", "foo", "", "GET",
diff --git a/toolkit/components/search/tests/xpcshell/test_searchSuggest.js b/toolkit/components/search/tests/xpcshell/test_searchSuggest.js
index 2a8e8dedd9c6..122f3b3d2e16 100644
--- a/toolkit/components/search/tests/xpcshell/test_searchSuggest.js
+++ b/toolkit/components/search/tests/xpcshell/test_searchSuggest.js
@@ -36,21 +36,18 @@ function run_test() {
add_task(function* add_test_engines() {
let getEngineData = {
baseURL: gDataUrl,
- engineType: Ci.nsISearchEngine.TYPE_OPENSEARCH,
name: "GET suggestion engine",
method: "GET",
};
let postEngineData = {
baseURL: gDataUrl,
- engineType: Ci.nsISearchEngine.TYPE_OPENSEARCH,
name: "POST suggestion engine",
method: "POST",
};
let unresolvableEngineData = {
baseURL: "http://example.invalid/",
- engineType: Ci.nsISearchEngine.TYPE_OPENSEARCH,
name: "Offline suggestion engine",
method: "GET",
};
diff --git a/toolkit/components/search/tests/xpcshell/test_serialize_file.js b/toolkit/components/search/tests/xpcshell/test_serialize_file.js
index 14cae33e9209..3c193953c1c9 100644
--- a/toolkit/components/search/tests/xpcshell/test_serialize_file.js
+++ b/toolkit/components/search/tests/xpcshell/test_serialize_file.js
@@ -20,8 +20,7 @@ function run_test() {
add_task(function test_batchTask() {
let [engine1, engine2] = yield addTestEngines([
{ name: "Test search engine", xmlFileName: "engine.xml" },
- { name: "Sherlock test search engine", srcFileName: "engine.src",
- iconFileName: "ico-size-16x16-png.ico" },
+ { name: "A second test engine", xmlFileName: "engine2.xml"},
]);
// Test that files are written correctly.
diff --git a/toolkit/components/search/tests/xpcshell/xpcshell.ini b/toolkit/components/search/tests/xpcshell/xpcshell.ini
index d98252bf7c51..9a36a940b2bd 100644
--- a/toolkit/components/search/tests/xpcshell/xpcshell.ini
+++ b/toolkit/components/search/tests/xpcshell/xpcshell.ini
@@ -5,7 +5,6 @@ firefox-appdir = browser
skip-if = toolkit == 'android' || toolkit == 'gonk'
support-files =
data/chrome.manifest
- data/engine.src
data/engine.xml
data/engine2.xml
data/engine-addon.xml