/*$svgEventオブジェクトは、SVGEvent発火を監視するためのオブジェクト*/\r
base("$frame").up("$svgEvent").mix( {\r
/*イベントのスケジュール記録*/\r
- log: [],\r
+ first: null,\r
\r
/*タイムラインの長さのキャッシュ*/\r
length: 0,\r
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
/*境界条件を調べておく (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
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
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