OSDN Git Service

Version 0.5.151, fix X.Timer.remove & X.OAuth2 is working.
authoritozyun <itozyun@user.sourceforge.jp>
Wed, 20 May 2015 11:03:57 +0000 (20:03 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Wed, 20 May 2015 11:03:57 +0000 (20:03 +0900)
0.6.x/js/01_core/09_XPair.js
0.6.x/js/01_core/14_XTimer.js
0.6.x/js/06_net/00_XNet.js
0.6.x/js/06_net/05_XXHRGadget.js
0.6.x/js/06_net/10_XOAuth2.js
0.6.x/js/main.js

index 120258c..14cd864 100644 (file)
@@ -9,6 +9,8 @@ X[ 'Pair' ] = {
 var X_Pair_SIZE            = 1000,\r
        X_Pair_KEY_STORE_LIST  = [[]],\r
        X_Pair_PAIR_STORE_LIST = [[]],\r
+       X_Pair_noChashe        = false,\r
+       \r
        X_Pair_functionString  = new Function( 's', 'p', 'k', (function(){\r
                var ret = 'var i=0,l=s.length,a;' +\r
                                  'for(;i<l;++i){' +\r
@@ -21,7 +23,6 @@ var X_Pair_SIZE            = 1000,
                };\r
                return ret + '}}';\r
        })()),\r
-       X_Pair_noChashe = false,\r
        \r
        // TODO キャッシュするペアの数とヒット率、探索時間の記録\r
        X_Pair_lastKey, X_Pair_lastPair;\r
index c6d8378..de15c13 100644 (file)
@@ -132,7 +132,7 @@ var
                        } else {\r
                                for( ; i; ){\r
                                        if( ( f = list[ --i ] ).uid < uid ) break;\r
-                                       if( f.uid === uid ){\r
+                                       if( f.uid == uid ){\r
                                                list.splice( i, 1 );\r
                                                // gecko では cancelRequestAnimationFrame が無い場合がある\r
                                                l === 1 && X_Timer_CANCEL_ANIME_FRAME && X_Timer_CANCEL_ANIME_FRAME( X_Timer_requestID );\r
@@ -155,7 +155,7 @@ var
                        } else {\r
                                for( ; i; ){\r
                                        if( ( f = list[ --i ] ).uid < uid ) break;\r
-                                       if( f.uid === uid ){\r
+                                       if( f.uid == uid ){\r
                                                list.splice( i, 1 );\r
                                                l === 1 && X_Timer_remove( X_Timer_requestID );\r
                                                break;\r
@@ -270,7 +270,7 @@ X[ 'Timer' ] = {
                        X_Timer_removal[ uid ] = true;\r
                } else {\r
                        for( ; i; ){\r
-                               if( ( q = list[ --i ] ).uid === uid ){\r
+                               if( ( q = list[ --i ] ).uid == uid ){ // 数字の場合と文字の場合がある\r
                                        list.splice( i, 1 );\r
                                        \r
                                        /*\r
index 7d6393c..ec0ee1a 100644 (file)
@@ -72,7 +72,7 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ](
                        'netVersion' : 0,\r
                        \r
                        'Constructor' : function( urlOrObject, opt_options ){\r
-                               var v, opt, url, type;\r
+                               var v, opt, url, type, auth;\r
                                \r
                                if( X_Type_isObject( opt = urlOrObject ) ){\r
                                        if( v = opt[ 'xhr' ] ){\r
@@ -135,7 +135,13 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ](
                                        return;\r
                                };\r
                                \r
+                               if( auth = opt[ 'auth' ] ){\r
+                                       delete opt[ 'auth' ];\r
+                               };\r
                                opt = X_Object_deepCopy( opt );\r
+                               if( auth ){\r
+                                       opt[ 'auth' ] = auth; // auth は deep copy されるとまずい\r
+                               };\r
                                opt.netType   = type;\r
                                opt[ 'url'  ] = url;                            \r
                                \r
@@ -269,7 +275,7 @@ function X_NET_shiftQueue(){
        switch( X_NET_currentData.netType ){\r
                case X_NET_TYPE_XHR :\r
                        \r
-                       // TODO (xProtocol | method) & canUse -> gadget.io.makeRequset, flash\r
+                       // TODO (xProtocol | method='update' | !cors) & canUse -> gadget.io.makeRequset, flash\r
                        // force 'gadget', 'flash'\r
                        switch( X_NET_currentData[ 'test' ] ){\r
                                case 'gadget' :\r
@@ -277,6 +283,7 @@ function X_NET_shiftQueue(){
                                        break;\r
                                case 'flash'  :\r
                                        break;\r
+                               \r
                                default :\r
                                        X_NET_currentWrapper = X_NET_XHRWrapper || X_TEMP.X_Net_XHR_init();\r
                        };\r
@@ -285,16 +292,17 @@ function X_NET_shiftQueue(){
                        // OAuth2\r
                        if( auth = X_NET_currentData[ 'auth' ] ){\r
                                authSettings = X_Pair_get( auth );\r
-                               switch( auth.state() ){\r
+                               switch( auth[ 'state' ]() ){\r
                                        case 0 :\r
                                        case 1 :\r
+                                       case 2 :\r
                                                if( !( auth[ 'dispatch' ]( X_EVENT_NEED_AUTH ) & X_Callback_PREVENT_DEFAULT ) ){\r
                                                        authSettings.lazyReq = X_NET_currentQueue;\r
                                                };\r
                                                X_NET_currentQueue = null;\r
                                                X_NET_shiftQueue();\r
                                                break;\r
-                                       case 2 : // refresh token\r
+                                       case 3 : // refresh token\r
                                                X_NET_QUEUE_LIST.push( X_NET_currentQueue );\r
                                                X_NET_currentQueue = null;\r
                                                X_NET_shiftQueue();\r
@@ -312,9 +320,6 @@ function X_NET_shiftQueue(){
                case X_NET_TYPE_IMAGE :\r
                        X_NET_currentWrapper = X_NET_ImageWrapper || X_TEMP.X_NET_Image_init();\r
                        break;\r
-               case 5 :\r
-                       X_NET_currentWrapper = X_NET_GIMRWrapper;\r
-                       break;\r
        };\r
        \r
        X_NET_currentWrapper[ 'listen' ]( [ X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR, X_EVENT_TIMEOUT ], X_NET_currentQueue, X_NET_proxyDispatch );\r
index 0a04809..3d2cf68 100644 (file)
@@ -39,12 +39,14 @@ var X_NET_GIMR_canUse         = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ],
        \r
        X_NET_GIMR_phase = 0,\r
        \r
-       X_NET_GIMR_lastHashString;\r
+       X_NET_GIMR_lastHashString,\r
+       \r
+       X_NET_GIMR_isReceiveBatches, X_NET_GIMR_receivedString;\r
 \r
 \r
 function X_NET_GIMR_detectImageOverIframe(){\r
        var raw = X_NET_GIMR_gadgetIframe[ '_rawObject' ],\r
-               iwin, ret, error, data = null;\r
+               iwin, ret, n, error, data = null;\r
        \r
        if( raw ){\r
                iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ X_NET_GIMR_iframeName ];\r
@@ -53,7 +55,8 @@ function X_NET_GIMR_detectImageOverIframe(){
                        ret = X_NET_GIMR_detection( iwin.frames );\r
                        if( ret && ret !== X_NET_GIMR_lastHashString ){\r
                                X_NET_GIMR_lastHashString = ret;\r
-                               console.log( ret );\r
+                               //console.log( ret.length );\r
+                               //console.log( '' + ret );\r
                                \r
                                switch( X_NET_GIMR_phase ){\r
                                        case 0 : // init\r
@@ -66,7 +69,33 @@ function X_NET_GIMR_detectImageOverIframe(){
                                                break;\r
 \r
                                        case 2 : // _waiting_ 通信結果待ち\r
-                                               ret = X_String_parseTrustedJsonString( decodeURIComponent( ret.substr( 1 ) ) );\r
+                                               // 分割受信モードか?\r
+                                               ret = ret.substr( 1 );\r
+                                               n   = parseInt( ret );\r
+                                               \r
+                                               if( X_NET_GIMR_isReceiveBatches ){\r
+                                                       X_NET_GIMR_receivedString += ret;\r
+                                                       if( --X_NET_GIMR_isReceiveBatches ){\r
+                                                               iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches;\r
+                                                               return;\r
+                                                       };\r
+                                               } else\r
+                                               if( 1 < n ){\r
+                                                       X_NET_GIMR_receivedString   = ret.substr( ( n + ':' ).length );\r
+                                                       X_NET_GIMR_isReceiveBatches = --n;\r
+                                                       iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches;\r
+                                                       // TODO speedup\r
+                                                       X_NET_GIMR_timerID = X_Timer_add( 16, 0, X_NET_GIMR_detectImageOverIframe );\r
+                                                       return X_Callback_UN_LISTEN;\r
+                                               } else {\r
+                                                       X_NET_GIMR_receivedString = ret;\r
+                                               };\r
+\r
+                                               var zero = String.fromCharCode( 0 );\r
+                                               console.log( _builtin_decodeURI( X_NET_GIMR_receivedString ).split( zero + '002' ).join( '--' ).split( zero + 'E0F' ).join( '--' ) );\r
+                                               ret = X_String_parseTrustedJsonString( _builtin_decodeURI( X_NET_GIMR_receivedString ).split( zero + '002' ).join( '。' ).split( zero + 'F0E' ).join( '.' ) );\r
+                                               \r
+                                               X_NET_GIMR_receivedString = '';\r
                                                \r
                                                error = ret[ 'errors' ] && ret[ 'errors' ].length;\r
                                                \r
@@ -83,14 +112,15 @@ function X_NET_GIMR_detectImageOverIframe(){
                                                X_NET_GIMRWrapper\r
                                                        [ 'asyncDispatch' ]({\r
                                                                type      : error ? X_EVENT_ERROR : X_EVENT_SUCCESS,\r
-                                                               state     : ret[ 'rc' ] || ( error ? 400 : 200 ),\r
+                                                               state     : ret[ 'rc' ] || ( error ? ret[ 'code' ] || 400 : 200 ),\r
                                                                data      : data,\r
                                                                'headers' : ret[ 'headers' ],\r
                                                                'message' : error && ret[ 'errors' ].join( '\n' )\r
                                                        });\r
-                                               iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_';\r
+                                                       \r
                                                X_NET_GIMR_timerID = X_NET_GIMR_phase = 0;\r
-                                               X_NET_GIMR_lastHashString = '';\r
+                                               X_NET_GIMR_lastHashString = '';                                                 \r
+                                               iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_';\r
                                                \r
                                                return X_Callback_UN_LISTEN;\r
                                };\r
@@ -145,9 +175,11 @@ X_NET_GIMRWrapper = X_Class_override(
                                                        } );\r
                        };\r
                        \r
-                       X_NET_GIMR_timerID = X.Timer.add( 100, 0, X_NET_GIMR_detectImageOverIframe );\r
+                       X_NET_GIMR_timerID = X_Timer_add( 333, 0, X_NET_GIMR_detectImageOverIframe );\r
                        \r
                        X_NET_GIMR_requestOriginal = X_Object_deepCopy( obj );\r
+       \r
+                       console.dir( obj );\r
                        \r
                        X_NET_GIMR_requestOptions = {\r
                                'CONTENT_TYPE'     : 'TEXT',\r
@@ -157,7 +189,7 @@ X_NET_GIMRWrapper = X_Class_override(
                        };\r
                        \r
                        for( k in obj ){\r
-                               if( v = obj[ k ] ){\r
+                               if( v = '' + obj[ k ] ){\r
                                        switch( k ){\r
                                                case 'postdata' :\r
                                                        X_NET_GIMR_requestOptions[ 'POST_DATA' ] = v;\r
@@ -167,7 +199,7 @@ X_NET_GIMRWrapper = X_Class_override(
                                                        break;                                  \r
                                                case 'dataType' :\r
                                                        // TEXT 以外は無視される?\r
-                                                       switch( v = ( '' + v ).toUpperCase() ){\r
+                                                       switch( v = v.toUpperCase() ){\r
                                                                case 'TEXT' :\r
                                                                case 'JSON' :\r
                                                                        X_NET_GIMR_requestOptions[ 'CONTENT_TYPE' ] = v;\r
@@ -182,7 +214,7 @@ X_NET_GIMRWrapper = X_Class_override(
                                                        };              \r
                                                        break;\r
                                                case 'headers' :\r
-                                                       X_NET_GIMR_requestOptions[ 'HEADERS' ] = X_NET_GIMR_requestOriginal[ v ];\r
+                                                       X_NET_GIMR_requestOptions[ 'HEADERS' ] = X_NET_GIMR_requestOriginal[ k ];\r
                                                        break;\r
                                                case 'cashe' :\r
                                                        X_NET_GIMR_requestOptions[ 'REFRESH_INTERVAL' ] = 3600;\r
index e43d508..d8f3dd1 100644 (file)
@@ -17,9 +17,9 @@ var X_NET_OAUTH2_detection      = new Function( 'w', 'try{return w.location.sear
  * <dl>
  * <dt>0 : <dd>disconnected
  * <dt>1 : <dd>now authentication ...
- * <dt>+ : <dd>authorization_code
- * <dt>2 : <dd>refresh_token
- * <dt>3 : <dd>hasAccessToken
+ * <dt>2 : <dd>authorization_code
+ * <dt>3 : <dd>refresh_token
+ * <dt>4 : <dd>hasAccessToken
  * </dl>
  */
 X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
@@ -29,11 +29,13 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                /** @lends OAuth2.prototype */
                {
                        'Constructor' : function( obj ){
+                               obj = X_Object_clone( obj );
                                
-                               X_Pair_create( this, obj = X_Object_clone( obj ) );
+                               X_Pair_create( this, obj );
                                
                                if( _getAccessToken( this ) ){
-                                       obj.oauth2State = 3;
+                                       obj.oauth2State = 4;
+                                       this[ 'asyncDispatch' ]( X_EVENT_SUCCESS );
                                } else {
                                        this[ 'asyncDispatch' ]( X_EVENT_NEED_AUTH );
                                }
@@ -44,7 +46,7 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                                // TODO kill の cancel
                        },
 
-                       'authState' : function(){
+                       'state' : function(){
                                return X_Pair_get( this ).oauth2State || 0;
                        },
                        
@@ -62,7 +64,7 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                                                {
                                                        'response_type' : 'code',
                                                        'client_id'     : pair[ 'clientID' ],
-                                                       'redirect_uri'  : tpair[ 'redirectURI' ],
+                                                       'redirect_uri'  : pair[ 'redirectURI' ],
                                                        'scope'         : ( pair[ 'scopes' ] || []).join(' ')
                                                }
                                        ), 'oauthauthorize',
@@ -80,14 +82,15 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                        },
                        
                        'cancelAuth' : function(){
-                               pair = X_Pair_get( this );
+                               var pair = X_Pair_get( this );
                                
                                if( pair.net ){
                                        pair.net[ 'kill' ]();
                                        delete pair.net;
                                };
                                
-                               X_NET_OAUTH2_authorizationWindow && X_NET_OAUTH2_authorizationWindow.close();
+                               // http://kojikoji75.hatenablog.com/entry/2013/12/15/223839
+                               X_NET_OAUTH2_authorizationWindow && X_NET_OAUTH2_authorizationWindow.open( 'about:blank','_self' ).close();
                                X_NET_OAUTH2_authorizationWindow  = null;
                                
                                X_NET_OAUTH2_authorizationTimerID && X_Timer_remove( X_NET_OAUTH2_authorizationTimerID );
@@ -97,7 +100,7 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                        },
                        
                        'refreshToken' : function(){
-                               /*
+                               /* TODO 自動リフレッシュ
                                 *                              var expires_at = this._getAccessTokenExpiry();
                                if (expires_at && Date.now() + millis > expires_at)
                                        this._refreshAccessToken({replay: false});
@@ -107,7 +110,7 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                                
                                if( pair.net ) return;
                                
-                               pair.oauth2State = 2;
+                               pair.oauth2State = 3;
                                
                                pair.net = X.Net( {
                                        'xhr'      : pair[ 'tokenEndpoint' ],
@@ -118,10 +121,11 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                                                'refresh_token' : _getRefreshToken( this )
                                        }),
                                        'dataType' : 'json',
-                                       'headers' : {
-                                               'Accept'       : 'application/json',
-                                               'Content-Type' : 'application/x-www-form-urlencoded'
-                                       }
+                                       'headers'  : {
+                                                                       'Accept'       : 'application/json',
+                                                                       'Content-Type' : 'application/x-www-form-urlencoded'
+                                                               },
+                                       'test'     : 'gadget'
                                } ).listenOnce( [ X_EVENT_SUCCESS, X_EVENT_ERROR ], this, X_Net_OAuth2_responceHandler );
                                
                                this[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, message : 'Start to refresh token.' } );
@@ -130,11 +134,12 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
        );
 
 function X_Net_OAuth2_detectAuthPopup(){
-       var closed, search, pair;
+       var closed, search, pair = X_Pair_get( this );
        
-       if( window.frames[ 'oauthauthorize' ] !== X_NET_OAUTH2_authorizationWindow || X_NET_OAUTH2_authorizationWindow.closed ){
+       if( X_NET_OAUTH2_authorizationWindow.closed ){
                pair.oauth2State = 0;
                closed = true;
+
                this[ 'asyncDispatch' ]( X_EVENT_CANCELED );
        } else
        if( search = X_NET_OAUTH2_detection( X_NET_OAUTH2_authorizationWindow ) ){
@@ -146,6 +151,7 @@ function X_Net_OAuth2_detectAuthPopup(){
 
                X_Net_OAuth2_authorizationCode( this, pair );
                
+               pair.oauth2State = 2;
                this[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, message : 'Get code success, then authorization code.' } );
        };
        
@@ -168,17 +174,18 @@ function X_Net_OAuth2_authorizationCode( oauth2, pair ){
                        'redirect_uri'  : pair[ 'redirectURI' ]
                }),
                'dataType' : 'json',
-               'headers' : {
+               'headers'  : {
                        'Accept'       : 'application/json',
                        'Content-Type' : 'application/x-www-form-urlencoded'
-               }
+               },
+               'test'     : 'gadget'
        } ).listenOnce( [ X_EVENT_SUCCESS, X_EVENT_ERROR ], oauth2, X_Net_OAuth2_responceHandler );
 };
 
 function X_Net_OAuth2_responceHandler( e ){
        var data = e.data,
                pair = X_Pair_get( this ),
-               isRefresh = pair.oauth2State === 2;
+               isRefresh = pair.oauth2State === 3;
        
        delete pair.net;
        
@@ -208,7 +215,7 @@ function X_Net_OAuth2_responceHandler( e ){
                                _removeAccessTokenExpiry( this );
                        };
                        
-                       pair.oauth2State = 3;
+                       pair.oauth2State = 4;
                        this[ 'asyncDispatch' ]( { type : X_EVENT_SUCCESS, message : isRefresh ? 'Refresh access token success.' : 'Get new access token success.' } );
                        break;
                        
@@ -225,7 +232,7 @@ function X_Net_OAuth2_responceHandler( e ){
                                this[ 'asyncDispatch' ]( { type : X_EVENT_ERROR, message : 'network-error' } );
                        } else {
                                pair.oauth2State = 0;
-                               _setAuthMechanism( 'param' );
+                               _setAuthMechanism( this, 'param' );
                                this[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, message : 'Refresh access token failed. retry header -> param. ' } );
                                // retry
                                X_Net_OAuth2_authorizationCode( this, pair );
@@ -241,7 +248,7 @@ function X_NET_OAUTH2_onXHR401Error( oauth2 ){
        if( _getAuthMechanism( oauth2 ) !== 'param' ){
                xhr            = X_NET_currentWrapper[ '_rawObject' ];
                bearerParams   = xhr.getResponseHeader( 'WWW-Authenticate' );
-               headersExposed = !X_Net_XHR_X_DOMAIN || !!xhr.getAllResponseHeaders(); // this is a hack for Firefox and IE
+               headersExposed = !X_Net_XHR_createXDR || !!xhr.getAllResponseHeaders(); // this is a hack for Firefox and IE
        };
        
        // http://d.hatena.ne.jp/ritou/20110402/1301679908
@@ -251,7 +258,7 @@ function X_NET_OAUTH2_onXHR401Error( oauth2 ){
        } else
        if ((( bearerParams && bearerParams.indexOf( ' error="invalid_token"' ) !== -1 ) || !headersExposed) && _getRefreshToken( oauth2 ) ) {
                _removeAccessToken( oauth2 ); // It doesn't work any more.
-               pair.oauth2State = 2;
+               pair.oauth2State = 3;
                oauth2[ 'refreshToken' ]();
        } else
        if (!headersExposed && !_getRefreshToken( oauth2 )) {
@@ -266,12 +273,12 @@ function X_NET_OAUTH2_updateRequest( oauth2, request ){
                url       = request[ 'url' ],
                headers;
 
-       if( token && mechanism === 'param'){
+       if( token && mechanism === 'param' ){
                request[ 'url' ] = url + ((url.indexOf('?') !== -1) ? '&' : '?') + 'bearer_token=' + encodeURIComponent( token );
        };
        
        if( token && ( !mechanism || mechanism === 'header' ) ){
-               request[ 'headers' ] || ( headers = request[ 'headers' ] = {} );
+               headers = request[ 'headers' ] || ( request[ 'headers' ] = {} );
                headers[ 'Authorization' ] = 'Bearer ' + token;
        };
 };
@@ -280,8 +287,9 @@ function _getAccessToken( that ){ return updateLocalStorage( '', that, 'accessTo
 function _getRefreshToken( that){ return updateLocalStorage( '', that, 'refreshToken' ); }
 function _getAccessTokenExpiry( that ){ return updateLocalStorage( '', that, 'tokenExpiry' ); }
 function _getAuthMechanism( that ){
+               // TODO use gadget | flash ...
                // IE's XDomainRequest doesn't support sending headers, so don't try.
-               return X_Net_XHR_X_DOMAIN ? 'param' : updateLocalStorage( '', that, 'AuthMechanism' );
+               return X_Net_XHR_createXDR ? 'param' : updateLocalStorage( '', that, 'AuthMechanism' );
        }
 function _setAccessToken( that, value ){ updateLocalStorage( '+', that, 'accessToken' , value); }
 function _setRefreshToken( that, value ){ updateLocalStorage( '+', that, 'refreshToken', value); }
@@ -294,7 +302,7 @@ function _removeAccessTokenExpiry( that ){ updateLocalStorage( '-', that, 'token
 function _removeAuthMechanism( that ){ updateLocalStorage( '-', that, 'AuthMechanism' ); }
        
 function updateLocalStorage( cmd, that, name, value ){
-       var action = cmd === '+' ? 'setItem' : '-' ? 'removeItem' : 'getItem',
+       var action = cmd === '+' ? 'setItem' : cmd === '-' ? 'removeItem' : 'getItem',
                pair;
        
        if( window.localStorage ){
index 73ef331..77956ee 100644 (file)
@@ -64,8 +64,6 @@ root = X.UI.PageRoot(
                )\r
        )\r
 );\r
-_root = X.Class._getPrivate( root );\r
-_text = X.Class._getPrivate( text );\r
 \r
 function _onClick( e ){\r
        alert( e.type );\r