OSDN Git Service

Lighten the unload event
[sie/sie.git] / org / w3c / dom / smil.js
index 63aa055..4185ec8 100644 (file)
@@ -34,8 +34,9 @@ base("$frame").mix ( {
   timelines: [],\r
 \r
   /*開始フレーム数の候補。アニメーションの開始条件となる\r
-   * 単位はフレーム数であって、秒数ではない*/\r
-  begin: 0,\r
+   * 単位はフレーム数であって、秒数ではない\r
+   * なお、初期値については、開始フレームが負の値を考慮しているため*/\r
+  begin: -Number.MAX_VALUE,\r
 \r
   /*活動継続時間 (Active Duration)のフレーム数。アニメーションの継続条件となる\r
    * 単位はフレーム数であって、秒数ではない*/\r
@@ -61,9 +62,6 @@ base("$frame").mix ( {
   /*setFrame メソッド\r
    * フレーム数を数値num まで進めるか、戻す*/\r
   setFrame: function( /*number*/ num) {\r
-    if((num < this.begin) || (num >= (this.begin+this.activeTime))) {\r
-      return;\r
-    }\r
     this.currentFrame = num;\r
     var timelines = this.timelines;\r
     for (var i=0;i<timelines.length;++i) {\r
@@ -139,12 +137,12 @@ base("$frame").mix ( {
     },\r
     \r
     /*引数に渡された時刻リストの中から、現在フレームf以下の、最大値を求めるメソッド\r
-     * -1を返したときはリストの中にf以下の値がないことを示す*/\r
+     * Number.MIN_VALUEの値を返したときはリストの中にf以下の値がないことを示す*/\r
     getMaxList: function (f, list) {\r
-      var maxTime = -1; /*時刻の最大値*/\r
+      var maxTime = -Number.MAX_VALUE; /*時刻の最大値*/\r
       while( list ) {\r
         var v = list.value;\r
-        /*f以下の開始リスト値のうち、最大値をstartTimeに代入*/\r
+        /*f以下の開始リスト値のうち、最大値をmaxTimeに代入*/\r
         if ( (v <= f)\r
              && (maxTime <= v) ) {\r
           maxTime = v;\r
@@ -195,12 +193,17 @@ base("$frame").mix ( {
        * 現在フレーム数 f より大きい数値は、更新できる条件と無関係なので、除外しておく\r
        * だから、f以下の値の中から、最大値を探して、\r
        * それをbeginプロパティの値cacheBeginと比較する*/\r
-      var startTime = this.getMaxList(f, this.beginList),\r
-          endTime = this.getMaxList(f, this.endList),\r
+      var startTime = this.getMaxList(f, this.beginList);\r
+      if (startTime === -Number.MAX_VALUE) {\r
+        (state > post) && (this.state = begin);\r
+        return this;\r
+      }\r
+      var endTime = this.getMaxList(f, this.endList),\r
           isWait = (state === wait),\r
           cacheBegin = this.begin;\r
       if ( !startTime && isWait) {\r
-          /*開始時刻が0ならば、アニメーションを開始*/\r
+          /*開始時刻が0ならば、アニメーションを開始\r
+           * ただし、アニメが終了した後のPOSTWAITING状態の時には作動させない*/\r
           this.begin = 0;\r
           this.state = begin;\r
       } else if ( isWait || (state === post) ) {\r
@@ -2053,7 +2056,7 @@ function getDocument()
   var id = __step(),\r
       idstop = function() {\r
         /*アニメーションを中止する関数*/\r
-        window.cancelAnimationRequest && cancelAnimationRequest(id);\r
+        window.cancelAnimationFrame && cancelAnimationFrame(id);\r
       };\r
   base("$frame").on("pauseAnimation", idstop);\r
   window.addEventListener("unload", idstop);\r
@@ -2101,19 +2104,18 @@ if (!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Anim
        handle: null\r
       };\r
     (function(frame) {\r
-      var $frame = base("$frame"),\r
-          _cancel = cancel; /*cancelのエイリアス*/\r
-      _cancel.handle = requestAnimationFrame(step);\r
-      function step() {\r
-        if (!$frame.isPaused) {\r
+      var _cancel = cancel; /*cancelのエイリアス*/\r
+      var step = function () {\r
+        if (!this.isPaused) {\r
           frame++;\r
           try {\r
-            $frame.setFrame(frame);\r
+            this.setFrame(frame);\r
           } catch(e) {\r
           }\r
           _cancel.handle = requestAnimationFrame(step);\r
         }\r
-      };\r
+      }.bind(base("$frame"));\r
+      _cancel.handle = requestAnimationFrame(step);\r
     })(-1);\r
     return cancel;\r
   } else {\r