Author: ddumont
Date: Wed May  2 13:53:49 2012
New Revision: 1333049

URL: http://svn.apache.org/viewvc?rev=1333049&view=rev
Log:
Allow site element creation to be asynchronous in open-views features

Modified:
    
shindig/trunk/features/src/main/javascript/features/open-views.ee/open-views-ee-container.js
    
shindig/trunk/features/src/main/javascript/features/open-views.gadget/open-views-gadget-container.js
    
shindig/trunk/features/src/main/javascript/features/open-views.url/open-views-url-container.js

Modified: 
shindig/trunk/features/src/main/javascript/features/open-views.ee/open-views-ee-container.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/open-views.ee/open-views-ee-container.js?rev=1333049&r1=1333048&r2=1333049&view=diff
==============================================================================
--- 
shindig/trunk/features/src/main/javascript/features/open-views.ee/open-views-ee-container.js
 (original)
+++ 
shindig/trunk/features/src/main/javascript/features/open-views.ee/open-views-ee-container.js
 Wed May  2 13:53:49 2012
@@ -76,37 +76,42 @@ osapi.container.Container.addMixin('view
       var orig_site = container.getGadgetSiteByIframeId_(siteOwnerId),
           rel = orig_site.getActiveSiteHolder().getIframeElement();
 
+      function callback(element) {
+        var gadgetRenderParams = {};
+        gadgetRenderParams[osapi.container.RenderParam.VIEW] =
+            osapi.container.ee.RenderParam.EMBEDDED;
+        gadgetRenderParams[osapi.container.RenderParam.WIDTH] = '100%';
+        gadgetRenderParams[osapi.container.RenderParam.HEIGHT] = '100%';
+
+        var urlRenderParams = {};
+        urlRenderParams[osapi.container.RenderParam.WIDTH] = '100%';
+        urlRenderParams[osapi.container.RenderParam.HEIGHT] = '100%';
+
+        var eeRenderParams = {};
+        eeRenderParams[osapi.container.ee.RenderParam.GADGET_RENDER_PARAMS] =
+            gadgetRenderParams;
+        eeRenderParams[osapi.container.ee.RenderParam.URL_RENDER_PARAMS] =
+            urlRenderParams;
+        eeRenderParams[osapi.container.ee.RenderParam.GADGET_VIEW_PARAMS] =
+            viewParams;
+
+        container.ee.navigate(element, dataModel, eeRenderParams, 
function(site, result) {
+          site.ownerId_ = siteOwnerId;
+          if (result) {
+            self.resultCallbacks_[site.getId()] = resultCallback;
+          }
+          if (navigateCallback) {
+            navigateCallback([site.getId(), result]);
+          }
+        });
+      }
+
       var element = self.createElementForEmbeddedExperience(
-        rel, opt_metadata, viewTarget, coordinates, orig_site
+        rel, opt_metadata, viewTarget, coordinates, orig_site, callback
       );
-
-      var gadgetRenderParams = {};
-      gadgetRenderParams[osapi.container.RenderParam.VIEW] =
-          osapi.container.ee.RenderParam.EMBEDDED;
-      gadgetRenderParams[osapi.container.RenderParam.WIDTH] = '100%';
-      gadgetRenderParams[osapi.container.RenderParam.HEIGHT] = '100%';
-
-      var urlRenderParams = {};
-      urlRenderParams[osapi.container.RenderParam.WIDTH] = '100%';
-      urlRenderParams[osapi.container.RenderParam.HEIGHT] = '100%';
-
-      var eeRenderParams = {};
-      eeRenderParams[osapi.container.ee.RenderParam.GADGET_RENDER_PARAMS] =
-          gadgetRenderParams;
-      eeRenderParams[osapi.container.ee.RenderParam.URL_RENDER_PARAMS] =
-          urlRenderParams;
-      eeRenderParams[osapi.container.ee.RenderParam.GADGET_VIEW_PARAMS] =
-          viewParams;
-
-      container.ee.navigate(element, dataModel, eeRenderParams, function(site, 
result) {
-        site.ownerId_ = siteOwnerId;
-        if (result) {
-          self.resultCallbacks_[site.getId()] = resultCallback;
-        }
-        if (navigateCallback) {
-          navigateCallback([site.getId(), result]);
-        }
-      });
+      if (element) {
+        callback(element);
+      }
     };
 
     if(gadgetUrl) {
@@ -133,7 +138,8 @@ osapi.container.Container.addMixin('view
 
   /**
    * Method will be called to create the DOM element to place the embedded
-   * experience in.
+   * experience in. An implementation must either return an element or call
+   * the provided callback asynchronously, but not both.
    *
    *@param {Element}
    *          rel: The element to which opt_coordinates values are
@@ -151,10 +157,12 @@ osapi.container.Container.addMixin('view
    *          gadget.
    * @param {osapi.container.Site} parentSite
    *          The site opening the EE.
+   * @param {function(element)} opt_callback
+   *          A callback to asynchronously provide the result of the 
createElement call.
    * @return {Object} The DOM element to place the embedded experience in.
    */
   this.createElementForEmbeddedExperience = function(rel, opt_gadgetInfo, 
opt_viewTarget,
-      opt_coordinates, parentSite) {
+      opt_coordinates, parentSite, opt_callback) {
     console.log('container needs to define createElementForEmbeddedExperience 
function');
   };
 });
\ No newline at end of file

Modified: 
shindig/trunk/features/src/main/javascript/features/open-views.gadget/open-views-gadget-container.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/open-views.gadget/open-views-gadget-container.js?rev=1333049&r1=1333048&r2=1333049&view=diff
==============================================================================
--- 
shindig/trunk/features/src/main/javascript/features/open-views.gadget/open-views-gadget-container.js
 (original)
+++ 
shindig/trunk/features/src/main/javascript/features/open-views.gadget/open-views-gadget-container.js
 Wed May  2 13:53:49 2012
@@ -104,34 +104,41 @@ osapi.container.Container.addMixin('view
         }
       }
 
