changeset 3:017106cf4c79

Weave's util.js can now be imported.
author Atul Varma <varmaa@toolness.com>
date Wed, 08 Apr 2009 16:59:52 -0700
parents e8416415be29
children 760cb3aa1a01
files jsm-in-web.js
diffstat 1 files changed, 63 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/jsm-in-web.js	Wed Apr 08 16:16:48 2009 -0700
+++ b/jsm-in-web.js	Wed Apr 08 16:59:52 2009 -0700
@@ -23,16 +23,13 @@
 
   function getCodeForJsModule(url, cb) {
     var realUri = resourceMapper(url);
-    if (realUri)
-      jQuery.get(
-        realUri,
-        function(code) {
-          code = code.replace(/Components/g, "FakeComponents");
-          cb(code);
-        }
-      );
-    else
-      cb("/* No code for " + url + "*/");
+    jQuery.get(
+      realUri,
+      function(code) {
+        code = code.replace(/Components/g, "FakeComponents");
+        cb(code);
+      }
+    );
   }
 
   function findDependencies(code) {
@@ -45,17 +42,45 @@
     return dependencies;
   }
 
-  self.fetch = function fetch(url, cb) {
+  self.import = function JSMR_import(url, obj) {
+    //console.log("Importing " + url);
+    var module = modules[url];
+
+    if (!module)
+      throw new Error("Module at url not fetched: " + url);
+
+    if (!module.hasBeenImported) {
+      //console.log("Evaluating code for " + url);
+      module.window.eval(module.code);
+      module.hasBeenImported = true;
+    }
+
+    var exported = module.window.EXPORTED_SYMBOLS;
+
+    if (!exported)
+      throw new Error("EXPORTED_SYMBOLS is " + exported +
+                      " for " + url);
+
+    exported.forEach(
+      function(symbol) {
+        //console.log("Exporting symbol " + symbol);
+        obj[symbol] = module.window[symbol];
+      });
+  };
+
+  self.fetch = function JSMR_fetch(url, cb) {
     //console.log("Fetching " + url);
     var jsModule = {
+      url: url,
       isBeingFetched: true,
+      hasBeenImported: false,
       fetchCallbacks: []
     };
 
     modules[url] = jsModule;
 
     function onMaybeDone() {
-      if (jsModule.code && jsModule.iframe) {
+      if (jsModule.code && jsModule.window) {
         jsModule.isBeingFetched = false;
         jsModule.fetchCallbacks.forEach(
           function(fetchCb) {
@@ -97,8 +122,27 @@
         } else
           doneResolvingDeps();
       });
-    loadIframe(function(iframe) { jsModule.iframe = iframe;
-                                  onMaybeDone(); });
+    loadIframe(
+      function(iframe) {
+        var window = iframe.contentWindow;
+        jsModule.window = window;
+        window.FakeComponents = {
+          interfaces: {},
+          classes: {
+            "@mozilla.org/observer-service;1": {
+              getService: function() {}
+            }
+          },
+          utils: {
+            "import": function FCU_import(url, obj) {
+              if (!obj)
+                obj = window;
+              self.import(url, obj);
+            }
+          }
+        };
+        onMaybeDone();
+      });
   };
 
   self.modules = modules;
@@ -116,14 +160,17 @@
           filename = "constants.js.in";
         filename = "modules/" + filename;
         return filename;
+      } else if (uri == "resource://gre/modules/XPCOMUtils.jsm") {
+        return "fake_XPCOMUtils.js";
       } else
-        return "";
+        throw new Error("Don't know how to map " + uri);
     }
     gJsmReg = new JsModuleRegistry(window, mapWeaveResourceUri);
     gJsmReg.fetch(
       "resource://weave/util.js",
       function(jsm) {
-        console.log(jsm);
+        gJsmReg.import(jsm.url, {});
+        console.log("Import successful.");
       });
   });