Skip to content

Commit ee6e9f6

Browse files
Bug 1883876 - Update window list in Open Tabs in Fx View when moving a tab between windows r=fxview-reviewers,sclements,sfoster
Differential Revision: https://phabricator.services.mozilla.com/D203971
1 parent d59d4eb commit ee6e9f6

File tree

3 files changed

+111
-20
lines changed

3 files changed

+111
-20
lines changed

browser/components/firefoxview/opentabs.mjs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -348,11 +348,6 @@ class OpenTabsInView extends ViewPage {
348348
switch (type) {
349349
case "TabRecencyChange":
350350
case "TabChange":
351-
// if we're switching away from our tab, we can halt any updates immediately
352-
if (!this.isSelectedBrowserTab) {
353-
this.stop();
354-
return;
355-
}
356351
windowIds = detail.windowIds;
357352
this._updateWindowList();
358353
this.bookmarkList.setTrackedUrls(this.#getAllTabUrls());

browser/components/firefoxview/tests/browser/browser_firefoxview_paused.js

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,42 @@ async function checkFxRenderCalls(browser, elements, selectedView) {
191191
sandbox.restore();
192192
}
193193

194+
function dragAndDrop(
195+
tab1,
196+
tab2,
197+
initialWindow = window,
198+
destWindow = window,
199+
afterTab = true,
200+
context
201+
) {
202+
let rect = tab2.getBoundingClientRect();
203+
let event = {
204+
ctrlKey: false,
205+
altKey: false,
206+
clientX: rect.left + rect.width / 2 + 10 * (afterTab ? 1 : -1),
207+
clientY: rect.top + rect.height / 2,
208+
};
209+
210+
if (destWindow != initialWindow) {
211+
// Make sure that both tab1 and tab2 are visible
212+
initialWindow.focus();
213+
initialWindow.moveTo(rect.left, rect.top + rect.height * 3);
214+
}
215+
216+
EventUtils.synthesizeDrop(
217+
tab1,
218+
tab2,
219+
null,
220+
"move",
221+
initialWindow,
222+
destWindow,
223+
event
224+
);
225+
226+
// Ensure dnd suppression is cleared.
227+
EventUtils.synthesizeMouseAtCenter(tab2, { type: "mouseup" }, context);
228+
}
229+
194230
add_task(async function test_recentbrowsing() {
195231
await setupOpenAndClosedTabs();
196232

@@ -402,3 +438,66 @@ add_task(async function test_recentlyclosed() {
402438
});
403439
await BrowserTestUtils.removeTab(TestTabs.tab2);
404440
});
441+
442+
add_task(async function test_drag_drop_pinned_tab() {
443+
await setupOpenAndClosedTabs();
444+
await withFirefoxView({}, async browser => {
445+
const { document } = browser.contentWindow;
446+
let win1 = browser.ownerGlobal;
447+
await navigateToViewAndWait(document, "opentabs");
448+
449+
let openTabs = document.querySelector("view-opentabs[name=opentabs]");
450+
await openTabs.updateComplete;
451+
await TestUtils.waitForCondition(
452+
() => openTabs.viewCards[0].tabList.rowEls.length
453+
);
454+
await openTabs.openTabsTarget.readyWindowsPromise;
455+
let card = openTabs.viewCards[0];
456+
let tabRows = card.tabList.rowEls;
457+
let tabChangeRaised;
458+
459+
// Pin first two tabs
460+
for (var i = 0; i < 2; i++) {
461+
tabChangeRaised = BrowserTestUtils.waitForEvent(
462+
NonPrivateTabs,
463+
"TabChange"
464+
);
465+
let currentTabEl = tabRows[i];
466+
let currentTab = currentTabEl.tabElement;
467+
info(`Pinning tab ${i + 1} with label: ${currentTab.label}`);
468+
win1.gBrowser.pinTab(currentTab);
469+
await tabChangeRaised;
470+
await openTabs.updateComplete;
471+
tabRows = card.tabList.rowEls;
472+
currentTabEl = tabRows[i];
473+
474+
await TestUtils.waitForCondition(
475+
() => currentTabEl.indicators.includes("pinned"),
476+
`Tab ${i + 1} is pinned.`
477+
);
478+
}
479+
480+
info(`First two tabs are pinned.`);
481+
482+
let win2 = await BrowserTestUtils.openNewBrowserWindow();
483+
484+
await openTabs.updateComplete;
485+
await TestUtils.waitForCondition(
486+
() => openTabs.viewCards.length === 2,
487+
"Two windows are shown for Open Tabs in in Fx View."
488+
);
489+
490+
let pinnedTab = win1.gBrowser.visibleTabs[0];
491+
let newWindowTab = win2.gBrowser.visibleTabs[0];
492+
493+
dragAndDrop(newWindowTab, pinnedTab, win2, win1, true, content);
494+
495+
await switchToFxViewTab();
496+
await openTabs.updateComplete;
497+
await TestUtils.waitForCondition(
498+
() => openTabs.viewCards.length === 1,
499+
"One window is shown for Open Tabs in in Fx View."
500+
);
501+
});
502+
cleanupTabs();
503+
});

browser/components/firefoxview/viewpage.mjs

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ export class ViewPage extends ViewPageContent {
131131
super();
132132
this.selectedTab = false;
133133
this.recentBrowsing = Boolean(this.recentBrowsingElement);
134-
this.onVisibilityChange = this.onVisibilityChange.bind(this);
134+
this.onTabSelect = this.onTabSelect.bind(this);
135135
this.onResize = this.onResize.bind(this);
136136
}
137137

@@ -148,33 +148,28 @@ export class ViewPage extends ViewPageContent {
148148
this.windowResizeTask?.arm();
149149
}
150150

151-
onVisibilityChange() {
152-
if (this.isVisible) {
151+
onTabSelect({ target }) {
152+
const win = target.ownerGlobal;
153+
154+
let selfBrowser = window.docShell?.chromeEventHandler;
155+
const { gBrowser } = this.getWindow();
156+
let isForegroundTab = gBrowser.selectedBrowser == selfBrowser;
157+
158+
if (win.FirefoxViewHandler.tab.selected && isForegroundTab) {
153159
this.paused = false;
154160
this.viewVisibleCallback();
155-
} else if (
156-
this.ownerViewPage.selectedTab &&
157-
this.ownerDocument.visibilityState == "hidden"
158-
) {
161+
} else {
159162
this.paused = true;
160163
this.viewHiddenCallback();
161164
}
162165
}
163166

164167
connectedCallback() {
165168
super.connectedCallback();
166-
this.ownerDocument.addEventListener(
167-
"visibilitychange",
168-
this.onVisibilityChange
169-
);
170169
}
171170

172171
disconnectedCallback() {
173172
super.disconnectedCallback();
174-
this.ownerDocument.removeEventListener(
175-
"visibilitychange",
176-
this.onVisibilityChange
177-
);
178173
this.getWindow().removeEventListener("resize", this.onResize);
179174
}
180175

@@ -246,6 +241,7 @@ export class ViewPage extends ViewPageContent {
246241
this.paused = false;
247242
this.viewVisibleCallback();
248243
this.getWindow().addEventListener("resize", this.onResize);
244+
this.getWindow().addEventListener("TabSelect", this.onTabSelect);
249245
}
250246
}
251247

@@ -257,5 +253,6 @@ export class ViewPage extends ViewPageContent {
257253
this.windowResizeTask?.finalize();
258254
}
259255
this.getWindow().removeEventListener("resize", this.onResize);
256+
this.getWindow().removeEventListener("TabSelect", this.onTabSelect);
260257
}
261258
}

0 commit comments

Comments
 (0)