-      var renderParams = {},
-          elem = self.createElementForGadget(
-            metadata, rel, view, viewTarget, coordinates, orig_site
-          ),
-          site = container.newGadgetSite(elem);
+      function callback(elem) {
+        var renderParams = {},
+            site = container.newGadgetSite(elem);
 
-      site.ownerId_ = siteOwnerId;
+        site.ownerId_ = siteOwnerId;
 
-      if ((typeof view != 'undefined') && view !== '') {
-        renderParams[osapi.container.RenderParam.VIEW] = view;
+        if ((typeof view != 'undefined') && view !== '') {
+          renderParams[osapi.container.RenderParam.VIEW] = view;
+        }
+        renderParams[osapi.container.RenderParam.WIDTH] = '100%';
+        renderParams[osapi.container.RenderParam.HEIGHT] = '100%';
+
+        container.navigateGadget(site, gadgetUrl, viewParams, renderParams, 
function(metadata) {
+          if (metadata) {
+            self.resultCallbacks_[site.getId()] = resultCallback;
+          }
+          if (navigateCallback) {
+            navigateCallback([site.getId(), metadata]);
+          }
+        });
       }
-      renderParams[osapi.container.RenderParam.WIDTH] = '100%';
-      renderParams[osapi.container.RenderParam.HEIGHT] = '100%';
 
-      container.navigateGadget(site, gadgetUrl, viewParams, renderParams, 
function(metadata) {
-        if (metadata) {
-          self.resultCallbacks_[site.getId()] = resultCallback;
-        }
-        if (navigateCallback) {
-          navigateCallback([site.getId(), metadata]);
-        }
-      });
+      var elem = self.createElementForGadget(
+        metadata, rel, view, viewTarget, coordinates, orig_site, callback
+      );
+      if (elem) {
+        callback(elem);
+      }
     });
   });
 
   /**
    * Method will be called to create the DOM element to place the Gadget
-   * Site in.
+   * Site in. An implementation must either return an element or call
+   * the provided callback asynchronously, but not both.
    *
    * @param {Object}
    *          metadata: Gadget meta data for the gadget being opened in
@@ -152,10 +159,12 @@ osapi.container.Container.addMixin('view
    *          gadget.
    * @param {osapi.container.Site} parentSite
    *          The site opening the gadget view.
+   * @param {function(element)} opt_callback
+   *          A callback to asynchronously provide the result of the 
createElement call.
    * @return {Object} The DOM element to place the GadgetSite in.
    */
   this.createElementForGadget = function(metadata, rel, opt_view, 
opt_viewTarget,
-      opt_coordinates, parentSite) {
+      opt_coordinates, parentSite, opt_callback) {
     console.log('container needs to define createElementForGadget function');
   };
 });
