
/*
 * 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) 2011 IBM Corporation
 */

requireClass ../common/Weinre

//-----------------------------------------------------------------------------
class WiRuntimeImpl

//-----------------------------------------------------------------------------
method evaluate(/*string*/ expression, /*string*/ objectGroup, /*boolean*/ includeCommandLineAPI, callback)
    var result = Weinre.injectedScript.evaluate(expression, objectGroup, includeCommandLineAPI)
    
    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback, [result])
    }

//-----------------------------------------------------------------------------
method getCompletions(/*string*/ expression, /*boolean*/ includeCommandLineAPI, callback)
    var result = Weinre.injectedScript.getCompletions(expression, includeCommandLineAPI)

    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback, [result])
    }

//-----------------------------------------------------------------------------
method getProperties(/*any*/ objectId, /*boolean*/ ignoreHasOwnProperty, /*boolean*/ abbreviate, callback)
    var objectId = JSON.stringify(objectId)
    var result = Weinre.injectedScript.getProperties(objectId, ignoreHasOwnProperty, abbreviate)

    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback, [result])
    }

//-----------------------------------------------------------------------------
method setPropertyValue(/*any*/ objectId, /*string*/ propertyName, /*string*/ expression, callback)
    var objectId = JSON.stringify(objectId)
    var result = Weinre.injectedScript.setPropertyValue(objectId, propertyName, expression)

    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback, [result])
    }

//-----------------------------------------------------------------------------
method releaseWrapperObjectGroup(/*int*/ injectedScriptId, /*string*/ objectGroup, callback)
    var result = Weinre.injectedScript.releaseWrapperObjectGroup(objectGroupName)

    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback, [result])
    }
    