You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by jo...@apache.org on 2010/07/30 02:50:21 UTC

svn commit: r980622 - in /shindig/trunk/features/src: main/javascript/features/container/ main/javascript/features/shindig.uri/ test/javascript/features/shindig.uri/

Author: johnh
Date: Fri Jul 30 00:50:21 2010
New Revision: 980622

URL: http://svn.apache.org/viewvc?rev=980622&view=rev
Log:
Correct common container gadgets.rpc.setRelayUrl(), and use shindig.uri in common container code.

Lastly, adds method setExistingP to shindig.uri.

Patch provided by Michael Hermanto.


Modified:
    shindig/trunk/features/src/main/javascript/features/container/feature.xml
    shindig/trunk/features/src/main/javascript/features/container/gadget_holder.js
    shindig/trunk/features/src/main/javascript/features/container/init.js
    shindig/trunk/features/src/main/javascript/features/container/util.js
    shindig/trunk/features/src/main/javascript/features/shindig.uri/uri.js
    shindig/trunk/features/src/test/javascript/features/shindig.uri/uritest.js

Modified: shindig/trunk/features/src/main/javascript/features/container/feature.xml
URL: http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/container/feature.xml?rev=980622&r1=980621&r2=980622&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/container/feature.xml (original)
+++ shindig/trunk/features/src/main/javascript/features/container/feature.xml Fri Jul 30 00:50:21 2010
@@ -22,6 +22,7 @@ under the License.
   <dependency>globals</dependency>
   <dependency>core.log</dependency>
   <dependency>shindig.auth</dependency>
+  <dependency>shindig.uri</dependency>
   <dependency>core.util</dependency>
   <dependency>osapi</dependency>
   <dependency>rpc</dependency>

Modified: shindig/trunk/features/src/main/javascript/features/container/gadget_holder.js
URL: http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/container/gadget_holder.js?rev=980622&r1=980621&r2=980622&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/container/gadget_holder.js (original)
+++ shindig/trunk/features/src/main/javascript/features/container/gadget_holder.js Fri Jul 30 00:50:21 2010
@@ -29,7 +29,7 @@
  */
 shindig.container.GadgetHolder = function(siteId, el) {
   /**
-   * Unique numeric gadget ID. Should be the same as siteId.
+   * Unique numeric gadget ID.
    * @type {number}
    * @private
    */
@@ -198,10 +198,13 @@ shindig.container.GadgetHolder.prototype
 
   // Set up RPC channel. RPC relay url is on gmodules, relative to base of the
   // container. Assumes container has set up forwarding to gmodules at /gadgets.
-  gadgets.rpc.setRelayUrl(this.iframeId_, this.gadgetInfo_['iframeHost'] +
-      '/gadgets/files/container/rpc_relay.html');
-  // Pull RPC token from gadget URI
-  gadgets.rpc.setAuthToken(this.iframeId_, this.getRpcToken_());
+  var iframeUri = shindig.uri(this.gadgetInfo_['iframeUrl']);
+  var relayUri = shindig.uri()
+      .setSchema(iframeUri.getSchema())
+      .setAuthority(iframeUri.getAuthority())
+      .setPath('/gadgets/files/container/rpc_relay.html');
+  gadgets.rpc.setRelayUrl(this.iframeId_, relayUri.toString());
+  gadgets.rpc.setAuthToken(this.iframeId_, iframeUri.getFP('rpctoken'));
 };
 
 
