You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by li...@apache.org on 2009/09/23 01:47:22 UTC

svn commit: r817905 - in /incubator/shindig/trunk: features/src/main/javascript/features/caja/taming.js features/src/main/javascript/features/flash/flash.js javascript/container/Bridge.as javascript/container/Bridge.fla

Author: lindner
Date: Tue Sep 22 23:47:22 2009
New Revision: 817905

URL: http://svn.apache.org/viewvc?rev=817905&view=rev
Log:
SHINDIG-1157 | Patch from Jasvir Nagra | Flash support in cajoled gadgets

Added:
    incubator/shindig/trunk/javascript/container/Bridge.as
    incubator/shindig/trunk/javascript/container/Bridge.fla
Modified:
    incubator/shindig/trunk/features/src/main/javascript/features/caja/taming.js
    incubator/shindig/trunk/features/src/main/javascript/features/flash/flash.js

Modified: incubator/shindig/trunk/features/src/main/javascript/features/caja/taming.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/src/main/javascript/features/caja/taming.js?rev=817905&r1=817904&r2=817905&view=diff
==============================================================================
--- incubator/shindig/trunk/features/src/main/javascript/features/caja/taming.js (original)
+++ incubator/shindig/trunk/features/src/main/javascript/features/caja/taming.js Tue Sep 22 23:47:22 2009
@@ -135,11 +135,104 @@
   var taming = {
     flash: {
       embedFlash: function(orig) {
-        return ___.frozenFunc(function tamedEmbedFlash(swfUrl, swfContainer,
-                                                         swfVersion, opt_params) {
-      return orig.call(this, swfUrl, swfContainer.node___, swfVersion,
-                       opt_params);
-      });
+          var cleanse = (function () {
+          // Gets a fresh Array and Object constructor that 
+          // doesn't have the caja properties on it.  This is 
+          // important for passing objects across the boundary 
+          // to flash code.
+          var ifr = document.createElement("iframe");
+          ifr.width = 1; ifr.height = 1; ifr.border = 0;
+          document.body.appendChild(ifr);
+          var A = ifr.contentWindow.Array;
+          var O = ifr.contentWindow.Object;
+          document.body.removeChild(ifr);
+
+          var c = function(obj) {
+            var t = typeof obj, i;
+            if (t === 'number' || t === 'boolean' || t === 'string') { 
+                return obj; 
+            }
+            if (t === 'object') {
+              var o;
+              if (obj instanceof Array) { o = new A; }
+              else if (obj instanceof Object) { o = new O; }
+              for (i in obj) {
+                if (/__$/.test(i)) { continue; }
+                o[i] = c(obj[i]);
+              }
+              return o;
+            }
+            return (void 0);
+          };
+
+          return c;
+        })();
+
+        return ___.frozenFunc(function tamedEmbedFlash(
+            swfUrl, 
+            swfContainer,
+            swfVersion, 
+            opt_params) {
+          // Check that swfContainer is a wrapped node
+          if (typeof swfContainer === "string") {
+            // This assumes that there's only one gadget in the frame.
+            var $v = ___.getNewModuleHandler().getImports().$v;
+            swfContainer = $v.cm(
+                $v.ro("document"), 
+                "getElementById", 
+                [swfContainer]);
+          } else if (typeof swfContainer !== "object" || !swfContainer.node___) {
+            return false;
+          }
+
+          // Generate a random number for use as the channel name
+          // for communication between the bridge and the contained
+          // flash object.
+          // TODO: Use true randomness.
+          var channel = "_flash" + ("" + Math.random()).substring(2);
+
+          // Strip out allowNetworking and allowScriptAccess, 
+          //   as well as any caja-specific properties.
+          var new_params = {};
+          for (i in opt_params) {
+            if (i.match(/___$/)) { continue; }
+            var ilc = i.toLowerCase();
+            if (ilc === "allownetworking" || ilc === "allowscriptaccess") {
+              continue;
+            }
+            var topi = typeof opt_params[i];
+            if (topi !== "string" && topi !== "number") { continue; }
+            new_params[i] = opt_params[i];
+          }
+          new_params.allowNetworking = "never";
+          new_params.allowScriptAccess = "none";
+          if (!new_params.flashVars) { new_params.flashVars = ""; }
+          new_params.flashVars += "&channel=" + channel;
+
+          // Load the flash.
+          orig(swfUrl, swfContainer.node___, 10, new_params);
+
+          if (bridge___.channels) {
+            // If the bridge hasn't loaded, queue up the channel names
+            // for later registration
+            bridge___.channels.push(channel);
+          } else {
+            // Otherwise, register the channel immediately.
+            bridge___.registerChannel(channel);
+          }
+
+          // Return the ability to talk to the boxed swf.
+          return ___.primFreeze({
+            callSWF: (function (channel) { 
+              return ___.func(function (methodName, argv) {
+                  return bridge___.callSWF(
+                      "" + channel, 
+                      "" + methodName, 
+                      cleanse(argv));
+                });
+            })(channel)
+          });
+        });
       }
     },
 
@@ -256,521 +349,563 @@
     }
   };
       
