[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