It's a common convention for hasOwnProperty tests (which really should be done any time you iterate over object keys, especially now that I noticed that caja modifies Object.prototype).
On Feb 1, 2008 10:36 AM, Cassie <[EMAIL PROTECTED]> wrote: > On Fri, Feb 1, 2008 at 3:05 AM, <[EMAIL PROTECTED]> wrote: > > > Author: etnu > > Date: Fri Feb 1 03:05:01 2008 > > New Revision: 617472 > > > > URL: http://svn.apache.org/viewvc?rev=617472&view=rev > > Log: > > Fixed features/views to actually use the current view data. > > requestNavigateTo is currently a NOOP. It should just use gadgets.rpc, > but > > technically this feature should be core-views -- in other words, it > should > > not be an explicit feature according to the gadgets API spec. I have > > petitioned for a spec change (the "views" javascript should not be a > part of > > core), but if that doesn't happen then this will need to be moved to > core, > > which means that IFPC / gadgets.rpc will always be delivered to every > > gadget. This is extraordinarily wasteful. One possible ugly solution > would > > be to only serve views when we see an actual reference to "gadgets.views > " > > in the content section, but this is hacky, and really there's no reason > for > > views to be in the core spec anyway. > > > > Takes data in the following form: > > > > views.getParams() -- Assumes that any parameter named "view-<name>" is a > > key that belongs in this. When Cajoled this won't make sense, so we > should > > probably add a check for whether or not we're rendering in an iframe or > not > > first. > > > > views.getCurrentView() -- Assumes that the current view is named in the > > "view" query string parameter, which is what GadgetRenderingServlet uses > to > > discriminate between views. > > > > May be initialized by calling gadgets.views.init and passing in all of > the > > supported views for this container and whether or not they're the "only > > visible" gadget at render time. > > > > Also fixed a possible NPE with GadgetSpecParser and removed a dead file. > > > > > > Removed: > > incubator/shindig/trunk/features/core-features.txt > > Modified: > > incubator/shindig/trunk/features/core/util.js > > incubator/shindig/trunk/features/views/feature.xml > > incubator/shindig/trunk/features/views/views.js > > > > > > incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java > > > > Modified: incubator/shindig/trunk/features/core/util.js > > URL: > > > http://svn.apache.org/viewvc/incubator/shindig/trunk/features/core/util.js?rev=617472&r1=617471&r2=617472&view=diff > > > > > ============================================================================== > > --- incubator/shindig/trunk/features/core/util.js (original) > > +++ incubator/shindig/trunk/features/core/util.js Fri Feb 1 03:05:01 > 2008 > > @@ -114,6 +114,23 @@ > > }, > > > > /** > > + * Utility function for generating an "enum" from an array. > > + * > > + * @param {Array.<String>} values The values to generate. > > + * @return {Map<String,String>} An object with member fields > to > > handle > > + * the enum. > > + * > > + * @private Implementation detail. > > + */ > > + makeEnum : function (values) { > > + var obj = {}; > > + for (var i = 0, v; v = values[i]; ++i) { > > + obj[v] = v; > > + } > > + return obj; > > + }, > > + > > + /** > > * Gets the feature parameters. > > * > > * @param {String} feature The feature to get parameters for > > > > Modified: incubator/shindig/trunk/features/views/feature.xml > > URL: > > > http://svn.apache.org/viewvc/incubator/shindig/trunk/features/views/feature.xml?rev=617472&r1=617471&r2=617472&view=diff > > > > > ============================================================================== > > --- incubator/shindig/trunk/features/views/feature.xml (original) > > +++ incubator/shindig/trunk/features/views/feature.xml Fri Feb 1 > 03:05:01 > > 2008 > > @@ -18,7 +18,12 @@ > > --> > > <feature> > > <name>views</name> > > + <!-- <dependency>ifpc</dependency> --> > > <gadget> > > <script src="views.js"/> > > + <!-- TODO: Clean this up and unify the configuration model --> > > + <script> > > + gadgets.views.init({"default" : false}); > > + </script> > > </gadget> > > </feature> > > > > Modified: incubator/shindig/trunk/features/views/views.js > > URL: > > > http://svn.apache.org/viewvc/incubator/shindig/trunk/features/views/views.js?rev=617472&r1=617471&r2=617472&view=diff > > > > > ============================================================================== > > --- incubator/shindig/trunk/features/views/views.js (original) > > +++ incubator/shindig/trunk/features/views/views.js Fri Feb 1 03:05:01 > > 2008 > > @@ -24,126 +24,86 @@ > > var gadgets = gadgets || {}; > > > > /** > > - * @static > > - * @class Provides operations for dealing with Views. > > - * @name gadgets.views > > + * Implements the gadgets.views API spec. See > > + * > http://code.google.com/apis/gadgets/docs/reference/gadgets.views.html > > */ > > -gadgets.views = gadgets.views || {}; > > +gadgets.views = function() { > > > > -/** > > - * Attempts to navigate to this gadget in a different view. If the > > container > > - * supports parameters will pass the optional parameters along to the > > gadget in > > - * the new view. > > - * > > - * @param {gadgets.views.View} view The view to navigate to > > - * @param {Map.<String, String>} opt_params Parameters to pass to > > the > > - * gadget after it has been navigated to on the surface > > - * > > - * @member gadgets.views > > - */ > > -gadgets.views.requestNavigateTo = function(surface, opt_params) { > > - return opensocial.Container.get().requestNavigateTo(surface, > > opt_params); > > -}; > > - > > -/** > > - * Returns the current view. > > - * > > - * @return {gadgets.views.View} The current view > > - * @member gadgets.views > > - */ > > -gadgets.views.getCurrentView = function() { > > - return this.surface; > > + /** > > + * Reference to the current view object. > > + */ > > + var currentView = null; > > + > > + /** > > + * Map of all supported views for this container. > > + */ > > + var supportedViews = {}; > > + > > + /** > > + * Map of parameters passed to the current request. > > + */ > > + var params = {}; > > + > > + return { > > + requestNavigateTo : function(view, opt_params) { > > + // TODO: Actually implementing this is going to require > gadgets.rpcor > > + // ifpc or something. > > + }, > > + > > + getCurrentView : function() { > > + return currentView; > > + }, > > + > > + getSupportedViews : function() { > > + return supportedViews; > > + }, > > + > > + getParams : function() { > > + return params; > > + }, > > + > > + /** > > + * Initializes views. Assumes that the current view is the "view" > > + * url parameter (or default if "view" isn't supported), and that > > + * all view parameters are in the form view-<name> > > + * TODO: Use unified configuration when it becomes available. > > + * @param {Map<String, Boolean>} supported The views you > > support, > > + * where keys = name of the view and values = isOnlyVisible > > + */ > > + init : function(supported) { > > + if (typeof supported["default"] === "undefined") { > > + throw new Error("default view required!"); > > + } > > + > > + for (var s in supported) if (supported.hasOwnProperty(s)) { > > > we really need to agree on some code style docs for shindig. > this for and if on the same line realllllyyy makes me cringe. > > > > > > + supportedViews[s] = new gadgets.views.View(s, supported[s]); > > + } > > + > > + var urlParams = gadgets.util.getUrlParameters(); > > + // extract all parameters prefixed with "view-". > > + for (var p in urlParams) if (urlParams.hasOwnProperty(p)) { > > + if (p.substring(0, 5) === "view-") { > > + params[p.substr(5)] = urlParams[p]; > > + } > > + } > > + currentView = supportedViews[urlParams.view] || > > supportedViews["default"]; > > + } > > + }; > > +}(); > > + > > +gadgets.views.View = function(name, opt_isOnlyVisible) { > > + this.name_ = name; > > + this.isOnlyVisible_ = !!opt_isOnlyVisible; > > }; > > > > -/** > > - * Returns a map of all the supported views. Keys each > gadgets.view.Viewby > > - * its name. > > - * > > - * @return {Map<gadgets.views.ViewType | String, > gadgets.views.View>} > > All > > - * supported views, keyed by their name attribute. > > - * @member gadgets.views > > - */ > > -gadgets.views.getSupportedViews = function() { > > - return this.supportedSurfaces; > > -}; > > - > > -/** > > - * Returns the parameters passed into this gadget for this view. Does > not > > - * include all url parameters, only the ones passed into > > - * gadgets.views.requestNavigateTo > > - * > > - * @return {Map.<String, String>} The parameter map > > - * @member gadgets.views > > - */ > > -gadgets.views.getParams = function() { > > - return this.params; > > -}; > > - > > - > > -/** > > - * @class Base interface for all view objects. > > - * @name gadgets.views.View > > - */ > > - > > -/** > > - * @private > > - * @constructor > > - */ > > -gadgets.views.View = function(name, opt_isOnlyVisibleGadgetValue) { > > - this.name = name; > > - this.isOnlyVisibleGadgetValue = !!opt_isOnlyVisibleGadgetValue; > > -}; > > - > > -/** > > - * Returns the name of this view. > > - * > > - * @return {gadgets.views.ViewType | String} The view name, usually > > specified as > > - * a gadgets.views.ViewType > > - */ > > gadgets.views.View.prototype.getName = function() { > > - return this.name; > > + return this.name_; > > }; > > > > -/** > > - * Returns true if the gadget is the only visible gadget in this view. > > - * On a canvas page or in maximize mode this is most likely true; on a > > profile > > - * page or in dashboard mode, it is most likely false. > > - * > > - * @return {boolean} True if the gadget is the only visible gadget; > > otherwise, false > > - */ > > gadgets.views.View.prototype.isOnlyVisibleGadget = function() { > > - return this.isOnlyVisibleGadgetValue; > > + return this.isOnlyVisible_; > > }; > > > > - > > -/** > > - * @static > > - * @class > > - * Used by <a href="gadgets.views.View.html"> View</a>s. > > - * @name gadgets.views.ViewType > > - */ > > -gadgets.views.ViewType = { > > - /** > > - * A view where the gadget is displayed in a very large mode. It > should > > be the > > - * only thing on the page. In a social context, this is usually called > > the > > - * canvas page. > > - * > > - * @member gadgets.views.ViewType > > - */ > > - FULL_PAGE : 'FULL_PAGE', > > - > > - /** > > - * A view where the gadget is displayed in a small area usually on a > > page with > > - * other gadgets. In a social context, this is usually called the > > profile page. > > - * > > - * @member gadgets.views.ViewType > > - */ > > - DASHBOARD : 'DASHBOARD', > > - > > - /** > > - * A view where the gadget is displayed in a small separate window by > > itself. > > - * > > - * @member gadgets.views.ViewType > > - */ > > - POPUP : 'POPUP' > > -}; > > +gadgets.views.ViewType = gadgets.util.makeEnum([ > > + "FULL_PAGE", "DASHBOARD", "POPUP" > > +]); > > \ No newline at end of file > > > > Modified: > > > incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java > > URL: > > > http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java?rev=617472&r1=617471&r2=617472&view=diff > > > > > ============================================================================== > > --- > > > incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java > > (original) > > +++ > > > incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java > > Fri Feb 1 03:05:01 2008 > > @@ -160,7 +160,7 @@ > > Node messagesAttr = attrs.getNamedItem("messages"); > > Node languageAttr = attrs.getNamedItem("lang"); > > Node countryAttr = attrs.getNamedItem("country"); > > - Node rtlAttr = attrs.getNamedItem("rtl"); > > + Node rtlAttr = attrs.getNamedItem("language_direction"); > > > > String messages = null; > > if (null != messagesAttr) { > > @@ -181,10 +181,8 @@ > > language = languageAttr.getNodeValue(); > > } > > > > - boolean rightToLeft; > > - if (null == rtlAttr) { > > - rightToLeft = false; > > - } else { > > + boolean rightToLeft = false; > > + if (rtlAttr != null && rtlAttr.getTextContent().equals("rtl")) { > > rightToLeft = true; > > } > > > > @@ -548,19 +546,25 @@ > > public String getContentData() { > > return getContentData(DEFAULT_VIEW); > > } > > - > > + > > public String getContentData(String view) { > > Check.is(contentType == ContentType.HTML, > > "getContentData() requires contentType HTML"); > > if (view == null || view == "") { > > view = DEFAULT_VIEW; > > } > > - if (!contentData.containsKey(view)) { > > - return null; > > + > > + StringBuilder content = contentData.get(view); > > + if (content == null) { > > + return ""; > > + } else { > > + return content.toString(); > > } > > - return contentData.get(view).toString(); > > } > > - > > + > > + // TODO: Synchronizing this seems unnecessary...a parse job should > > never > > + // happen across threads, and addContent *can't* be called anywhere > > but > > + // within a call to GadgetSpecParser.parse() > > public synchronized void addContent(String view, String content) { > > if (view == null || view.equals("")) { > > view = DEFAULT_VIEW; > > @@ -569,7 +573,7 @@ > > if (!contentData.containsKey(view)) { > > contentData.put(view, new StringBuilder()); > > } > > - > > + > > contentData.get(view).append(content); > > } > > } > > > > > > >

