summaryrefslogtreecommitdiffstats
path: root/install/ui/src/freeipa/_base/construct.js
diff options
context:
space:
mode:
authorPetr Vobornik <pvoborni@redhat.com>2013-04-12 17:19:52 +0200
committerPetr Vobornik <pvoborni@redhat.com>2013-05-06 16:22:25 +0200
commit9f0188684fc970404d660b85e557135d103c3e73 (patch)
treef1788d589e73a14cf53ad4685bdac0993b7f276e /install/ui/src/freeipa/_base/construct.js
parent3b77c63b2acfc36b4f8472018acc2d177c8fd0db (diff)
downloadfreeipa-9f0188684fc970404d660b85e557135d103c3e73.tar.gz
freeipa-9f0188684fc970404d660b85e557135d103c3e73.tar.xz
freeipa-9f0188684fc970404d660b85e557135d103c3e73.zip
Handle built object in spec
https://fedorahosted.org/freeipa/ticket/3235
Diffstat (limited to 'install/ui/src/freeipa/_base/construct.js')
-rw-r--r--install/ui/src/freeipa/_base/construct.js50
1 files changed, 42 insertions, 8 deletions
diff --git a/install/ui/src/freeipa/_base/construct.js b/install/ui/src/freeipa/_base/construct.js
index e44c66b1e..960596da2 100644
--- a/install/ui/src/freeipa/_base/construct.js
+++ b/install/ui/src/freeipa/_base/construct.js
@@ -56,16 +56,50 @@ define(['dojo/_base/declare',
},
/**
- * Creates copy of construction specification
+ * Deep clone.
+ * - does not clone framework objects
+ * - fails on cyclic non-framework objects
*
- * It makes sure that pre_ops, post_ops and spec are new Arrays/Object
+ * based on dojo/_base/lang.clone
+ *
+ * @param {anything} object to clone
*/
- copy_cs: function(org_cs) {
- var cs = lang.mixin({}, org_cs);
- if (cs.spec) cs.spec = lang.mixin({}, cs.spec);
- cs.pre_ops = cs.pre_ops.slice(0);
- cs.post_ops = cs.pre_ops.slice(0);
- return cs;
+ clone: function(src) {
+
+ if(!src || typeof src != "object" || lang.isFunction(src)) {
+ // null, undefined, any non-object, or function
+ return src; // anything
+ }
+ if(src.nodeType && "cloneNode" in src) {
+ // DOM Node
+ return src.cloneNode(true); // Node
+ }
+ if (!construct.is_spec(src)) {
+ // framework object
+ return src;
+ }
+ if (src instanceof Date) {
+ // Date
+ return new Date(src.getTime()); // Date
+ }
+ if (src instanceof RegExp) {
+ // RegExp
+ return new RegExp(src); // RegExp
+ }
+ var r, i, l;
+ if (lang.isArray(src)){
+ // array
+ r = [];
+ for (i = 0, l = src.length; i < l; ++i) {
+ if (i in src){
+ r.push(construct.clone(src[i]));
+ }
+ }
+ } else {
+ // generic objects
+ r = src.constructor ? new src.constructor() : {};
+ }
+ return lang._mixin(r, src, construct.clone);
},
no_cs_for_type_error: function(type) {