diff --git a/browser/components/uitour/UITour.jsm b/browser/components/uitour/UITour.jsm index c4d865cf2113..7b124b4ee3ee 100644 --- a/browser/components/uitour/UITour.jsm +++ b/browser/components/uitour/UITour.jsm @@ -220,12 +220,6 @@ this.UITour = { query: "#searchbar", widgetName: "search-container", }], - ["searchProvider", { - query: (aDocument) => { - return null; - }, - widgetName: "search-container", - }], ["searchIcon", { query: (aDocument) => { let searchbar = aDocument.getElementById("searchbar"); @@ -987,11 +981,6 @@ this.UITour = { return deferred.promise; } - if (aTargetName.startsWith(TARGET_SEARCHENGINE_PREFIX)) { - let engineID = aTargetName.slice(TARGET_SEARCHENGINE_PREFIX.length); - return this.getSearchEngineTarget(aWindow, engineID); - } - let targetObject = this.targets.get(aTargetName); if (!targetObject) { log.warn("getTarget: The specified target name is not in the allowed set"); @@ -1331,18 +1320,6 @@ this.UITour = { */ showHighlight: function(aChromeWindow, aTarget, aEffect = "none") { function showHighlightPanel() { - if (aTarget.targetName.startsWith(TARGET_SEARCHENGINE_PREFIX)) { - // This won't affect normal higlights done via the panel, so we need to - // manually hide those. - this.hideHighlight(aChromeWindow); - aTarget.node.setAttribute("_moz-menuactive", true); - return; - } - - // Conversely, highlights for search engines are highlighted via CSS - // rather than a panel, so need to be manually removed. - this._hideSearchEngineHighlight(aChromeWindow); - let highlighter = aChromeWindow.document.getElementById("UITourHighlight"); let effect = aEffect; @@ -1419,24 +1396,6 @@ this.UITour = { highlighter.removeAttribute("active"); this._setAppMenuStateForAnnotation(aWindow, "highlight", false); - this._hideSearchEngineHighlight(aWindow); - }, - - _hideSearchEngineHighlight: function(aWindow) { - // We special case highlighting items in the search engines dropdown, - // so just blindly remove any highlight there. - let searchMenuBtn = null; - try { - searchMenuBtn = this.targets.get("searchProvider").query(aWindow.document); - } catch (e) { /* This is ok to fail. */ } - if (searchMenuBtn) { - let searchPopup = aWindow.document - .getAnonymousElementByAttribute(searchMenuBtn, - "anonid", - "searchbar-popup"); - for (let menuItem of searchPopup.children) - menuItem.removeAttribute("_moz-menuactive"); - } }, /** @@ -1558,11 +1517,6 @@ this.UITour = { return; } - // Due to a platform limitation, we can't anchor a panel to an element in a - // . So we can't support showing info panels for search engines. - if (aAnchor.targetName.startsWith(TARGET_SEARCHENGINE_PREFIX)) - return; - this._setAppMenuStateForAnnotation(aChromeWindow, "info", this.targetIsInAppMenu(aAnchor), showInfoPanel.bind(this, this._correctAnchor(aAnchor.node))); @@ -1670,10 +1624,6 @@ this.UITour = { }); panel.addEventListener("popuphidden", this.onPanelHidden); panel.addEventListener("popuphiding", this.hideLoopPanelAnnotations); - } else if (aMenuName == "searchEngines") { - this.getTarget(aWindow, "searchProvider").then(target => { - openMenuButton(target.node); - }).catch(log.error); } else if (aMenuName == "pocket") { this.getTarget(aWindow, "pocket").then(Task.async(function* onPocketTarget(target) { let widgetGroupWrapper = CustomizableUI.getWidget(target.widgetName); @@ -1735,9 +1685,6 @@ this.UITour = { } else if (aMenuName == "loop") { let panel = aWindow.document.getElementById("loop-notification-panel"); panel.hidePopup(); - } else if (aMenuName == "searchEngines") { - let menuBtn = this.targets.get("searchProvider").query(aWindow.document); - closeMenuButton(menuBtn); } }, @@ -1882,17 +1829,22 @@ this.UITour = { gettingStartedSeen: Services.prefs.getBoolPref("loop.gettingStarted.seen"), }); break; + case "search": case "selectedSearchEngine": Services.search.init(rv => { - let engine; + let data; if (Components.isSuccessCode(rv)) { - engine = Services.search.defaultEngine; + let engines = Services.search.getVisibleEngines(); + data = { + searchEngineIdentifier: Services.search.defaultEngine.identifier, + engines: [TARGET_SEARCHENGINE_PREFIX + engine.identifier + for (engine of engines) + if (engine.identifier)] + }; } else { - engine = { identifier: "" }; + data = {engines: [], searchEngineIdentifier: ""}; } - this.sendPageCallback(aMessageManager, aCallbackID, { - searchEngineIdentifier: engine.identifier - }); + this.sendPageCallback(aMessageManager, aCallbackID, data); }); break; case "sync": @@ -1950,10 +1902,6 @@ this.UITour = { targetNames.push(targetObject.targetName); } - targetNames = targetNames.concat( - yield this.getAvailableSearchEngineTargets(window) - ); - data = { targets: targetNames, }; @@ -2060,55 +2008,6 @@ this.UITour = { }); }, - getAvailableSearchEngineTargets(aWindow) { - return new Promise(resolve => { - this.getTarget(aWindow, "search").then(searchTarget => { - if (!searchTarget.node || this.targetIsInAppMenu(searchTarget)) - return resolve([]); - - Services.search.init(() => { - let engines = Services.search.getVisibleEngines(); - resolve([TARGET_SEARCHENGINE_PREFIX + engine.identifier - for (engine of engines) - if (engine.identifier)]); - }); - }).catch(() => resolve([])); - }); - }, - - // We only allow matching based on a search engine's identifier - this gives - // us a non-changing ID and guarentees we only match against app-provided - // engines. - getSearchEngineTarget(aWindow, aIdentifier) { - return new Promise((resolve, reject) => { - Task.spawn(function*() { - let searchTarget = yield this.getTarget(aWindow, "search"); - // We're not supporting having the searchbar in the app-menu, because - // popups within popups gets crazy. This restriction should be lifted - // once bug 988151 is implemented, as the page can then be responsible - // for opening each menu when appropriate. - if (!searchTarget.node || this.targetIsInAppMenu(searchTarget)) - return reject("Search engine not available"); - - yield Services.search.init(); - - let searchPopup = searchTarget.node._popup; - for (let engineNode of searchPopup.children) { - let engine = engineNode.engine; - if (engine && engine.identifier == aIdentifier) { - return resolve({ - targetName: TARGET_SEARCHENGINE_PREFIX + engine.identifier, - node: engineNode, - }); - } - } - reject("Search engine not available"); - }.bind(this)).catch(() => { - reject("Search engine not available"); - }); - }); - }, - notify(eventName, params) { let winEnum = Services.wm.getEnumerator("navigator:browser"); while (winEnum.hasMoreElements()) { diff --git a/browser/components/uitour/test/browser_UITour.js b/browser/components/uitour/test/browser_UITour.js index 8272beae6631..d0487a0c6784 100644 --- a/browser/components/uitour/test/browser_UITour.js +++ b/browser/components/uitour/test/browser_UITour.js @@ -216,56 +216,6 @@ var tests = [ gContentAPI.showHighlight("urlbar"); waitForElementToBeVisible(highlight, checkDefaultEffect, "Highlight should be shown after showHighlight()"); }, - function test_highlight_search_engine(done) { - let highlight = document.getElementById("UITourHighlight"); - gContentAPI.showHighlight("urlbar"); - waitForElementToBeVisible(highlight, () => { - - let searchbar = document.getElementById("searchbar"); - done(); - return; // The oneoffui removes the menu that's being tested here. - - gContentAPI.showMenu("searchEngines", function() { - isnot(searchbar, null, "Should have found searchbar"); - let searchPopup = document.getAnonymousElementByAttribute(searchbar, - "anonid", - "searchbar-popup"); - isnot(searchPopup, null, "Should have found search popup"); - - function getEngineNode(identifier) { - let engineNode = null; - for (let node of searchPopup.children) { - if (node.engine.identifier == identifier) { - engineNode = node; - break; - } - } - isnot(engineNode, null, "Should have found search engine node in popup"); - return engineNode; - } - let googleEngineNode = getEngineNode("google"); - let bingEngineNode = getEngineNode("bing"); - - gContentAPI.showHighlight("searchEngine-google"); - waitForCondition(() => googleEngineNode.getAttribute("_moz-menuactive") == "true", function() { - is_element_hidden(highlight, "Highlight panel should be hidden by highlighting search engine"); - - gContentAPI.showHighlight("searchEngine-bing"); - waitForCondition(() => bingEngineNode.getAttribute("_moz-menuactive") == "true", function() { - isnot(googleEngineNode.getAttribute("_moz-menuactive"), "true", "Previous engine should no longer be highlighted"); - - gContentAPI.hideHighlight(); - waitForCondition(() => bingEngineNode.getAttribute("_moz-menuactive") != "true", function() { - gContentAPI.hideMenu("searchEngines"); - waitForCondition(() => searchPopup.state == "closed", function() { - done(); - }, "Search dropdown should close"); - }, "Menu item should get attribute removed"); - }, "Menu item should get attribute to make it look active"); - }); - }); - }); - }, function test_highlight_effect_unsupported(done) { function checkUnsupportedEffect() { is(highlight.getAttribute("active"), "none", "No effect should be used when an unsupported effect is requested"); @@ -367,7 +317,7 @@ var tests = [ }); }); }, - function test_select_search_engine(done) { + function test_search(done) { Services.search.init(rv => { if (!Components.isSuccessCode(rv)) { ok(false, "search service init failed: " + rv); @@ -375,9 +325,21 @@ var tests = [ return; } let defaultEngine = Services.search.defaultEngine; - gContentAPI.getConfiguration("availableTargets", data => { - let searchEngines = data.targets.filter(t => t.startsWith("searchEngine-")); - let someOtherEngineID = searchEngines.filter(t => t != "searchEngine-" + defaultEngine.identifier)[0]; + gContentAPI.getConfiguration("search", data => { + let visibleEngines = Services.search.getVisibleEngines(); + let expectedEngines = ["searchEngine-" + engine.identifier + for (engine of visibleEngines) + if (engine.identifier)]; + + let engines = data.engines; + ok(Array.isArray(engines), "data.engines should be an array"); + is(engines.sort().toString(), expectedEngines.sort().toString(), + "Engines should be as expected"); + + is(data.searchEngineIdentifier, defaultEngine.identifier, + "the searchEngineIdentifier property should contain the defaultEngine's identifier"); + + let someOtherEngineID = data.engines.filter(t => t != "searchEngine-" + defaultEngine.identifier)[0]; someOtherEngineID = someOtherEngineID.replace(/^searchEngine-/, ""); let observe = function (subject, topic, verb) { diff --git a/browser/components/uitour/test/browser_UITour_availableTargets.js b/browser/components/uitour/test/browser_UITour_availableTargets.js index 1913a699d2f3..ff25acec44d6 100644 --- a/browser/components/uitour/test/browser_UITour_availableTargets.js +++ b/browser/components/uitour/test/browser_UITour_availableTargets.js @@ -34,13 +34,6 @@ function test() { UITourTest(); } -function searchEngineTargets() { - let engines = Services.search.getVisibleEngines(); - return ["searchEngine-" + engine.identifier - for (engine of engines) - if (engine.identifier)]; -} - var tests = [ function test_availableTargets(done) { gContentAPI.getConfiguration("availableTargets", (data) => { @@ -63,7 +56,6 @@ var tests = [ "searchIcon", "trackingProtection", "urlbar", - ...searchEngineTargets(), ...(hasWebIDE ? ["webide"] : []) ]); @@ -96,7 +88,6 @@ var tests = [ "searchIcon", "trackingProtection", "urlbar", - ...searchEngineTargets(), ...(hasWebIDE ? ["webide"] : []) ]); @@ -114,7 +105,7 @@ var tests = [ // Make sure the callback still fires with the other available targets. CustomizableUI.removeWidgetFromArea("search-container"); gContentAPI.getConfiguration("availableTargets", (data) => { - // Default minus "search" and "searchProvider" and "searchIcon" + // Default minus "search" and "searchIcon" ok_targets(data, [ "accountStatus", "addons",