[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

estade at chromium.org estade at chromium.org
Wed Dec 22 11:55:32 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit ce0f0744c6117a249b6d829ab10ccc0e0f4c6d4f
Author: estade at chromium.org <estade at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Aug 11 13:45:01 2010 +0000

    2010-08-11  Evan Stade  <estade at chromium.org>
    
            Reviewed by David Levin.
    
            [chromium] linux chromium sends double clicks too often
            https://bugs.webkit.org/show_bug.cgi?id=43096
    
            * WebKit.gyp: add the test
            * src/gtk/WebInputEventFactory.cpp:
            (WebKit::WebInputEventFactory::mouseEvent): check the x/y coordinates of the
            potential double click event
            * tests/WebInputEventFactoryTestGtk.cpp: Added.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@65152 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index 1501cd7..128fcf0 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,16 @@
+2010-08-11  Evan Stade  <estade at chromium.org>
+
+        Reviewed by David Levin.
+
+        [chromium] linux chromium sends double clicks too often
+        https://bugs.webkit.org/show_bug.cgi?id=43096
+
+        * WebKit.gyp: add the test
+        * src/gtk/WebInputEventFactory.cpp:
+        (WebKit::WebInputEventFactory::mouseEvent): check the x/y coordinates of the
+        potential double click event
+        * tests/WebInputEventFactoryTestGtk.cpp: Added.
+
 2010-08-11  John Abd-El-Malek  <jam at chromium.org>
 
         Reviewed by Darin Fisher.
diff --git a/WebKit/chromium/WebKit.gyp b/WebKit/chromium/WebKit.gyp
index f34355d..123aed5 100644
--- a/WebKit/chromium/WebKit.gyp
+++ b/WebKit/chromium/WebKit.gyp
@@ -722,6 +722,14 @@
                                 'tests/DragImageTest.cpp',
                             ],
                         }],
+                        ['OS=="linux"', {
+                            'sources': [
+                                'tests/WebInputEventFactoryTestGtk.cpp',
+                            ],
+                            'include_dirs': [
+                                'public/gtk',
+                            ],
+                        }],
                     ],
                 }],
             ],
diff --git a/WebKit/chromium/src/gtk/WebInputEventFactory.cpp b/WebKit/chromium/src/gtk/WebInputEventFactory.cpp
index dc46b07..f8a1386 100644
--- a/WebKit/chromium/src/gtk/WebInputEventFactory.cpp
+++ b/WebKit/chromium/src/gtk/WebInputEventFactory.cpp
@@ -45,12 +45,15 @@
 
 namespace {
 
-gint getDoubleClickTime()
+bool countsAsDoubleClick(gint timeDiff, gint xDiff, gint yDiff)
 {
     static GtkSettings* settings = gtk_settings_get_default();
     gint doubleClickTime = 250;
-    g_object_get(G_OBJECT(settings), "gtk-double-click-time", &doubleClickTime, NULL);
-    return doubleClickTime;
+    gint doubleClickDistance = 5;
+    g_object_get(G_OBJECT(settings),
+                 "gtk-double-click-time", &doubleClickTime,
+                 "gtk-double-click-distance", &doubleClickDistance, 0);
+    return timeDiff <= doubleClickTime && abs(xDiff) <= doubleClickDistance && abs(yDiff) <= doubleClickDistance;
 }
 
 }  // namespace
@@ -404,9 +407,13 @@ WebMouseEvent WebInputEventFactory::mouseEvent(const GdkEventButton* event)
         static int numClicks = 0;
         static GdkWindow* eventWindow = 0;
         static gint lastLeftClickTime = 0;
+        static gint lastLeftClickX = 0;
+        static gint lastLeftClickY = 0;
 
-        gint time_diff = event->time - lastLeftClickTime;
-        if (eventWindow == event->window && time_diff < getDoubleClickTime())
+        gint timeDiff = event->time - lastLeftClickTime;
+        gint xDiff = event->x - lastLeftClickX;
+        gint yDiff = event->y - lastLeftClickY;
+        if (eventWindow == event->window && countsAsDoubleClick(timeDiff, xDiff, yDiff))
             numClicks++;
         else
             numClicks = 1;
