(source)
| 944 | } |
| 945 | |
| 946 | function copyElement(source) { |
| 947 | // Simple values |
| 948 | if (!isObject(source)) { |
| 949 | return source; |
| 950 | } |
| 951 | |
| 952 | // Already copied values |
| 953 | var index = stackSource.indexOf(source); |
| 954 | if (index !== -1) { |
| 955 | return stackDest[index]; |
| 956 | } |
| 957 | |
| 958 | if (isWindow(source) || isScope(source)) { |
| 959 | throw ngMinErr('cpws', |
| 960 | "Can't copy! Making copies of Window or Scope instances is not supported."); |
| 961 | } |
| 962 | |
| 963 | var needsRecurse = false; |
| 964 | var destination; |
| 965 | |
| 966 | if (isArray(source)) { |
| 967 | destination = []; |
| 968 | needsRecurse = true; |
| 969 | } else if (isTypedArray(source)) { |
| 970 | destination = new source.constructor(source); |
| 971 | } else if (isDate(source)) { |
| 972 | destination = new Date(source.getTime()); |
| 973 | } else if (isRegExp(source)) { |
| 974 | destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]); |
| 975 | destination.lastIndex = source.lastIndex; |
| 976 | } else if (isBlob(source)) { |
| 977 | destination = new source.constructor([source], {type: source.type}); |
| 978 | } else if (isFunction(source.cloneNode)) { |
| 979 | destination = source.cloneNode(true); |
| 980 | } else { |
| 981 | destination = Object.create(getPrototypeOf(source)); |
| 982 | needsRecurse = true; |
| 983 | } |
| 984 | |
| 985 | stackSource.push(source); |
| 986 | stackDest.push(destination); |
| 987 | |
| 988 | return needsRecurse |
| 989 | ? copyRecurse(source, destination) |
| 990 | : destination; |
| 991 | } |
| 992 | } |
| 993 | |
| 994 | /** |
no test coverage detected