[Checkins] SVN: zc.testbrowser/trunk/src/zc/testbrowser/real.js Implemented checkboxes

Justas Sadzevičius justas at pov.lt
Wed Sep 26 18:15:06 EDT 2007


Log message for revision 80158:
  Implemented checkboxes
  

Changed:
  U   zc.testbrowser/trunk/src/zc/testbrowser/real.js

-=-
Modified: zc.testbrowser/trunk/src/zc/testbrowser/real.js
===================================================================
--- zc.testbrowser/trunk/src/zc/testbrowser/real.js	2007-09-26 22:14:46 UTC (rev 80157)
+++ zc.testbrowser/trunk/src/zc/testbrowser/real.js	2007-09-26 22:15:06 UTC (rev 80158)
@@ -146,17 +146,20 @@
 
 function tb_set_checked(token, checked) {
     var input = tb_tokens[token];
-    var changed = false;
-    if ((input.checked && !checked) || (!input.checked && checked))
-        changed = true;
-    if (changed) {
-        var evt = input.ownerDocument.createEvent('MouseEvents');
-        evt.initMouseEvent('click', true, true,
-                           input.ownerDocument.defaultView,
-                           1, 0, 0, 0, 0, false, false, false, false,
-                           0, null);
-        input.dispatchEvent(evt);
-    }
+//  XXX: yes, it would be nice to handle checkbox checking via mouse events, but
+//  sometimes tests run too fast, and Firefox misses the mouse clicks
+//    var changed = false;
+//    if ((input.checked && !checked) || (!input.checked && checked))
+//        changed = true;
+//    if (changed) {
+//        var evt = input.ownerDocument.createEvent('MouseEvents');
+//        evt.initMouseEvent('click', true, true,
+//                           input.ownerDocument.defaultView,
+//                           1, 0, 0, 0, 0, false, false, false, false,
+//                           0, null);
+//        input.dispatchEvent(evt);
+//    }
+    input.checked = checked;
     type = input.getAttribute('type');
     value = input.getAttribute('value')
     if (type == 'checkbox' && value == null) {
@@ -220,7 +223,6 @@
     return false; // control not found
 }
 
-
 function tb_get_control_by_label(text, index, contextToken, xpath) {
     context = null;
     if (contextToken != null) {
@@ -248,11 +250,11 @@
 
                 var id = control.getAttribute('id');
                 var name = control.getAttribute('name');
+                // The label encloses the input element
+                var res = tb_xpath("ancestor::label", control);
                 // The label element references the control id
-                var res = tb_xpath("//label[@for='" + id + "']")
-                // The label encloses the input element
                 if (res.snapshotLength == 0) {
-                    var res = tb_xpath("ancestor::label", control);
+                    var res = tb_xpath("//label[@for='" + id + "']")
                 }
                 // Collect all text content, since HTML allows multiple labels
                 // for the same input.
@@ -265,6 +267,7 @@
                             res.snapshotItem(c).textContent);
                     }
                 }
+
             }
             // We can only match whole words! Sigh!
             if (labelText == null)
@@ -302,7 +305,8 @@
                            "'][@type='"+typeName+"']", elem);
         for (var c = 0; c < res.snapshotLength; c++) {
             var item = res.snapshotItem(c);
-            if (item.hasAttribute('value') && (typeName != 'checkbox')) {
+            var value = item.getAttribute('value');
+            if (value != null && value != 'on') {
                 options.push(item.getAttribute('value'));
             }
             else {
@@ -326,6 +330,18 @@
             else
                 options.push(item.textContent);
         }
+    } else if (tagName == 'INPUT') {
+        var elemName = elem.getAttribute('name');
+        var typeName = elem.getAttribute('type');
+        var res = tb_xpath("//input[@name='" + elemName +
+                           "'][@type='"+typeName+"']", elem);
+        for (var c = 0; c < res.snapshotLength; c++) {
+            var item = res.snapshotItem(c);
+            labels = tb_find_labels(item);
+            for (var i = 0; i < labels.length; i++) {
+                options.push(labels[i]);
+            }
+        }
     }
 
     return options.toSource();
@@ -339,7 +355,14 @@
         var elem = tb_tokens[token];
         var res = tb_xpath("//input[@name='" + elem.getAttribute('name') +
                            "'][@type='"+typeName+"']", elem);
-        return res.snapshotLength < 2;
+        if (res.snapshotLength > 1) {
+            return false;
+        }
+        else if (res.snapshotLength == 1) {
+            item = res.snapshotItem(0);
+            return !item.hasAttribute('value');
+        }
+        return true;
     }
     return false;
 }
