michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: "use strict"; michael@0: michael@0: const Ci = Components.interfaces; michael@0: michael@0: Components.utils.import("resource://testing-common/httpd.js"); michael@0: michael@0: let gTestLog = []; michael@0: michael@0: /** michael@0: * The order of notifications expected for this test is: michael@0: * - engine-changed (while we're installing the engine, we modify it, which notifies - bug 606886) michael@0: * - engine-added (engine was added to the store by the search service) michael@0: * -> our search observer is called, which sets: michael@0: * - .defaultEngine, triggering engine-default michael@0: * - .currentEngine, triggering engine-current (after bug 493051 - for now the search service sets this after engine-added) michael@0: * ...and then schedules a removal michael@0: * - engine-loaded (the search service's observer is garanteed to fire first, which is what causes engine-added to fire) michael@0: * - engine-removed (due to the removal schedule above) michael@0: */ michael@0: let expectedLog = [ michael@0: "engine-changed", // XXX bug 606886 michael@0: "engine-added", michael@0: "engine-default", michael@0: "engine-current", michael@0: "engine-loaded", michael@0: "engine-removed" michael@0: ]; michael@0: michael@0: function search_observer(subject, topic, data) { michael@0: let engine = subject.QueryInterface(Ci.nsISearchEngine); michael@0: gTestLog.push(data + " for " + engine.name); michael@0: michael@0: do_print("Observer: " + data + " for " + engine.name); michael@0: michael@0: switch (data) { michael@0: case "engine-added": michael@0: let retrievedEngine = Services.search.getEngineByName("Test search engine"); michael@0: do_check_eq(engine, retrievedEngine); michael@0: Services.search.defaultEngine = engine; michael@0: Services.search.currentEngine = engine; michael@0: do_execute_soon(function () { michael@0: Services.search.removeEngine(engine); michael@0: }); michael@0: break; michael@0: case "engine-removed": michael@0: let engineNameOutput = " for Test search engine"; michael@0: expectedLog = expectedLog.map(logLine => logLine + engineNameOutput); michael@0: do_print("expectedLog:\n" + expectedLog.join("\n")) michael@0: do_print("gTestLog:\n" + gTestLog.join("\n")) michael@0: for (let i = 0; i < expectedLog.length; i++) { michael@0: do_check_eq(gTestLog[i], expectedLog[i]); michael@0: } michael@0: do_check_eq(gTestLog.length, expectedLog.length); michael@0: do_test_finished(); michael@0: break; michael@0: } michael@0: } michael@0: michael@0: function run_test() { michael@0: removeMetadata(); michael@0: updateAppInfo(); michael@0: michael@0: let httpServer = new HttpServer(); michael@0: httpServer.start(-1); michael@0: httpServer.registerDirectory("/", do_get_cwd()); michael@0: michael@0: do_register_cleanup(function cleanup() { michael@0: httpServer.stop(function() {}); michael@0: Services.obs.removeObserver(search_observer, "browser-search-engine-modified"); michael@0: }); michael@0: michael@0: do_test_pending(); michael@0: michael@0: Services.obs.addObserver(search_observer, "browser-search-engine-modified", false); michael@0: michael@0: Services.search.addEngine("http://localhost:" + michael@0: httpServer.identity.primaryPort + michael@0: "/data/engine.xml", michael@0: Ci.nsISearchEngine.DATA_XML, michael@0: null, false); michael@0: }