Index: chrome/ext/common.js
===================================================================
--- a/chrome/ext/common.js
+++ b/chrome/ext/common.js
@@ -17,99 +17,48 @@
 
 (function()
 {
-  /* Events */
+  /* Message passing */
 
-  SimpleEventTarget = function()
+  var sendMessage;
+  if ("runtime" in chrome && "sendMessage" in chrome.runtime)
+    sendMessage = chrome.runtime.sendMessage;
+  else if ("sendMessage" in chrome.extension)
+    sendMessage = chrome.extension.sendMessage;
+  else
+    sendMessage = chrome.extension.sendRequest;
+
+  ext._setupMessageListener = function(wrapSender)
   {
-    this._listeners = [];
+    var onMessage;
+    if ("runtime" in chrome && "onMessage" in chrome.runtime)
+      onMessage = chrome.runtime.onMessage;
+    else if ("onMessage" in chrome.extension)
+      onMessage = chrome.extension.onMessage;
+    else
+      onMessage = chrome.extension.onRequest;
+
+    onMessage.addListener(function(message, sender, sendResponse)
+    {
+      ext.onMessage._dispatch(message, wrapSender(sender), sendResponse);
+    });
   };
-  SimpleEventTarget.prototype = {
-    _onListenerAdded: function(listener, idx) {},
-    _onListenerRemoved: function(listener, idx) {},
 
-    addListener: function(listener)
+  ext.onMessage = new ext._EventTarget();
+
+
+  /* Background page */
+
+  ext.backgroundPage = {
+    sendMessage: sendMessage,
+    getWindow: function()
     {
-      var idx = this._listeners.push(listener) - 1;
-      this._onListenerAdded(listener, idx);
-    },
-    removeListener: function(listener)
-    {
-      var idx = this._listeners.indexOf(listener);
-      if (idx != -1)
-      {
-        this._listeners.splice(idx, 1);
-        this._onListenerRemoved(listener, idx);
-      }
+      return chrome.extension.getBackgroundPage();
     }
   };
 
-  WrappedEventTarget = function(target)
-  {
-    SimpleEventTarget.call(this);
 
-    this._wrappedListeners = [];
-    this._target = target;
-  };
-  WrappedEventTarget.prototype = {
-    __proto__: SimpleEventTarget.prototype,
-    _onListenerAdded: function(listener, idx)
-    {
-      var wrappedListener = this._wrapListener(listener);
+  /* Utils */
 
-      this._wrappedListeners[idx] = wrappedListener;
-      this._target.addListener.call(this._target, wrappedListener);
-    },
-    _onListenerRemoved: function(listener, idx)
-    {
-      this._target.removeListener(this._wrappedListeners[idx]);
-      this._wrappedListeners.splice(idx, 1);
-    }
-  };
-
-  MessageEventTarget = function()
-  {
-    var target;
-    if ("runtime" in chrome && "onMessage" in chrome.runtime)
-      target = chrome.runtime.onMessage;
-    else if ("onMessage" in chrome.extension)
-      target = chrome.extension.onMessage;
-    else
-      target = chrome.extension.onRequest;
-    WrappedEventTarget.call(this, target);
-  };
-  MessageEventTarget.prototype = {
-    __proto__: WrappedEventTarget.prototype,
-    _wrapSender: function(sender)
-    {
-      return {};
-    },
-    _wrapListener: function(listener)
-    {
-      return function(message, sender, sendResponse)
-      {
-        return listener(message, this._wrapSender(sender), sendResponse);
-      }.bind(this);
-    }
-  };
-
-
-  /* API */
-
-  ext = {
-    backgroundPage: {
-      getWindow: function()
-      {
-        return chrome.extension.getBackgroundPage();
-      }
-    },
-    getURL: chrome.extension.getURL,
-    i18n: chrome.i18n
-  };
-
-  if ("runtime" in chrome && "sendMessage" in chrome.runtime)
-    ext.backgroundPage.sendMessage = chrome.runtime.sendMessage;
-  else if ("sendMessage" in chrome.extension)
-    ext.backgroundPage.sendMessage = chrome.extension.sendMessage;
-  else
-    ext.backgroundPage.sendMessage = chrome.extension.sendRequest;
+  ext.getURL = chrome.extension.getURL;
+  ext.i18n = chrome.i18n;
 })();