\ No newline at end of file

Modified: 
shindig/trunk/features/src/main/javascript/features/open-views.url/open-views-url-container.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/open-views.url/open-views-url-container.js?rev=1333049&r1=1333048&r2=1333049&view=diff
==============================================================================
--- 
shindig/trunk/features/src/main/javascript/features/open-views.url/open-views-url-container.js
 (original)
+++ 
shindig/trunk/features/src/main/javascript/features/open-views.url/open-views-url-container.js
 Wed May  2 13:53:49 2012
@@ -51,24 +51,31 @@ osapi.container.Container.addMixin('view
     var orig_site = container.getGadgetSiteByIframeId_(rpcArgs.f),
       rel = orig_site.getActiveSiteHolder().getIframeElement();
 
-    var content_div = self.createElementForUrl(rel, opt_viewTarget, 
opt_coordinates, orig_site);
-    var site = container.newUrlSite(content_div);
+    function callback(content_div) {
+      var site = container.newUrlSite(content_div);
 
-    var renderParams = {}; // (height, width, class,userPrefsObject)
-    renderParams[osapi.container.RenderParam.WIDTH] = '100%';
-    renderParams[osapi.container.RenderParam.HEIGHT] = '100%';
-
-    container.navigateUrl(site, url, renderParams);
-
-    // record who opened this site, so that if they use the siteId to close it 
later,
-    // we don't inadvertently allow other gadgets to guess the id and close 
the site.
-    site.ownerId_ = rpcArgs.f;
-    return site.getId();
+      var renderParams = {}; // (height, width, class,userPrefsObject)
+      renderParams[osapi.container.RenderParam.WIDTH] = '100%';
+      renderParams[osapi.container.RenderParam.HEIGHT] = '100%';
+
+      container.navigateUrl(site, url, renderParams);
+
+      // record who opened this site, so that if they use the siteId to close 
it later,
+      // we don't inadvertently allow other gadgets to guess the id and close 
the site.
+      site.ownerId_ = rpcArgs.f;
+      rpcArgs.callback([site.getId()]);
+    };
+
+    var content_div = self.createElementForUrl(rel, opt_viewTarget, 
opt_coordinates, orig_site, callback);
+    if (content_div) {
+      callback(content_div);
+    }
   });
 
   /**
    * Method will be called to create the DOM element to place the UrlSite
-   * in.
+   * in. An implementation must either return an element or call
+   * the provided callback asynchronously, but not both.
    *
    * @param {Element}
    *          rel: The element to which opt_coordinates values are
@@ -83,9 +90,11 @@ osapi.container.Container.addMixin('view
    *          gadget.
    * @param {osapi.container.Site} parentSite
    *          The site opening the url.
+   * @param {function(element)} opt_callback
+   *          A callback to asynchronously provide the result of the 
createElement call.
    * @return {Object} The DOM element to place the UrlSite object in.
    */
-  this.createElementForUrl = function(rel, opt_viewTarget, opt_coordinates, 
parentSite) {
+  this.createElementForUrl = function(rel, opt_viewTarget, opt_coordinates, 
parentSite, opt_callback) {
     console.log('container needs to define createElementForUrl function');
   };
 });
\ No newline at end of file


Reply via email to