OSDN Git Service

Modify the Spec for the SVGEvents
authordhrname <dhrname@users.sourceforge.jp>
Sun, 11 Oct 2015 12:22:59 +0000 (21:22 +0900)
committerdhrname <dhrname@users.sourceforge.jp>
Sun, 11 Oct 2015 12:22:59 +0000 (21:22 +0900)
org/w3c/dom/smil.js
tool/Spec/spec/SvgDomSpec.js

index 46ce413..4358abb 100644 (file)
@@ -1192,7 +1192,7 @@ base("$calcMode").up("$attribute").mix( {
 /*$svgEventオブジェクトは、SVGEvent発火を監視するためのオブジェクト*/\r
 base("$frame").up("$svgEvent").mix( {\r
   /*イベントのスケジュール記録*/\r
-  log: [],\r
+  first: null,\r
   \r
   /*タイムラインの長さのキャッシュ*/\r
   length: 0,\r
@@ -1201,48 +1201,56 @@ base("$frame").up("$svgEvent").mix( {
     var timelines = this.timelines,\r
         log = this.log;\r
     /*キャッシュのlengthプロパティを使って、再びログの計算をさせないようにする*/\r
-    if (this.length ===timelines.length) {\r
-      return this.$frame.setFrame(num);\r
-    }\r
-    this.length = timelines.length;\r
-    for (var i=0;i<timelines.length;++i) {\r
-      /*タイムラインから、beginEventとendEventを発火するスケジュールを作成*/\r
-      var timeline = timelines[i],\r
-          begin = timeline.begin,\r
-          target = timeline.target;\r
-      log.push( {\r
-        frame: begin,\r
-        eventType: "begin",\r
-        target: target\r
-      },\r
-      { frame: begin,\r
-        eventType: "repeat",\r
-        target: target,\r
-        limit: 0,\r
-        simpleDuration: 0\r
-      },\r
-      {\r
-        frame: begin+timeline.activeTime,\r
-        eventType: "end",\r
-        target: target\r
-      });\r
+    if (this.length !==timelines.length) {\r
+      this.length = timelines.length;\r
+      this.first = null\r
+      for (var i=0, obj = this.first;i<timelines.length;++i) {\r
+        /*タイムラインから、beginEventとendEventを発火するスケジュールを作成*/\r
+        var timeline = timelines[i],\r
+            begin = timeline.begin,\r
+            target = timeline.target,\r
+            first = {\r
+              frame: begin,\r
+              eventType: "begin",\r
+              target: target,\r
+              next: { frame: begin,\r
+                eventType: "repeat",\r
+                target: target,\r
+                limit: 0,\r
+                simpleDuration: 0,\r
+                next: {\r
+                  frame: begin+timeline.activeTime,\r
+                  eventType: "end",\r
+                  target: target,\r
+                  next: null\r
+                }\r
+              }\r
+            };\r
+        if (obj) {\r
+          obj.next = first;\r
+        } else {\r
+          this.first = first;\r
+          obj = first;\r
+        }\r
+      }\r
     }\r
-    \r
-    /*logで記録しておいたものを実行して、イベントを発火\r
-     * また、発火した場合はログから取り除いて、次回から再び発火しないようにする*/\r
-    for (var i=0,li=log.length;i<li;++i) {\r
-      var logi = log[i],\r
-          frame = logi.frame,\r
-          target = logi.target;\r
+    /*スケジュールに記録しておいたものを実行して、イベントを発火\r
+     * また、発火した場合は記録から取り除いて、次回から再び発火しないようにする*/\r
+    obj = this.first;\r
+    while(obj) {\r
+      var frame = obj.frame,\r
+          target = obj.target;\r
       if (frame <= num) {\r
         /*IE11ではSVGEventsやDOMEventsを使うと問題が起きるため、MouseEventsで代用する*/\r
         var evt = target.ownerDocument.createEvent("MouseEvents");\r
-        evt.initMouseEvent(logi.eventType+"Event" ,true, true, window, 0, 0, 0, 0, 0, false, false, false, false,0, target);\r
+        evt.initMouseEvent(obj.eventType+"Event" ,true, true, window, 0, 0, 0, 0, 0, false, false, false, false,0, target);\r
         target.dispatchEvent(evt);\r
-        log.shift();\r
+        obj = obj.next;\r
+      } else {\r
+        obj = obj.next;\r
       }\r
     }\r
-    timelines = void 0;\r
+    timelines = obj = first = void 0;\r
     return this.$frame.setFrame(num);\r
   }\r
 } );\r
index 007008d..6e7a305 100644 (file)
@@ -4205,9 +4205,9 @@ describe("SMIL Animation Spec", function() {
       /*境界条件を調べておく (limit value analysis)*/\r
       it("should be this for the value  (limit value analysis)", function() {\r
         expect(frame.length).toBe(0);\r
-        expect(frame.log).toEqual([]);\r
+        expect(frame.first).toBeNull();\r
         frame.setFrame(0);\r
-        expect(frame.log).toEqual([]);\r
+        expect(frame.first).toBeNull();\r
         base("$frame").addLine( base("$frame").$begin.up().mix({\r
           timelines: [],\r
           begin: 0,\r
@@ -4215,22 +4215,25 @@ describe("SMIL Animation Spec", function() {
           target: ele\r
         }) );\r
         frame.setFrame(0);\r
-        expect(frame.log).toEqual([\r
+        expect(frame.first).toEqual(\r
           { frame: 0,\r
             eventType: "begin",\r
-            target: ele\r
-          },\r
-          { frame: 0,\r
-            eventType: "repeat",\r
-            limit: 0,\r
-            simpleDuration: 0,\r
-            target: ele\r
-          },\r
-          { frame: 0,\r
-            eventType: "end",\r
-            target: ele\r
+            target: ele,\r
+          \r
+            next: { frame: 0,\r
+              eventType: "repeat",\r
+              limit: 0,\r
+              simpleDuration: 0,\r
+              target: ele,\r
+            \r
+              next: { frame: 0,\r
+                eventType: "end",\r
+                target: ele,\r
+                next: null\r
+              }\r
+            }\r
           }\r
-        ]);\r
+        );\r
       } );\r
       /*同値分割をして、有効同値クラスを調べておく (Equivalence partitioning, the following is the valid partion)*/\r
       it("should be this for the value (the valid partion )", function() {\r
@@ -4243,40 +4246,46 @@ describe("SMIL Animation Spec", function() {
           target: ele\r
         }) );\r
         frame.setFrame(0);\r
-        expect(frame.log).toEqual([\r
+        expect(frame.first).toEqual(\r
           { frame: 0,\r
             eventType: "begin",\r
-            target: ele\r
-          },\r
-          { frame: 0,\r
-            eventType: "repeat",\r
-            limit: 0,\r
-            simpleDuration: 0,\r
-            target: ele\r
-          },\r
-          { frame: 0,\r
-            eventType: "end",\r
-            target: ele\r
+            target: ele,\r
+          \r
+            next: { frame: 0,\r
+              eventType: "repeat",\r
+              limit: 0,\r
+              simpleDuration: 0,\r
+              target: ele,\r
+            \r
+              next: { frame: 0,\r
+                eventType: "end",\r
+                target: ele,\r
+                next: null\r
+              }\r
+            }\r
           }\r
-        ]);\r
+        );\r
         frame.setFrame(0);\r
         frame.setFrame(1);\r
-        expect(frame.log).toEqual([\r
+        expect(frame.first).toEqual(\r
           { frame: 0,\r
             eventType: "begin",\r
-            target: ele\r
-          },\r
-          { frame: 0,\r
-            eventType: "repeat",\r
-            limit: 0,\r
-            simpleDuration: 0,\r
-            target: ele\r
-          },\r
-          { frame: 0,\r
-            eventType: "end",\r
-            target: ele\r
+            target: ele,\r
+          \r
+            next: { frame: 0,\r
+              eventType: "repeat",\r
+              limit: 0,\r
+              simpleDuration: 0,\r
+              target: ele,\r
+            \r
+              next: { frame: 0,\r
+                eventType: "end",\r
+                target: ele,\r
+                next: null\r
+              }\r
+            }\r
           }\r
-        ]);\r
+        );\r
         \r
         var isFiredBeginEvent = false;\r
         ele.addEventListener("beginEvent", function(evt) {\r