michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: var gSS = Services.search; michael@0: michael@0: function observer(aSubject, aTopic, aData) { michael@0: if (!gCurrentTest) { michael@0: info("Observer called with no test active"); michael@0: return; michael@0: } michael@0: michael@0: let engine = aSubject.QueryInterface(Ci.nsISearchEngine); michael@0: info("Observer: " + aData + " for " + engine.name); michael@0: let method; michael@0: switch (aData) { michael@0: case "engine-added": michael@0: if (gCurrentTest.added) michael@0: method = "added" michael@0: break; michael@0: case "engine-current": michael@0: if (gCurrentTest.current) michael@0: method = "current"; michael@0: break; michael@0: case "engine-removed": michael@0: if (gCurrentTest.removed) michael@0: method = "removed"; michael@0: break; michael@0: } michael@0: michael@0: if (method) michael@0: gCurrentTest[method](engine); michael@0: } michael@0: michael@0: function checkEngine(checkObj, engineObj) { michael@0: info("Checking engine"); michael@0: for (var prop in checkObj) michael@0: is(checkObj[prop], engineObj[prop], prop + " is correct"); michael@0: } michael@0: michael@0: var gTests = [ michael@0: { michael@0: name: "opensearch install", michael@0: engine: { michael@0: name: "Foo", michael@0: alias: null, michael@0: description: "Foo Search", michael@0: searchForm: "http://mochi.test:8888/browser/browser/components/search/test/", michael@0: type: Ci.nsISearchEngine.TYPE_OPENSEARCH michael@0: }, michael@0: run: function () { michael@0: gSS.addEngine("http://mochi.test:8888/browser/browser/components/search/test/testEngine.xml", michael@0: Ci.nsISearchEngine.DATA_XML, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABGklEQVQoz2NgGB6AnZ1dUlJSXl4eSDIyMhLW4Ovr%2B%2Fr168uXL69Zs4YoG%2BLi4i5dusTExMTGxsbNzd3f37937976%2BnpmZmagbHR09J49e5YvX66kpATVEBYW9ubNm2nTphkbG7e2tp44cQLIuHfvXm5urpaWFlDKysqqu7v73LlzECMYIiIiHj58mJCQoKKicvXq1bS0NKBgW1vbjh074uPjgeqAXE1NzSdPnvDz84M0AEUvXLgAsW379u1z5swBen3jxo2zZ892cHB4%2BvQp0KlAfwI1cHJyghQFBwfv2rULokFXV%2FfixYu7d%2B8GGqGgoMDKyrpu3br9%2B%2FcDuXl5eVA%2FAEWBfoWHAdAYoNuAYQ0XAeoUERFhGDYAAPoUaT2dfWJuAAAAAElFTkSuQmCC", michael@0: false); michael@0: }, michael@0: added: function (engine) { michael@0: ok(engine, "engine was added."); michael@0: michael@0: checkEngine(this.engine, engine); michael@0: michael@0: let engineFromSS = gSS.getEngineByName(this.engine.name); michael@0: is(engine, engineFromSS, "engine is obtainable via getEngineByName"); michael@0: michael@0: let aEngine = gSS.getEngineByAlias("fooalias"); michael@0: ok(!aEngine, "Alias was not parsed from engine description"); michael@0: michael@0: gSS.currentEngine = engine; michael@0: }, michael@0: current: function (engine) { michael@0: let currentEngine = gSS.currentEngine; michael@0: is(engine, currentEngine, "engine is current"); michael@0: is(engine.name, this.engine.name, "current engine was changed successfully"); michael@0: michael@0: gSS.removeEngine(engine); michael@0: }, michael@0: removed: function (engine) { michael@0: let currentEngine = gSS.currentEngine; michael@0: ok(currentEngine, "An engine is present."); michael@0: isnot(currentEngine.name, this.engine.name, "Current engine reset after removal"); michael@0: michael@0: nextTest(); michael@0: } michael@0: }, michael@0: { michael@0: name: "sherlock install", michael@0: engine: { michael@0: name: "Test Sherlock", michael@0: alias: null, michael@0: description: "Test Description", michael@0: searchForm: "http://example.com/searchform", michael@0: type: Ci.nsISearchEngine.TYPE_SHERLOCK michael@0: }, michael@0: run: function () { michael@0: gSS.addEngine("http://mochi.test:8888/browser/browser/components/search/test/testEngine.src", michael@0: Ci.nsISearchEngine.DATA_TEXT, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABGklEQVQoz2NgGB6AnZ1dUlJSXl4eSDIyMhLW4Ovr%2B%2Fr168uXL69Zs4YoG%2BLi4i5dusTExMTGxsbNzd3f37937976%2BnpmZmagbHR09J49e5YvX66kpATVEBYW9ubNm2nTphkbG7e2tp44cQLIuHfvXm5urpaWFlDKysqqu7v73LlzECMYIiIiHj58mJCQoKKicvXq1bS0NKBgW1vbjh074uPjgeqAXE1NzSdPnvDz84M0AEUvXLgAsW379u1z5swBen3jxo2zZ892cHB4%2BvQp0KlAfwI1cHJyghQFBwfv2rULokFXV%2FfixYu7d%2B8GGqGgoMDKyrpu3br9%2B%2FcDuXl5eVA%2FAEWBfoWHAdAYoNuAYQ0XAeoUERFhGDYAAPoUaT2dfWJuAAAAAElFTkSuQmCC", michael@0: false); michael@0: }, michael@0: added: function (engine) { michael@0: ok(engine, "engine was added."); michael@0: checkEngine(this.engine, engine); michael@0: michael@0: let engineFromSS = gSS.getEngineByName(this.engine.name); michael@0: is(engineFromSS, engine, "engine is obtainable via getEngineByName"); michael@0: michael@0: gSS.removeEngine(engine); michael@0: }, michael@0: removed: function (engine) { michael@0: let currentEngine = gSS.currentEngine; michael@0: ok(currentEngine, "An engine is present."); michael@0: isnot(currentEngine.name, this.engine.name, "Current engine reset after removal"); michael@0: michael@0: nextTest(); michael@0: } michael@0: } michael@0: ]; michael@0: michael@0: var gCurrentTest = null; michael@0: function nextTest() { michael@0: if (gTests.length) { michael@0: gCurrentTest = gTests.shift(); michael@0: info("Running " + gCurrentTest.name); michael@0: gCurrentTest.run(); michael@0: } else michael@0: executeSoon(finish); michael@0: } michael@0: michael@0: function test() { michael@0: waitForExplicitFinish(); michael@0: Services.obs.addObserver(observer, "browser-search-engine-modified", false); michael@0: registerCleanupFunction(cleanup); michael@0: michael@0: nextTest(); michael@0: } michael@0: michael@0: function cleanup() { michael@0: Services.obs.removeObserver(observer, "browser-search-engine-modified"); michael@0: }