-      // The below described the opensocial reference APIs.
-      // A prefix of "c_" specifies a class, "m_" a method, "f_" a field,
-      // and "s_" a static member.
-      // Derived from http://code.google.com/apis/opensocial/docs/0.8/reference/ .
-      var opensocialSchema = {
-        c_gadgets: {
-          c_MiniMessage: {
-            m_createDismissibleMessage: 0,
-            m_createStaticMessage: 0,
-            m_createTimerMessage: 0,
-            m_dismissMessage: 0
-          },
-          c_Prefs: {
-            m_getArray: 0,
-            m_getBool: 0,
-            m_getCountry: 0,
-            m_getFloat: 0,
-            m_getInt: 0,
-            m_getLang: 0,
-            m_getMsg: 0,
-            m_getString: 0,
-            m_set: 0,
-            m_setArray: 0
-          },
-          c_Tab: {
-            m_getCallback: 0,
-            m_getContentContainer: 0,
-            m_getIndex: 0,
-            m_getName: 0,
-            m_getNameContainer: 0
-          },
-          c_TabSet: {
-            m_addTab: 0
-            //        m_alignTabs: 0,
-            //        m_displayTabs: 0,
-            //        m_getHeaderContainer: 0,
-            //        m_getSelectedTab: 0,
-            //        m_getTabs: 0,
-            //        m_removeTab: 0,
-            //        m_setSelectedTab: 0,
-            //        m_swapTabs: 0
-          },
-          c_flash: {
-            s_embedCachedFlash: 0,
-            s_embedFlash: 0,
-            s_getMajorVersion: 0
-          },
-          c_io: {
-            c_AuthorizationType: {
-              s_NONE: 0,
-              s_OAUTH: 0,
-              s_SIGNED: 0
-            },
-            c_ContentType: {
-              s_DOM: 0,
-              s_FEED: 0,
-              s_JSON: 0,
-              s_TEXT: 0
-            },
-            c_MethodType: {
-              s_DELETE: 0,
-              s_GET: 0,
-              s_HEAD: 0,
-              s_POST: 0,
-              s_PUT: 0
-            },
-            c_ProxyUrlRequestParameters: {
-              s_REFRESH_INTERVAL: 0
-            },
-            c_RequestParameters: {
-              s_AUTHORIZATION: 0,
-              s_CONTENT_TYPE: 0,
-              s_GET_SUMMARIES: 0,
-              s_HEADERS: 0,
-              s_METHOD: 0,
-              s_NUM_ENTRIES: 0,
-              s_POST_DATA: 0
-            },
-            s_encodeValues: 0,
-            s_getProxyUrl: 0,
-            s_makeRequest: 0
-          },
-          c_json: {
-            s_parse: 0,
-            s_stringify: 0
-          },
-          c_pubsub: {
-            s_publish: 0,
-            s_subscribe: 0,
-            s_unsubscribe: 0
-          },
-          c_rpc: {
-            s_call: 0,
-            s_register: 0,
-            s_registerDefault: 0,
-            s_unregister: 0,
-            s_unregisterDefault: 0
-          },
-          c_skins: {
-            c_Property: {
-              s_ANCHOR_COLOR: 0,
-              s_BG_COLOR: 0,
-              s_BG_IMAGE: 0,
-              s_FONT_COLOR: 0
-            },
-            s_getProperty: 0
-          },
-          c_util: {
-            s_escapeString: 0,
-            s_getFeatureParameters: 0,
-            s_hasFeature: 0,
-            s_registerOnLoadHandler: 0,
-            s_unescapeString: 0
-          },
-          c_views: {
-            c_View: {
-              m_bind: 0,
-              m_getUrlTemplate: 0,
-              m_isOnlyVisibleGadget: 0
-            },
-            c_ViewType: {
-              s_CANVAS: 0,
-              s_HOME: 0,
-              s_PREVIEW: 0,
-              s_PROFILE: 0
-            },
-            s_bind: 0,
-            // FIXME(benl): Why do we think getCurrentView does not use "this"?
-            s_getCurrentView: 0,
-            s_getParams: 0,
-            s_requestNavigateTo: 0
-          },
-          c_window: {
-            s_adjustHeight: 0,
-            s_getViewportDimensions: 0,
-            s_setTitle: 0
-          }
+  // The below described the opensocial reference APIs.
+  // A prefix of "c_" specifies a class, "m_" a method, "f_" a field,
+  // and "s_" a static member.
+  // Derived from http://code.google.com/apis/opensocial/docs/0.8/reference/ .
+  var opensocialSchema = {
+    c_gadgets: {
+      c_MiniMessage: {
+        m_createDismissibleMessage: 0,
+        m_createStaticMessage: 0,
+        m_createTimerMessage: 0,
+        m_dismissMessage: 0
+      },
+      c_Prefs: {
+        m_getArray: 0,
+        m_getBool: 0,
+        m_getCountry: 0,
+        m_getFloat: 0,
+        m_getInt: 0,
+        m_getLang: 0,
+        m_getMsg: 0,
+        m_getString: 0,
+        m_set: 0,
+        m_setArray: 0
+      },
+      c_Tab: {
+        m_getCallback: 0,
+        m_getContentContainer: 0,
+        m_getIndex: 0,
+        m_getName: 0,
+        m_getNameContainer: 0
+      },
+      c_TabSet: {
+        m_addTab: 0
+        //        m_alignTabs: 0,
+        //        m_displayTabs: 0,
+        //        m_getHeaderContainer: 0,
+        //        m_getSelectedTab: 0,
+        //        m_getTabs: 0,
+        //        m_removeTab: 0,
+        //        m_setSelectedTab: 0,
+        //        m_swapTabs: 0
+      },
+      c_flash: {
+        s_embedCachedFlash: 0,
+        s_embedFlash: 0,
+        s_getMajorVersion: 0
+      },
+      c_io: {
+        c_AuthorizationType: {
+          s_NONE: 0,
+          s_OAUTH: 0,
+          s_SIGNED: 0
         },
-        c_opensocial: {
-          c_Activity: {
-            c_Field: {
-              s_APP_ID: 0,
-              s_BODY: 0,
-              s_BODY_ID: 0,
-              s_EXTERNAL_ID: 0,
-              s_ID: 0,
-              s_MEDIA_ITEMS: 0,
-              s_POSTED_TIME: 0,
-              s_PRIORITY: 0,
-              s_STREAM_FAVICON_URL: 0,
-              s_STREAM_SOURCE_URL: 0,
-              s_STREAM_TITLE: 0,
-              s_STREAM_URL: 0,
-              s_TEMPLATE_PARAMS: 0,
-              s_TITLE: 0,
-              s_TITLE_ID: 0,
-              s_URL: 0,
-              s_USER_ID: 0
-            },
-            m_getField: 0,
-            m_getId: 0,
-            m_setField: 0
-          },
-          c_Address: {
-            c_Field: {
-              s_COUNTRY: 0,
-              s_EXTENDED_ADDRESS: 0,
-              s_LATITUDE: 0,
-              s_LOCALITY: 0,
-              s_LONGITUDE: 0,
-              s_POSTAL_CODE: 0,
-              s_PO_BOX: 0,
-              s_REGION: 0,
-              s_STREET_ADDRESS: 0,
-              s_TYPE: 0,
-              s_UNSTRUCTURED_ADDRESS: 0
-            },
-            m_getField: 0
-          },
-          c_BodyType: {
-            c_Field: {
-              s_BUILD: 0,
-              s_EYE_COLOR: 0,
-              s_HAIR_COLOR: 0,
-              s_HEIGHT: 0,
-              s_WEIGHT: 0
-            },
-            m_getField: 0
-          },
-          c_Collection: {
-            m_asArray: 0,
-            m_each: 0,
-            m_getById: 0,
-            m_getOffset: 0,
-            m_getTotalSize: 0,
-            m_size: 0
-          },
-          c_CreateActivityPriority: {
-            s_HIGH: 0,
-            s_LOW: 0
-          },
-          c_DataRequest: {
-            c_DataRequestFields: {
-              s_ESCAPE_TYPE: 0
-            },
-            c_FilterType: {
-              s_ALL: 0,
-              s_HAS_APP: 0,
-              s_TOP_FRIENDS: 0
-            },
-            c_PeopleRequestFields: {
-              s_FILTER: 0,
-              s_FILTER_OPTIONS: 0,
-              s_FIRST: 0,
-              s_MAX: 0,
-              s_PROFILE_DETAILS: 0,
-              s_SORT_ORDER: 0
-            },
-            c_SortOrder: {
-              s_NAME: 0,
-              s_TOP_FRIENDS: 0
-            },
-            m_add: 0,
-            m_newFetchActivitiesRequest: 0,
-            m_newFetchPeopleRequest: 0,
-            m_newFetchPersonAppDataRequest: 0,
-            m_newFetchPersonRequest: 0,
-            m_newRemovePersonAppDataRequest: 0,
-            m_newUpdatePersonAppDataRequest: 0,
-            m_send: 0
-          },
-          c_DataResponse: {
-            m_get: 0,
-            m_getErrorMessage: 0,
-            m_hadError: 0
-          },
-          c_Email: {
-            c_Field: {
-              s_ADDRESS: 0,
-              s_TYPE: 0
-            },
-            m_getField: 0
-          },
-          c_Enum: {
-            c_Drinker: {
-              s_HEAVILY: 0,
-              s_NO: 0,
-              s_OCCASIONALLY: 0,
-              s_QUIT: 0,
-              s_QUITTING: 0,
-              s_REGULARLY: 0,
-              s_SOCIALLY: 0,
-              s_YES: 0
-            },
-            c_Gender: {
-              s_FEMALE: 0,
-              s_MALE: 0
-            },
-            c_LookingFor: {
-              s_ACTIVITY_PARTNERS: 0,
-              s_DATING: 0,
-              s_FRIENDS: 0,
-              s_NETWORKING: 0,
-              s_RANDOM: 0,
-              s_RELATIONSHIP: 0
-            },
-            c_Presence: {
-              s_AWAY: 0,
-              s_CHAT: 0,
-              s_DND: 0,
-              s_OFFLINE: 0,
-              s_ONLINE: 0,
-              s_XA: 0
-            },
-            c_Smoker: {
-              s_HEAVILY: 0,
-              s_NO: 0,
-              s_OCCASIONALLY: 0,
-              s_QUIT: 0,
-              s_QUITTING: 0,
-              s_REGULARLY: 0,
-              s_SOCIALLY: 0,
-              s_YES: 0
-            },
-            m_getDisplayValue: 0,
-            m_getKey: 0
-          },
-          c_Environment: {
-            c_ObjectType: {
-              s_ACTIVITY: 0,
-              s_ACTIVITY_MEDIA_ITEM: 0,
-              s_ADDRESS: 0,
-              s_BODY_TYPE: 0,
-              s_EMAIL: 0,
-              s_FILTER_TYPE: 0,
-              s_MESSAGE: 0,
-              s_MESSAGE_TYPE: 0,
-              s_NAME: 0,
-              s_ORGANIZATION: 0,
-              s_PERSON: 0,
-              s_PHONE: 0,
-              s_SORT_ORDER: 0,
-              s_URL: 0
-            },
-            m_getDomain: 0,
-            m_supportsField: 0
-          },
-          c_EscapeType: {
-            s_HTML_ESCAPE: 0,
-            s_NONE: 0
-          },
-          c_IdSpec: {
-            c_Field: {
-              s_GROUP_ID: 0,
-              s_NETWORK_DISTANCE: 0,
-              s_USER_ID: 0
-            },
-            c_PersonId: {
-              s_OWNER: 0,
-              s_VIEWER: 0
-            },
-            m_getField: 0,
-            m_setField: 0
-          },
-          c_MediaItem: {
-            c_Field: {
-              s_MIME_TYPE: 0,
-              s_TYPE: 0,
-              s_URL: 0
-            },
-            c_Type: {
-              s_AUDIO: 0,
-              s_IMAGE: 0,
-              s_VIDEO: 0
-            },
-            m_getField: 0,
-            m_setField: 0
-          },
-          c_Message: {
-            c_Field: {
-              s_BODY: 0,
-              s_BODY_ID: 0,
-              s_TITLE: 0,
-              s_TITLE_ID: 0,
-              s_TYPE: 0
-            },
-            c_Type: {
-              s_EMAIL: 0,
-              s_NOTIFICATION: 0,
-              s_PRIVATE_MESSAGE: 0,
-              s_PUBLIC_MESSAGE: 0
-            },
-            m_getField: 0,
-            m_setField: 0
-          },
-          c_Name: {
-            c_Field: {
-              s_ADDITIONAL_NAME: 0,
-              s_FAMILY_NAME: 0,
-              s_GIVEN_NAME: 0,
-              s_HONORIFIC_PREFIX: 0,
-              s_HONORIFIC_SUFFIX: 0,
-              s_UNSTRUCTURED: 0
-            },
-            m_getField: 0
-          },
-          c_NavigationParameters: {
-            c_DestinationType: {
-              s_RECIPIENT_DESTINATION: 0,
-              s_VIEWER_DESTINATION: 0
-            },
-            c_Field: {
-              s_OWNER: 0,
-              s_PARAMETERS: 0,
-              s_VIEW: 0
-            },
-            m_getField: 0,
-            m_setField: 0
-          },
-          c_Organization: {
-            c_Field: {
-              s_ADDRESS: 0,
-              s_DESCRIPTION: 0,
-              s_END_DATE: 0,
-              s_FIELD: 0,
-              s_NAME: 0,
-              s_SALARY: 0,
-              s_START_DATE: 0,
-              s_SUB_FIELD: 0,
-              s_TITLE: 0,
-              s_WEBPAGE: 0
-            },
-            m_getField: 0
-          },
-          c_Permission: {
-            s_VIEWER: 0
-          },
-          c_Person: {
-            c_Field: {
-              s_ABOUT_ME: 0,
-              s_ACTIVITIES: 0,
-              s_ADDRESSES: 0,
-              s_AGE: 0,
-              s_BODY_TYPE: 0,
-              s_BOOKS: 0,
-              s_CARS: 0,
-              s_CHILDREN: 0,
-              s_CURRENT_LOCATION: 0,
-              s_DATE_OF_BIRTH: 0,
-              s_DRINKER: 0,
-              s_EMAILS: 0,
-              s_ETHNICITY: 0,
-              s_FASHION: 0,
-              s_FOOD: 0,
-              s_GENDER: 0,
-              s_HAPPIEST_WHEN: 0,
-              s_HAS_APP: 0,
-              s_HEROES: 0,
-              s_HUMOR: 0,
-              s_ID: 0,
-              s_INTERESTS: 0,
-              s_JOBS: 0,
-              s_JOB_INTERESTS: 0,
-              s_LANGUAGES_SPOKEN: 0,
-              s_LIVING_ARRANGEMENT: 0,
-              s_LOOKING_FOR: 0,
-              s_MOVIES: 0,
-              s_MUSIC: 0,
-              s_NAME: 0,
-              s_NETWORK_PRESENCE: 0,
-              s_NICKNAME: 0,
-              s_PETS: 0,
-              s_PHONE_NUMBERS: 0,
-              s_POLITICAL_VIEWS: 0,
-              s_PROFILE_SONG: 0,
-              s_PROFILE_URL: 0,
-              s_PROFILE_VIDEO: 0,
-              s_QUOTES: 0,
-              s_RELATIONSHIP_STATUS: 0,
-              s_RELIGION: 0,
-              s_ROMANCE: 0,
-              s_SCARED_OF: 0,
-              s_SCHOOLS: 0,
-              s_SEXUAL_ORIENTATION: 0,
-              s_SMOKER: 0,
-              s_SPORTS: 0,
-              s_STATUS: 0,
-              s_TAGS: 0,
-              s_THUMBNAIL_URL: 0,
-              s_TIME_ZONE: 0,
-              s_TURN_OFFS: 0,
-              s_TURN_ONS: 0,
-              s_TV_SHOWS: 0,
-              s_URLS: 0
-            },
-            m_getDisplayName: 0,
-            m_getField: 0,
-            m_getId: 0,
-            m_isOwner: 0,
-            m_isViewer: 0
-          },
-          c_Phone: {
-            c_Field: {
-              s_NUMBER: 0,
-              s_TYPE: 0
-            },
-            m_getField: 0
-          },
-          c_ResponseItem: {
-            c_Error: {
-              s_BAD_REQUEST: 0,
-              s_FORBIDDEN: 0,
-              s_INTERNAL_ERROR: 0,
-              s_LIMIT_EXCEEDED: 0,
-              s_NOT_IMPLEMENTED: 0,
-              s_UNAUTHORIZED: 0
-            },
-            m_getData: 0,
-            m_getErrorCode: 0,
-            m_getErrorMessage: 0,
-            m_getOriginalDataRequest: 0,
-            m_hadError: 0
-          },
-          c_Url: {
-            c_Field: {
-              s_ADDRESS: 0,
-              s_LINK_TEXT: 0,
-              s_TYPE: 0
-            },
-            m_getField: 0
-          },
-          s_getEnvironment: 0,
-          s_hasPermission: 0,
-          s_newActivity: 0,
-          s_newDataRequest: 0,
-          s_newIdSpec: 0,
-          s_newMediaItem: 0,
-          s_newMessage: 0,
-          s_newNavigationParameters: 0,
-          s_requestCreateActivity: 0,
-          s_requestPermission: 0,
-          s_requestSendMessage: 0,
-          s_requestShareApp: 0
-        }
-      };
-      
-      if (window.gadgets) 
-        imports.outers.gadgets = gadgets;
-      if (window.opensocial)
-        imports.outers.opensocial = opensocial; 
-      caja___.whitelist(opensocialSchema, imports.outers);
-      if (gadgets.MiniMessage)
-        ___.ctor(gadgets.MiniMessage, Object, 'MiniMessage');
-      if (gadgets.TabSet)
-        ___.ctor(gadgets.TabSet, Object, 'TabSet');
+        c_ContentType: {
+          s_DOM: 0,
+          s_FEED: 0,
+          s_JSON: 0,
+          s_TEXT: 0
+        },
+        c_MethodType: {
+          s_DELETE: 0,
+          s_GET: 0,
+          s_HEAD: 0,
+          s_POST: 0,
+          s_PUT: 0
+        },
+        c_ProxyUrlRequestParameters: {
+          s_REFRESH_INTERVAL: 0
+        },
+        c_RequestParameters: {
+          s_AUTHORIZATION: 0,
+          s_CONTENT_TYPE: 0,
+          s_GET_SUMMARIES: 0,
+          s_HEADERS: 0,
+          s_METHOD: 0,
+          s_NUM_ENTRIES: 0,
+          s_POST_DATA: 0
+        },
+        s_encodeValues: 0,
+        s_getProxyUrl: 0,
+        s_makeRequest: 0
+      },
+      c_json: {
+        s_parse: 0,
+        s_stringify: 0
+      },
+      c_pubsub: {
+        s_publish: 0,
+        s_subscribe: 0,
+        s_unsubscribe: 0
+      },
+      c_rpc: {
+        s_call: 0,
+        s_register: 0,
+        s_registerDefault: 0,
+        s_unregister: 0,
+        s_unregisterDefault: 0
+      },
+      c_skins: {
+        c_Property: {
+          s_ANCHOR_COLOR: 0,
+          s_BG_COLOR: 0,
+          s_BG_IMAGE: 0,
+          s_FONT_COLOR: 0
+        },
+        s_getProperty: 0
+      },
+      c_util: {
+        s_escapeString: 0,
+        s_getFeatureParameters: 0,
+        s_hasFeature: 0,
+        s_registerOnLoadHandler: 0,
+        s_unescapeString: 0
+      },
+      c_views: {
+        c_View: {
+          m_bind: 0,
+          m_getUrlTemplate: 0,
+          m_isOnlyVisibleGadget: 0
+        },
+        c_ViewType: {
+          s_CANVAS: 0,
+          s_HOME: 0,
+          s_PREVIEW: 0,
+          s_PROFILE: 0
+        },
+        s_bind: 0,
+        // FIXME(benl): Why do we think getCurrentView does not use "this"?
+        s_getCurrentView: 0,
+        s_getParams: 0,
+        s_requestNavigateTo: 0
+      },
+      c_window: {
+        s_adjustHeight: 0,
+        s_getViewportDimensions: 0,
+        s_setTitle: 0
+      }
+    },
+    c_opensocial: {
+      c_Activity: {
+        c_Field: {
+          s_APP_ID: 0,
+          s_BODY: 0,
+          s_BODY_ID: 0,
+          s_EXTERNAL_ID: 0,
+          s_ID: 0,
+          s_MEDIA_ITEMS: 0,
+          s_POSTED_TIME: 0,
+          s_PRIORITY: 0,
+          s_STREAM_FAVICON_URL: 0,
+          s_STREAM_SOURCE_URL: 0,
+          s_STREAM_TITLE: 0,
+          s_STREAM_URL: 0,
+          s_TEMPLATE_PARAMS: 0,
+          s_TITLE: 0,
+          s_TITLE_ID: 0,
+          s_URL: 0,
+          s_USER_ID: 0
+        },
+        m_getField: 0,
+        m_getId: 0,
+        m_setField: 0
+      },
+      c_Address: {
+        c_Field: {
+          s_COUNTRY: 0,
+          s_EXTENDED_ADDRESS: 0,
+          s_LATITUDE: 0,
+          s_LOCALITY: 0,
+          s_LONGITUDE: 0,
+          s_POSTAL_CODE: 0,
+          s_PO_BOX: 0,
+          s_REGION: 0,
+          s_STREET_ADDRESS: 0,
+          s_TYPE: 0,
+          s_UNSTRUCTURED_ADDRESS: 0
+        },
+        m_getField: 0
+      },
+      c_BodyType: {
+        c_Field: {
+          s_BUILD: 0,
+          s_EYE_COLOR: 0,
+          s_HAIR_COLOR: 0,
+          s_HEIGHT: 0,
+          s_WEIGHT: 0
+        },
+        m_getField: 0
+      },
+      c_Collection: {
+        m_asArray: 0,
+        m_each: 0,
+        m_getById: 0,
+        m_getOffset: 0,
+        m_getTotalSize: 0,
+        m_size: 0
+      },
+      c_CreateActivityPriority: {
+        s_HIGH: 0,
+        s_LOW: 0
+      },
+      c_DataRequest: {
+        c_DataRequestFields: {
+          s_ESCAPE_TYPE: 0
+        },
+        c_FilterType: {
+          s_ALL: 0,
+          s_HAS_APP: 0,
+          s_TOP_FRIENDS: 0
+        },
+        c_PeopleRequestFields: {
+          s_FILTER: 0,
+          s_FILTER_OPTIONS: 0,
+          s_FIRST: 0,
+          s_MAX: 0,
+          s_PROFILE_DETAILS: 0,
+          s_SORT_ORDER: 0
+        },
+        c_SortOrder: {
+          s_NAME: 0,
+          s_TOP_FRIENDS: 0
+        },
+        m_add: 0,
+        m_newFetchActivitiesRequest: 0,
+        m_newFetchPeopleRequest: 0,
+        m_newFetchPersonAppDataRequest: 0,
+        m_newFetchPersonRequest: 0,
+        m_newRemovePersonAppDataRequest: 0,
+        m_newUpdatePersonAppDataRequest: 0,
+        m_send: 0
+      },
+      c_DataResponse: {
+        m_get: 0,
+        m_getErrorMessage: 0,
+        m_hadError: 0
+      },
+      c_Email: {
+        c_Field: {
+          s_ADDRESS: 0,
+          s_TYPE: 0
+        },
+        m_getField: 0
+      },
+      c_Enum: {
+        c_Drinker: {
+          s_HEAVILY: 0,
+          s_NO: 0,
+          s_OCCASIONALLY: 0,
+          s_QUIT: 0,
+          s_QUITTING: 0,
+          s_REGULARLY: 0,
+          s_SOCIALLY: 0,
+          s_YES: 0
+        },
+        c_Gender: {
+          s_FEMALE: 0,
+          s_MALE: 0
+        },
+        c_LookingFor: {
+          s_ACTIVITY_PARTNERS: 0,
+          s_DATING: 0,
+          s_FRIENDS: 0,
+          s_NETWORKING: 0,
+          s_RANDOM: 0,
+          s_RELATIONSHIP: 0
+        },
+        c_Presence: {
+          s_AWAY: 0,
+          s_CHAT: 0,
+          s_DND: 0,
+          s_OFFLINE: 0,
+          s_ONLINE: 0,
+          s_XA: 0
+        },
+        c_Smoker: {
+          s_HEAVILY: 0,
+          s_NO: 0,
+          s_OCCASIONALLY: 0,
+          s_QUIT: 0,
+          s_QUITTING: 0,
+          s_REGULARLY: 0,
+          s_SOCIALLY: 0,
+          s_YES: 0
+        },
+        m_getDisplayValue: 0,
+        m_getKey: 0
+      },
+      c_Environment: {
+        c_ObjectType: {
+          s_ACTIVITY: 0,
+          s_ACTIVITY_MEDIA_ITEM: 0,
+          s_ADDRESS: 0,
+          s_BODY_TYPE: 0,
+          s_EMAIL: 0,
+          s_FILTER_TYPE: 0,
+          s_MESSAGE: 0,
+          s_MESSAGE_TYPE: 0,
+          s_NAME: 0,
+          s_ORGANIZATION: 0,
+          s_PERSON: 0,
+          s_PHONE: 0,
+          s_SORT_ORDER: 0,
+          s_URL: 0
+        },
+        m_getDomain: 0,
+        m_supportsField: 0
+      },
+      c_EscapeType: {
+        s_HTML_ESCAPE: 0,
+        s_NONE: 0
+      },
+      c_IdSpec: {
+        c_Field: {
+          s_GROUP_ID: 0,
+          s_NETWORK_DISTANCE: 0,
+          s_USER_ID: 0
+        },
+        c_PersonId: {
+          s_OWNER: 0,
+          s_VIEWER: 0
+        },
+        m_getField: 0,
+        m_setField: 0
+      },
+      c_MediaItem: {
+        c_Field: {
+          s_MIME_TYPE: 0,
+          s_TYPE: 0,
+          s_URL: 0
+        },
+        c_Type: {
+          s_AUDIO: 0,
+          s_IMAGE: 0,
+          s_VIDEO: 0
+        },
+        m_getField: 0,
+        m_setField: 0
+      },
+      c_Message: {
+        c_Field: {
+          s_BODY: 0,
+          s_BODY_ID: 0,
+          s_TITLE: 0,
+          s_TITLE_ID: 0,
+          s_TYPE: 0
+        },
+        c_Type: {
+          s_EMAIL: 0,
+          s_NOTIFICATION: 0,
+          s_PRIVATE_MESSAGE: 0,
+          s_PUBLIC_MESSAGE: 0
+        },
+        m_getField: 0,
+        m_setField: 0
+      },
+      c_Name: {
+        c_Field: {
+          s_ADDITIONAL_NAME: 0,
+          s_FAMILY_NAME: 0,
+          s_GIVEN_NAME: 0,
+          s_HONORIFIC_PREFIX: 0,
+          s_HONORIFIC_SUFFIX: 0,
+          s_UNSTRUCTURED: 0
+        },
+        m_getField: 0
+      },
+      c_NavigationParameters: {
+        c_DestinationType: {
+          s_RECIPIENT_DESTINATION: 0,
+          s_VIEWER_DESTINATION: 0
+        },
+        c_Field: {
+          s_OWNER: 0,
+          s_PARAMETERS: 0,
+          s_VIEW: 0
+        },
+        m_getField: 0,
+        m_setField: 0
+      },
+      c_Organization: {
+        c_Field: {
+          s_ADDRESS: 0,
+          s_DESCRIPTION: 0,
+          s_END_DATE: 0,
+          s_FIELD: 0,
+          s_NAME: 0,
+          s_SALARY: 0,
+          s_START_DATE: 0,
+          s_SUB_FIELD: 0,
+          s_TITLE: 0,
+          s_WEBPAGE: 0
+        },
+        m_getField: 0
+      },
+      c_Permission: {
+        s_VIEWER: 0
+      },
+      c_Person: {
+        c_Field: {
+          s_ABOUT_ME: 0,
+          s_ACTIVITIES: 0,
+          s_ADDRESSES: 0,
+          s_AGE: 0,
+          s_BODY_TYPE: 0,
+          s_BOOKS: 0,
+          s_CARS: 0,
+          s_CHILDREN: 0,
+          s_CURRENT_LOCATION: 0,
+          s_DATE_OF_BIRTH: 0,
+          s_DRINKER: 0,
+          s_EMAILS: 0,
+          s_ETHNICITY: 0,
+          s_FASHION: 0,
+          s_FOOD: 0,
+          s_GENDER: 0,
+          s_HAPPIEST_WHEN: 0,
+          s_HAS_APP: 0,
+          s_HEROES: 0,
+          s_HUMOR: 0,
+          s_ID: 0,
+          s_INTERESTS: 0,
+          s_JOBS: 0,
+          s_JOB_INTERESTS: 0,
+          s_LANGUAGES_SPOKEN: 0,
+          s_LIVING_ARRANGEMENT: 0,
+          s_LOOKING_FOR: 0,
+          s_MOVIES: 0,
+          s_MUSIC: 0,
+          s_NAME: 0,
+          s_NETWORK_PRESENCE: 0,
+          s_NICKNAME: 0,
+          s_PETS: 0,
+          s_PHONE_NUMBERS: 0,
+          s_POLITICAL_VIEWS: 0,
+          s_PROFILE_SONG: 0,
+          s_PROFILE_URL: 0,
+          s_PROFILE_VIDEO: 0,
+          s_QUOTES: 0,
+          s_RELATIONSHIP_STATUS: 0,
+          s_RELIGION: 0,
+          s_ROMANCE: 0,
+          s_SCARED_OF: 0,
+          s_SCHOOLS: 0,
+          s_SEXUAL_ORIENTATION: 0,
+          s_SMOKER: 0,
+          s_SPORTS: 0,
+          s_STATUS: 0,
+          s_TAGS: 0,
+          s_THUMBNAIL_URL: 0,
+          s_TIME_ZONE: 0,
+          s_TURN_OFFS: 0,
+          s_TURN_ONS: 0,
+          s_TV_SHOWS: 0,
+          s_URLS: 0
+        },
+        m_getDisplayName: 0,
+        m_getField: 0,
+        m_getId: 0,
+        m_isOwner: 0,
+        m_isViewer: 0
+      },
+      c_Phone: {
+        c_Field: {
+          s_NUMBER: 0,
+          s_TYPE: 0
+        },
+        m_getField: 0
+      },
+      c_ResponseItem: {
+        c_Error: {
+          s_BAD_REQUEST: 0,
+          s_FORBIDDEN: 0,
+          s_INTERNAL_ERROR: 0,
+          s_LIMIT_EXCEEDED: 0,
+          s_NOT_IMPLEMENTED: 0,
+          s_UNAUTHORIZED: 0
+        },
+        m_getData: 0,
+        m_getErrorCode: 0,
+        m_getErrorMessage: 0,
+        m_getOriginalDataRequest: 0,
+        m_hadError: 0
+      },
+      c_Url: {
+        c_Field: {
+          s_ADDRESS: 0,
+          s_LINK_TEXT: 0,
+          s_TYPE: 0
+        },
+        m_getField: 0
+      },
+      s_getEnvironment: 0,
+      s_hasPermission: 0,
+      s_newActivity: 0,
+      s_newDataRequest: 0,
+      s_newIdSpec: 0,
+      s_newMediaItem: 0,
+      s_newMessage: 0,
+      s_newNavigationParameters: 0,
+      s_requestCreateActivity: 0,
+      s_requestPermission: 0,
+      s_requestSendMessage: 0,
+      s_requestShareApp: 0
+    }
+  };
+  
+  // Taming
+  if (gadgets.flash) {
+    var d = document.createElement('div');
+    d.appendChild(document.createTextNode("bridge"));
+    document.body.appendChild(d);
+    
+    gadgets.flash.embedFlash(
+        "/gadgets/files/container/Bridge.swf", 
+        d,
+        10,
+        {
+          allowNetworking: "always",
+          allowScriptAccess: "all",
+          width: 0,
+          height: 0,
+          flashvars: "logging=true"
+        });
+    bridge___ = d.childNodes[0];
+    bridge___.channels = [];
+
+    callJS = function (functionName, argv) {
+      // This assumes that there's a single gadget in the frame.
+      var $v = ___.getNewModuleHandler().getImports().$v;
+      return $v.cf($v.ro(functionName), [argv]);
+    };
+    
+    onFlashBridgeReady = function () {
+      var len = bridge___.channels.length;
+      for(var i = 0; i < len; ++i) {
+        bridge___.registerChannel(bridge___.channels[i]);
+      }
+      delete bridge___.channels;
+      var outers = ___.getNewModuleHandler().getImports().$v.getOuters();
+      if (outers.onFlashBridgeReady) {
+        callJS("onFlashBridgeReady");
+      }
+    };
+
+    gadgets.flash.embedFlash =
+        taming.flash.embedFlash(gadgets.flash.embedFlash);
+  }
+  
+  if (window.gadgets) 
+    imports.outers.gadgets = gadgets;
+  if (window.opensocial)
+    imports.outers.opensocial = opensocial; 
+  caja___.whitelist(opensocialSchema, imports.outers);
+  if (gadgets.MiniMessage)
+    ___.ctor(gadgets.MiniMessage, Object, 'MiniMessage');
+  if (gadgets.TabSet)
+    ___.ctor(gadgets.TabSet, Object, 'TabSet');
 });
 
 // Expose alert and console.log to cajoled programs

