[BlackBerry] Input Range element expects mouse events
authorcharles.wei@torchmobile.com.cn <charles.wei@torchmobile.com.cn@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Apr 2012 15:57:24 +0000 (15:57 +0000)
committercharles.wei@torchmobile.com.cn <charles.wei@torchmobile.com.cn@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Apr 2012 15:57:24 +0000 (15:57 +0000)
https://bugs.webkit.org/show_bug.cgi?id=84571

Reviewed by Antonio Gomes.

.:

Input element with Range type expects mouse events to
drag the handle. Note that Input Range could appear
in both the web page directly, or in some shadow tree,
like the MediaControlTimeline and MediaControlVolume.
* ManualTests/blackberry/slider-thumb-consumes-event.html: Added.

Source/WebKit/blackberry:

Input element with Range type expects mouse events to
drag the handle. Note that Input Range could appear
in both the web page directly, or in some shadow tree,
like the MediaControlTimeline and MediaControlVolume.
* WebKitSupport/TouchEventHandler.cpp:
(BlackBerry::WebKit::isRangeControlElement):
(WebKit):
(BlackBerry::WebKit::elementExpectsMouseEvents):
(BlackBerry::WebKit::shouldConvertTouchToMouse):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@115065 268f45cc-cd09-0410-ab3c-d52691b4dbfc

ChangeLog
ManualTests/blackberry/slider-thumb-consumes-event.html [new file with mode: 0644]
Source/WebKit/blackberry/ChangeLog
Source/WebKit/blackberry/WebKitSupport/TouchEventHandler.cpp

index db0131f..6bf293c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2012-04-24  Charles Wei  <charles.wei@torchmobile.com.cn>
+
+        [BlackBerry] Input Range element expects mouse events
+        https://bugs.webkit.org/show_bug.cgi?id=84571
+
+        Reviewed by Antonio Gomes.
+
+        Input element with Range type expects mouse events to
+        drag the handle. Note that Input Range could appear
+        in both the web page directly, or in some shadow tree,
+        like the MediaControlTimeline and MediaControlVolume.
+        * ManualTests/blackberry/slider-thumb-consumes-event.html: Added.
+
 2012-04-24  Christophe Dumez  <christophe.dumez@intel.com>
 
         [EFL] Enable Web Timing
diff --git a/ManualTests/blackberry/slider-thumb-consumes-event.html b/ManualTests/blackberry/slider-thumb-consumes-event.html
new file mode 100644 (file)
index 0000000..de216cc
--- /dev/null
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title> Slider thumb should eat event </title>
+</head>
+
+<body>
+<p>
+This test case verifies that an event should be comsumed <br>
+by the slider thumb element when pressed on it, to prevent<br>
+the event been used for page zooming or scrolling. <br><br>
+
+Steps to verify:<br>
+1. Zoom in the page.<br>
+2. Press and drag the slider thumb.<br><br>
+
+If the slider changes but the page stays, it SUCCEEDS.<br>
+othersie, if the page scrolls, it FAILS.<br><br>
+
+range:    <input type="range" min="0" max="100" step="1" /><br>
+</body>
+</html>
index d938499..a195fbb 100644 (file)
@@ -1,3 +1,20 @@
+2012-04-24  Charles Wei  <charles.wei@torchmobile.com.cn>
+
+        [BlackBerry] Input Range element expects mouse events
+        https://bugs.webkit.org/show_bug.cgi?id=84571
+
+        Reviewed by Antonio Gomes.
+
+        Input element with Range type expects mouse events to
+        drag the handle. Note that Input Range could appear
+        in both the web page directly, or in some shadow tree,
+        like the MediaControlTimeline and MediaControlVolume.
+        * WebKitSupport/TouchEventHandler.cpp:
+        (BlackBerry::WebKit::isRangeControlElement):
+        (WebKit):
+        (BlackBerry::WebKit::elementExpectsMouseEvents):
+        (BlackBerry::WebKit::shouldConvertTouchToMouse):
+
 2012-04-23  Charles Wei  <charles.wei@torchmobile.com.cn>
 
         [BlackBerry] Build failure when DEBUG_FAT_FINGER is enabled
index e36eaf7..00d530f 100644 (file)
@@ -68,14 +68,29 @@ static bool hasTouchListener(Element* element)
         || element->hasEventListeners(eventNames().touchendEvent);
 }
 
+static bool isRangeControlElement(Element* element)
+{
+    ASSERT(element);
+    if (!element->hasTagName(HTMLNames::inputTag))
+        return false;
+
+    HTMLInputElement* inputElement = static_cast<HTMLInputElement*>(element);
+    return inputElement->isRangeControl();
+}
+
 static bool elementExpectsMouseEvents(Element* element)
 {
-    // Make sure we are not operating a shadow node here, since the webpages
-    // aren't able to attach event listeners to shadow content.
+    // If the shadow tree contains a Range Control, like the MediaControlTimeline,
+    // MediaContolVolumeElement, etc, they expect natual elements. Otherwise, we
+    // won't operate on the shadow node, because the webpages aren't able to attach
+    // listeners to shadow content.
     ASSERT(element);
-    while (element->isInShadowTree())
+    while (element->isInShadowTree()) {
         element = toElement(element->shadowAncestorNode());
-
+      
+        if (isRangeControlElement(element))
+            return true;
+    }
     return hasMouseMoveListener(element) && !hasTouchListener(element);
 }
 
@@ -84,13 +99,10 @@ static bool shouldConvertTouchToMouse(Element* element)
     if (!element)
         return false;
 
-    // Range element are a special case that require natural mouse events in order to allow
+    // Range element is a special case that requires natural mouse events in order to allow
     // dragging of the slider handle.
-    if (element->hasTagName(HTMLNames::inputTag)) {
-        HTMLInputElement* inputElement = static_cast<HTMLInputElement*>(element);
-        if (inputElement->isRangeControl())
-            return true;
-    }
+    if (isRangeControlElement(element))
+        return true;
 
     if ((element->hasTagName(HTMLNames::objectTag) || element->hasTagName(HTMLNames::embedTag)) && static_cast<HTMLPlugInElement*>(element))
         return true;