Ticket 1054

--
Endi S. Dewata
From 1405a36a1669f0493b22f7d7de1192896aabba48 Mon Sep 17 00:00:00 2001
From: Endi S. Dewata <edew...@redhat.com>
Date: Mon, 7 Mar 2011 12:35:11 -0600
Subject: [PATCH] Fixed memory leak caused by certificate dialogs.

Ticket 1054
---
 install/ui/certificate.js |  451 ++++++++++++++++++++-------------------------
 install/ui/dialog.js      |    7 +-
 2 files changed, 205 insertions(+), 253 deletions(-)

diff --git a/install/ui/certificate.js b/install/ui/certificate.js
index c5de56c1f461ee5865a53e3762aee2081093c503..fea7448cde8cf80739aee05397100238d59c8437 100755
--- a/install/ui/certificate.js
+++ b/install/ui/certificate.js
@@ -78,39 +78,27 @@ IPA.cert.get_dialog = function(spec) {
 
     spec = spec || {};
 
-    var that = {};
+    var that = IPA.dialog(spec);
+
+    that.width = spec.width || 500;
+    that.height = spec.height || 400;
 
-    that.title = spec.title || '';
     that.usercertificate = spec.usercertificate || '';
 
-    var dialog = $('<div/>', {
-        'title': that.title
+    that.add_button(IPA.messages.buttons.close, function() {
+        that.close();
     });
 
-    var textarea = $('<textarea/>', {
-        readonly: 'yes',
-        style: 'width: 100%; height: 275px;'
-    }).appendTo(dialog);
-
-    textarea.val(
-        IPA.cert.BEGIN_CERTIFICATE+'\n'+
-        that.usercertificate+'\n'+
-        IPA.cert.END_CERTIFICATE);
-
-    that.open = function() {
-
-        var buttons = {};
-
-        buttons[IPA.messages.buttons.close] = function() {
-            dialog.dialog('destroy');
-        };
-
-        dialog.dialog({
-            modal: true,
-            width: 500,
-            height: 400,
-            buttons: buttons
-        });
+    that.create = function() {
+        var textarea = $('<textarea/>', {
+            readonly: 'yes',
+            style: 'width: 100%; height: 275px;'
+        }).appendTo(that.container);
+
+        textarea.val(
+            IPA.cert.BEGIN_CERTIFICATE+'\n'+
+            that.usercertificate+'\n'+
+            IPA.cert.END_CERTIFICATE);
     };
 
     return that;
@@ -120,64 +108,53 @@ IPA.cert.revoke_dialog = function(spec) {
 
     spec = spec || {};
 
-    var that = {};
+    var that = IPA.dialog(spec);
+
+    that.width = spec.width || 500;
+    that.height = spec.height || 300;
 
-    that.title = spec.title || '';
     that.revoke = spec.revoke;
 
-    var dialog = $('<div/>', {
-        'title': that.title
+    that.add_button(IPA.messages.buttons.revoke, function() {
+        var values = {};
+        values['reason'] = that.select.val();
+        if (that.revoke) {
+            that.revoke(values);
+        }
+        that.close();
     });
 
-    var table = $('<table/>').appendTo(dialog);
-
-    var tr = $('<tr/>').appendTo(table);
-
-    var td = $('<td/>').appendTo(tr);
-    td.append(IPA.messages.objects.cert.note+':');
-
-    td = $('<td/>').appendTo(tr);
-    td.append(IPA.messages.objects.cert.revoke_confirmation);
+    that.add_button(IPA.messages.buttons.cancel, function() {
+        that.close();
+    });
 
-    tr = $('<tr/>').appendTo(table);
+    that.create = function() {
 
-    td = $('<td/>').appendTo(tr);
-    td.append(IPA.messages.objects.cert.reason+':');
+        var table = $('<table/>').appendTo(that.container);
 
-    td = $('<td/>').appendTo(tr);
+        var tr = $('<tr/>').appendTo(table);
 
-    var select = $('<select/>').appendTo(td);
-    for (var i=0; i<IPA.cert.CRL_REASON.length; i++) {
-        if (!IPA.cert.CRL_REASON[i]) continue;
-        $('<option/>', {
-            'value': i,
-            'html': IPA.cert.CRL_REASON[i]
-        }).appendTo(select);
-    }
+        var td = $('<td/>').appendTo(tr);
+        td.append(IPA.messages.objects.cert.note+':');
 
-    that.open = function() {
+        td = $('<td/>').appendTo(tr);
+        td.append(IPA.messages.objects.cert.revoke_confirmation);
 
-        var buttons = {};
+        tr = $('<tr/>').appendTo(table);
 
-        buttons[IPA.messages.buttons.revoke] = function() {
-            var values = {};
-            values['reason'] = select.val();
-            if (that.revoke) {
-                that.revoke(values);
-            }
-            dialog.dialog('destroy');
-        };
+        td = $('<td/>').appendTo(tr);
+        td.append(IPA.messages.objects.cert.reason+':');
 
-        buttons[IPA.messages.buttons.cancel] = function() {
-            dialog.dialog('destroy');
-        };
+        td = $('<td/>').appendTo(tr);
 
-        dialog.dialog({
-            modal: true,
-            width: 500,
-            height: 300,
-            buttons: buttons
-        });
+        that.select = $('<select/>').appendTo(td);
+        for (var i=0; i<IPA.cert.CRL_REASON.length; i++) {
+            if (!IPA.cert.CRL_REASON[i]) continue;
+            $('<option/>', {
+                'value': i,
+                'html': IPA.cert.CRL_REASON[i]
+            }).appendTo(that.select);
+        }
     };
 
     return that;
@@ -187,40 +164,28 @@ IPA.cert.restore_dialog = function(spec) {
 
     spec = spec || {};
 
-    var that = {};
+    var that = IPA.dialog(spec);
+
+    that.width = spec.width || 400;
+    that.height = spec.height || 200;
 
-    that.title = spec.title || '';
     that.restore = spec.restore;
 
-    var dialog = $('<div/>', {
-        'title': that.title
+    that.add_button(IPA.messages.buttons.restore, function() {
+        var values = {};
+        if (that.restore) {
+            that.restore(values);
+        }
+        that.close();
     });
 
-    dialog.append(
-        IPA.messages.objects.cert.restore_confirmation);
-
-    that.open = function() {
-
-        var buttons = {};
-
-        buttons[IPA.messages.buttons.restore] = function() {
-            var values = {};
-            if (that.restore) {
-                that.restore(values);
-            }
-            dialog.dialog('destroy');
-        };
-
-        buttons[IPA.messages.buttons.cancel] = function() {
-            dialog.dialog('destroy');
-        };
+    that.add_button(IPA.messages.buttons.cancel, function() {
+        that.close();
+    });
 
-        dialog.dialog({
-            modal: true,
-            width: 400,
-            height: 200,
-            buttons: buttons
-        });
+    that.create = function() {
+        that.container.append(
+            IPA.messages.objects.cert.restore_confirmation);
     };
 
     return that;
@@ -230,9 +195,11 @@ IPA.cert.view_dialog = function(spec) {
 
     spec = spec || {};
 
-    var that = {};
+    var that = IPA.dialog(spec);
+
+    that.width = spec.width || 600;
+    that.height = spec.height || 500;
 
-    that.title = spec.title || '';
     that.subject = IPA.cert.parse_dn(spec.subject);
     that.serial_number = spec.serial_number || '';
     that.issuer = IPA.cert.parse_dn(spec.issuer);
@@ -241,116 +208,103 @@ IPA.cert.view_dialog = function(spec) {
     that.md5_fingerprint = spec.md5_fingerprint || '';
     that.sha1_fingerprint = spec.sha1_fingerprint || '';
 
-    var dialog = $('<div/>', {
-        'title': that.title
+    that.add_button(IPA.messages.buttons.close, function() {
+        that.close();
     });
 
-    var table = $('<table/>').appendTo(dialog);
-
-    var tr = $('<tr/>').appendTo(table);
-    $('<td/>', {
-        'colspan': 2,
-        'html': '<h3>'+IPA.messages.objects.cert.issued_to+'</h3>'
-    }).appendTo(tr);
-
-    tr = $('<tr/>').appendTo(table);
-    $('<td>'+IPA.messages.objects.cert.common_name+':</td>').appendTo(tr);
-    $('<td/>', {
-        'html': that.subject.cn
-    }).appendTo(tr);
-
-    tr = $('<tr/>').appendTo(table);
-    $('<td>'+IPA.messages.objects.cert.organization+':</td>').appendTo(tr);
-    $('<td/>', {
-        'html': that.subject.o
-    }).appendTo(tr);
-
-    tr = $('<tr/>').appendTo(table);
-    $('<td>'+IPA.messages.objects.cert.organizational_unit+':</td>').appendTo(tr);
-    $('<td/>', {
-        'html': that.subject.ou
-    }).appendTo(tr);
-
-    tr = $('<tr/>').appendTo(table);
-    $('<td>'+IPA.messages.objects.cert.serial_number+':</td>').appendTo(tr);
-    $('<td/>', {
-        'html': that.serial_number
-    }).appendTo(tr);
-
-    tr = $('<tr/>').appendTo(table);
-    $('<td/>', {
-        'colspan': 2,
-        'html': '<h3>'+IPA.messages.objects.cert.issued_by+'</h3>'
-    }).appendTo(tr);
-
-    tr = $('<tr/>').appendTo(table);
-    $('<td>'+IPA.messages.objects.cert.common_name+':</td>').appendTo(tr);
-    $('<td/>', {
-        'html': that.issuer.cn
-    }).appendTo(tr);
-
-    tr = $('<tr/>').appendTo(table);
-    $('<td>'+IPA.messages.objects.cert.organization+':</td>').appendTo(tr);
-    $('<td/>', {
-        'html': that.issuer.o
-    }).appendTo(tr);
-
-    tr = $('<tr/>').appendTo(table);
-    $('<td>'+IPA.messages.objects.cert.organizational_unit+':</td>').appendTo(tr);
-    $('<td/>', {
-        'html': that.issuer.ou
-    }).appendTo(tr);
-
-    tr = $('<tr/>').appendTo(table);
-    $('<td/>', {
-        'colspan': 2,
-        'html': '<h3>'+IPA.messages.objects.cert.validity+'</h3>'
-    }).appendTo(tr);
-
-    tr = $('<tr/>').appendTo(table);
-    $('<td>'+IPA.messages.objects.cert.issued_on+':</td>').appendTo(tr);
-    $('<td/>', {
-        'html': that.issued_on
-    }).appendTo(tr);
-
-    tr = $('<tr/>').appendTo(table);
-    $('<td>'+IPA.messages.objects.cert.expires_on+':</td>').appendTo(tr);
-    $('<td/>', {
-        'html': that.expires_on
-    }).appendTo(tr);
-
-    tr = $('<tr/>').appendTo(table);
-    $('<td/>', {
-        'colspan': 2,
-        'html': '<h3>'+IPA.messages.objects.cert.fingerprints+'</h3>'
-    }).appendTo(tr);
-
-    tr = $('<tr/>').appendTo(table);
-    $('<td>'+IPA.messages.objects.cert.sha1_fingerprint+':</td>').appendTo(tr);
-    $('<td/>', {
-        'html': that.sha1_fingerprint
-    }).appendTo(tr);
-
-    tr = $('<tr/>').appendTo(table);
-    $('<td>'+IPA.messages.objects.cert.md5_fingerprint+':</td>').appendTo(tr);
-    $('<td/>', {
-        'html': that.md5_fingerprint
-    }).appendTo(tr);
-
-    that.open = function() {
-
-        var buttons = {};
-
-        buttons[IPA.messages.buttons.close] = function() {
-            dialog.dialog('destroy');
-        };
-
-        dialog.dialog({
-            modal: true,
-            width: 600,
-            height: 500,
-            buttons: buttons
-        });
+    that.create = function() {
+
+        var table = $('<table/>').appendTo(that.container);
+
+        var tr = $('<tr/>').appendTo(table);
+        $('<td/>', {
+            'colspan': 2,
+            'html': '<h3>'+IPA.messages.objects.cert.issued_to+'</h3>'
+        }).appendTo(tr);
+
+        tr = $('<tr/>').appendTo(table);
+        $('<td>'+IPA.messages.objects.cert.common_name+':</td>').appendTo(tr);
+        $('<td/>', {
+            'html': that.subject.cn
+        }).appendTo(tr);
+
+        tr = $('<tr/>').appendTo(table);
+        $('<td>'+IPA.messages.objects.cert.organization+':</td>').appendTo(tr);
+        $('<td/>', {
+            'html': that.subject.o
+        }).appendTo(tr);
+
+        tr = $('<tr/>').appendTo(table);
+        $('<td>'+IPA.messages.objects.cert.organizational_unit+':</td>').appendTo(tr);
+        $('<td/>', {
+            'html': that.subject.ou
+        }).appendTo(tr);
+
+        tr = $('<tr/>').appendTo(table);
+        $('<td>'+IPA.messages.objects.cert.serial_number+':</td>').appendTo(tr);
+        $('<td/>', {
+            'html': that.serial_number
+        }).appendTo(tr);
+
+        tr = $('<tr/>').appendTo(table);
+        $('<td/>', {
+            'colspan': 2,
+            'html': '<h3>'+IPA.messages.objects.cert.issued_by+'</h3>'
+        }).appendTo(tr);
+
+        tr = $('<tr/>').appendTo(table);
+        $('<td>'+IPA.messages.objects.cert.common_name+':</td>').appendTo(tr);
+        $('<td/>', {
+            'html': that.issuer.cn
+        }).appendTo(tr);
+
+        tr = $('<tr/>').appendTo(table);
+        $('<td>'+IPA.messages.objects.cert.organization+':</td>').appendTo(tr);
+        $('<td/>', {
+            'html': that.issuer.o
+        }).appendTo(tr);
+
+        tr = $('<tr/>').appendTo(table);
+        $('<td>'+IPA.messages.objects.cert.organizational_unit+':</td>').appendTo(tr);
+        $('<td/>', {
+            'html': that.issuer.ou
+        }).appendTo(tr);
+
+        tr = $('<tr/>').appendTo(table);
+        $('<td/>', {
+            'colspan': 2,
+            'html': '<h3>'+IPA.messages.objects.cert.validity+'</h3>'
+        }).appendTo(tr);
+
+        tr = $('<tr/>').appendTo(table);
+        $('<td>'+IPA.messages.objects.cert.issued_on+':</td>').appendTo(tr);
+        $('<td/>', {
+            'html': that.issued_on
+        }).appendTo(tr);
+
+        tr = $('<tr/>').appendTo(table);
+        $('<td>'+IPA.messages.objects.cert.expires_on+':</td>').appendTo(tr);
+        $('<td/>', {
+            'html': that.expires_on
+        }).appendTo(tr);
+
+        tr = $('<tr/>').appendTo(table);
+        $('<td/>', {
+            'colspan': 2,
+            'html': '<h3>'+IPA.messages.objects.cert.fingerprints+'</h3>'
+        }).appendTo(tr);
+
+        tr = $('<tr/>').appendTo(table);
+        $('<td>'+IPA.messages.objects.cert.sha1_fingerprint+':</td>').appendTo(tr);
+        $('<td/>', {
+            'html': that.sha1_fingerprint
+        }).appendTo(tr);
+
+        tr = $('<tr/>').appendTo(table);
+        $('<td>'+IPA.messages.objects.cert.md5_fingerprint+':</td>').appendTo(tr);
+        $('<td/>', {
+            'html': that.md5_fingerprint
+        }).appendTo(tr);
     };
 
     return that;
@@ -360,57 +314,45 @@ IPA.cert.request_dialog = function(spec) {
 
     spec = spec || {};
 
-    var that = {};
+    var that = IPA.dialog(spec);
+
+    that.width = spec.width || 500;
+    that.height = spec.height || 400;
 
-    that.title = spec.title || '';
     that.request = spec.request;
 
-    var dialog = $('<div/>', {
-        'title': that.title
+    that.add_button(IPA.messages.buttons.issue, function() {
+        var values = {};
+        var request = that.textarea.val();
+        request =
+            IPA.cert.BEGIN_CERTIFICATE_REQUEST+'\n'+
+            $.trim(request)+'\n'+
+            IPA.cert.END_CERTIFICATE_REQUEST+'\n';
+        values['request'] = request;
+        if (that.request) {
+            that.request(values);
+        }
+        that.close();
     });
 
-    dialog.append(IPA.messages.objects.cert.enter_csr+':');
-    dialog.append('<br/>');
-    dialog.append('<br/>');
-
-    dialog.append(IPA.cert.BEGIN_CERTIFICATE_REQUEST);
-    dialog.append('<br/>');
-
-    var textarea = $('<textarea/>', {
-        style: 'width: 100%; height: 225px;'
-    }).appendTo(dialog);
-
-    dialog.append('<br/>');
-    dialog.append(IPA.cert.END_CERTIFICATE_REQUEST);
-
-    that.open = function() {
+    that.add_button(IPA.messages.buttons.cancel, function() {
+        that.close();
+    });
 
-        var buttons = {};
+    that.create = function() {
+        that.container.append(IPA.messages.objects.cert.enter_csr+':');
+        that.container.append('<br/>');
+        that.container.append('<br/>');
 
-        buttons[IPA.messages.buttons.issue] = function() {
-            var values = {};
-            var request = textarea.val();
-            request =
-                IPA.cert.BEGIN_CERTIFICATE_REQUEST+'\n'+
-                $.trim(request)+'\n'+
-                IPA.cert.END_CERTIFICATE_REQUEST+'\n';
-            values['request'] = request;
-            if (that.request) {
-                that.request(values);
-            }
-            dialog.dialog('destroy');
-        };
+        that.container.append(IPA.cert.BEGIN_CERTIFICATE_REQUEST);
+        that.container.append('<br/>');
 
-        buttons[IPA.messages.buttons.cancel] = function() {
-            dialog.dialog('destroy');
-        };
+        that.textarea = $('<textarea/>', {
+            style: 'width: 100%; height: 225px;'
+        }).appendTo(that.container);
 
-        dialog.dialog({
-            modal: true,
-            width: 500,
-            height: 400,
-            buttons: buttons
-        });
+        that.container.append('<br/>');
+        that.container.append(IPA.cert.END_CERTIFICATE_REQUEST);
     };
 
     return that;
@@ -703,6 +645,7 @@ IPA.cert.status_widget = function(spec) {
             'sha1_fingerprint': result['sha1_fingerprint']
         });
 
+        dialog.init();
         dialog.open();
     }
 
@@ -725,6 +668,7 @@ IPA.cert.status_widget = function(spec) {
             'usercertificate': entity_certificate
         });
 
+        dialog.init();
         dialog.open();
     }
 
@@ -755,6 +699,7 @@ IPA.cert.status_widget = function(spec) {
             }
         });
 
+        dialog.init();
         dialog.open();
     }
 
@@ -791,6 +736,7 @@ IPA.cert.status_widget = function(spec) {
             }
         });
 
+        dialog.init();
         dialog.open();
     }
 
@@ -823,6 +769,7 @@ IPA.cert.status_widget = function(spec) {
             }
         });
 
+        dialog.init();
         dialog.open();
     }
 
diff --git a/install/ui/dialog.js b/install/ui/dialog.js
index c3efc25a8ee1eb157334bd5779fe802f44e5e32b..1b2f3192ab440c74d5ee3cf3b0846e6922ba1252 100644
--- a/install/ui/dialog.js
+++ b/install/ui/dialog.js
@@ -36,6 +36,7 @@ IPA.dialog = function(spec) {
     that._entity_name = spec.entity_name;
 
     that.width = spec.width || '400px';
+    that.height = spec.height;
 
     that.buttons = {};
 
@@ -173,7 +174,11 @@ IPA.dialog = function(spec) {
      */
     that.open = function(container) {
 
-        that.container = $('<div/>').appendTo(container);
+        that.container = $('<div/>');
+
+        if (container) {
+            container.append(that.container);
+        }
 
         if (that.template) {
             var template = IPA.get_template(that.template);
-- 
1.6.6.1

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to