OSDN Git Service

version0.5.3, fix around fetchCSS.
authoritozyun <itozyun@gmail.com>
Sat, 4 Aug 2012 09:13:34 +0000 (18:13 +0900)
committeritozyun <itozyun@gmail.com>
Sat, 4 Aug 2012 09:13:34 +0000 (18:13 +0900)
0.5.x/javascripts/system.js

index 01de22a..bb8f7fc 100644 (file)
@@ -1641,7 +1641,8 @@ var AbstractApplication = function( displayName, appClass, isOverlay ){
        var self          = null, // init で設定\r
                uiList        = [],\r
                finderList    = [],\r
-               fetchResource = false,\r
+               fetchResource = 0,\r
+               bootParams    = null,\r
                phase         = 0;\r
        this.rootElement = document.createElement( 'div' );\r
        this.bgColor     = '#C1CACF';\r
@@ -1656,19 +1657,37 @@ var AbstractApplication = function( displayName, appClass, isOverlay ){
        };\r
        this.open = function( _w, _h /*, _option */ ){\r
                phase = 3;\r
-               if( self.MIN_WIDTH > _w || self.MIN_HEIGHT > _h ){\r
-                       if( Type.isHTMLElement( self.rootElement ) === true ){\r
-                               // 小さすぎる!、と表示\r
-                       }\r
-               }\r
-               if( arguments.length > 2 ){\r
-                       self.onOpen.apply( self, arguments );\r
+               bootParams = Util.copyArray( arguments );\r
+               \r
+               if( this.rootElement.innerHTML && this.rootElement.innerHTML.length > 0 ){\r
+                       SystemTimer.add( self, detect, 16 );\r
                } else {\r
-                       self.onOpen( _w, _h );\r
+                       onOpen();\r
                }\r
-               phase = 4;\r
+               \r
+               function detect(){\r
+                       if( self.rootElement.firstChild && fetchResource === 0 ){\r
+                               SystemTimer.remove( self, detect );\r
+                               onOpen();\r
+                       };\r
+               };\r
+               \r
+               function onOpen(){\r
+                       if( self.MIN_WIDTH > _w || self.MIN_HEIGHT > _h ){\r
+                               if( Type.isHTMLElement( self.rootElement ) === true ){\r
+                                       // 小さすぎる!、と表示\r
+                               }\r
+                       }\r
+                       if( bootParams.length > 2 ){\r
+                               self.onOpen.apply( self, bootParams );\r
+                       } else {\r
+                               self.onOpen( _w, _h );\r
+                       }\r
+                       phase = 4;                      \r
+               };\r
        };\r
        this.resize = function( _w, _h ){\r
+               if( phase !== 4 ) return;\r
                if( self.MIN_WIDTH > _w || self.MIN_HEIGHT > _h ){\r
                        if( Type.isHTMLElement( self.rootElement ) === true ){\r
                                // 小さすぎる!、と表示\r
@@ -1721,12 +1740,13 @@ var AbstractApplication = function( displayName, appClass, isOverlay ){
        };\r
        this.fetchCSS = function( _url, opt_onload, opt_onerror ){\r
                if( phase === 1 ){\r
-                       Css.load( self, _url, fetchResourceComplete );\r
+                       ++fetchResource;\r
+                       Css.load( self, _url, fetchResourceComplete, fetchResourceComplete );\r
                };\r
        };\r
        \r
        function fetchResourceComplete(){\r
-               alert( phase );\r
+               --fetchResource;\r
        };\r
 };\r
 \r
@@ -2124,7 +2144,7 @@ var Application = ( function(){
                                        delete this.handler;\r
                                        delete this.destroy;\r
                                };\r
-                       }\r
+                       };\r
                } else {\r
                        wrappedEventClass = function( e, element ){\r
                                this._event        = e;\r
@@ -2147,13 +2167,13 @@ var Application = ( function(){
                                this.wheelDelta    = e.wheelDelta;\r
                                \r
                                e = element = null;\r
-                       }\r
+                       };\r
                        wrappedEventClass.prototype.stopPropagation = function(){\r
                                this._event.cancelBubble = true;\r
-                       }\r
+                       };\r
                        wrappedEventClass.prototype.preventDefault  = function(){\r
                                this._event.returnValue = false;\r
-                       }\r
+                       };\r
 \r
                        if( doc.attachEvent ){\r
                                wrappedHandlerClass = function( element, handler ){\r
@@ -2191,6 +2211,9 @@ var Application = ( function(){
                                        this.element[ 'on' + this.eventType ] = function( e ){\r
                                                return self.fire( self, e );\r
                                        };\r
+                                       this.clean = function(){\r
+                                               self = null;\r
+                                       };\r
                                        _ticket = null;\r
                                };\r
                                tmp.ticketClass.prototype = {\r
@@ -2222,11 +2245,13 @@ var Application = ( function(){
                                                return true;\r
                                        },\r
                                        destroy: function(){\r
+                                               this.clean();\r
                                                this.element[ 'on' + this.eventType ] = '';\r
                                                tmp.list.splice( Util.getIndex( tmp.list, this ), 1 );\r
                                                delete this.element;\r
                                                delete this.eventType;\r
                                                delete this.handlers;\r
+                                               delete this.clean;\r
                                        }\r
                                };\r
                        };\r
@@ -2359,7 +2384,7 @@ var ReadyEvent = ( function(){
        if( doc.readyState && !!UA.WEBKIT ){\r
                timer = window.setInterval( detect, 50 );\r
        } else\r
-       if( document.readyState && UA.isIE ){\r
+       if( document.readyState && UA.isIE && UA.ieVersion < 9 ){\r
                document.write('<script type="text/javascript" defer="defer" id="ieDOMContentLoaded" src="' +\r
                        ( ( window.location.protocol === 'https:' ) ? '://0' : 'javascript:void(0)' ) +\r
                        '"><\/script>');\r
@@ -2860,18 +2885,26 @@ var KeyEvent = ( function(){
        }\r
 })();\r
 \r
+/**\r
+ * \r
+ * http://thudjs.tumblr.com/post/637855087/stylesheet-onload-or-lack-thereof
+ */\r
+\r
 var Css = ( function(){\r
        var head = doc.getElementsByTagName( 'head' )[ 0 ];\r
        \r
        var TICKET_LIST = [];\r
        var STATE_LIST  = 'loaded,complete,uninitialized'.split( ',' );\r
        \r
+       var cssRules, sheet;\r
+       \r
        var FetchCssTicketClass = function( _apiuser, _url, _elm, _onload, _onerror ){\r
                this.apiusers = [ _apiuser ];\r
                this.url      = _url;\r
                this.elm      = _elm;\r
                this.onload   = [ _onload ];\r
                this.onerror  = [ _onerror ];\r
+               this.time     = 0;\r
        };\r
        FetchCssTicketClass.prototype = {\r
                match: function( _apiuser, _url ){\r
@@ -2899,9 +2932,32 @@ var Css = ( function(){
                        delete this.elm;\r
                        delete this.onload;\r
                        delete this.onerror;\r
+                       delete this.time;\r
                        \r
                        return true;\r
                },\r
+               loaded: function(){\r
+               for( var i = this.onload.length, f; i; ){\r
+                       f = this.onload[ --i ];\r
+                       Type.isFunction( f ) === true && AsyncCall.add( this.apiusers[ i ], f, this.url );\r
+                       this.onload[ i ] = this.onerror[ i ] = null;\r
+               };\r
+               },\r
+               error: function(){\r
+               for( var i = this.onerror.length, c; i; ){\r
+                       c = this.onerror[ --i ];\r
+                       Type.isFunction( c ) === true && AsyncCall.add( t.apiusers[ i ], c, t.url );\r
+                       this.onload[ i ] = this.onerror[ i ] = null;\r
+               };\r
+               },\r
+               check: function(){\r
+                       var el = this.elm;\r
+                       try {\r
+                               return el[ sheet ] && el[ sheet ][ cssRules ].length > 0;\r
+                       } catch( e ){\r
+                               return false;\r
+                       };\r
+               },\r
                done: false\r
        };\r
        \r
@@ -2914,17 +2970,33 @@ var Css = ( function(){
        \r
        function detect(){\r
                var t = getTicket( this ), rs = this.readyState, c;\r
-               if( t && t.done === false && ( !rs ||  Util.getIndex( STATE_LIST, rs ) !== -1 ) ){\r
+               if( t && t.done === false && ( !rs || Util.getIndex( STATE_LIST, rs ) !== -1 ) ){\r
                        t.done = true;\r
-               for( var i = t.onload.length; i; ){\r
-                       c = t.onload[ --i ];\r
-                       Type.isFunction( c ) === true && AsyncCall.add( t.apiusers[ i ], c, t.url );\r
-               };\r
+               t.loaded();\r
                this.onreadystatechange = new Function();\r
                this.onload = null;\r
                };\r
        };\r
        \r
+       function checkTimer(){\r
+               var l = TICKET_LIST.length,\r
+                       n = 0;\r
+               for( var i = 0; i < l; ++i ){\r
+                       t = TICKET_LIST[ i ];\r
+                       ++t.time;\r
+                       if( t.check() === true ){\r
+                               t.loaded();\r
+                               ++n;\r
+                       } else\r
+                       if( t.time > 99 ){\r
+                               t.error();\r
+                       } else {\r
+                               \r
+                       };\r
+               };\r
+               l === n && SystemTimer.remove( SUPER_USER_KEY, checkTimer );\r
+       };\r
+       \r
        return {\r
                load: function( _apiuser, _url, opt_onload, opt_onerror ){\r
                        _url = Util.getAbsolutePath( _url );\r
@@ -2935,8 +3007,9 @@ var Css = ( function(){
                                        if( t.match( _apiuser, _url ) === false ){\r
                                                t.apiusers.push( _apiuser );\r
                                                t.onload.push( opt_onload );\r
-                                               t.onerror( opt_onerror );\r
+                                               t.onerror.push( opt_onerror );\r
                                        };\r
+                                       SystemTimer.add( SUPER_USER_KEY, checkTimer, 333 );\r
                                        return;\r
                                };\r
                        };\r
@@ -2947,7 +3020,18 @@ var Css = ( function(){
                        elm.onreadystatechange = elm.onload = detect;\r
                        elm.href = _url;\r
                        \r
+                       if( !sheet ){ // only assign these once\r
+                               cssRules = 'cssRules';\r
+                               sheet    = 'sheet';\r
+                               if ( !( sheet in elm ) ) { // MSIE uses non-standard property names\r
+                                       cssRules = 'rules';\r
+                                       sheet    = 'styleSheet';\r
+                               };\r
+                       };\r
+                       \r
                        TICKET_LIST.push( new FetchCssTicketClass( _apiuser, _url, elm, opt_onload, opt_onerror ) );\r
+                       \r
+                       SystemTimer.add( SUPER_USER_KEY, checkTimer, 333 );\r
                },\r
                unload: function( _apiuser, _url ){\r
                        _url = _url ? Util.getAbsolutePath( _url ) : null;\r
@@ -2959,6 +3043,9 @@ var Css = ( function(){
                                        ++i;\r
                                }\r
                        };\r
+                       if( TICKET_LIST.length === 0 ){\r
+                               SystemTimer.remove( SUPER_USER_KEY, checkTimer );\r
+                       }\r
                }\r
        }\r
 })();\r