[Checkins] SVN: zc.testbrowser/trunk/src/zc/testbrowser/real. More checkbox-realted hacking:

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


Log message for revision 80135:
  More checkbox-realted hacking:
  - handle the case where a single checkbox makes ListControl produce a single value
  - traces of code to handle input controls for a ListControl
  

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

-=-
Modified: zc.testbrowser/trunk/src/zc/testbrowser/real.js
===================================================================
--- zc.testbrowser/trunk/src/zc/testbrowser/real.js	2007-09-26 20:08:32 UTC (rev 80134)
+++ zc.testbrowser/trunk/src/zc/testbrowser/real.js	2007-09-26 20:15:10 UTC (rev 80135)
@@ -149,8 +149,6 @@
     var changed = false;
     if ((input.checked && !checked) || (!input.checked && checked))
         changed = true;
-    input.checked = checked;
-
     if (changed) {
         var evt = input.ownerDocument.createEvent('MouseEvents');
         evt.initMouseEvent('click', true, true,
@@ -159,8 +157,22 @@
                            0, null);
         input.dispatchEvent(evt);
     }
+    type = input.getAttribute('type');
+    value = input.getAttribute('value')
+    if (type == 'checkbox' && value == null) {
+        input.setAttribute('value', 'on');
+    }
 }
 
+function tb_get_checked(token) {
+    var input = tb_tokens[token];
+    var tagName = input.tagName;
+    if (tagName == 'OPTION') {
+        return input.selected;
+    }
+    return input.checked;
+}
+
 function tb_get_link_text(token) {
     return tb_normalize_whitespace(tb_tokens[token].textContent);
 }
@@ -290,10 +302,12 @@
                            "'][@type='"+typeName+"']", elem);
         for (var c = 0; c < res.snapshotLength; c++) {
             var item = res.snapshotItem(c);
-            if (!item.hasAttribute('value'))
+            if (item.hasAttribute('value') && (typeName != 'checkbox')) {
+                options.push(item.getAttribute('value'));
+            }
+            else {
                 options.push(true);
-            else
-                options.push(item.getAttribute('value'));
+            }
         }
     }
     return options.toSource();
@@ -312,21 +326,24 @@
             else
                 options.push(item.textContent);
         }
-    } else if (tagName == 'INPUT') {
-        var res = tb_xpath("//label[@for='" + elem.id + "']", elem);
-        for (var c = 0; c < res.snapshotLength; c++) {
-            var item = res.snapshotItem(c);
-            options.push(item.textContent);
-        }
     }
 
     return options.toSource();
 }
 
-function tb_listcontrol_has_multiple(token, name, typeName) {
+function tb_act_as_single(token) {
+    elem = tb_tokens[token]
+    tagName = elem.tagName
+    if (tagName == 'INPUT') {
+        typeName = elem.getAttribute('type');
+        var elem = tb_tokens[token];
+        var res = tb_xpath("//input[@name='" + elem.getAttribute('name') +
+                           "'][@type='"+typeName+"']", elem);
+        return res.snapshotLength < 2;
+    }
+    return false;
 }
 
-
 function tb_is_listcontrol_multiple(token) {
     elem = tb_tokens[token]
     tagName = elem.tagName
@@ -337,7 +354,7 @@
     else if (tagName == 'INPUT') {
         typeName = elem.getAttribute('type');
         var elem = tb_tokens[token];
-        var res = tb_xpath("//input[@name='" + name +
+        var res = tb_xpath("//input[@name='" + elem.getAttribute('name') +
                            "'][@type='"+typeName+"']", elem);
         return res.snapshotLength > 0;
     }
@@ -389,6 +406,17 @@
                     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);
+            if (item.checked) {
+                options.push()
+            }
+        }
     }
     return options.toSource();
 }
@@ -396,7 +424,6 @@
 function tb_set_listcontrol_displayValue(token, value) {
     var elem = tb_tokens[token];
     var tagName = elem.tagName;
-    var options = new Array();
     if (tagName == 'SELECT') {
         var res = tb_xpath('child::option', elem)
         for (var c = 0; c < res.snapshotLength; c++) {
@@ -408,13 +435,11 @@
                 item.selected = false;
         }
     }
-    return options.toSource();
 }
 
 function tb_set_listcontrol_value(token, value) {
     var elem = tb_tokens[token];
     var tagName = elem.tagName;
-    var options = new Array();
     if (tagName == 'SELECT') {
         var res = tb_xpath('child::option', elem)
         for (var c = 0; c < res.snapshotLength; c++) {
@@ -425,7 +450,9 @@
                 item.selected = false;
         }
     }
-    return options.toSource();
+    else if (tagName == 'INPUT'){
+        //alert(tagName);
+    }
 }
 
 function tb_get_listcontrol_item_tokens(token) {

Modified: zc.testbrowser/trunk/src/zc/testbrowser/real.py
===================================================================
--- zc.testbrowser/trunk/src/zc/testbrowser/real.py	2007-09-26 20:08:32 UTC (rev 80134)
+++ zc.testbrowser/trunk/src/zc/testbrowser/real.py	2007-09-26 20:15:10 UTC (rev 80135)
@@ -469,6 +469,11 @@
                 self.token, simplejson.dumps(value)) )
         return property(fget, fset)
 
+    @property
+    def acts_as_single(self):
+        return simplejson.loads(self.browser.execute(
+            'tb_act_as_single(%s)' % (self.token)))
+
     @apply
     def value():
         def fget(self):
@@ -476,14 +481,27 @@
                 'tb_get_listcontrol_value(%r)' % self.token)
 
             v = [option for option in simplejson.loads(options)]
+
+            if self.acts_as_single:
+                return v[0]
+
             return v
 
         def fset(self, value):
             if self._browser_counter != self.browser._counter:
                 raise zc.testbrowser.interfaces.ExpiredError
-            self.browser.execute(
-                'tb_set_listcontrol_value(%r, %s)' % (
-                self.token, simplejson.dumps(value)) )
+
+            if self.acts_as_single:
+                # expects a single value
+                self.browser.execute('tb_set_checked(%s, %s)' %
+                                     (self.token, simplejson.dumps(bool(value))))
+                #raise NotImplementedError
+            else:
+                # expects a list of control ids
+                self.browser.execute(
+                    'tb_set_listcontrol_value(%r, %s)' % (
+                    self.token, simplejson.dumps(value)) )
+
         return property(fget, fset)
 
     @property
@@ -576,22 +594,15 @@
     def selected():
 
         def fget(self):
-            tagName = self.browser.execute(
-                'tb_tokens[%s].tagName' % self.token)
-            if tagName == 'OPTION':
-                return self.browser.execute(
-                    'tb_tokens[%s].selected' % self.token) == 'true'
-            return self.browser.execute(
-                'tb_tokens[%s].checked' % self.token) == 'true'
+            return simplejson.loads(self.browser.execute(
+                'tb_get_checked(%s)' % self.token))
+            return False
 
         def fset(self, value):
             if self._browser_counter != self.browser._counter:
                 raise zc.testbrowser.interfaces.ExpiredError
-            checked = 'false'
-            if value:
-                checked = 'true'
             self.browser.execute('tb_set_checked(%s, %s)' %
-                                 (self.token, checked))
+                                 (self.token, simplejson.dumps(bool(value))))
 
         return property(fget, fset)
 
@@ -602,7 +613,6 @@
 
         if not v and self.selected:
             v = 'on'
-
         return v
 
     def click(self):



More information about the Checkins mailing list