Skip to content

Commit b76b186

Browse files
committed
Update THP on tab change r=dwalker,tabbrowser-reviewers
1 parent 2c9db4a commit b76b186

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

browser/components/tabbrowser/content/tab-hover-preview.mjs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,18 @@ export default class TabHoverPreviewPanel {
2424
this._tab = null;
2525
this._thumbnailElement = null;
2626

27+
// Observe changes to this tab's DOM, and
28+
// update the preview if the tab title changes
29+
this._tabObserver = new this._win.MutationObserver(
30+
(mutationList, _observer) => {
31+
for (const mutation of mutationList) {
32+
if (mutation.attributeName === "label") {
33+
this._updatePreview();
34+
}
35+
}
36+
}
37+
);
38+
2739
this._setExternalPopupListeners();
2840

2941
XPCOMUtils.defineLazyPreferenceGetter(
@@ -112,6 +124,9 @@ export default class TabHoverPreviewPanel {
112124
}
113125

114126
this._tab = tab;
127+
this._tabObserver.observe(this._tab, {
128+
attributes: true,
129+
});
115130

116131
// Calling `moveToAnchor` in advance of the call to `openPopup` ensures
117132
// that race conditions can be avoided in cases where the user hovers
@@ -145,6 +160,7 @@ export default class TabHoverPreviewPanel {
145160
return;
146161
}
147162
this._tab = null;
163+
this._tabObserver.disconnect();
148164
this._thumbnailElement = null;
149165
this._panel.removeEventListener("popupshowing", this);
150166
this._win.removeEventListener("TabSelect", this);

browser/components/tabbrowser/test/browser/tabs/browser_tab_preview.js

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -714,4 +714,34 @@
714714
type: "mouseover",
715715
});
716716
});
717-
717+
718+
/**
719+
* Verify that if the browser document title (i.e. tab label) changes,
720+
* the tab preview panel is updated
721+
*/
722+
add_task(async function tabContentChangeTests() {
723+
const previewPanel = document.getElementById("tab-preview-panel");
724+
const tabUrl =
725+
"data:text/html,<html><head><title>Original Tab Title</title></head><body>Hello</body></html>";
726+
const tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, tabUrl);
727+
await openPreview(tab);
728+
Assert.equal(
729+
previewPanel.querySelector(".tab-preview-title").innerText,
730+
"Original Tab Title",
731+
"Preview of tab shows original tab title"
732+
);
733+
tab.setAttribute("label", "New Tab Title");
734+
await BrowserTestUtils.waitForCondition(() => {
735+
return (
736+
previewPanel.querySelector(".tab-preview-title").innerText ===
737+
"New Tab Title"
738+
);
739+
});
740+
Assert.equal(
741+
previewPanel.querySelector(".tab-preview-title").innerText,
742+
"New Tab Title",
743+
"Preview of tab shows new tab title"
744+
);
745+
await closePreviews();
746+
BrowserTestUtils.removeTab(tab);
747+
});

0 commit comments

Comments
 (0)