[gnome-shell/gnome-3-26] overview: Protect ::drag-end handlers



commit af79d975b06212c371432f862fe0bf3ffde1f2dd
Author: Carlos Garnacho <carlosg gnome org>
Date:   Thu Nov 16 17:27:12 2017 +0100

    overview: Protect ::drag-end handlers
    
    These end up emitting item-drag-end/window-drag-end pretty much
    without checks. Given the MetaDnd object may end up emitting
    ::drag-leave as a result of the plugin ending its grab, this
    would result on spurious emission of those events and subsequent
    warnings.
    
    For extra paranoia, the _inDrag variable has been split into
    _inItemDrag/_inWindowDrag so we can't cross the streams.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=784545

 js/ui/overview.js |   14 +++++++++-----
 1 files changed, 9 insertions(+), 5 deletions(-)
---
diff --git a/js/ui/overview.js b/js/ui/overview.js
index 7eb2102..816f32f 100644
--- a/js/ui/overview.js
+++ b/js/ui/overview.js
@@ -417,7 +417,7 @@ var Overview = new Lang.Class({
 
     beginItemDrag: function(source) {
         this.emit('item-drag-begin');
-        this._inDrag = true;
+        this._inItemDrag = true;
     },
 
     cancelledItemDrag: function(source) {
@@ -425,13 +425,15 @@ var Overview = new Lang.Class({
     },
 
     endItemDrag: function(source) {
+        if (!this._inItemDrag)
+            return;
         this.emit('item-drag-end');
-        this._inDrag = false;
+        this._inItemDrag = false;
     },
 
     beginWindowDrag: function(window) {
         this.emit('window-drag-begin', window);
-        this._inDrag = true;
+        this._inWindowDrag = true;
     },
 
     cancelledWindowDrag: function(window) {
@@ -439,8 +441,10 @@ var Overview = new Lang.Class({
     },
 
     endWindowDrag: function(window) {
+        if (!this._inWindowDrag)
+            return;
         this.emit('window-drag-end', window);
-        this._inDrag = false;
+        this._inWindowDrag = false;
     },
 
     focusSearch: function() {
@@ -484,7 +488,7 @@ var Overview = new Lang.Class({
     shouldToggleByCornerOrButton: function() {
         if (this.animationInProgress)
             return false;
-        if (this._inDrag)
+        if (this._inItemDrag || this._inWindowDrag)
             return false;
         if (this._activationTime == 0 || Date.now() / 1000 - this._activationTime > 
OVERVIEW_ACTIVATION_TIMEOUT)
             return true;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]