XMLLoadChecker

by umhr
♥0 | Line 286 | Modified 2015-03-08 23:45:53 | MIT License
play

ActionScript3 source code

/**
 * Copyright umhr ( http://wonderfl.net/user/umhr )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/SWcV
 */

package

{

    import flash.display.Sprite;

    import flash.events.Event;

    import flash.events.UncaughtErrorEvent;

    //import jp.mztm.umhr.logging.Log;

    

    /**

     * ...

     * @author umhr

     */

    public class WonderflMain extends Sprite 

    {

        

        public function WonderflMain() 

        {

            if (stage) init();

            else addEventListener(Event.ADDED_TO_STAGE, init);

        }

        

        private function init(e:Event = null):void 

        {

            removeEventListener(Event.ADDED_TO_STAGE, init);

            // entry point

            

            addChild(new Canvas());

            addChild(new Log(8, 80, 465-16, 465-80));

            setGlobalErrorHandler();

        }

        

        public function setGlobalErrorHandler():void 

        {

            loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorEvents_uncaughtError);

        }

        

        private var _prevMessage:String = "";

        private function uncaughtErrorEvents_uncaughtError(e:UncaughtErrorEvent):void 

        {

            var teemp:String = e.errorID +"," + e.type + "," + e.error;

            if (_prevMessage != teemp) {

                Log.trace(e.errorID, e.type, e.error);

                errorType(e.error);

                _prevMessage = teemp;

            }

            //e.preventDefault();

        }

        

        private function errorType(str:String):void {

            

            //TypeError: Error #1085

            if (str.indexOf("#") < 0) {

                return;

            }

            var errorID:int = parseInt(str.split("#")[1]);

            switch (errorID) 

            {

                case 1085:

                    Log.trace("XMLエレメントが適切に終了していません。");

                break;

                case 1090:

                    Log.trace("XML パーサエラー :エレメントの形式が正しくありません。");

                break;

                case 1095:

                    Log.trace("XML パーサエラー :属性が終了していません。");

                break;

                case 1104:

                    Log.trace('属性 "type" (エレメント "bbb") は既に指定されています。');

                break;

            default:

                Log.trace(errorID);

            }

        }

        

    }

    

}







    

    import com.bit101.components.CheckBox;

    import com.bit101.components.InputText;

    import com.bit101.components.PushButton;

    import flash.display.Sprite;

    import flash.events.Event;

    import flash.events.IOErrorEvent;

    import flash.events.SecurityErrorEvent;

    import flash.net.URLLoader;

    import flash.net.URLRequest;

    import flash.system.Security;

    //import jp.mztm.umhr.logging.Log;

    /**

     * ランタイムエラー - Adobe ActionScript® 3(AS3 )API リファレンス

     * http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/runtimeErrors.html

     * ...

     * @author umhr

     */

    class Canvas extends Sprite 

    {

        private var _targetURL:InputText;

        private var _crossdomainURL:InputText;

        private var _isSetCrossdomain:CheckBox;

        

        public function Canvas() 

        {

            init();

        }

        private function init():void 

        {

            if (stage) onInit();

            else addEventListener(Event.ADDED_TO_STAGE, onInit);

        }



        private function onInit(event:Event = null):void 

        {

            removeEventListener(Event.ADDED_TO_STAGE, onInit);

            // entry point

            

            addUI();

            

            

        }

        private function addUI():void {

            _targetURL = new InputText(this, 8, 8, "http://cnet.tumblr.com/");

            _targetURL.width = 465 - 16;

            _isSetCrossdomain = new CheckBox(this, 8, 30, "set crossdomain.xml", onSetCrossdomain);

            _crossdomainURL = new InputText(this, 8+128, 30, "crossdomain.xml");

            _crossdomainURL.width = 465 - 16 - 128;

            _crossdomainURL.enabled = false;

            new PushButton(this, 365-8, 60, "load", onLoad);

        }

        

        private function onSetCrossdomain(e:Event):void 

        {

            //Log.trace("read crossdomain.xml");

            _crossdomainURL.enabled = _isSetCrossdomain.selected;

            // 自動補完

            if (_crossdomainURL.text == "crossdomain.xml" || _crossdomainURL.text == "") {

                var text:String = _targetURL.text;

                if (text.lastIndexOf("/") > -1) {

                    text = text.substr(0, text.lastIndexOf("/"));

                }

                text += "/crossdomain.xml";

                _crossdomainURL.text = text;

            }

        }

        

        private function onLoad(e:Event):void 

        {

            Log.clear();

            loadXML(_targetURL.text);

        }

        

        private function loadXML(url:String):void 

        {

            var urlRequest:URLRequest = new URLRequest(url);

            

            // AS3でXML - さくさんの日記

            // http://d.hatena.ne.jp/sakusan_net/20100117/1263694599

            //var urlRequestHeader:URLRequestHeader = new URLRequestHeader("pragma", "no-cache");

            //urlRequest.requestHeaders.push(urlRequestHeader);// クロスドメイン時2170のerrorがでる

            

            // チェックされている場合、設定します。

            if(_isSetCrossdomain.selected){

                Security.loadPolicyFile(_crossdomainURL.text);

            }

            

            var urlLoader:URLLoader = new URLLoader(urlRequest);

            urlLoader.addEventListener(Event.COMPLETE, urlLoader_complete);

            urlLoader.addEventListener(Event.OPEN, urlLoader_open);

            urlLoader.addEventListener(IOErrorEvent.IO_ERROR, urlLoader_ioError);

            urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, urlLoader_securityError);

        }

        

        private function urlLoader_securityError(e:SecurityErrorEvent):void 

        {

            Log.trace(e.type, e.errorID, e.text);

            if (e.errorID == 2170) {

                Log.trace("セキュリティサンドボックス侵害:%1 は HTTP ヘッダーを %2 に送信できません。");

            }else if (e.errorID == 2048) {

                Log.trace("crossdomain.xmlで許可されていないようです。");

                Log.trace('crossdomain.xmlの読み先がマスターでは無い場合、');

                Log.trace('マスターに < site-control permitted - cross - domain - policies = "all" / > を設定し忘れていませんか?');

            }

        }

        

        private function urlLoader_ioError(e:IOErrorEvent):void 

        {

            Log.trace(e.type, e.errorID, e.text);

            if (e.errorID == 2032) {

                Log.trace("ストリームエラー:ファイルがありません。");

            }

        }

        

        private function urlLoader_open(e:Event):void 

        {

            Log.trace(e.type, "ダウンロードが開始されました。");

        }

        

        private function urlLoader_complete(e:Event):void 

        {

            Log.trace(e.type,"ダウンロードが完了しました。");

            

            var urlLoader:URLLoader = e.target as URLLoader;

            urlLoader.removeEventListener(Event.COMPLETE, urlLoader_complete);

            

            var data:String = urlLoader.data;

            

            Log.trace("長さ "+data.length+"の文字列として読み込みました。");

            //Log.trace(data);

            var xml:XML = XML(data);

            Log.trace(xml);

            

            //Log.trace(xml.item);

            

            

        }

    }

    





    import flash.display.Sprite;

    import flash.events.Event;

    import flash.text.TextField;

    import flash.utils.getQualifiedClassName;

    

    /**

     * traceを

     * @author umhr

     */

    

    class Log extends Sprite

    {

        static private var _tracer:Tracer;

        static private var _textField:TextField;

        static private var _date:Date;

        static private var _width:int;

        static private var _height:int;

        

        public function Log(x:Number = 0, y:Number = 0, width:int = 800, height:int = 600) 

        {

            this.x = x;

            this.y = y;

            _width = width;

            _height = height;

            

            if (stage) init();

            else addEventListener(Event.ADDED_TO_STAGE, init);

            

        }

        private function init(e:Event = null):void 

        {

            removeEventListener(Event.ADDED_TO_STAGE, init);

            // entry point

            addChild(getTextField());

            mouseEnabled = false;

        }

        

        static private function getTextField():TextField {

            if (!_textField) {

                _textField = new TextField();

            }

            _textField.textColor = 0xFF0000;

            _textField.width = _width;

            _textField.height = _height;

            _textField.mouseEnabled = false;

            return _textField;

        }

        

        static public function trace(... arguments):void {

            

            if (!_tracer) {

                _tracer = new Tracer();

            }

            

            var msg:String = _tracer.show(arguments);

            

            if (_textField) {

                _textField.appendText(msg + "\n");

            }

        }

        static public function clear():void {

            _textField.text = "";

        }

        

        static public function traceTime(... arguments):void {

            

            if (!_tracer) {

                _tracer = new Tracer();

            }

            

            if (!_date) {

                _date = new Date();

            }

            

            var time:uint = new Date().time - _date.time;

            

            var msg:String = _tracer.withTime(time, arguments);

            

            if (_textField) {

                _textField.appendText(msg + "\n");

            }

        }

        

        static public function timeReset():void {

            _date = null;

        }

        

        

        

        static public function dump(obj:Object, useLineFeed:Boolean = false):String {

            var str:String = returnDump(obj)

            if (!useLineFeed) {

                str = str.replace(/\n/g, "");

            }

            trace(str);

            return str;

        }

        

        static private function returnDump(obj:Object):String {

            var str:String = _dump(obj);

            if (str.length == 0) {

                str = String(obj);

            }else if (getQualifiedClassName(obj) == "Array") {

                str = "[\n" + str.slice( 0, -2 ) + "\n]";

            }else {

                str = "{\n" + str.slice( 0, -2 ) + "\n}";

            }

            return str;

        }

        

        static private function _dump(obj:Object, indent:int = 0):String {

            var result:String = "";

            

            var da:String = (getQualifiedClassName(obj) == "Array")?'':'"';

            

            var tab:String = "";

            for ( var i:int = 0; i < indent; ++i ) {

                tab += "    ";

            }

            

            for (var key:String in obj) {

                if (typeof obj[key] == "object") {

                    var type:String = getQualifiedClassName(obj[key]);

                    if (type == "Object" || type == "Array") {

                        result += tab + da + key + da + ":"+((type == "Array")?"[":"{");

                        var dump_str:String = _dump(obj[key], indent + 1);

                        if (dump_str.length > 0) {

                            result += "\n" + dump_str.slice(0, -2) + "\n";

                            result += tab;

                        }

                        result += (type == "Array")?"],\n":"},\n";

                    }else {

                        result += tab + '"' + key + '":<' + type + ">,\n";

                    }

                }else if (typeof obj[key] == "function") {

                    result += tab + '"' + key + '":<Function>,\n';

                }else {

                    var dd:String = (typeof obj[key] == "string")?"'":"";

                    result += tab + da + key + da + ":" + dd + obj[key] +dd + ",\n";

                }

            }            

            return result;

        }

        

    }

    





class Tracer {

    public function Tracer() {

        

    }

    public function show(... arguments):String {

        var result:String = "Log : " + arguments.join(" ");

        trace(result);

        return result;

    }

    public function withTime(time:uint, arg:Array):String {

        var result:String = "Log : " + time + " : " + arg.join(" ");

        trace(result);

        return result;

    }

    

}