From d00ed79599fcd755ada4ce5e787bed7ec66ba2dc Mon Sep 17 00:00:00 2001
From: Shane Tomlinson <stomlinson@mozilla.com>
Date: Tue, 13 Dec 2011 15:15:03 +0000
Subject: [PATCH] Only attempt to close the channel if a channel is established
 to a relay frame.

close #748
---
 resources/static/dialog/resources/channel.js  | 42 +++++++++----------
 .../qunit/controllers/dialog_unit_test.js     |  2 +-
 .../test/qunit/resources/channel_unit_test.js | 13 ++++++
 3 files changed, 33 insertions(+), 24 deletions(-)

diff --git a/resources/static/dialog/resources/channel.js b/resources/static/dialog/resources/channel.js
index b8ba0f92c..a2dad83d7 100644
--- a/resources/static/dialog/resources/channel.js
+++ b/resources/static/dialog/resources/channel.js
@@ -90,24 +90,24 @@
       // In a native channel, do nothing.
     }
     else {
-      var REGISTERED_METHODS = {
-        'get': function(origin, params, onsuccess, onerror) {
-          // check for old controller methods
-          // FIXME KILL THIS SOON
-          if (controller.get) {
-            return controller.get(origin, params, onsuccess, onerror);
-          } else {
-            return controller.getVerifiedEmail(origin, onsuccess, onerror);
+     getRelayWindow();
+
+      if (_relayWindow) {
+        var REGISTERED_METHODS = {
+          // The relay frame will give us the origin and a function to call when
+          // dialog processing is complete.
+          'get': function(origin, params, onsuccess, onerror) {
+            // check for old controller methods
+            // FIXME KILL THIS SOON
+            if (controller.get) {
+              return controller.get(origin, params, onsuccess, onerror);
+            } else {
+              return controller.getVerifiedEmail(origin, onsuccess, onerror);
+            }
           }
-        }
-      };
+        };
 
-      // The relay frame will give us the origin and a function to call when
-      // dialog processing is complete.
-      var frameWindow = getRelayWindow();
-
-      if (frameWindow) {
-        frameWindow.BrowserID.Relay.registerClient(REGISTERED_METHODS);
+        _relayWindow.BrowserID.Relay.registerClient(REGISTERED_METHODS);
       }
       else {
         throw "relay frame not found";
@@ -123,15 +123,11 @@
   }
 
   function close() {
-    var frameWindow = getRelayWindow();
-
-    if (frameWindow) {
-      frameWindow.BrowserID.Relay.unregisterClient();
+    // Only tear down if a channel has been established with a relay frame.
+    if (_relayWindow) {
+      _relayWindow.BrowserID.Relay.unregisterClient();
       _relayWindow = null;
     }
-    else {
-      throw "relay frame not found";
-    }
   }
 
   function init(options) {
diff --git a/resources/static/test/qunit/controllers/dialog_unit_test.js b/resources/static/test/qunit/controllers/dialog_unit_test.js
index 23941014f..e6c2ea1a6 100644
--- a/resources/static/test/qunit/controllers/dialog_unit_test.js
+++ b/resources/static/test/qunit/controllers/dialog_unit_test.js
@@ -204,7 +204,7 @@
       error = e;
     }
 
-    equal(typeof error, "undefined", "no error thrown when unloading window");
+    equal(typeof error, "undefined", "unexpected error thrown when unloading window (" + error + ")");
   });
 
 }());
diff --git a/resources/static/test/qunit/resources/channel_unit_test.js b/resources/static/test/qunit/resources/channel_unit_test.js
index 878f2acbe..6caff0449 100644
--- a/resources/static/test/qunit/resources/channel_unit_test.js
+++ b/resources/static/test/qunit/resources/channel_unit_test.js
@@ -159,5 +159,18 @@
     }
   });
 
+  test("close on a channel that has not been opened expects no errors", function() {
+    var error;
+
+    try {
+      channel.close();
+    }
+    catch(e) {
+      error = e;
+    }
+
+    equal(typeof error, "undefined", "unexpected error when closing channel (" + error + ")");
+  });
+
 }());
 
-- 
GitLab