blob: 272af2800daff5b85a5b7c139ec26172940e44fe [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package
{
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.StatusEvent;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.net.LocalConnection;
import flash.utils.getQualifiedClassName;
import mx.managers.IFocusManagerComponent;
import mx.managers.SystemManager;
import mx.core.FlexGlobals;
import mx.core.IFlexDisplayObject;
import mx.core.IMXMLObject;
import mx.core.UIComponent;
// import mx.core.Container;
import mx.utils.ObjectUtil;
import mx.core.mx_internal;
use namespace mx_internal;
[Mixin]
/**
* Displays object properties and values to SnifferRemoteClient
*/
public class ObjectSnifferRemote
{
public function ObjectSnifferRemote()
{
}
public static function init(root:Object):void
{
_root = document = root;
if (document)
document.addEventListener("applicationComplete", initHandler);
connection = new LocalConnection();
connection.allowDomain("*");
connection.addEventListener(StatusEvent.STATUS, statusHandler);
commandconnection = new LocalConnection();
commandconnection.allowDomain("*");
commandconnection.client = ObjectSnifferRemote;
commandconnection.connect("_ObjectSnifferCommands");
}
private static function initHandler(event:Event):void
{
//enableSniffer();
}
private static function statusHandler(event:Event):void
{
}
/**
* @private
* The document containing a reference to this object
*/
private static var document:Object;
private static var _root:Object;
/**
* @private
* The local connection to the remote client
*/
private static var connection:LocalConnection;
private static var commandconnection:LocalConnection;
private static var snifferEnabled:Boolean = true;
public static function enableSniffer():void
{
snifferEnabled = true;
}
public static function disableSniffer():void
{
snifferEnabled = false;
}
private static function appendLog(s:String):void
{
//connection.send("_ObjectSniffer", "appendLog", "Object", s);
var info:Object = new Object();
info.dataSource = "Object";
info.target = s;
info.eventName = "";
info.event = "";
/**
trace("ObjectSniffer is sending: ");
trace (" info.dataSource: " + info.dataSource);
trace (" info.target: " + info.target);
trace (" info.eventName: " + info.eventName);
trace (" info.event: " + info.event);
**/
connection.send("_ObjectSniffer", "appendLog", info);
}
public static function dumpObject(s:String):void
{
if (!snifferEnabled)
return;
var obj:* = stringToObject(s);
if (obj === null)
{
appendLog(s + " = null");
}
else if (obj === undefined)
{
appendLog(s + " = undefined");
}
else if (obj is String)
{
appendLog(s + " = " + obj);
}
else if (obj is Boolean)
{
appendLog(s + " = " + obj.toString());
}
else if (obj is uint)
{
appendLog(s + " = " + obj.toString(10) + " (0x" + obj.toString(16).toUpperCase() + ")");
}
else if (obj is Number)
{
appendLog(s + " = " + obj.toString());
}
else if (obj is XML || obj is XMLList)
{
if (obj is XMLList && obj.length() == 1)
appendLog(s + " = " + obj.toString());
else if (obj is XMLList && obj.length() == 0)
appendLog(s + " not found");
else
appendLog(s + " = " + obj.toXMLString());
}
else if (obj is Array)
{
appendLog(s + " = Array");
}
else appendLog(s + " = " + getQualifiedClassName(obj));
}
public static function listProperties(s:String):void
{
document.document.callLater(listProperties_cb, [s]);
}
public static function listProperties_cb(s:String):void
{
if (!snifferEnabled)
return;
var n:int;
var i:int;
var obj:* = stringToObject(s);
if (obj === null)
{
appendLog(s + " is null, has no properties");
}
else if (obj === undefined)
{
appendLog(s + " is undefined, has no properties");
}
else if (obj is String)
{
appendLog(s + " is String, has no properties");
}
else if (obj is uint)
{
appendLog(s + " is uint, has no properties");
}
else if (obj is uint)
{
appendLog(s + " is int, has no properties");
}
else if (obj is Number)
{
appendLog(s + " is Number, has no properties");
}
else if (obj is XML)
{
appendLog(s);
appendLog(" attributes:");
var attrs:XMLList = obj.attributes();
n = attrs.length();
for (i = 0; i < n; i++)
{
appendLog(" " + attrs[i].name());
}
var children:XMLList = obj.children();
n = children.length();
var namesTable:Object = {};
for (i = 0; i < n; i++)
{
namesTable[children[i].name()] = 1;
}
appendLog(" children:");
for (var p:String in namesTable)
appendLog(" " + p);
}
else if (obj is Array)
{
appendLog(s + " is Array of length " + obj.length);
}
else
{
var info:Object = ObjectUtil.getClassInfo(obj, null, { includeReadOnly: true, includeTransient: true, uris: ["", "mx_internal"] } );
appendLog(s + " = " + info.name);
n = info.properties.length;
for (i = 0; i < n; i++)
appendLog(" " + info.properties[i]);
}
}
/**
* direct copy of UnitTester's stringToObject, except that it doesn't handle "script"
* take an expression, find the object.
* handles mx_internal:propName
* a.b.c
* getChildAt()
*/
public static function stringToObject(s:*):*
{
if (s == null || s == "")
return _root["document"];
try
{
var propName:* = s;
if (s.indexOf("mx_internal:") == 0)
propName = new QName("mx_internal", s.substring(12));
if (s.indexOf("getChildAt(") == 0 && s.indexOf(".") == -1)
{
s = s.substring(11);
s = s.substring(0, s.indexOf(")"));
return _root["document"].getChildAt(parseInt(s));
}
return _root["document"][propName];
}
catch (e:Error)
{
// maybe it is a class
var dot:int;
var cc:int = s.indexOf("::");
var className:String = s;
var obj:Object = _root["document"];
if (cc > 0)
{
dot = s.indexOf(".", cc);
if (dot >= 0)
{
className = s.substring(0, dot);
s = s.substring(dot + 1);
}
else
s = "";
}
else
dot = s.indexOf(".");
try
{
obj = _root["info"]().currentDomain.getDefinition(className);
}
catch (e:Error)
{
if (dot == -1)
return undefined;
}
if (dot == -1)
return obj;
var list:Array = s.split(".");
while (list.length)
{
try
{
s = list.shift();
if (s.indexOf("mx_internal:") == 0)
s = new QName(mx_internal, s.substring(12));
if (s is String && s.indexOf("getChildAt(") == 0)
{
s = s.substring(11);
s = s.substring(0, s.indexOf(")"));
obj = obj.getChildAt(parseInt(s));
}
else
obj = obj[s];
}
catch (e:Error)
{
return undefined;
}
}
return obj;
}
return null;
}
}
}