
/*
 * 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
requireClass ../common/Callback

requireClass ./Console

//-----------------------------------------------------------------------------
class WeinreTargetEventsImpl

//-----------------------------------------------------------------------------
method connectionCreated(/*string*/ clientChannel, /*string*/ targetChannel)
    var message = "weinre: target " + targetChannel + " connected to client " + clientChannel
    
    Weinre.logInfo(message)
    var oldValue = Console.useRemote(true)
    
    // Weinre.showNotImplemented()

    Weinre.target.setDocument()
    Weinre.wi.TimelineNotify.timelineProfilerWasStopped()
    Weinre.wi.DOMStorage.initialize()

//-----------------------------------------------------------------------------
method connectionDestroyed(/*string*/ clientChannel, /*string*/ targetChannel)
    var message = "weinre: target " + targetChannel + " disconnected from client " + clientChannel
    
    Weinre.logInfo(message)
    var oldValue = Console.useRemote(false)
    
//-----------------------------------------------------------------------------
method sendCallback(/*int*/ callbackId, /*any*/ result)
    Callback.invoke(callbackId, result)
