101 lines
3.4 KiB
JavaScript
101 lines
3.4 KiB
JavaScript
/* 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;
|
|
},
|
|
};
|