[Sie-announce] SIEコード [1896] 1, object要素などが指定されていないときの処理を追加

アーカイブの一覧に戻る

svnno****@sourc***** svnno****@sourc*****
2010年 6月 17日 (木) 23:06:29 JST


Revision: 1896
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1896
Author:   dhrname
Date:     2010-06-17 23:06:29 +0900 (Thu, 17 Jun 2010)

Log Message:
-----------
1, object要素などが指定されていないときの処理を追加
2, SVGLoadイベントの振る舞いを修正

Modified Paths:
--------------
    branches/06x/061/org/w3c/dom/svg.js

Modified: branches/06x/061/org/w3c/dom/svg.js
===================================================================
--- branches/06x/061/org/w3c/dom/svg.js	2010-06-15 14:54:36 UTC (rev 1895)
+++ branches/06x/061/org/w3c/dom/svg.js	2010-06-17 14:06:29 UTC (rev 1896)
@@ -794,10 +794,14 @@
  */
 function SVGURIReference() {
   /*readonly SVGAnimatedString*/ this.href = new SVGAnimatedString();
-  this._instance = null; //埋め込みの場合に、読み込んだDOMツリーを結び付けておくプロパティ
+  this._instance = this._text = null; //埋め込みの場合に、読み込んだDOMツリーを結び付けておくプロパティ
   this.addEventListener("DOMAttrModified", function(evt){
     if (evt.relatedNode.namespaceURI === "http://www.w3.org/1999/xlink" && evt.attrName === "xlink:href") {
       evt.target.href.baseVal = evt.newValue;
+      /*_svgload_limitedを+1とすることで、
+       *SVGLoadイベントは発火されなくなる。1を引く必要がある
+       */
+      evt.target.ownerDocument.documentElement._svgload_limited++;
     }
     evt = null;
   }, false);
@@ -937,6 +941,9 @@
 function SVGSVGElement() {
   SVGElement.apply(this, arguments);
   this._tar = document.createElement("v:group");
+  /*_svgload_limitedはSVGLoadイベントを発火させる判定基準。
+   * Xlink言語が使われていない限り0であり、SVGLoadイベントが発火される*/
+  this._svgload_limited = 0;
 /*                SVGElement,
                 SVGTests,
                 SVGLangSpace,
@@ -1310,7 +1317,7 @@
   _init : function() {
   /*objeiはobject要素かembed要素*/
   var xmlhttp = NAIBU.xmlhttp, objei = this._tar, thistar = this;
-  if (this._tar.nodeName === "object") {
+  if (this._tar.nodeName === "OBJECT") {
     var data = "data";
   } else {
     var data = "src";
@@ -1388,10 +1395,18 @@
       var backdown = bt + viewHeight + 1;
       trstyle.clip = "rect(" +bt+ "px " +backright+ "px " +backdown+ "px " +bl+ "px)";
       this._document = s;
-      var evt = s.createEvent("SVGEvents");
-      evt.target = s.documentElement;
-      evt.initEvent("SVGLoad", false, false);
-      s.documentElement.dispatchEvent(evt);
+      if (!!s._svgload_limited) {
+        /*_svgload_limitedプロパティはXlink言語が使われていない限り、0である。
+         *xlink:href属性が指定されるたびに+1となる。
+         *0以外は、SVGLoadイベントが発火されない仕組みとなっている
+         */
+        s._svgload_limited--;
+        if (s._svgload_limited < 0) {
+          var evt = s.createEvent("SVGEvents");
+          evt.initEvent("SVGLoad", false, false);
+          s.documentElement.dispatchEvent(evt);
+        }
+      }
       s = evt = null;
       alert((new Date()).getTime() - dew.getTime());
       if (thistar._next) {
@@ -3617,29 +3632,35 @@
     evt = null;
   }, false);
   this.addEventListener("SVGLoad", function(evt){
-    var tar = evt.target;
-    var evtt = this.ownerDocument.createEvent("MutationEvents");
-    evtt.initMutationEvent("DOMNodeInsertedIntoDocument", false, false, null, null, null, null, null);
-    tar.dispatchEvent(evt);
-    evtt = evt = tar = null;
+    var tar = evt.target, script = tar._text;
+    script = "(function(window, document){" +script;
+    script += "})(Document.prototype.defaultView, window._document)";
+    /*_documentに該当する文書ノードをグローバル変数に入れておいて、後で渡しておく*/
+    var tod = tar.ownerDocument;
+    window._document = tod;
+    eval(script);
+    tod._svgload_limited--;
+    if (tod.documentElement._svgload_limited < 0) {
+      evt = tod.createEvent("SVGEvents");
+      evt.initEvent("SVGLoad", false, false);
+      tod.documentElement.dispatchEvent(evt);
+    }
+    tar = evt = script = null;
   }, false);
   this.addEventListener("DOMNodeInserted", function(evt){
     var tar = evt.target;
     if (evt.eventPhase === Event.BUBBLING_PHASE) {
       if (tar.nodeType === Node.CDATA_SECTION_NODE) {
+        /*もし、CDATA宣言を用いて、ソースが書かれていれば、
+         *それを_textプロパティに格納しておく
+         */
         evt.currentTarget._text = tar.nodeValue;
       }
-      return;
+    } else if (evt.eventPhase === Event.AT_TARGET && !tar.hasAttribute("xlink:href")) {
+      var evtt = tar.ownerDocument.createEvent("SVGEvents");
+      evtt.initEvent("SVGLoad", false, false);
+      evt.currentTarget.dispatchEvent(evtt);
     }
-    tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt){
-      var tar = evt.target, script = tar._text;
-      script = "(function(window, document){" +script;
-      script += "})(Document.prototype.defaultView, window._document)";
-      /*_documentに該当する文書ノードをグローバル変数に入れておいて、後で渡しておく*/
-      window._document = tar.ownerDocument;
-      eval(script);
-      tar = evt = script = null;
-    }, false);
     tar = evt = null;
   }, false);
   return this;
@@ -3952,18 +3973,21 @@
     oba.setAttribute("id","_NAIBU_outline");
     document.body.appendChild(oba);
     var ob = document.getElementsByTagName("object"), em = document.getElementsByTagName("embed");
-    for (var i=0,s=[];i<ob.length;++i) {
+    var i = 0;
+    for (s=[];i<ob.length;++i) {
       s[s.length] = new GetSVGDocument(ob[i]);
     }
-    for (var i=0;i<em.length;++i) {
+    for (i=0;i<em.length;++i) {
       s[s.length] = new GetSVGDocument(em[i]);
     }
-    for (var i=0;i<s.length;++i) {
+    for (i=0;i<s.length;++i) {
       if (i < s.length-1) {
         s[i]._next = s[i+1]
       }
     }
-    s[0]._init(); //初期化作業を開始
+    if (i > 0) {
+      s[0]._init(); //初期化作業を開始
+    }
     s = null;
   }
 }) )




Sie-announce メーリングリストの案内
アーカイブの一覧に戻る