
/*
 * 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*/ clientId, /*string*/ targetId)
    var message = "weinre: target " + targetId + " connected to client " + clientId
    
    Weinre.logInfo(message)
    var oldValue = Console.useRemote(true)
    
    // Weinre.showNotImplemented()

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

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