@@ -391,6 +414,26 @@
     return values.toSource();
 }
 
+function tb_find_labels(elem) {
+    var elem_id = elem.id;
+    var labels = new Array();
+    // The label encloses the input element
+    var res = tb_xpath("ancestor::label", elem);
+    // The label element references the control id
+    if (res.snapshotLength == 0) {
+        var res = tb_xpath("//label[@for='" + elem_id + "']")
+    }
+    // Collect all text content, since HTML allows multiple labels
+    // for the same input.
+    if (res.snapshotLength > 0) {
+        for (var c = 0; c < res.snapshotLength; c++) {
+            labels.push(tb_normalize_whitespace(
+                res.snapshotItem(c).textContent));
+        }
+    }
+    return labels;
+}
+
 function tb_get_listcontrol_displayValue(token) {
     var elem = tb_tokens[token];
     var tagName = elem.tagName;
@@ -414,13 +457,38 @@
         for (var c = 0; c < res.snapshotLength; c++) {
             var item = res.snapshotItem(c);
             if (item.checked) {
-                options.push()
+                labels = tb_find_labels(item);
+                for (var i = 0; i < labels.length; i++) {
+                    options.push(labels[i]);
+                }
             }
         }
     }
     return options.toSource();
 }
 
+function tb_find_listcontrol_elements(token) {
+    var elem = tb_tokens[token];
+    var tagName = elem.tagName;
+    var elements = new Array();
+    if (tagName == 'SELECT') {
+        var res = tb_xpath('child::option', elem);
+        for (var c = 0; c < res.snapshotLength; c++) {
+            elements.push(res.snapshotItem(c));
+        }
+    } else if (tagName == 'INPUT') {
+        var elemName = elem.getAttribute('name');
+        var typeName = elem.getAttribute('type');
+        var res = tb_xpath("//input[@name='" + elemName +
+                           "'][@type='"+ typeName +"']");
+        for (var c = 0; c < res.snapshotLength; c++) {
+            elements.push(res.snapshotItem(c));
+        }
+    }
+    return elements;
+}
+
+
 function tb_set_listcontrol_displayValue(token, value) {
     var elem = tb_tokens[token];
     var tagName = elem.tagName;
@@ -434,6 +502,19 @@
             else
                 item.selected = false;
         }
+    } else if (tagName == 'INPUT') {
+        elements = tb_find_listcontrol_elements(token);
+        for (var c = 0; c < elements.length; c++ ) {
+            element = elements[c];
+            var check = false;
+            labels = tb_find_labels(element);
+            for (var li = 0; li < labels.length; li++ ) {
+                if(value.indexOf(labels[li]) > -1 || value == labels[li]) {
+                    check = true;
+                }
+            }
+            element.checked = check;
+        }
     }
 }
 
@@ -451,20 +532,27 @@
         }
     }
     else if (tagName == 'INPUT'){
-        //alert(tagName);
+        var elements = tb_find_listcontrol_elements(token);
+        for (var c = 0; c < elements.length; c++ ) {
+            var element = elements[c];
+            var elemValue = element.getAttribute('value');
+            if (elemValue != null &&
+                (elemValue == value || value.indexOf(elemValue) > -1)) {
+                element.checked = true;
+            }
+            else {
+                element.checked = false;
+            }
+        }
     }
 }
 
 function tb_get_listcontrol_item_tokens(token) {
-    var elem = tb_tokens[token];
-    var tagName = elem.tagName;
     var tokens = new Array();
-    if (tagName == 'SELECT') {
-        var res = tb_xpath('child::option', elem);
-        for (var c = 0; c < res.snapshotLength; c++) {
-            tb_tokens[tb_next_token] = res.snapshotItem(c);
-            tokens.push(tb_next_token++);
-        }
+    var elements = tb_find_listcontrol_elements(token);
+    for (var c = 0; c < elements.length; c++) {
+        tb_tokens[tb_next_token] = elements[c];
+        tokens.push(tb_next_token++);
     }
     return tokens.toSource();
 }



More information about the Checkins mailing list