@@ -675,6 +675,8 @@ async function getDroppedLinksOnTabBehavior() {
675
675
676
676
/* DOM event listeners */
677
677
678
+ let mFinishCanceledDragOperation ;
679
+
678
680
function onDragStart ( event ) {
679
681
log ( 'onDragStart: start ' , event ) ;
680
682
clearDraggingTabsState ( ) ; // clear previous state anyway
@@ -757,13 +759,26 @@ function onDragStart(event) {
757
759
Tabs . getTabsContainer ( tab ) . classList . add ( kTABBAR_STATE_TAB_DRAGGING ) ;
758
760
document . documentElement . classList . add ( kTABBAR_STATE_TAB_DRAGGING ) ;
759
761
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
+
760
770
log ( 'onDragStart: started' ) ;
761
771
}
762
772
onDragStart = EventUtils . wrapWithErrorHandler ( onDragStart ) ;
763
773
764
774
let mLastDragOverTimestamp = null ;
765
775
766
776
function onDragOver ( event ) {
777
+ if ( mFinishCanceledDragOperation ) {
778
+ clearTimeout ( mFinishCanceledDragOperation ) ;
779
+ mFinishCanceledDragOperation = null ;
780
+ }
781
+
767
782
event . preventDefault ( ) ; // this is required to override default dragover actions!
768
783
Scroll . autoScrollOnMouseEvent ( event ) ;
769
784
@@ -970,30 +985,14 @@ onDrop = EventUtils.wrapWithErrorHandler(onDrop);
970
985
function onDragEnd ( event ) {
971
986
log ( 'onDragEnd, mDraggingOnSelfWindow = ' , mDraggingOnSelfWindow ) ;
972
987
973
- // clear "dragging" status safely, because we possibly fail to get drag data from dataTransfer.
974
- clearDraggingTabsState ( ) ;
975
-
976
988
let dragData = event . dataTransfer . mozGetDataAt ( kTREE_DROP_TYPE , 0 ) ;
977
989
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
-
990
990
if ( Array . isArray ( dragData . apiTabs ) )
991
991
dragData . tabNodes = dragData . apiTabs . map ( Tabs . getTabById ) ;
992
992
993
- clearDropPosition ( ) ;
994
- mLastDropPosition = null ;
995
- clearDraggingState ( ) ;
996
- collapseAutoExpandedTabsWhileDragging ( ) ;
993
+ const stillInSelfWindow = ! ! mDraggingOnSelfWindow ;
994
+
995
+ finishDrag ( ) ;
997
996
998
997
if ( event . dataTransfer . dropEffect != 'none' ||
999
998
//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) {
1047
1046
}
1048
1047
onDragEnd = EventUtils . wrapWithErrorHandler ( onDragEnd ) ;
1049
1048
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
+
1050
1070
1051
1071
/* drag on tabs API */
1052
1072
0 commit comments