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

http://datanucleus-appengine.googlecode.com/ · JavaScript · 142 lines · 93 code · 18 blank · 31 comment · 17 complexity · 8c1ea18740916e41a4a3b799f0600661 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. cssQuery.addModule("css-level2", function() {
  7. // -----------------------------------------------------------------------
  8. // selectors
  9. // -----------------------------------------------------------------------
  10. // child selector
  11. selectors[">"] = function($results, $from, $tagName, $namespace) {
  12. var $element, i, j;
  13. for (i = 0; i < $from.length; i++) {
  14. var $subset = childElements($from[i]);
  15. for (j = 0; ($element = $subset[j]); j++)
  16. if (compareTagName($element, $tagName, $namespace))
  17. $results.push($element);
  18. }
  19. };
  20. // sibling selector
  21. selectors["+"] = function($results, $from, $tagName, $namespace) {
  22. for (var i = 0; i < $from.length; i++) {
  23. var $element = nextElementSibling($from[i]);
  24. if ($element && compareTagName($element, $tagName, $namespace))
  25. $results.push($element);
  26. }
  27. };
  28. // attribute selector
  29. selectors["@"] = function($results, $from, $attributeSelectorID) {
  30. var $test = attributeSelectors[$attributeSelectorID].test;
  31. var $element, i;
  32. for (i = 0; ($element = $from[i]); i++)
  33. if ($test($element)) $results.push($element);
  34. };
  35. // -----------------------------------------------------------------------
  36. // pseudo-classes
  37. // -----------------------------------------------------------------------
  38. pseudoClasses["first-child"] = function($element) {
  39. return !previousElementSibling($element);
  40. };
  41. pseudoClasses["lang"] = function($element, $code) {
  42. $code = new RegExp("^" + $code, "i");
  43. while ($element && !$element.getAttribute("lang")) $element = $element.parentNode;
  44. return $element && $code.test($element.getAttribute("lang"));
  45. };
  46. // -----------------------------------------------------------------------
  47. // attribute selectors
  48. // -----------------------------------------------------------------------
  49. // constants
  50. AttributeSelector.NS_IE = /\\:/g;
  51. AttributeSelector.PREFIX = "@";
  52. // properties
  53. AttributeSelector.tests = {};
  54. // methods
  55. AttributeSelector.replace = function($match, $attribute, $namespace, $compare, $value) {
  56. var $key = this.PREFIX + $match;
  57. if (!attributeSelectors[$key]) {
  58. $attribute = this.create($attribute, $compare || "", $value || "");
  59. // store the selector
  60. attributeSelectors[$key] = $attribute;
  61. attributeSelectors.push($attribute);
  62. }
  63. return attributeSelectors[$key].id;
  64. };
  65. AttributeSelector.parse = function($selector) {
  66. $selector = $selector.replace(this.NS_IE, "|");
  67. var $match;
  68. while ($match = $selector.match(this.match)) {
  69. var $replace = this.replace($match[0], $match[1], $match[2], $match[3], $match[4]);
  70. $selector = $selector.replace(this.match, $replace);
  71. }
  72. return $selector;
  73. };
  74. AttributeSelector.create = function($propertyName, $test, $value) {
  75. var $attributeSelector = {};
  76. $attributeSelector.id = this.PREFIX + attributeSelectors.length;
  77. $attributeSelector.name = $propertyName;
  78. $test = this.tests[$test];
  79. $test = $test ? $test(this.getAttribute($propertyName), getText($value)) : false;
  80. $attributeSelector.test = new Function("e", "return " + $test);
  81. return $attributeSelector;
  82. };
  83. AttributeSelector.getAttribute = function($name) {
  84. switch ($name.toLowerCase()) {
  85. case "id":
  86. return "e.id";
  87. case "class":
  88. return "e.className";
  89. case "for":
  90. return "e.htmlFor";
  91. case "href":
  92. if (isMSIE) {
  93. // IE always returns the full path not the fragment in the href attribute
  94. // so we RegExp it out of outerHTML. Opera does the same thing but there
  95. // is no way to get the original attribute.
  96. return "String((e.outerHTML.match(/href=\\x22?([^\\s\\x22]*)\\x22?/)||[])[1]||'')";
  97. }
  98. }
  99. return "e.getAttribute('" + $name.replace($NAMESPACE, ":") + "')";
  100. };
  101. // -----------------------------------------------------------------------
  102. // attribute selector tests
  103. // -----------------------------------------------------------------------
  104. AttributeSelector.tests[""] = function($attribute) {
  105. return $attribute;
  106. };
  107. AttributeSelector.tests["="] = function($attribute, $value) {
  108. return $attribute + "==" + Quote.add($value);
  109. };
  110. AttributeSelector.tests["~="] = function($attribute, $value) {
  111. return "/(^| )" + regEscape($value) + "( |$)/.test(" + $attribute + ")";
  112. };
  113. AttributeSelector.tests["|="] = function($attribute, $value) {
  114. return "/^" + regEscape($value) + "(-|$)/.test(" + $attribute + ")";
  115. };
  116. // -----------------------------------------------------------------------
  117. // parsing
  118. // -----------------------------------------------------------------------
  119. // override parseSelector to parse out attribute selectors
  120. var _parseSelector = parseSelector;
  121. parseSelector = function($selector) {
  122. return _parseSelector(AttributeSelector.parse($selector));
  123. };
  124. }); // addModule