/testing/selenium-core/lib/cssQuery/src/cssQuery-level3.js

http://datanucleus-appengine.googlecode.com/ · JavaScript · 150 lines · 93 code · 34 blank · 23 comment · 32 complexity · 19a9a12db544d7de0ee1ea9b6dfe71c9 MD5 · raw file

  1. /*
  2. cssQuery, version 2.0.2 (2005-08-19)
  3. Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/)
  4. License: http://creativecommons.org/licenses/LGPL/2.1/
  5. */
  6. /* Thanks to Bill Edney */
  7. cssQuery.addModule("css-level3", function() {
  8. // -----------------------------------------------------------------------
  9. // selectors
  10. // -----------------------------------------------------------------------
  11. // indirect sibling selector
  12. selectors["~"] = function($results, $from, $tagName, $namespace) {
  13. var $element, i;
  14. for (i = 0; ($element = $from[i]); i++) {
  15. while ($element = nextElementSibling($element)) {
  16. if (compareTagName($element, $tagName, $namespace))
  17. $results.push($element);
  18. }
  19. }
  20. };
  21. // -----------------------------------------------------------------------
  22. // pseudo-classes
  23. // -----------------------------------------------------------------------
  24. // I'm hoping these pseudo-classes are pretty readable. Let me know if
  25. // any need explanation.
  26. pseudoClasses["contains"] = function($element, $text) {
  27. $text = new RegExp(regEscape(getText($text)));
  28. return $text.test(getTextContent($element));
  29. };
  30. pseudoClasses["root"] = function($element) {
  31. return $element == getDocument($element).documentElement;
  32. };
  33. pseudoClasses["empty"] = function($element) {
  34. var $node, i;
  35. for (i = 0; ($node = $element.childNodes[i]); i++) {
  36. if (thisElement($node) || $node.nodeType == 3) return false;
  37. }
  38. return true;
  39. };
  40. pseudoClasses["last-child"] = function($element) {
  41. return !nextElementSibling($element);
  42. };
  43. pseudoClasses["only-child"] = function($element) {
  44. $element = $element.parentNode;
  45. return firstElementChild($element) == lastElementChild($element);
  46. };
  47. pseudoClasses["not"] = function($element, $selector) {
  48. var $negated = cssQuery($selector, getDocument($element));
  49. for (var i = 0; i < $negated.length; i++) {
  50. if ($negated[i] == $element) return false;
  51. }
  52. return true;
  53. };
  54. pseudoClasses["nth-child"] = function($element, $arguments) {
  55. return nthChild($element, $arguments, previousElementSibling);
  56. };
  57. pseudoClasses["nth-last-child"] = function($element, $arguments) {
  58. return nthChild($element, $arguments, nextElementSibling);
  59. };
  60. pseudoClasses["target"] = function($element) {
  61. return $element.id == location.hash.slice(1);
  62. };
  63. // UI element states
  64. pseudoClasses["checked"] = function($element) {
  65. return $element.checked;
  66. };
  67. pseudoClasses["enabled"] = function($element) {
  68. return $element.disabled === false;
  69. };
  70. pseudoClasses["disabled"] = function($element) {
  71. return $element.disabled;
  72. };
  73. pseudoClasses["indeterminate"] = function($element) {
  74. return $element.indeterminate;
  75. };
  76. // -----------------------------------------------------------------------
  77. // attribute selector tests
  78. // -----------------------------------------------------------------------
  79. AttributeSelector.tests["^="] = function($attribute, $value) {
  80. return "/^" + regEscape($value) + "/.test(" + $attribute + ")";
  81. };
  82. AttributeSelector.tests["$="] = function($attribute, $value) {
  83. return "/" + regEscape($value) + "$/.test(" + $attribute + ")";
  84. };
  85. AttributeSelector.tests["*="] = function($attribute, $value) {
  86. return "/" + regEscape($value) + "/.test(" + $attribute + ")";
  87. };
  88. // -----------------------------------------------------------------------
  89. // nth child support (Bill Edney)
  90. // -----------------------------------------------------------------------
  91. function nthChild($element, $arguments, $traverse) {
  92. switch ($arguments) {
  93. case "n": return true;
  94. case "even": $arguments = "2n"; break;
  95. case "odd": $arguments = "2n+1";
  96. }
  97. var $$children = childElements($element.parentNode);
  98. function _checkIndex($index) {
  99. var $index = ($traverse == nextElementSibling) ? $$children.length - $index : $index - 1;
  100. return $$children[$index] == $element;
  101. };
  102. // it was just a number (no "n")
  103. if (!isNaN($arguments)) return _checkIndex($arguments);
  104. $arguments = $arguments.split("n");
  105. var $multiplier = parseInt($arguments[0]);
  106. var $step = parseInt($arguments[1]);
  107. if ((isNaN($multiplier) || $multiplier == 1) && $step == 0) return true;
  108. if ($multiplier == 0 && !isNaN($step)) return _checkIndex($step);
  109. if (isNaN($step)) $step = 0;
  110. var $count = 1;
  111. while ($element = $traverse($element)) $count++;
  112. if (isNaN($multiplier) || $multiplier == 1)
  113. return ($traverse == nextElementSibling) ? ($count <= $step) : ($step >= $count);
  114. return ($count % $multiplier) == $step;
  115. };
  116. }); // addModule