Bug 1799694 - Avoid flickering when messages have different lengths. r=rpl,mconley,desktop-theme-reviewers,Itiel
This is a completely redesign based on mconley's idea to use `deck`. That removes a lot of code and makes things a lot better. Depends on D163077 Differential Revision: https://phabricator.services.mozilla.com/D162390
This commit is contained in:
@@ -244,23 +244,37 @@ this.browserAction = class extends ExtensionAPIPersistent {
|
||||
name.classList.add("unified-extensions-item-name");
|
||||
contents.appendChild(name);
|
||||
|
||||
// This deck (and its labels) should be kept in sync with
|
||||
// `browser/base/content/unified-extensions-viewcache.inc.xhtml`.
|
||||
let deck = document.createXULElement("deck");
|
||||
deck.classList.add("unified-extensions-item-message-deck");
|
||||
|
||||
let messageDefault = document.createXULElement("label");
|
||||
messageDefault.classList.add(
|
||||
"unified-extensions-item-message",
|
||||
"unified-extensions-item-message-default"
|
||||
);
|
||||
contents.appendChild(messageDefault);
|
||||
deck.appendChild(messageDefault);
|
||||
|
||||
let messageHover = document.createXULElement("label");
|
||||
messageHover.classList.add(
|
||||
"unified-extensions-item-message",
|
||||
"unified-extensions-item-message-hover"
|
||||
);
|
||||
messageHover.setAttribute(
|
||||
deck.appendChild(messageHover);
|
||||
|
||||
let messageHoverForMenuButton = document.createXULElement("label");
|
||||
messageHoverForMenuButton.classList.add(
|
||||
"unified-extensions-item-message",
|
||||
"unified-extensions-item-message-hover-menu-button"
|
||||
);
|
||||
messageHoverForMenuButton.setAttribute(
|
||||
"data-l10n-id",
|
||||
"unified-extensions-item-message-manage"
|
||||
);
|
||||
contents.appendChild(messageHover);
|
||||
deck.appendChild(messageHoverForMenuButton);
|
||||
|
||||
contents.appendChild(deck);
|
||||
|
||||
button.appendChild(contents);
|
||||
}
|
||||
@@ -571,20 +585,25 @@ this.browserAction = class extends ExtensionAPIPersistent {
|
||||
handleMenuButtonEvent(event) {
|
||||
let window = event.target.ownerGlobal;
|
||||
let { node } = window.gBrowser && this.widget.forWindow(window);
|
||||
let messageDeck = node?.querySelector(
|
||||
".unified-extensions-item-message-deck"
|
||||
);
|
||||
|
||||
switch (event.type) {
|
||||
case "focus":
|
||||
case "mouseover": {
|
||||
if (node) {
|
||||
node.setAttribute("secondary-button-hovered", true);
|
||||
if (messageDeck) {
|
||||
messageDeck.selectedIndex =
|
||||
window.gUnifiedExtensions.MESSAGE_DECK_INDEX_MENU_HOVER;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "blur":
|
||||
case "mouseout": {
|
||||
if (node) {
|
||||
node.removeAttribute("secondary-button-hovered");
|
||||
if (messageDeck) {
|
||||
messageDeck.selectedIndex =
|
||||
window.gUnifiedExtensions.MESSAGE_DECK_INDEX_DEFAULT;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -645,21 +664,9 @@ this.browserAction = class extends ExtensionAPIPersistent {
|
||||
|
||||
let { node } = window.gBrowser && this.widget.forWindow(window);
|
||||
if (gUnifiedExtensionsEnabled && node) {
|
||||
const policy = WebExtensionPolicy.getByID(this.extension.id);
|
||||
const messages = OriginControls.getStateMessageIDs({
|
||||
policy,
|
||||
uri: window.gBrowser.currentURI,
|
||||
isAction: true,
|
||||
hasPopup: !!popupURL,
|
||||
});
|
||||
|
||||
if (messages?.onHover) {
|
||||
node.ownerDocument.l10n.setAttributes(
|
||||
node.querySelector(".unified-extensions-item-message-default"),
|
||||
messages.onHover
|
||||
);
|
||||
node.dataset.showsHoverMessage = true;
|
||||
}
|
||||
node.querySelector(
|
||||
".unified-extensions-item-message-deck"
|
||||
).selectedIndex = window.gUnifiedExtensions.MESSAGE_DECK_INDEX_HOVER;
|
||||
}
|
||||
|
||||
// We don't want to preload the popup on focus (for now).
|
||||
@@ -683,24 +690,10 @@ this.browserAction = class extends ExtensionAPIPersistent {
|
||||
case "mouseout": {
|
||||
let { node } = window.gBrowser && this.widget.forWindow(window);
|
||||
if (gUnifiedExtensionsEnabled && node) {
|
||||
let tab = window.gBrowser.selectedTab;
|
||||
let popupURL = this.action.getPopupUrl(tab);
|
||||
|
||||
const policy = WebExtensionPolicy.getByID(this.extension.id);
|
||||
const messages = OriginControls.getStateMessageIDs({
|
||||
policy,
|
||||
uri: window.gBrowser.currentURI,
|
||||
isAction: true,
|
||||
hasPopup: !!popupURL,
|
||||
});
|
||||
|
||||
if (messages?.default) {
|
||||
node.ownerDocument.l10n.setAttributes(
|
||||
node.querySelector(".unified-extensions-item-message-default"),
|
||||
messages.default
|
||||
);
|
||||
delete node.dataset.showsHoverMessage;
|
||||
}
|
||||
node.querySelector(
|
||||
".unified-extensions-item-message-deck"
|
||||
).selectedIndex =
|
||||
window.gUnifiedExtensions.MESSAGE_DECK_INDEX_DEFAULT;
|
||||
}
|
||||
|
||||
// We don't want to clear the popup on blur for now.
|
||||
@@ -851,7 +844,7 @@ this.browserAction = class extends ExtensionAPIPersistent {
|
||||
let title = tabData.title || this.extension.name;
|
||||
|
||||
let messages;
|
||||
if (gUnifiedExtensionsEnabled && !node.dataset.showsHoverMessage) {
|
||||
if (gUnifiedExtensionsEnabled) {
|
||||
let policy = WebExtensionPolicy.getByID(this.extension.id);
|
||||
messages = OriginControls.getStateMessageIDs({
|
||||
policy,
|
||||
@@ -881,16 +874,21 @@ this.browserAction = class extends ExtensionAPIPersistent {
|
||||
).textContent = this.extension?.name;
|
||||
|
||||
if (messages) {
|
||||
const messageElement = button.querySelector(
|
||||
const messageDefaultElement = button.querySelector(
|
||||
".unified-extensions-item-message-default"
|
||||
);
|
||||
node.ownerDocument.l10n.setAttributes(
|
||||
messageElement,
|
||||
messageDefaultElement,
|
||||
messages.default
|
||||
);
|
||||
|
||||
// TODO: Bug 1799694 - adjust min-height property on the
|
||||
// `.unified-extensions-item-contents` element.
|
||||
const messageHoverElement = button.querySelector(
|
||||
".unified-extensions-item-message-hover"
|
||||
);
|
||||
node.ownerDocument.l10n.setAttributes(
|
||||
messageHoverElement,
|
||||
messages.onHover || messages.default
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user