Skip to content

Commit 3bad8ee

Browse files
committed
Clear "dragging" state with delay, if the drag operation is canceled by some reason #1778
1 parent ae947ea commit 3bad8ee

File tree

1 file changed

+39
-19
lines changed

1 file changed

+39
-19
lines changed

webextensions/sidebar/drag-and-drop.js

+39-19
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,8 @@ async function getDroppedLinksOnTabBehavior() {
675675

676676
/* DOM event listeners */
677677

678+
let mFinishCanceledDragOperation;
679+
678680
function onDragStart(event) {
679681
log('onDragStart: start ', event);
680682
clearDraggingTabsState(); // clear previous state anyway
@@ -757,13 +759,26 @@ function onDragStart(event) {
757759
Tabs.getTabsContainer(tab).classList.add(kTABBAR_STATE_TAB_DRAGGING);
758760
document.documentElement.classList.add(kTABBAR_STATE_TAB_DRAGGING);
759761

762+
// The drag operation can be canceled by something, then
763+
// "dragend" event is not dispatched and TST wrongly keeps
764+
// its "dragging" state. So we clear the dragging state with
765+
// a delay. (This timer will be cleared immediately by dragover
766+
// event, if the dragging operation is not canceled.)
767+
// See also: https://github.com/piroor/treestyletab/issues/1778#issuecomment-404569842
768+
mFinishCanceledDragOperation = setTimeout(finishDrag, 250);
769+
760770
log('onDragStart: started');
761771
}
762772
onDragStart = EventUtils.wrapWithErrorHandler(onDragStart);
763773

764774
let mLastDragOverTimestamp = null;
765775

766776
function onDragOver(event) {
777+
if (mFinishCanceledDragOperation) {
778+
clearTimeout(mFinishCanceledDragOperation);
779+
mFinishCanceledDragOperation = null;
780+
}
781+
767782
event.preventDefault(); // this is required to override default dragover actions!
768783
Scroll.autoScrollOnMouseEvent(event);
769784

@@ -970,30 +985,14 @@ onDrop = EventUtils.wrapWithErrorHandler(onDrop);
970985
function onDragEnd(event) {
971986
log('onDragEnd, mDraggingOnSelfWindow = ', mDraggingOnSelfWindow);
972987

973-
// clear "dragging" status safely, because we possibly fail to get drag data from dataTransfer.
974-
clearDraggingTabsState();
975-
976988
let dragData = event.dataTransfer.mozGetDataAt(kTREE_DROP_TYPE, 0);
977989
dragData = (dragData && JSON.parse(dragData)) || mCurrentDragData;
978-
const stillInSelfWindow = !!mDraggingOnSelfWindow;
979-
mDraggingOnSelfWindow = false;
980-
981-
wait(100).then(() => {
982-
mCurrentDragData = null;
983-
browser.runtime.sendMessage({
984-
type: Constants.kCOMMAND_BROADCAST_CURRENT_DRAG_DATA,
985-
windowId: Tabs.getWindow(),
986-
dragData: null
987-
});
988-
});
989-
990990
if (Array.isArray(dragData.apiTabs))
991991
dragData.tabNodes = dragData.apiTabs.map(Tabs.getTabById);
992992

993-
clearDropPosition();
994-
mLastDropPosition = null;
995-
clearDraggingState();
996-
collapseAutoExpandedTabsWhileDragging();
993+
const stillInSelfWindow = !!mDraggingOnSelfWindow;
994+
995+
finishDrag();
997996

998997
if (event.dataTransfer.dropEffect != 'none' ||
999998
//event.shiftKey || // don't ignore shift-drop, because it can be used to drag a parent tab as an individual tab.
@@ -1047,6 +1046,27 @@ function onDragEnd(event) {
10471046
}
10481047
onDragEnd = EventUtils.wrapWithErrorHandler(onDragEnd);
10491048

1049+
function finishDrag() {
1050+
log('finishDrag');
1051+
clearDraggingTabsState();
1052+
1053+
mDraggingOnSelfWindow = false;
1054+
1055+
wait(100).then(() => {
1056+
mCurrentDragData = null;
1057+
browser.runtime.sendMessage({
1058+
type: Constants.kCOMMAND_BROADCAST_CURRENT_DRAG_DATA,
1059+
windowId: Tabs.getWindow(),
1060+
dragData: null
1061+
});
1062+
});
1063+
1064+
clearDropPosition();
1065+
mLastDropPosition = null;
1066+
clearDraggingState();
1067+
collapseAutoExpandedTabsWhileDragging();
1068+
}
1069+
10501070

10511071
/* drag on tabs API */
10521072

0 commit comments

Comments
 (0)