Fix bug where search bar in about:home does nothing

This commit is contained in:
ownedbywuigi 2026-04-01 16:33:21 +01:00
commit 6dfeba05d1
7 changed files with 104 additions and 9 deletions

View file

@ -120,6 +120,7 @@ a {
transition-property: background-color, border-color, box-shadow;
transition-duration: 150ms;
width: 50px;
display: none;
}
#searchSubmit:dir(rtl) {

View file

@ -27,7 +27,10 @@ window.addEventListener("pageshow", function () {
// Delay search engine setup, cause browser.js::BrowserOnAboutPageLoad runs
// later and may use asynchronous getters.
window.gObserver.observe(document.documentElement, { attributes: true });
window.gObserver.observe(document.getElementById("launcher"), { attributes: true });
let launcher = document.getElementById("launcher");
if (launcher) {
window.gObserver.observe(launcher, { attributes: true });
}
fitToWidth();
setupSearch();
window.addEventListener("resize", fitToWidth);
@ -72,7 +75,22 @@ window.addEventListener("keypress", ev => {
function onSearchSubmit(aEvent)
{
gContentSearchController.search(aEvent);
if (aEvent instanceof MouseEvent && gContentSearchController &&
gContentSearchController.defaultEngine) {
gContentSearchController.search(aEvent);
return;
}
// Fallback path for builds where ContentSearch mediation fails.
let terms = searchText && searchText.value ? searchText.value.trim() : "";
if (!terms) {
return;
}
document.dispatchEvent(new CustomEvent("AboutHomeSearch", {
bubbles: true,
detail: { searchString: terms },
}));
}
@ -80,10 +98,13 @@ var gContentSearchController;
function setupSearch()
{
let searchSubmit = document.getElementById("searchSubmit");
// Set submit button label for when CSS background are disabled (e.g.
// high contrast mode).
document.getElementById("searchSubmit").value =
searchSubmit.value =
document.body.getAttribute("dir") == "ltr" ? "\u25B6" : "\u25C0";
searchSubmit.addEventListener("click", onSearchSubmit, true);
// The "autofocus" attribute doesn't focus the form element
// immediately when the element is first drawn, so the
@ -99,6 +120,14 @@ function setupSearch()
new ContentSearchUIController(searchText, searchText.parentNode,
"abouthome", "homepage");
}
searchText.addEventListener("keypress", function(event) {
if (event.keyCode == event.DOM_VK_RETURN) {
event.preventDefault();
event.stopPropagation();
onSearchSubmit(event);
}
}, true);
}
/**

View file

@ -42,7 +42,7 @@
<div id="searchIcon"/>
<input type="text" name="q" value="" id="searchText" maxlength="256"
aria-label="&contentSearchInput.label;" autofocus="autofocus"/>
<input id="searchSubmit" type="button" onclick="onSearchSubmit(event)"
<input id="searchSubmit" type="button"
title="&contentSearchSubmit.tooltip;"/>
</div>
</div>

View file

@ -82,10 +82,22 @@ addMessageListener("MixedContent:ReenableProtection", function() {
var AboutHomeListener = {
init: function(chromeGlobal) {
chromeGlobal.addEventListener('AboutHomeLoad', this, false, true);
chromeGlobal.addEventListener('AboutHomeSearch', this, false, true);
},
_isAboutHomeDocumentURI(uri) {
if (!uri) {
return false;
}
let lowerURI = uri.toLowerCase();
return lowerURI == "about:home" ||
lowerURI.startsWith("about:home?") ||
lowerURI.startsWith("about:home#") ||
lowerURI == "chrome://browser/content/abouthome/abouthome.xhtml";
},
get isAboutHome() {
return content.document.documentURI.toLowerCase() == "about:home";
return this._isAboutHomeDocumentURI(content.document.documentURI);
},
handleEvent: function(aEvent) {
@ -96,6 +108,9 @@ var AboutHomeListener = {
case "AboutHomeLoad":
this.onPageLoad();
break;
case "AboutHomeSearch":
this.onSearch(aEvent);
break;
case "click":
this.onClick(aEvent);
break;
@ -144,7 +159,7 @@ var AboutHomeListener = {
let originalTarget = aEvent.originalTarget;
let ownerDoc = originalTarget.ownerDocument;
if (ownerDoc.documentURI != "about:home") {
if (!this._isAboutHomeDocumentURI(ownerDoc.documentURI)) {
// This shouldn't happen, but we're being defensive.
return;
}
@ -191,6 +206,25 @@ var AboutHomeListener = {
removeEventListener("click", this, true);
removeEventListener("pagehide", this, true);
},
onSearch: function(aEvent) {
let originalTarget = aEvent.originalTarget || aEvent.target;
let ownerDoc = originalTarget && originalTarget.ownerDocument;
if (!ownerDoc && originalTarget && originalTarget.nodeType == Ci.nsIDOMNode.DOCUMENT_NODE) {
ownerDoc = originalTarget;
}
if (!ownerDoc || !this._isAboutHomeDocumentURI(ownerDoc.documentURI)) {
return;
}
let detail = aEvent.detail || {};
let searchString = (detail.searchString || "").trim();
if (!searchString) {
return;
}
sendAsyncMessage("AboutHome:Search", { searchString });
},
};
AboutHomeListener.init(this);
@ -362,6 +396,7 @@ var ContentSearchMediator = {
whitelist: new Set([
"about:home",
"about:newtab",
"chrome://browser/content/abouthome/aboutHome.xhtml",
]),
init: function (chromeGlobal) {
@ -389,7 +424,11 @@ var ContentSearchMediator = {
},
get _contentWhitelisted() {
return this.whitelist.has(content.document.documentURI);
let documentURI = content.document.documentURI;
// about:home may carry query/hash fragments; whitelist should apply to the
// base page URI so search events are not dropped for those variants.
let baseURI = documentURI.replace(/[?#].*$/, "");
return this.whitelist.has(baseURI);
},
_sendMsg: function (type, data=null) {

View file

@ -27,7 +27,7 @@ this.__defineGetter__("BROWSER_NEW_TAB_URL", () => {
!aboutNewTabService.overridden) {
return "about:privatebrowsing";
}
return aboutNewTabService.newTabURL;
return "about:home";
});
var TAB_DROP_TYPE = "application/x-moz-tabbrowser-tab";

View file

@ -27,7 +27,7 @@ const LOCAL_NEWTAB_URL = "chrome://browser/content/newtab/newTab.xhtml";
const REMOTE_NEWTAB_PATH = "/newtab/v%VERSION%/%CHANNEL%/%LOCALE%/index.html";
const ABOUT_URL = "about:newtab";
const ABOUT_URL = "about:home";
// Pref that tells if remote newtab is enabled
const PREF_REMOTE_ENABLED = "browser.newtabpage.remote";

View file

@ -81,6 +81,7 @@ var AboutHome = {
"AboutHome:Addons",
"AboutHome:Sync",
"AboutHome:Settings",
"AboutHome:Search",
"AboutHome:RequestUpdate",
"AboutHome:MaybeShowAutoMigrationUndoNotification",
],
@ -129,6 +130,31 @@ var AboutHome = {
window.openPreferences();
break;
case "AboutHome:Search": {
let data = aMessage.data || {};
let searchString = (data.searchString || "").trim();
if (!searchString) {
break;
}
let engine = Services.search.defaultEngine;
if (!engine) {
break;
}
let submission = engine.getSubmission(searchString, "", "homepage");
if (!submission) {
break;
}
aMessage.target.loadURIWithFlags(submission.uri.spec,
Ci.nsIWebNavigation.LOAD_FLAGS_NONE,
null,
null,
submission.postData);
break;
}
case "AboutHome:RequestUpdate":
this.sendAboutHomeData(aMessage.target);
break;