diff --git a/CLOBBER b/CLOBBER index 0fbd16b17b53..864c1c575427 100644 --- a/CLOBBER +++ b/CLOBBER @@ -22,4 +22,4 @@ # changes to stick? As of bug 928195, this shouldn't be necessary! Please # don't change CLOBBER for WebIDL changes any more. -Bug 1171344 requires a clobber due to renaming of a test file. +Bug 1178850 requires clobber for Android JNI header changes diff --git a/browser/base/content/abouthome/aboutHome.css b/browser/base/content/abouthome/aboutHome.css index c3cbf234950c..1f39cb04440c 100644 --- a/browser/base/content/abouthome/aboutHome.css +++ b/browser/base/content/abouthome/aboutHome.css @@ -49,57 +49,78 @@ a { background-repeat: no-repeat; } -#searchIconAndTextContainer, +#searchForm, #snippets { width: 470px; } -#searchIconAndTextContainer { +#searchForm { display: -moz-box; - height: 36px; - position: relative; +} + +#searchLogoContainer { + display: -moz-box; + -moz-box-align: center; + padding-top: 2px; + -moz-padding-end: 8px; +} + +#searchLogoContainer[hidden] { + display: none; +} + +#searchEngineLogo { + display: inline-block; + height: 28px; + width: 70px; + min-width: 70px; } #searchIcon { - border: 1px transparent; - padding: 0; - margin: 0; - width: 36px; - height: 36px; - background: url("chrome://browser/skin/search-indicator-magnifying-glass.svg") center center no-repeat; - position: absolute; + border: 1px solid transparent; + -moz-margin-end: 5px; + height: 38px; + width: 38px; + background: url("chrome://browser/skin/magnifier.png") center center no-repeat; + background-size: 26px; +} + +#searchIcon[active], +#searchIcon:hover { + background-color: #e9e9e9; + border-color: rgb(226, 227, 229); + border-radius: 2.5px; +} + +html[searchUIConfiguration="oldsearchui"] #searchIcon { + display: none; +} + +html:not([searchUIConfiguration="oldsearchui"]) #searchText::-moz-placeholder { + color: transparent; +} + +html:not([searchUIConfiguration="oldsearchui"]) #searchLogoContainer { + display: none; } #searchText { - margin-left: 0; -moz-box-flex: 1; - padding-top: 6px; - padding-bottom: 6px; - padding-left: 34px; - padding-right: 8px; + padding: 6px 8px; background: hsla(0,0%,100%,.9) padding-box; border: 1px solid; - border-radius: 2px 0 0 2px; border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2); box-shadow: 0 1px 0 hsla(210,65%,9%,.02) inset, 0 0 2px hsla(210,65%,9%,.1) inset, 0 1px 0 hsla(0,0%,100%,.2); + border-radius: 2.5px 0 0 2.5px; color: inherit; } #searchText:-moz-dir(rtl) { - border-radius: 0 2px 2px 0; + border-radius: 0 2.5px 2.5px 0; } -#searchText[aria-expanded="true"] { - border-radius: 2px 0 0 0; -} - -#searchText[aria-expanded="true"]:-moz-dir(rtl) { - border-radius: 0 2px 0 0; -} - -#searchText[keepfocus], #searchText:focus, #searchText[autofocus] { border-color: hsla(206,100%,60%,.6) hsla(206,76%,52%,.6) hsla(204,100%,40%,.6); @@ -107,27 +128,25 @@ a { #searchSubmit { -moz-margin-start: -1px; - background: url("chrome://browser/skin/search-arrow-go.svg#search-arrow-go") center center no-repeat, linear-gradient(hsla(0,0%,100%,.8), hsla(0,0%,100%,.1)) padding-box; - padding: 0; + background: linear-gradient(hsla(0,0%,100%,.8), hsla(0,0%,100%,.1)) padding-box; + padding: 0 9px; border: 1px solid; border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2); - border-radius: 0 2px 2px 0; -moz-border-start: 1px solid transparent; + border-radius: 0 2.5px 2.5px 0; box-shadow: 0 0 2px hsla(0,0%,100%,.5) inset, 0 1px 0 hsla(0,0%,100%,.2); color: inherit; cursor: pointer; transition-property: background-color, border-color, box-shadow; transition-duration: 150ms; - width: 50px; } #searchSubmit:-moz-dir(rtl) { - border-radius: 2px 0 0 2px; + border-radius: 2.5px 0 0 2.5px; } #searchText:focus + #searchSubmit, -#searchText[keepfocus] + #searchSubmit, #searchText + #searchSubmit:hover, #searchText[autofocus] + #searchSubmit { border-color: #59b5fc #45a3e7 #3294d5; @@ -135,16 +154,15 @@ a { } #searchText:focus + #searchSubmit, -#searchText[keepfocus] + #searchSubmit, #searchText[autofocus] + #searchSubmit { - background: url("chrome://browser/skin/search-arrow-go.svg#search-arrow-go-inverted") center center no-repeat, linear-gradient(#4cb1ff, #1793e5); + background-image: linear-gradient(#4cb1ff, #1793e5); box-shadow: 0 1px 0 hsla(0,0%,100%,.2) inset, 0 0 0 1px hsla(0,0%,100%,.1) inset, 0 1px 0 hsla(210,54%,20%,.03); } #searchText + #searchSubmit:hover { - background: url("chrome://browser/skin/search-arrow-go.svg#search-arrow-go-inverted") center center no-repeat, linear-gradient(#66bdff, #0d9eff); + background-image: linear-gradient(#66bdff, #0d9eff); box-shadow: 0 1px 0 hsla(0,0%,100%,.2) inset, 0 0 0 1px hsla(0,0%,100%,.1) inset, 0 1px 0 hsla(210,54%,20%,.03), @@ -162,9 +180,9 @@ a { #rightsSnippet { display: block; min-height: 38px; - background: 0 center no-repeat; + background: 30px center no-repeat; padding: 6px 0; - -moz-padding-start: 49px; + -moz-padding-start: 79px; } #rightsSnippet[hidden] { @@ -174,7 +192,7 @@ a { #defaultSnippet1:-moz-dir(rtl), #defaultSnippet2:-moz-dir(rtl), #rightsSnippet:-moz-dir(rtl) { - background-position: right 0 center; + background-position: right 30px center; } #defaultSnippet1 { @@ -229,7 +247,7 @@ body[narrow] #launcher[session] { white-space: normal; background: transparent padding-box; border: 1px solid transparent; - border-radius: 2px; + border-radius: 2.5px; color: #525c66; font-size: 75%; cursor: pointer; @@ -378,6 +396,10 @@ body[narrow] #restorePreviousSession::before { background-image: url("chrome://branding/content/about-logo@2x.png"); } + #searchIcon { + background-image: url("chrome://browser/skin/magnifier@2x.png"); + } + #defaultSnippet1, #defaultSnippet2, #rightsSnippet { diff --git a/browser/base/content/abouthome/aboutHome.js b/browser/base/content/abouthome/aboutHome.js index a3d0b81dc2d2..b8b76e0fa084 100644 --- a/browser/base/content/abouthome/aboutHome.js +++ b/browser/base/content/abouthome/aboutHome.js @@ -4,6 +4,138 @@ "use strict"; +const SEARCH_ENGINES = { + "Google": { + // This is the "2x" image designed for OS X retina resolution, Windows at 192dpi, etc.; + // it will be scaled down as necessary on lower-dpi displays. + // This needs to be defined in a single line to keep the JS parser from creating many + // intermediate strings in memory. See bug 986672. + image: "data:image/png;base64,\ +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" + } +}; + // The process of adding a new default snippet involves: // * add a new entity to aboutHome.dtd // * add a for it in aboutHome.xhtml @@ -26,7 +158,8 @@ const SNIPPETS_OBJECTSTORE_NAME = "snippets"; let gInitialized = false; let gObserver = new MutationObserver(function (mutations) { for (let mutation of mutations) { - if (mutation.attributeName == "snippetsVersion") { + if (mutation.attributeName == "searchEngineName") { + setupSearchEngine(); if (!gInitialized) { ensureSnippetsMapThen(loadSnippets); gInitialized = true; @@ -41,7 +174,6 @@ window.addEventListener("pageshow", function () { // later and may use asynchronous getters. window.gObserver.observe(document.documentElement, { attributes: true }); fitToWidth(); - setupSearch(); window.addEventListener("resize", fitToWidth); // Ask chrome to update snippets. @@ -168,13 +300,52 @@ function ensureSnippetsMapThen(aCallback) function onSearchSubmit(aEvent) { - gContentSearchController.search(aEvent); + let searchText = document.getElementById("searchText"); + let searchTerms = searchText.value; + let engineName = document.documentElement.getAttribute("searchEngineName"); + + if (engineName && searchTerms.length > 0) { + // Send an event that will perform a search and Firefox Health Report will + // record that a search from about:home has occurred. + let eventData = { + engineName: engineName, + searchTerms: searchTerms, + originalEvent: { + target: { + ownerDocument: null + }, + shiftKey: aEvent.shiftKey, + ctrlKey: aEvent.ctrlKey, + metaKey: aEvent.metaKey, + altKey: aEvent.altKey, + button: aEvent.button, + }, + }; + + if (searchText.hasAttribute("selection-index")) { + eventData.selection = { + index: searchText.getAttribute("selection-index"), + kind: searchText.getAttribute("selection-kind") + }; + } + + eventData = JSON.stringify(eventData); + + let event = new CustomEvent("AboutHomeSearchEvent", {detail: eventData}); + document.dispatchEvent(event); + } + + gSearchSuggestionController.addInputValueToFormHistory(); + + if (aEvent) { + aEvent.preventDefault(); + } } -let gContentSearchController; +let gSearchSuggestionController; -function setupSearch() +function setupSearchEngine() { // The "autofocus" attribute doesn't focus the form element // immediately when the element is first drawn, so the @@ -184,12 +355,29 @@ function setupSearch() searchText.removeEventListener("blur", searchText_onBlur); searchText.removeAttribute("autofocus"); }); + + let searchEngineName = document.documentElement.getAttribute("searchEngineName"); + let searchEngineInfo = SEARCH_ENGINES[searchEngineName]; + let logoElt = document.getElementById("searchEngineLogo"); - if (!gContentSearchController) { - gContentSearchController = - new ContentSearchUIController(searchText, searchText.parentNode, - "abouthome", "homepage"); + // Add search engine logo. + if (searchEngineInfo && searchEngineInfo.image) { + logoElt.parentNode.hidden = false; + logoElt.src = searchEngineInfo.image; + logoElt.alt = searchEngineName; + searchText.placeholder = ""; } + else { + logoElt.parentNode.hidden = true; + searchText.placeholder = searchEngineName; + } + + if (!gSearchSuggestionController) { + gSearchSuggestionController = + new SearchSuggestionUIController(searchText, searchText.parentNode, + onSearchSubmit); + } + gSearchSuggestionController.engineName = searchEngineName; } /** diff --git a/browser/base/content/abouthome/aboutHome.xhtml b/browser/base/content/abouthome/aboutHome.xhtml index 837eee72789d..77a4c5ca18f2 100644 --- a/browser/base/content/abouthome/aboutHome.xhtml +++ b/browser/base/content/abouthome/aboutHome.xhtml @@ -24,14 +24,14 @@ + href="chrome://browser/content/searchSuggestionUI.css"/> - -
+ diff --git a/browser/base/content/test/general/searchSuggestionUI.js b/browser/base/content/test/general/searchSuggestionUI.js new file mode 100644 index 000000000000..1b233c8fe85d --- /dev/null +++ b/browser/base/content/test/general/searchSuggestionUI.js @@ -0,0 +1,158 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +(function () { + +const TEST_MSG = "SearchSuggestionUIControllerTest"; +const ENGINE_NAME = "browser_searchSuggestionEngine searchSuggestionEngine.xml"; + +let input = content.document.querySelector("input"); +let gController = + new content.SearchSuggestionUIController(input, input.parentNode); +gController.engineName = ENGINE_NAME; +gController.remoteTimeout = 5000; + +addMessageListener(TEST_MSG, msg => { + messageHandlers[msg.data.type](msg.data.data); +}); + +let messageHandlers = { + + key: function (arg) { + let keyName = typeof(arg) == "string" ? arg : arg.key; + content.synthesizeKey(keyName, {}); + let wait = arg.waitForSuggestions ? waitForSuggestions : cb => cb(); + wait(ack); + }, + + startComposition: function (arg) { + content.synthesizeComposition({ type: "compositionstart", data: "" }); + ack(); + }, + + changeComposition: function (arg) { + let data = typeof(arg) == "string" ? arg : arg.data; + content.synthesizeCompositionChange({ + composition: { + string: data, + clauses: [ + { length: data.length, attr: content.COMPOSITION_ATTR_RAW_CLAUSE } + ] + }, + caret: { start: data.length, length: 0 } + }); + let wait = arg.waitForSuggestions ? waitForSuggestions : cb => cb(); + wait(ack); + }, + + focus: function () { + gController.input.focus(); + ack(); + }, + + blur: function () { + gController.input.blur(); + ack(); + }, + + mousemove: function (suggestionIdx) { + // Copied from widget/tests/test_panel_mouse_coords.xul and + // browser/base/content/test/newtab/head.js + let row = gController._table.children[suggestionIdx]; + let rect = row.getBoundingClientRect(); + let left = content.mozInnerScreenX + rect.left; + let x = left + rect.width / 2; + let y = content.mozInnerScreenY + rect.top + rect.height / 2; + + let utils = content.SpecialPowers.getDOMWindowUtils(content); + let scale = utils.screenPixelsPerCSSPixel; + + let widgetToolkit = content.SpecialPowers. + Cc["@mozilla.org/xre/app-info;1"]. + getService(content.SpecialPowers.Ci.nsIXULRuntime). + widgetToolkit; + let nativeMsg = widgetToolkit == "cocoa" ? 5 : // NSMouseMoved + widgetToolkit == "windows" ? 1 : // MOUSEEVENTF_MOVE + 3; // GDK_MOTION_NOTIFY + + row.addEventListener("mousemove", function onMove() { + row.removeEventListener("mousemove", onMove); + ack(); + }); + utils.sendNativeMouseEvent(x * scale, y * scale, nativeMsg, 0, null); + }, + + mousedown: function (suggestionIdx) { + gController.onClick = () => { + gController.onClick = null; + ack(); + }; + let row = gController._table.children[suggestionIdx]; + content.sendMouseEvent({ type: "mousedown" }, row); + }, + + addInputValueToFormHistory: function () { + gController.addInputValueToFormHistory(); + ack(); + }, + + reset: function () { + // Reset both the input and suggestions by select all + delete. + gController.input.focus(); + content.synthesizeKey("a", { accelKey: true }); + content.synthesizeKey("VK_DELETE", {}); + ack(); + }, +}; + +function ack() { + sendAsyncMessage(TEST_MSG, currentState()); +} + +function waitForSuggestions(cb) { + let observer = new content.MutationObserver(() => { + if (gController.input.getAttribute("aria-expanded") == "true") { + observer.disconnect(); + cb(); + } + }); + observer.observe(gController.input, { + attributes: true, + attributeFilter: ["aria-expanded"], + }); +} + +function currentState() { + let state = { + selectedIndex: gController.selectedIndex, + numSuggestions: gController.numSuggestions, + suggestionAtIndex: [], + isFormHistorySuggestionAtIndex: [], + + tableHidden: gController._table.hidden, + tableChildrenLength: gController._table.children.length, + tableChildren: [], + + inputValue: gController.input.value, + ariaExpanded: gController.input.getAttribute("aria-expanded"), + }; + + for (let i = 0; i < gController.numSuggestions; i++) { + state.suggestionAtIndex.push(gController.suggestionAtIndex(i)); + state.isFormHistorySuggestionAtIndex.push( + gController.isFormHistorySuggestionAtIndex(i)); + } + + for (let child of gController._table.children) { + state.tableChildren.push({ + textContent: child.textContent, + classes: new Set(child.className.split(/\s+/)), + }); + } + + return state; +} + +})(); diff --git a/browser/base/content/test/newtab/browser_newtab_search.js b/browser/base/content/test/newtab/browser_newtab_search.js index e44ab8897716..6d4959e973bc 100644 --- a/browser/base/content/test/newtab/browser_newtab_search.js +++ b/browser/base/content/test/newtab/browser_newtab_search.js @@ -76,6 +76,13 @@ let runTaskifiedTests = Task.async(function* () { info("Adding search event listener"); getContentWindow().addEventListener(SERVICE_EVENT_NAME, searchEventListener); + let panel = searchPanel(); + is(panel.state, "closed", "Search panel should be closed initially"); + + // The panel's animation often is not finished when the test clicks on panel + // children, which makes the test click the wrong children, so disable it. + panel.setAttribute("animate", "false"); + // Add the engine without any logos and switch to it. let noLogoEngine = yield promiseNewSearchEngine(ENGINE_NO_LOGO); Services.search.currentEngine = noLogoEngine; @@ -106,6 +113,19 @@ let runTaskifiedTests = Task.async(function* () { yield promiseSearchEvents(["CurrentEngine"]); yield checkCurrentEngine(ENGINE_1X_2X_LOGO); + // Click the logo to open the search panel. + yield Promise.all([ + promisePanelShown(panel), + promiseClick(logoImg()), + ]); + + let manageBox = $("manage"); + ok(!!manageBox, "The Manage Engines box should be present in the document"); + is(panel.childNodes.length, 1, "Search panel should only contain the Manage Engines entry"); + is(panel.childNodes[0], manageBox, "Search panel should contain the Manage Engines entry"); + + panel.hidePopup(); + // Add the engine that provides search suggestions and switch to it. let suggestionEngine = yield promiseNewSearchEngine(ENGINE_SUGGESTIONS); Services.search.currentEngine = suggestionEngine; @@ -113,7 +133,7 @@ let runTaskifiedTests = Task.async(function* () { yield checkCurrentEngine(ENGINE_SUGGESTIONS); // Avoid intermittent failures. - gSearch().remoteTimeout = 5000; + gSearch()._suggestionController.remoteTimeout = 5000; // Type an X in the search input. This is only a smoke test. See // browser_searchSuggestionUI.js for comprehensive content search suggestion @@ -289,10 +309,21 @@ let checkCurrentEngine = Task.async(function* ({name: basename, logoPrefix1x, lo " basename=" + basename); // gSearch.currentEngineName - is(gSearch().defaultEngine.name, engine.name, + is(gSearch().currentEngineName, engine.name, "currentEngineName: " + engine.name); }); +function promisePanelShown(panel) { + let deferred = Promise.defer(); + info("Waiting for popupshown"); + panel.addEventListener("popupshown", function onEvent() { + panel.removeEventListener("popupshown", onEvent); + is(panel.state, "open", "Panel state"); + deferred.resolve(); + }); + return deferred.promise; +} + function promiseClick(node) { let deferred = Promise.defer(); let win = getContentWindow(); @@ -303,12 +334,16 @@ function promiseClick(node) { return deferred.promise; } +function searchPanel() { + return $("panel"); +} + function logoImg() { return $("logo"); } function gSearch() { - return getContentWindow().gSearch._contentSearchController; + return getContentWindow().gSearch; } /** diff --git a/browser/base/content/test/newtab/head.js b/browser/base/content/test/newtab/head.js index e936ad75b0dd..f07cb54d8804 100644 --- a/browser/base/content/test/newtab/head.js +++ b/browser/base/content/test/newtab/head.js @@ -722,23 +722,14 @@ function whenPagesUpdated(aCallback = TestRunner.next) { */ function whenSearchInitDone() { let deferred = Promise.defer(); - let searchController = getContentWindow().gSearch._contentSearchController; - if (searchController.defaultEngine) { + if (getContentWindow().gSearch._initialStateReceived) { return Promise.resolve(); } let eventName = "ContentSearchService"; getContentWindow().addEventListener(eventName, function onEvent(event) { if (event.detail.type == "State") { getContentWindow().removeEventListener(eventName, onEvent); - // Wait for the search controller to receive the event, then resolve. - let resolver = function() { - if (searchController.defaultEngine) { - deferred.resolve(); - return; - } - executeSoon(resolver); - } - executeSoon(resolver); + deferred.resolve(); } }); return deferred.promise; diff --git a/browser/base/jar.mn b/browser/base/jar.mn index a7fae2bcdbdc..90aaf100dc3e 100644 --- a/browser/base/jar.mn +++ b/browser/base/jar.mn @@ -144,8 +144,8 @@ browser.jar: * content/browser/sanitize.xul (content/sanitize.xul) * content/browser/sanitizeDialog.js (content/sanitizeDialog.js) content/browser/sanitizeDialog.css (content/sanitizeDialog.css) - content/browser/contentSearchUI.js (content/contentSearchUI.js) - content/browser/contentSearchUI.css (content/contentSearchUI.css) + content/browser/searchSuggestionUI.js (content/searchSuggestionUI.js) + content/browser/searchSuggestionUI.css (content/searchSuggestionUI.css) content/browser/tabbrowser.css (content/tabbrowser.css) content/browser/tabbrowser.xml (content/tabbrowser.xml) content/browser/urlbarBindings.xml (content/urlbarBindings.xml) diff --git a/browser/components/loop/test/mochitest/browser_mozLoop_context.js b/browser/components/loop/test/mochitest/browser_mozLoop_context.js index f8fcdce2ac18..123b459af9ed 100644 --- a/browser/components/loop/test/mochitest/browser_mozLoop_context.js +++ b/browser/components/loop/test/mochitest/browser_mozLoop_context.js @@ -30,9 +30,7 @@ add_task(function* test_mozLoop_getSelectedTabMetadata() { Assert.strictEqual(metadata.url, null, "URL should be empty for about:home"); Assert.strictEqual(metadata.favicon, null, "Favicon should be empty for about:home"); Assert.ok(metadata.title, "Title should be set for about:home"); - // Filter out null elements in the previews - contentSearchUI adds some img - // elements with chrome:// srcs, which show up as null in metadata.previews. - Assert.deepEqual(metadata.previews.filter(e => e), [], "No previews available for about:home"); + Assert.deepEqual(metadata.previews, [], "No previews available for about:home"); gBrowser.removeTab(tab); }); diff --git a/browser/locales/en-US/chrome/browser/aboutHome.dtd b/browser/locales/en-US/chrome/browser/aboutHome.dtd index 96c276466b58..551a5d1faef5 100644 --- a/browser/locales/en-US/chrome/browser/aboutHome.dtd +++ b/browser/locales/en-US/chrome/browser/aboutHome.dtd @@ -11,7 +11,7 @@ - + - - - diff --git a/browser/locales/en-US/chrome/browser/search.properties b/browser/locales/en-US/chrome/browser/search.properties index 39764f6f7fa0..b77c501ca9d0 100644 --- a/browser/locales/en-US/chrome/browser/search.properties +++ b/browser/locales/en-US/chrome/browser/search.properties @@ -32,15 +32,3 @@ cmd_addFoundEngine=Add "%S" # search panel using the cmd_addFoundEngine string, they will be # grouped in a submenu using cmd_addFoundEngineMenu as a label. cmd_addFoundEngineMenu=Add search engine - -# LOCALIZATION NOTE (searchFor, searchWith): -# These two strings are used to build the header above the list of one-click -# search providers: "Search for with:" -searchFor=Search for -searchWith= with: - -# LOCALIZATION NOTE (searchWithHeader): -# The wording of this string should be as close as possible to -# searchFor and searchWith. This string will be used instead of -# them when the user has not typed any keyword. -searchWithHeader=Search with: diff --git a/browser/modules/AboutHome.jsm b/browser/modules/AboutHome.jsm index b451bfe7a548..05c3aa63096d 100644 --- a/browser/modules/AboutHome.jsm +++ b/browser/modules/AboutHome.jsm @@ -100,6 +100,8 @@ let AboutHome = { "AboutHome:Sync", "AboutHome:Settings", "AboutHome:RequestUpdate", + "AboutHome:Search", + "AboutHome:OpenSearchPanel", ], init: function() { @@ -108,6 +110,16 @@ let AboutHome = { for (let msg of this.MESSAGES) { mm.addMessageListener(msg, this); } + + Services.obs.addObserver(this, "browser-search-engine-modified", false); + }, + + observe: function(aEngine, aTopic, aVerb) { + switch (aTopic) { + case "browser-search-engine-modified": + this.sendAboutHomeData(null); + break; + } }, receiveMessage: function(aMessage) { @@ -167,6 +179,65 @@ let AboutHome = { case "AboutHome:RequestUpdate": this.sendAboutHomeData(aMessage.target); break; + + case "AboutHome:Search": + let data; + try { + data = JSON.parse(aMessage.data.searchData); + } catch(ex) { + Cu.reportError(ex); + break; + } + + Services.search.init(function(status) { + if (!Components.isSuccessCode(status)) { + return; + } + + let engine = Services.search.currentEngine; + if (AppConstants.MOZ_SERVICES_HEALTHREPORT) { + window.BrowserSearch.recordSearchInHealthReport(engine, "abouthome", data.selection); + } + + // Trigger a search through nsISearchEngine.getSubmission() + let submission = engine.getSubmission(data.searchTerms, null, "homepage"); + let where = window.whereToOpenLink(data.originalEvent); + + // There is a chance that by the time we receive the search message, the + // user has switched away from the tab that triggered the search. If, + // based on the event, we need to load the search in the same tab that + // triggered it (i.e. where == "current"), openUILinkIn will not work + // because that tab is no longer the current one. For this case we + // manually load the URI in the target browser. + if (where == "current") { + aMessage.target.loadURIWithFlags(submission.uri.spec, + Ci.nsIWebNavigation.LOAD_FLAGS_NONE, + null, null, submission.postData); + } else { + let params = { + postData: submission.postData, + inBackground: Services.prefs.getBoolPref("browser.tabs.loadInBackground"), + }; + window.openLinkIn(submission.uri.spec, where, params); + } + // Used for testing + let mm = aMessage.target.messageManager; + mm.sendAsyncMessage("AboutHome:SearchTriggered", aMessage.data.searchData); + }); + + break; + + case "AboutHome:OpenSearchPanel": + let panel = window.document.getElementById("abouthome-search-panel"); + let anchor = aMessage.objects.anchor; + panel.hidden = false; + panel.openPopup(anchor); + anchor.setAttribute("active", "true"); + panel.addEventListener("popuphidden", function onHidden() { + panel.removeEventListener("popuphidden", onHidden); + anchor.removeAttribute("active"); + }); + break; } }, @@ -179,11 +250,24 @@ let AboutHome = { let ss = wrapper.SessionStore; ss.promiseInitialized.then(function() { + let deferred = Promise.defer(); + + Services.search.init(function (status){ + if (!Components.isSuccessCode(status)) { + deferred.reject(status); + } else { + deferred.resolve(Services.search.defaultEngine.name); + } + }); + + return deferred.promise; + }).then(function(engineName) { let data = { showRestoreLastSession: ss.canRestoreLastSession, snippetsURL: AboutHomeUtils.snippetsURL, showKnowYourRights: AboutHomeUtils.showKnowYourRights, snippetsVersion: AboutHomeUtils.snippetsVersion, + defaultEngineName: engineName }; if (AboutHomeUtils.showKnowYourRights) { @@ -201,5 +285,14 @@ let AboutHome = { }).then(null, function onError(x) { Cu.reportError("Error in AboutHome.sendAboutHomeData: " + x); }); + }, + + /** + * Focuses the search input in the page with the given message manager. + * @param messageManager + * The MessageManager object of the selected browser. + */ + focusInput: function (messageManager) { + messageManager.sendAsyncMessage("AboutHome:FocusInput"); } }; diff --git a/browser/modules/ContentSearch.jsm b/browser/modules/ContentSearch.jsm index 474345e22d56..2dc544bfee56 100644 --- a/browser/modules/ContentSearch.jsm +++ b/browser/modules/ContentSearch.jsm @@ -45,9 +45,6 @@ const MAX_SUGGESTIONS = 6; * GetState * Retrieves the current search engine state. * data: null - * GetStrings - * Retrieves localized search UI strings. - * data: null * ManageEngines * Opens the search engine management window. * data: null @@ -56,7 +53,7 @@ const MAX_SUGGESTIONS = 6; * data: the entry, a string * Search * Performs a search. - * data: { engineName, searchString, healthReportKey, searchPurpose } + * data: { engineName, searchString, whence } * SetCurrentEngine * Sets the current engine. * data: the name of the engine @@ -75,9 +72,6 @@ const MAX_SUGGESTIONS = 6; * State * Sent in reply to GetState. * data: see _currentStateObj - * Strings - * Sent in reply to GetStrings - * data: Object containing string names and values for the current locale. * Suggestions * Sent in reply to GetSuggestions. * data: see _onMessageGetSuggestions @@ -104,24 +98,9 @@ this.ContentSearch = { addMessageListener(INBOUND_MESSAGE, this); Services.obs.addObserver(this, "browser-search-engine-modified", false); Services.obs.addObserver(this, "shutdown-leaks-before-check", false); - Services.prefs.addObserver("browser.search.hiddenOneOffs", this, false); this._stringBundle = Services.strings.createBundle("chrome://global/locale/autocomplete.properties"); }, - get searchSuggestionUIStrings() { - if (this._searchSuggestionUIStrings) { - return this._searchSuggestionUIStrings; - } - this._searchSuggestionUIStrings = {}; - let searchBundle = Services.strings.createBundle("chrome://browser/locale/search.properties"); - let stringNames = ["searchHeader", "searchPlaceholder", "searchFor", - "searchWith", "searchWithHeader"]; - for (let name of stringNames) { - this._searchSuggestionUIStrings[name] = searchBundle.GetStringFromName(name); - } - return this._searchSuggestionUIStrings; - }, - destroy: function () { if (this._destroyedPromise) { return this._destroyedPromise; @@ -174,7 +153,6 @@ this.ContentSearch = { observe: function (subj, topic, data) { switch (topic) { - case "nsPref:changed": case "browser-search-engine-modified": this._eventQueue.push({ type: "Observe", @@ -223,19 +201,14 @@ this.ContentSearch = { }); }, - _onMessageGetStrings: function (msg, data) { - this._reply(msg, "Strings", this.searchSuggestionUIStrings); - }, - _onMessageSearch: function (msg, data) { this._ensureDataHasProperties(data, [ "engineName", "searchString", - "healthReportKey", - "searchPurpose", + "whence", ]); let engine = Services.search.getEngineByName(data.engineName); - let submission = engine.getSubmission(data.searchString, "", data.searchPurpose); + let submission = engine.getSubmission(data.searchString, "", data.whence); let browser = msg.target; let win; try { @@ -266,7 +239,7 @@ this.ContentSearch = { }; win.openUILinkIn(submission.uri.spec, where, params); } - win.BrowserSearch.recordSearchInHealthReport(engine, data.healthReportKey, + win.BrowserSearch.recordSearchInHealthReport(engine, data.whence, data.selection || null); return Promise.resolve(); }, @@ -441,12 +414,7 @@ this.ContentSearch = { engines: [], currentEngine: yield this._currentEngineObj(), }; - let pref = Services.prefs.getCharPref("browser.search.hiddenOneOffs"); - let hiddenList = pref ? pref.split(",") : []; for (let engine of Services.search.getVisibleEngines()) { - if (hiddenList.indexOf(engine.name) != -1) { - continue; - } let uri = engine.getIconURLBySize(16, 16); state.engines.push({ name: engine.name, diff --git a/browser/modules/DirectoryLinksProvider.jsm b/browser/modules/DirectoryLinksProvider.jsm index ebaea279d85e..8b5b20e861c8 100644 --- a/browser/modules/DirectoryLinksProvider.jsm +++ b/browser/modules/DirectoryLinksProvider.jsm @@ -673,7 +673,7 @@ let DirectoryLinksProvider = { let pastImpressions; // Check if the suggested tile was shown if (action == "view") { - sites.slice(0, triggeringSiteIndex + 1).filter(s => s).forEach(site => { + sites.slice(0, triggeringSiteIndex + 1).forEach(site => { let {targetedSite, url} = site.link; if (targetedSite) { this._addFrequencyCapView(url); diff --git a/browser/modules/test/browser_ContentSearch.js b/browser/modules/test/browser_ContentSearch.js index be701858777f..3a4f669d84ac 100644 --- a/browser/modules/test/browser_ContentSearch.js +++ b/browser/modules/test/browser_ContentSearch.js @@ -94,8 +94,7 @@ add_task(function* search() { let data = { engineName: engine.name, searchString: "ContentSearchTest", - healthReportKey: "ContentSearchTest", - searchPurpose: "ContentSearchTest", + whence: "ContentSearchTest", }; gMsgMan.sendAsyncMessage(TEST_MSG, { type: "Search", @@ -117,8 +116,7 @@ add_task(function* searchInBackgroundTab() { let data = { engineName: engine.name, searchString: "ContentSearchTest", - healthReportKey: "ContentSearchTest", - searchPurpose: "ContentSearchTest", + whence: "ContentSearchTest", }; gMsgMan.sendAsyncMessage(TEST_MSG, { type: "Search", diff --git a/browser/themes/linux/jar.mn b/browser/themes/linux/jar.mn index 81c43c3bfae2..7258b0cb79ab 100644 --- a/browser/themes/linux/jar.mn +++ b/browser/themes/linux/jar.mn @@ -93,8 +93,6 @@ browser.jar: skin/classic/browser/badge-add-engine.png (../shared/search/badge-add-engine.png) skin/classic/browser/search-indicator-badge-add.png (../shared/search/search-indicator-badge-add.png) skin/classic/browser/search-history-icon.svg (../shared/search/history-icon.svg) - skin/classic/browser/search-indicator-magnifying-glass.svg (../shared/search/search-indicator-magnifying-glass.svg) - skin/classic/browser/search-arrow-go.svg (../shared/search/search-arrow-go.svg) skin/classic/browser/Security-broken.png skin/classic/browser/setDesktopBackground.css skin/classic/browser/slowStartup-16.png diff --git a/browser/themes/osx/jar.mn b/browser/themes/osx/jar.mn index a3c7c106c593..02ad1f3cfd85 100644 --- a/browser/themes/osx/jar.mn +++ b/browser/themes/osx/jar.mn @@ -124,8 +124,6 @@ browser.jar: skin/classic/browser/search-indicator-badge-add.png (../shared/search/search-indicator-badge-add.png) skin/classic/browser/search-indicator-badge-add@2x.png (../shared/search/search-indicator-badge-add@2x.png) skin/classic/browser/search-history-icon.svg (../shared/search/history-icon.svg) - skin/classic/browser/search-indicator-magnifying-glass.svg (../shared/search/search-indicator-magnifying-glass.svg) - skin/classic/browser/search-arrow-go.svg (../shared/search/search-arrow-go.svg) skin/classic/browser/slowStartup-16.png skin/classic/browser/theme-switcher-icon.png (../shared/theme-switcher-icon.png) skin/classic/browser/theme-switcher-icon@2x.png (../shared/theme-switcher-icon@2x.png) diff --git a/browser/themes/shared/search/search-arrow-go.svg b/browser/themes/shared/search/search-arrow-go.svg deleted file mode 100644 index ddddff14d728..000000000000 --- a/browser/themes/shared/search/search-arrow-go.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - diff --git a/browser/themes/shared/search/search-indicator-magnifying-glass.svg b/browser/themes/shared/search/search-indicator-magnifying-glass.svg deleted file mode 100644 index 15bddfba43a5..000000000000 --- a/browser/themes/shared/search/search-indicator-magnifying-glass.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/browser/themes/windows/jar.mn b/browser/themes/windows/jar.mn index 97ee7280aba2..2bb5934e11c2 100644 --- a/browser/themes/windows/jar.mn +++ b/browser/themes/windows/jar.mn @@ -117,8 +117,6 @@ browser.jar: skin/classic/browser/search-indicator-badge-add.png (../shared/search/search-indicator-badge-add.png) skin/classic/browser/search-indicator-badge-add@2x.png (../shared/search/search-indicator-badge-add@2x.png) skin/classic/browser/search-history-icon.svg (../shared/search/history-icon.svg) - skin/classic/browser/search-indicator-magnifying-glass.svg (../shared/search/search-indicator-magnifying-glass.svg) - skin/classic/browser/search-arrow-go.svg (../shared/search/search-arrow-go.svg) skin/classic/browser/setDesktopBackground.css skin/classic/browser/slowStartup-16.png skin/classic/browser/theme-switcher-icon.png (../shared/theme-switcher-icon.png)