fix: Small drag and drop fixes and possible leak fix, b=no-bug, c=mods, split-view, workspaces

This commit is contained in:
mr. m
2026-01-18 00:16:32 +01:00
parent 7fae42087b
commit 679be6d208
6 changed files with 61 additions and 53 deletions

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/drag-and-drop.js b/browser/components/tabbrowser/content/drag-and-drop.js
index 57800333445ec7850742145527e04ae8d504b0bb..dcee798999a5feafa97b01dcaa473204ee750957 100644
index 57800333445ec7850742145527e04ae8d504b0bb..bd94089592ce8912fc1a9c1bdea0caa5775ed460 100644
--- a/browser/components/tabbrowser/content/drag-and-drop.js
+++ b/browser/components/tabbrowser/content/drag-and-drop.js
@@ -35,6 +35,9 @@
@@ -81,14 +81,14 @@ index 57800333445ec7850742145527e04ae8d504b0bb..dcee798999a5feafa97b01dcaa473204
isTab(draggedTab) &&
draggedTab.pinned &&
this._tabbrowserTabs.arrowScrollbox.contains(event.target);
@@ -387,6 +396,7 @@
(oldTranslateY && oldTranslateY != newTranslateY);
} else if (this._tabbrowserTabs.verticalMode) {
shouldTranslate &&= oldTranslateY && oldTranslateY != newTranslateY;
+ shouldTranslate = false;
} else {
shouldTranslate &&= oldTranslateX && oldTranslateX != newTranslateX;
@@ -432,6 +441,7 @@
}
}
+ shouldTranslate = false;
if (shouldTranslate) {
let translationPromises = [];
for (let item of movingTabs) {
@@ -443,7 +453,7 @@
item.removeAttribute("tabdrop-samewindow");
resolve();

View File

@@ -675,6 +675,7 @@
handle_drop(event) {
this.clearSpaceSwitchTimer();
this.#maybeClearVerticalPinnedGridDragOver();
super.handle_drop(event);
const dt = event.dataTransfer;
const activeWorkspace = gZenWorkspaces.activeWorkspace;
@@ -885,7 +886,8 @@
} else {
const numEssentials = gBrowser._numZenEssentials;
const numPinned = gBrowser.pinnedTabCount - numEssentials;
const tabToUse = event.target.closest(dropZoneSelector);
const tabToUse =
event.target.closest(dropZoneSelector) || draggedTab._dragData?.dropElement;
if (!tabToUse) {
return null;
}

View File

@@ -13,6 +13,7 @@
#include "mozilla/css/SheetParsingMode.h"
#include "mozilla/GlobalStyleSheetCache.h"
#include "mozilla/RefPtr.h"
#define GET_MODS_FILE(chromeFile, err) \
NS_GetSpecialDirectory(NS_APP_USER_CHROME_DIR, getter_AddRefs(chromeFile)); \
@@ -57,7 +58,7 @@ auto ZenStyleSheetCache::LoadSheetFile(nsIFile* aFile,
return;
}
auto loader = new mozilla::css::Loader;
RefPtr<mozilla::css::Loader> loader = new mozilla::css::Loader;
auto result = loader->LoadSheetSync(uri, aParsingMode,
css::Loader::UseSystemPrincipal::Yes);
if (MOZ_UNLIKELY(result.isErr())) {

View File

@@ -1773,7 +1773,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
if (this.fakeBrowser) {
delete this._hasAnimated;
this.fakeBrowser.remove();
this.fakeBrowser = null;
delete this.fakeBrowser;
if (select) {
gBrowser.selectedTab = this._draggingTab;
this._draggingTab = null;
@@ -2164,49 +2164,51 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
gridType: "grid",
layoutTree: this.calculateLayoutTree(tabs, "grid"),
};
this._data.push(data);
this.activateSplitView(data);
gBrowser.selectedTab = emptyTab;
setTimeout(() => {
window.addEventListener(
"ZenURLBarClosed",
(event) => {
const { onElementPicked, onSwitch } = event.detail;
const groupIndex = this._data.findIndex((group) => group.tabs.includes(emptyTab));
const newSelectedTab = gBrowser.selectedTab;
const cleanup = () => {
this.removeTabFromGroup(emptyTab, groupIndex, {
changeTab: !onSwitch,
forUnsplit: true,
});
const command = document.getElementById("cmd_zenNewEmptySplit");
command.removeAttribute("disabled");
};
if (onElementPicked) {
if (
newSelectedTab === emptyTab ||
newSelectedTab === selectedTab ||
selectedTab.getAttribute("zen-workspace-id") !==
newSelectedTab.getAttribute("zen-workspace-id")
) {
this.#withoutSplitViewTransition(() => {
this._data.push(data);
this.activateSplitView(data);
gBrowser.selectedTab = emptyTab;
setTimeout(() => {
window.addEventListener(
"ZenURLBarClosed",
(event) => {
const { onElementPicked, onSwitch } = event.detail;
const groupIndex = this._data.findIndex((group) => group.tabs.includes(emptyTab));
const newSelectedTab = gBrowser.selectedTab;
const cleanup = () => {
this.removeTabFromGroup(emptyTab, groupIndex, {
changeTab: !onSwitch,
forUnsplit: true,
});
const command = document.getElementById("cmd_zenNewEmptySplit");
command.removeAttribute("disabled");
};
if (onElementPicked) {
if (
newSelectedTab === emptyTab ||
newSelectedTab === selectedTab ||
selectedTab.getAttribute("zen-workspace-id") !==
newSelectedTab.getAttribute("zen-workspace-id")
) {
cleanup();
return;
}
this.removeTabFromGroup(emptyTab, groupIndex, { forUnsplit: true });
gBrowser.selectedTab = selectedTab;
this.resetTabState(emptyTab, false);
this.splitTabs(
rightSide ? [selectedTab, newSelectedTab] : [newSelectedTab, selectedTab],
"grid",
rightSide ? 1 : 0
);
} else {
cleanup();
return;
}
this.removeTabFromGroup(emptyTab, groupIndex, { forUnsplit: true });
gBrowser.selectedTab = selectedTab;
this.resetTabState(emptyTab, false);
this.splitTabs(
rightSide ? [selectedTab, newSelectedTab] : [newSelectedTab, selectedTab],
"grid",
rightSide ? 1 : 0
);
} else {
cleanup();
}
},
{ once: true }
);
gZenUIManager.handleNewTab(false, false, "tab", true);
},
{ once: true }
);
gZenUIManager.handleNewTab(false, false, "tab", true);
});
});
}

View File

@@ -152,7 +152,7 @@
}
:root:not([inDOMFullscreen='true'])
.browserSidebarContainer.deck-selected:hover
.browserSidebarContainer:hover
.zen-view-splitter-header-container,
.zen-view-splitter-header-container:hover {
pointer-events: all;

View File

@@ -140,6 +140,9 @@ class nsZenWorkspaces {
this._invalidateBookmarkContainers();
};
Services.obs.addObserver(observerFunction, "workspace-bookmarks-updated");
window.addEventListener("unload", () => {
Services.obs.removeObserver(observerFunction, "workspace-bookmarks-updated");
});
}
}