@@ -262,51 +265,31 @@ shindig.container.GadgetHolder.prototype
  * @private
  */
 shindig.container.GadgetHolder.prototype.getIframeUrl_ = function() {
-  var uri = this.gadgetInfo_['iframeUrl'];
-  uri = shindig.container.util.updateQueryParam(uri, 'view', this.view_);
-  uri = this.updateBooleanQueryParam_(uri, 'debug');
-  uri = this.updateBooleanQueryParam_(uri, 'nocache');
-  uri = this.updateBooleanQueryParam_(uri, 'testmode');
-  uri = this.updateUserPrefParams_(uri);
+  var uri = shindig.uri(this.gadgetInfo_['iframeUrl']);
+  uri.setQP('debug', this.renderParams_['debug'] ? '1' : '0');
+  uri.setQP('nocache', this.renderParams_['nocache'] ? '1' : '0');
+  uri.setQP('testmode', this.renderParams_['testmode'] ? '1' : '0');
+  uri.setQP('view', this.view_);
+  this.updateUserPrefParams_(uri);
 
   // TODO: Share this base container logic
   // TODO: Two SD base URIs - one for container, one for gadgets
   // Need to add parent at end of query due to gadgets parsing bug
-  var parent = shindig.container.util.parseOrigin(document.location.href);
-  uri = shindig.container.util.addQueryParam(uri, 'parent', parent);
+  uri.setQP('parent', window.__CONTAINER_HOST);
 
   // Remove existing social token if we have a new one
   if (this.securityToken_) {
-    var securityTokenMatch = uri.match(/([&#?])(st=[^&#]*)/);
-    if (securityTokenMatch) {
-      uri = uri.replace(securityTokenMatch[0], securityTokenMatch[1] +
-          'st=' + encodeURIComponent(this.securityToken_));
-    }
+    uri.setExistingP('st', this.securityToken_);
   }
-
-  uri = shindig.container.util.addFragmentParam(uri, 'mid',
-      String(this.siteId_));
+  
+  uri.setFP('mid', String(this.siteId_));
 
   if (this.hasGadgetParams_) {
     var gadgetParamText = gadgets.json.stringify(this.gadgetParams_);
-    uri = shindig.container.util.addFragmentParam(uri, 'view-params',
-        gadgetParamText);
+    uri.setFP('view-params', gadgetParamText);
   }
-  return uri;
-};
-
 
-/**
- * Updates query params of interest.
- * @param {string} uri The URL to append query param to.
- * @param {string} param The query param to update uri with.
- * @return {string} The URL with param append to.
- * @private
- */
-shindig.container.GadgetHolder.prototype.updateBooleanQueryParam_
-    = function(uri, param) {
-  var value = this.renderParams_[param] ? "1" : "0";
-  return shindig.container.util.updateQueryParam(uri, param, value);
+  return uri.toString();
 };
 
 
@@ -314,8 +297,8 @@ shindig.container.GadgetHolder.prototype
  * Replace user prefs specified in url with only those specified. This will
  * maintain each user prefs existence (or lack of), order (from left to right)
  * and its appearance (in query params or fragment).
- * @param {string} uri The URL possibly containing user preferences parameters
- *     prefixed by up_.
+ * @param {shindig.uri} uri The URL possibly containing user preferences
+ *     parameters prefixed by up_.
  * @return {string} The URL with up_ replaced by those specified in userPrefs.
  * @private
  */
@@ -323,29 +306,12 @@ shindig.container.GadgetHolder.prototype
   var userPrefs = this.renderParams_['userPrefs'];
   if (userPrefs) {
     for (var up in userPrefs) {
-      // Maybe more efficient to have a pre-compiled regex that looks for
-      // up_ANY_TEXT and match all instances.
-      var re = new RegExp('([&#?])up_' + up + '[^&#]*');
-      if (re) {
-        var key = encodeURIComponent('up_' + up);
-        var val = userPrefs[up];
-        if (val instanceof Array) {
-          val = val.join('|');
-        }
-        val = encodeURIComponent(val);
-        uri = uri.replace(re, '$1' + key + '=' + val);
+      var upKey = 'up_' + up;
+      var upValue = userPrefs[up];
+      if (upValue instanceof Array) {
+        upValue = upValue.join('|');
       }
+      uri.setExistingP(upKey, upValue);
     }
   }
-  return uri;
-};
-
-
-/**
- * @return {string} The current RPC token.
- * @private
- */
-shindig.container.GadgetHolder.prototype.getRpcToken_ = function() {
-  return shindig.container.util.getParamValue(
-      this.gadgetInfo_['iframeUrl'], 'rpctoken');
 };

Modified: shindig/trunk/features/src/main/javascript/features/container/init.js
URL: http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/container/init.js?rev=980622&r1=980621&r2=980622&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/container/init.js (original)
+++ shindig/trunk/features/src/main/javascript/features/container/init.js Fri Jul 30 00:50:21 2010
@@ -40,20 +40,18 @@
   }
 
   function initializeGlobalVars() {
-    var scriptSrc = getLastScriptSrc();
-    if (scriptSrc) {
-      window.__API_HOST = shindig.container.util.parseOrigin(scriptSrc);
-      window.__CONTAINER = shindig.container.util.getParamValue(
-          scriptSrc, 'container');
-      window.__CONTAINER_HOST = shindig.container.util.parseOrigin(
-          document.location.href);
+    var scriptUri = getLastScriptUri();
+    if (scriptUri) {
+      window.__API_HOST = scriptUri.getOrigin();
+      window.__CONTAINER = scriptUri.getQP('container');
     }
+    window.__CONTAINER_HOST = shindig.uri(document.location.href).getOrigin();
   }
 
-  function getLastScriptSrc() {
+  function getLastScriptUri() {
     var scriptEls = document.getElementsByTagName('script');
     return (scriptEls.length > 0)
-        ? scriptEls[scriptEls.length - 1].src
+        ? shindig.uri(scriptEls[scriptEls.length - 1].src)
         : null;
   }
 

Modified: shindig/trunk/features/src/main/javascript/features/container/util.js
URL: http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/container/util.js?rev=980622&r1=980621&r2=980622&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/container/util.js (original)
+++ shindig/trunk/features/src/main/javascript/features/container/util.js Fri Jul 30 00:50:21 2010
@@ -35,42 +35,6 @@ shindig.container.util = {};
 
 
 /**
- * Extract protocol and domain of container page. Valid values:
- * http://www.cnn.com, chrome-extension://www.cnn.com
- * @param {string} uri The URL to extract protocol and domain from.
- * @return {string} The protocol and domain of container page.
- */
-shindig.container.util.parseOrigin = function(uri) {
-  var indexAtStartOfAuthority = uri.indexOf('//') + 2;
-  var indexAtEndOfAuthority = uri.indexOf('/', indexAtStartOfAuthority);
-  return uri.substring(0, indexAtEndOfAuthority);
-};
-
-
-/**
- * Extract path of a URL.
- * @param {string} uri The URL to extract path from.
- * @return {string} The path in URL.
- */
-shindig.container.util.parsePath = function(uri) {
-  var match = uri.match(new RegExp("//[^/]+(/[^?#]*)"));
-  return match ? match[1] : null;
-};
-
-
-/**
- * Extract the parameter value in path with name paramName.
- * @param {string} path The path to extract parameter from.
- * @param {string} paramName The name of parameter to exact value from.
- * @return {string} The value of the parameter. Null otherwise.
- */
-shindig.container.util.getParamValue = function(path, paramName) {
-  var match = path.match(new RegExp("[?&]" + paramName + "=([^&#]+)"));
-  return match ? match[1] : null;
-};
-
-
-/**
  * Return value of json at key, if valid. Otherwise, return defaultValue.
  * @param {Object} json The JSON to look up key param from.
  * @param {string} key Key in config.
@@ -84,63 +48,6 @@ shindig.container.util.getSafeJsonValue 
 
 
 /**
- * Return URI with its query/fragment parameter either:
- * - if exist, added with name=value.
- * - otherwise, replaced with name=value.
- * @param {string} uri URL to work with.
- * @param {string} name of parameter to add/replace.
- * @param {string} value of parameter to add/replace.
- * @return {string}
- */
-shindig.container.util.updateQueryParam = function(uri, name, value) {
-  var fragmentString = '';
-  var fragmentIndex = uri.indexOf('#');
-  if (fragmentIndex >= 0) {
-	fragmentString = uri.substring(fragmentIndex);
-    uri = uri.substring(0, fragmentIndex);
-  }
-
-  var re = new RegExp('([&?])' + name + '[^&]*');
-  if (uri.match(re)) {
-	uri = uri.replace(re, '$1' + encodeURIComponent(name) + '=' +
-        encodeURIComponent(value));
-  } else {
-	uri = shindig.container.util.addQueryParam(uri, name, value);
-  }
-  return uri + fragmentString;
-};
-
-
-/**
- * Adds a hash parameter to a URI.
- * @param {string} uri The URI.
- * @param {string} key The param key.
- * @param {string} value The param value.
- * @return {string} The new URI.
- */
-shindig.container.util.addFragmentParam = function(uri, key, value) {
-  return uri + ((uri.indexOf('#') == -1) ? '#' : '&')
-      + encodeURIComponent(key) + '=' + encodeURIComponent(value);
-};
-
-
-/**
- * Adds a query parameter to a URI.
- * @param {string} uri The URI.
- * @param {string} key The param key.
- * @param {string} value The param value.
- * @return {string} The new URI.
- */
-shindig.container.util.addQueryParam = function(uri, key, value) {
-  var hasQuery = uri.indexOf('?') != -1;
-  var insertPos = (uri.indexOf('#') != -1) ? uri.indexOf('#') : uri.length;
-  return uri.substring(0, insertPos) + (hasQuery ? '&' : '?') +
-      encodeURIComponent(key) + '=' + encodeURIComponent(value) +
-      uri.substring(insertPos);
-};
-
-
-/**
  * Merge two JSON together. Keys in json2 will replace than in json1.
  * @param {Object} json1 JSON to start merge with.
  * @param {Object} json2 JSON to append/replace json1.

Modified: shindig/trunk/features/src/main/javascript/features/shindig.uri/uri.js
URL: http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/shindig.uri/uri.js?rev=980622&r1=980621&r2=980622&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/shindig.uri/uri.js (original)
+++ shindig/trunk/features/src/main/javascript/features/shindig.uri/uri.js Fri Jul 30 00:50:21 2010
@@ -100,6 +100,35 @@ shindig.uri = (function() {
       return fragment_;
     }
 
+    function getQP(key) {
+      qparms_ = qparms_ || parseParams(query_);
+      return getParam(qparms_, key);
+    }
+
+    function getFP(key) {
+      fparms_ = fparms_ || parseParams(fragment_);
+      return getParam(fparms_, key);
+    }
+
+    function setQP(argOne, argTwo) {
+      qparms_ = setParams(qparms_ || parseParams(query_), argOne, argTwo);
+      return bundle;
+    }
+
+    function setFP(argOne, argTwo) {
+      fparms_ = setParams(fparms_ || parseParams(fragment_), argOne, argTwo);
+      return bundle;
+    }
+    
+    function getOrigin() {
+      return [
+          schema_,
+          schema_ !== "" ? ":" : "",
+          authority_ !== "" ? "//" : "",
+          authority_
+      ].join("");
+    }
+
     /**
      * Returns a readable representation of the URL.
      * 
@@ -109,10 +138,7 @@ shindig.uri = (function() {
       var query = getQuery();
       var fragment = getFragment();
       return [
-        schema_,
-        schema_ !== "" ? ":" : "",
-        authority_ !== "" ? "//" : "",
-        authority_,
+        getOrigin(),
         path_,
         query !== "" ? "?" : "",
         query,
@@ -191,17 +217,12 @@ shindig.uri = (function() {
       // Getters
       getSchema: function() { return schema_; },
       getAuthority: function() { return authority_; },
+      getOrigin: getOrigin,
       getPath: function() { return path_; },
       getQuery: getQuery,
       getFragment: getFragment,
-      getQP: function(key) {
-        qparms_ = qparms_ || parseParams(query_);
-        return getParam(qparms_, key);
-      },
-      getFP: function(key) {
-        fparms_ = fparms_ || parseParams(fragment_);
-        return getParam(fparms_, key);
-      },
+      getQP: getQP,
+      getFP: getFP,
 
       // Setters
       setSchema: function(schema) { schema_ = schema; return bundle; },
@@ -209,12 +230,15 @@ shindig.uri = (function() {
       setPath: function(path) { path_ = (path[0] === "/" ? "" : "/") + path; return bundle; },
       setQuery: function(query) { qparms_ = null; query_ = stripPrefix(query, '?'); return bundle; },
       setFragment: function(fragment) { fparms_ = null; fragment_ = stripPrefix(fragment, '#'); return bundle; },
-      setQP: function(argOne, argTwo) {
-        qparms_ = setParams(qparms_ || parseParams(query_), argOne, argTwo);
-        return bundle;
-      },
-      setFP: function(argOne, argTwo) {
-        fparms_ = setParams(fparms_ || parseParams(fragment_), argOne, argTwo);
+      setQP: setQP,
+      setFP: setFP,
+      setExistingP: function(key, val) {
+        if (getQP(key, val) !== undefined) {
+          setQP(key, val);
+        }
+        if (getFP(key, val) !== undefined) {
+          setFP(key, val);
+        }
         return bundle;
       },
 

Modified: shindig/trunk/features/src/test/javascript/features/shindig.uri/uritest.js
URL: http://svn.apache.org/viewvc/shindig/trunk/features/src/test/javascript/features/shindig.uri/uritest.js?rev=980622&r1=980621&r2=980622&view=diff
==============================================================================
--- shindig/trunk/features/src/test/javascript/features/shindig.uri/uritest.js (original)
+++ shindig/trunk/features/src/test/javascript/features/shindig.uri/uritest.js Fri Jul 30 00:50:21 2010
@@ -35,6 +35,7 @@ ShindigUriTest.prototype.testParseFullUr
 
   this.assertEquals("http", uri.getSchema());
   this.assertEquals("www.example.com", uri.getAuthority());
+  this.assertEquals("http://www.example.com", uri.getOrigin());
   this.assertEquals("/my/path", uri.getPath());
   this.assertEquals("qk1=qv1&qk2=qv2", uri.getQuery());
   this.assertEquals("fk1=fv1&fk2=fv2", uri.getFragment());
@@ -57,6 +58,7 @@ ShindigUriTest.prototype.testParseQueryl
 
   this.assertEquals("http", uri.getSchema());
   this.assertEquals("www.example.com", uri.getAuthority());
+  this.assertEquals("http://www.example.com", uri.getOrigin());
   this.assertEquals("/my/path", uri.getPath());
   this.assertEquals("fk1=fv1&fk2=fv2", uri.getFragment());
   this.assertEquals("fv1", uri.getFP("fk1"));
@@ -75,6 +77,7 @@ ShindigUriTest.prototype.testParseFragme
 
   this.assertEquals("http", uri.getSchema());
   this.assertEquals("www.example.com", uri.getAuthority());
+  this.assertEquals("http://www.example.com", uri.getOrigin());
   this.assertEquals("/my/path", uri.getPath());
   this.assertEquals("qk1=qv1&qk2=qv2", uri.getQuery());
   this.assertEquals("qv1", uri.getQP("qk1"));
@@ -93,6 +96,7 @@ ShindigUriTest.prototype.testParseSchema
 
   this.assertEquals("", uri.getSchema());
   this.assertEquals("www.example.com", uri.getAuthority());
+  this.assertEquals("//www.example.com", uri.getOrigin());
   this.assertEquals("/my/path", uri.getPath());
   this.assertEquals("qk1=qv1&qk2=qv2", uri.getQuery());
   this.assertEquals("fk1=fv1&fk2=fv2", uri.getFragment());
@@ -115,6 +119,7 @@ ShindigUriTest.prototype.testParseAuthor
 
   this.assertEquals("", uri.getSchema());
   this.assertEquals("", uri.getAuthority());
+  this.assertEquals("", uri.getOrigin());
   this.assertEquals("/my/path", uri.getPath());
   this.assertEquals("qk1=qv1&qk2=qv2", uri.getQuery());
   this.assertEquals("fk1=fv1&fk2=fv2", uri.getFragment());
@@ -137,6 +142,7 @@ ShindigUriTest.prototype.testParsePathle
 
   this.assertEquals("http", uri.getSchema());
   this.assertEquals("www.example.com", uri.getAuthority());
+  this.assertEquals("http://www.example.com", uri.getOrigin());
   this.assertEquals("qk1=qv1&qk2=qv2", uri.getQuery());
   this.assertEquals("fk1=fv1&fk2=fv2", uri.getFragment());
   this.assertEquals("qv1", uri.getQP("qk1"));
@@ -158,6 +164,7 @@ ShindigUriTest.prototype.testParsePathOn
 
   this.assertEquals("", uri.getSchema());
   this.assertEquals("", uri.getAuthority());
+  this.assertEquals("", uri.getOrigin());
   this.assertEquals("/my/path", uri.getPath());
 
   this.assertEquals(str, uri.toString());
@@ -316,6 +323,15 @@ ShindigUriTest.prototype.testBuildFragme
   this.assertEquals("#one=one&three=three&two", uri.toString());
 };
 
+ShindigUriTest.prototype.testReplaceExistingQuery = function() {
+  var uri = shindig.uri().setQuery("one=two")
+                         .setFragment("three=four")
+                         .setExistingP("one", "111")
+                         .setExistingP("three", "333")
+                         .setExistingP("xxx", "yyy");
+  this.assertEquals("?one=111#three=333", uri.toString());
+};
+
 ShindigUriTest.prototype.testBuildWithOverrides = function() {
   var uri =
       shindig.uri("http://www.example.com/my/path?one=two&baz#three=four")