Source code

Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs";
import { CustomizableUI } from "resource:///modules/CustomizableUI.sys.mjs";
const WIDGET_ID = "search-container";
/**
* Updates persisted widths when the search bar is removed from any
* customizable area and put into the palette. Also automatically removes the
* search bar if it has not been used in a long time.
*/
export const SearchWidgetTracker = {
/**
* Main entrypoint to initializing the SearchWidgetTracker.
*/
init() {
CustomizableUI.addListener(this);
this._updateSearchBarVisibilityBasedOnUsage();
},
/**
* The callback for when a widget is moved via CustomizableUI. We use this
* to detect movement of the search bar.
*
* @param {Element} node
* The DOM node that was acted upon.
* @param {Element|null} _nextNode
* The DOM node (if any) that the widget was inserted before.
* @param {Element} _container
* The *actual* DOM container for the widget (could be an overflow panel in
* case of an overflowable toolbar).
* @param {boolean} wasRemoval
* True iff the action that happened was the removal of the DOM node.
*/
onWidgetAfterDOMChange(node, _nextNode, _container, wasRemoval) {
if (wasRemoval && node.id == WIDGET_ID) {
this.removePersistedWidths();
}
},
/**
* If the search bar is in the navigation toolbar, this method will check
* the lastUsed preference to see when the last time the search bar was
* actually used. If the number of days since it was last used exceeds a
* certain threshold, the widget is moved back into the customization
* palette.
*/
_updateSearchBarVisibilityBasedOnUsage() {
if (!this._widgetIsInNavBar) {
return;
}
let searchBarLastUsed = Services.prefs.getStringPref(
"browser.search.widget.lastUsed",
""
);
if (searchBarLastUsed) {
const removeAfterDaysUnused = Services.prefs.getIntPref(
"browser.search.widget.removeAfterDaysUnused"
);
let saerchBarUnusedThreshold =
removeAfterDaysUnused * 24 * 60 * 60 * 1000;
if (new Date() - new Date(searchBarLastUsed) > saerchBarUnusedThreshold) {
CustomizableUI.removeWidgetFromArea(WIDGET_ID);
}
}
},
/**
* Removes any widget customization on the search bar (which can be created
* with the resizer that appears if the search bar is placed immediately after
* the URL bar). Goes through each open browser window and removes the width
* property / style on each existant search bar.
*/
removePersistedWidths() {
Services.xulStore.removeValue(
AppConstants.BROWSER_CHROME_URL,
WIDGET_ID,
"width"
);
for (let win of CustomizableUI.windows) {
let searchbar =
win.document.getElementById(WIDGET_ID) ||
win.gNavToolbox.palette.querySelector("#" + WIDGET_ID);
searchbar.removeAttribute("width");
searchbar.style.removeProperty("width");
}
},
/**
* True if the search bar is currently in the navigation toolbar area.
*
* @type {boolean}
*/
get _widgetIsInNavBar() {
let placement = CustomizableUI.getPlacementOfWidget(WIDGET_ID);
return placement?.area == CustomizableUI.AREA_NAVBAR;
},
};