clone.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. //.CommonJS
  2. var CSSOM = {
  3. CSSStyleSheet: require("./CSSStyleSheet").CSSStyleSheet,
  4. CSSStyleRule: require("./CSSStyleRule").CSSStyleRule,
  5. CSSMediaRule: require("./CSSMediaRule").CSSMediaRule,
  6. CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration
  7. };
  8. ///CommonJS
  9. /**
  10. * Produces a deep copy of stylesheet — the instance variables of stylesheet are copied recursively.
  11. * @param {CSSStyleSheet|CSSOM.CSSStyleSheet} stylesheet
  12. * @nosideeffects
  13. * @return {CSSOM.CSSStyleSheet}
  14. */
  15. CSSOM.clone = function clone(stylesheet) {
  16. var cloned = new CSSOM.CSSStyleSheet;
  17. var rules = stylesheet.cssRules;
  18. if (!rules) {
  19. return cloned;
  20. }
  21. var RULE_TYPES = {
  22. 1: CSSOM.CSSStyleRule,
  23. 4: CSSOM.CSSMediaRule
  24. //FIXME
  25. //3: CSSOM.CSSImportRule,
  26. //5: CSSOM.CSSFontFaceRule,
  27. //6: CSSOM.CSSPageRule,
  28. };
  29. for (var i=0, rulesLength=rules.length; i < rulesLength; i++) {
  30. var rule = rules[i];
  31. var ruleClone = cloned.cssRules[i] = new RULE_TYPES[rule.type];
  32. var style = rule.style;
  33. if (style) {
  34. var styleClone = ruleClone.style = new CSSOM.CSSStyleDeclaration;
  35. for (var j=0, styleLength=style.length; j < styleLength; j++) {
  36. var name = styleClone[j] = style[j];
  37. styleClone[name] = style[name];
  38. styleClone._importants[name] = style.getPropertyPriority(name);
  39. }
  40. styleClone.length = style.length;
  41. }
  42. if ("selectorText" in rule) {
  43. ruleClone.selectorText = rule.selectorText;
  44. }
  45. if ("mediaText" in rule) {
  46. ruleClone.mediaText = rule.mediaText;
  47. }
  48. if ("cssRules" in rule) {
  49. rule.cssRules = clone(rule).cssRules;
  50. }
  51. }
  52. return cloned;
  53. };
  54. //.CommonJS
  55. exports.clone = CSSOM.clone;
  56. ///CommonJS