Modified: incubator/shindig/trunk/features/src/main/javascript/features/flash/flash.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/src/main/javascript/features/flash/flash.js?rev=817905&r1=817904&r2=817905&view=diff
==============================================================================
--- incubator/shindig/trunk/features/src/main/javascript/features/flash/flash.js (original)
+++ incubator/shindig/trunk/features/src/main/javascript/features/flash/flash.js Tue Sep 22 23:47:22 2009
@@ -111,15 +111,18 @@
     }
     if (ver >= swfVer) {
       // Set default size
-      if (!opt_params.width) {
+      if (opt_params.width === void 0) {
         opt_params.width = '100%';
       }
-      if (!opt_params.height) {
+      if (opt_params.height === void 0) {
         opt_params.height = '100%';
       }
       // Set the default "base" attribute
       if (typeof opt_params.base !== 'string') {
-        opt_params.base = swfUrl.match(/^[^?#]+\//)[0];
+        var a = document.createElement('a');
+        a.href = swfUrl;
+        // Get the part up to the last slash
+        opt_params.base = a.href.match(/^(.*\/)[^/]*$/)[1];
       }
       // Set wmode to "opaque" if it's not defined. The default value
       // "window" is undesirable because browsers will render Flash
@@ -133,21 +136,20 @@
           opt_params.id = newId;
         }
       }
-      // Prepare html snippet
-      var html;
+      // Prepare flash object
+      var flashObj;
       if (navigator.plugins && navigator.mimeTypes &&
           navigator.mimeTypes.length) {
         // Use <embed> tag for Netscape and Mozilla browsers
         opt_params.type = 'application/x-shockwave-flash';
         opt_params.src = swfUrl;
 
-        html = '<embed';
+        flashObj = document.createElement('embed');
         for (var prop in opt_params) {
-          if (!/^swf_/.test(prop)) {
-            html += ' ' + prop + '="' + opt_params[prop] + '"';
+          if (!/^swf_/.test(prop) && !/___$/.test(prop)) {
+            flashObj.setAttribute(prop, opt_params[prop]);
           }
         }
-        html += ' /></embed>';
       } else {
         // Use <object> tag for IE
         opt_params.movie = swfUrl;
@@ -160,21 +162,27 @@
           attr.id = opt_params.id;
         }
 
-        html = '<object';
+        flashObj = document.createElement('object');
+        flashObj.setAttribute('data', swfUrl);
         for (var attrProp in attr) {
-          html += ' ' + attrProp + '="' + attr[attrProp] + '"';
+          if (!/___$/.test(attrProp)) {
+            flashObj.setAttribute(attrProp, attr[attrProp]);
+          }
         }
-        html += '>';
         for (var paramsProp in opt_params) {
-          if (!/^swf_/.test(paramsProp) && !attr[paramsProp]) {
-            html += '<param name="' + paramsProp +
-              '" value="' + opt_params[paramsProp] + '" />';
+          var param = document.createElement('param');
+          if (!/^swf_/.test(paramsProp) && 
+              !attr[paramsProp] && 
+              !/___$/.test(paramsProp)) {
+            param.setAttribute('name', paramsProp);
+            param.setAttribute('value', opt_params[paramsProp]);
+            flashObj.appendChild(param);
           }
         }
-        html += '</object>';
       }
-      // Inject html
-      swfContainer.innerHTML = html;
+      // Inject flash object
+      swfContainer.innerHTML = '';
+      swfContainer.appendChild(flashObj);
       return true;
     }
   }

Added: incubator/shindig/trunk/javascript/container/Bridge.as
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/container/Bridge.as?rev=817905&view=auto
==============================================================================
--- incubator/shindig/trunk/javascript/container/Bridge.as (added)
+++ incubator/shindig/trunk/javascript/container/Bridge.as Tue Sep 22 23:47:22 2009
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+
+import flash.external.ExternalInterface;
+
+class com.google.Bridge extends MovieClip {
+  // The lcJS object stores a listening LocalConnection for each SWF on the page.
+  // These connections carry messages intentded for JavaScript code.
+  private var lcJS;
+  // We only need one LocalConnection for sending.
+  private var lcSWF;
+  
+  function log(msg) {
+    if (_root.logging) {
+      ExternalInterface.call('gadgets.log', msg);
+    }
+  }
+  
+  function callSWF(channel, methodName, argv) {
+    log('callSWF: ' + methodName + ', ' + lcSWF);
+    return {
+				channel: channel, 
+				methodName: methodName, 
+				argv: argv, 
+				result: lcSWF.send(channel + "swf", methodName, argv)
+			};
+  }
+    
+  function callJS(methodName, argv) {
+		log('callJS: ' + methodName);
+    return ExternalInterface.call("callJS", methodName, argv);
+  }
+  
+  function registerChannel(channel) {
+    log('registerChannel: ' + channel);
+    lcJS[channel] = new LocalConnection();
+    log('registerChannel: ' + lcJS[channel].connect(channel + "js"));
+    lcJS[channel].callJS = callJS;
+    lcJS[channel].allowDomain = function (domain) {
+      log('allowDomain: ' + domain);
+      return true;
+    }
+    return channel;
+  }
+  
+  // Fires when the movie loads  
+  function onLoad() {
+    lcJS = [];
+    lcSWF = new LocalConnection();
+
+    log('onLoad; domain = ' + lcSWF.domain());
+    ExternalInterface.addCallback('callSWF', this, callSWF);
+    ExternalInterface.addCallback('registerChannel', this, registerChannel);
+    ExternalInterface.call('onFlashBridgeReady');
+  }
+}

Added: incubator/shindig/trunk/javascript/container/Bridge.fla
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/container/Bridge.fla?rev=817905&view=auto
==============================================================================
Files incubator/shindig/trunk/javascript/container/Bridge.fla (added) and incubator/shindig/trunk/javascript/container/Bridge.fla Tue Sep 22 23:47:22 2009 differ