@@ -414,6 +421,8 @@ WebMouseEvent WebInputEventFactory::mouseEvent(const GdkEventButton* event)
         result.clickCount = numClicks;
         eventWindow = event->window;
         lastLeftClickTime = event->time;
+        lastLeftClickX = event->x;
+        lastLeftClickY = event->y;
     }
 
     result.button = WebMouseEvent::ButtonNone;
diff --git a/WebKit/chromium/tests/WebInputEventFactoryTestGtk.cpp b/WebKit/chromium/tests/WebInputEventFactoryTestGtk.cpp
new file mode 100644
index 0000000..7cd4837
--- /dev/null
+++ b/WebKit/chromium/tests/WebInputEventFactoryTestGtk.cpp
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include <gdk/gdk.h>
+#include <gtest/gtest.h>
+
+#include "WebInputEvent.h"
+#include "WebInputEventFactory.h"
+
+using WebKit::WebMouseEvent;
+using WebKit::WebInputEventFactory;
+
+namespace {
+
+TEST(WebInputEventFactoryTest, DoubleClick)
+{
+    GdkEventButton firstClick;
+    firstClick.type = GDK_BUTTON_PRESS;
+    firstClick.window = static_cast<GdkWindow*>(GINT_TO_POINTER(1));
+    firstClick.x = firstClick.y = firstClick.x_root = firstClick.y_root = 100;
+    firstClick.state = 0;
+    firstClick.time = 0;
+    firstClick.button = 1;
+
+    // Single click works.
+    WebMouseEvent firstClickEvent = WebInputEventFactory::mouseEvent(&firstClick);
+    EXPECT_EQ(1, firstClickEvent.clickCount);
+
+    // Make sure double click works.
+    GdkEventButton secondClick = firstClick;
+    secondClick.time = firstClick.time + 100;
+    WebMouseEvent secondClickEvent = WebInputEventFactory::mouseEvent(&secondClick);
+    EXPECT_EQ(2, secondClickEvent.clickCount);
+
+    // Reset the click count.
+    firstClick.time += 10000;
+    firstClickEvent = WebInputEventFactory::mouseEvent(&firstClick);
+    EXPECT_EQ(1, firstClickEvent.clickCount);
+
+    // Two clicks with a long gap in between aren't counted as a double click.
+    secondClick = firstClick;
+    secondClick.time = firstClick.time + 1000;
+    secondClickEvent = WebInputEventFactory::mouseEvent(&secondClick);
+    EXPECT_EQ(1, secondClickEvent.clickCount);
+
+    // Reset the click count.
+    firstClick.time += 10000;
+    firstClickEvent = WebInputEventFactory::mouseEvent(&firstClick);
+    EXPECT_EQ(1, firstClickEvent.clickCount);
+
+    // Two clicks far apart (horizontally) aren't counted as a double click.
+    secondClick = firstClick;
+    secondClick.time = firstClick.time + 1;
+    secondClick.x = firstClick.x + 100;
+    secondClickEvent = WebInputEventFactory::mouseEvent(&secondClick);
+    EXPECT_EQ(1, secondClickEvent.clickCount);
+
+    // Reset the click count.
+    firstClick.time += 10000;
+    firstClickEvent = WebInputEventFactory::mouseEvent(&firstClick);
+    EXPECT_EQ(1, firstClickEvent.clickCount);
+
+    // Two clicks far apart (vertically) aren't counted as a double click.
+    secondClick = firstClick;
+    secondClick.time = firstClick.time + 1;
+    secondClick.x = firstClick.y + 100;
+    secondClickEvent = WebInputEventFactory::mouseEvent(&secondClick);
+    EXPECT_EQ(1, secondClickEvent.clickCount);
+
+    // Reset the click count.
+    firstClick.time += 10000;
+    firstClickEvent = WebInputEventFactory::mouseEvent(&firstClick);
+    EXPECT_EQ(1, firstClickEvent.clickCount);
+
+    // Two clicks on different windows aren't a double click.
+    secondClick = firstClick;
+    secondClick.time = firstClick.time + 1;
+    secondClick.window = static_cast<GdkWindow*>(GINT_TO_POINTER(2));
+    secondClickEvent = WebInputEventFactory::mouseEvent(&secondClick);
+    EXPECT_EQ(1, secondClickEvent.clickCount);
+}
+
+} // anonymous namespace

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list