
/*
 * weinre is available under *either* the terms of the modified BSD license *or* the
 * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
 * 
 * Copyright (c) 2010, 2011 IBM Corporation
 */

requireClass ../common/Weinre

//-----------------------------------------------------------------------------
class InjectedScriptHostImpl

//-----------------------------------------------------------------------------
method clearConsoleMessages(callback)
    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback)
    }

//-----------------------------------------------------------------------------
method nodeForId(/*int*/ nodeId, callback)
    return Weinre.nodeStore.getNode(nodeId)

//-----------------------------------------------------------------------------
method pushNodePathToFrontend(/*any*/ node, /*boolean*/ withChildren, /*boolean*/ selectInUI, callback)
    // callback: function()
    var nodeId = Weinre.nodeStore.getNodeId(node)
    var children = Weinre.nodeStore.serializeNode(node, 1)
    Weinre.wi.DOMNotify.setChildNodes(nodeId, children)
    
    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback)
    }

//-----------------------------------------------------------------------------
method inspectedNode(/*int*/ num, callback)
    // callback: function()
    var nodeId = Weinre.nodeStore.getInspectedNode(num)
    return nodeId

//-----------------------------------------------------------------------------
method internalConstructorName(object)
    var ctor = object.constructor
    
    return ctor.fullClassName || ctor.displayName || ctor.name || "Object"