diff options
author | Petr Vobornik <pvoborni@redhat.com> | 2013-04-12 17:19:52 +0200 |
---|---|---|
committer | Petr Vobornik <pvoborni@redhat.com> | 2013-05-06 16:22:25 +0200 |
commit | 9f0188684fc970404d660b85e557135d103c3e73 (patch) | |
tree | f1788d589e73a14cf53ad4685bdac0993b7f276e /install/ui/src/freeipa/_base/construct.js | |
parent | 3b77c63b2acfc36b4f8472018acc2d177c8fd0db (diff) | |
download | freeipa-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.js | 50 |
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) { |