blob: 35ebed451ef562388c65114fe6895fae335747e0 [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 flash.tools.debugger;
import flash.tools.debugger.events.DebugEvent;
import flash.tools.debugger.expression.PlayerFaultException;
/**
* The Session object manages all aspects of debugging session with
* the Flash Player. A program can be suspended, resumed, single
* stepping can be performed and state information can be obtained
* through this object.
*/
public interface Session
{
/**
* Returns the URL that identifies this Session.
* Note: this may not be unique across Sessions if
* the same launching mechanism and SWF are used.
* @return URI received from the connected Player.
* It identifies the debugging session
*/
public String getURI();
/**
* Returns the Process object, if any, that triggered this Session.
* @return the Process object that was used to create this Session.
* If SessionManager.launch() was not used, then null is returned.
*/
public Process getLaunchProcess();
/**
* Adjust the preferences for this session; see SessionManager
* for a list of valid preference strings.
*
* If an invalid preference is passed, it will be silently ignored.
* @param pref preference name, one of the strings listed above
* @param value value to set for preference
*/
public void setPreference(String pref, int value);
/**
* Return the value of a particular preference item
*
* @param pref preference name, one of the strings listed in <code>SessionManager</code>
* @throws NullPointerException if pref does not exist
* @see SessionManager
*/
public int getPreference(String pref) throws NullPointerException;
/**
* Is the Player currently connected for this session. This function
* must be thread-safe.
*
* @return true if connection is alive
*/
public boolean isConnected();
/**
* Allow the session to start communicating with the player. This
* call must be made PRIOR to any other Session method call.
* @return true if bind was successful.
* @throws VersionException connected to Player which does not support all API completely
*/
public boolean bind() throws VersionException;
/**
* Permanently stops the debugging session and breaks the
* connection. If this Session is used for any subsequent
* calls exceptions will be thrown.
* <p>
* Note: this method allows the caller to disconnect
* from the debugging session (and Player) without
* terminating the Player. A subsequent call to terminate()
* will destroy the Player process.
* <p>
* Under normal circumstances this method need not be
* called since a call to terminate() performs both
* actions of disconnecting from the Player and destroying
* the Player process.
*/
public void unbind();
/**
* Permanently stops the debugging session and breaks the connection. If
* this session ID is used for any subsequent calls exceptions will be
* thrown.
* <p>
* Note that due to platform and browser differences, it should not be
* assumed that this function will necessarily kill the process being
* debugged. For example:
*
* <ul>
* <li> On all platforms, Firefox cannot be terminated. This is because when
* we launch a new instance of Firefox, Firefox actually checks to see if
* there is another already-running instance. If there is, then the new
* instance just passes control to that old instance. So, the debugger
* doesn't know the process ID of the browser. It would be bad to attempt to
* figure out the PID and then kill that process, because the user might
* have other browser windows open that they don't want to lose. </li>
* <li> On Mac, similar problems apply to the Safari and Camino browsers:
* all browsers are launched with /usr/bin/open, so we never know the
* process ID, and we can't kill it. However, for Safari and Camino, what we
* do attempt to do is communicate with the browser via AppleScript, and
* tell it to close the window of the program that is being debugged. </li>
* </ul>
*
* <p>
* If SessionManager.launch() was used to initiate the Session then calling
* this function also causes getLaunchProcess().destroy() to be called.
* <p>
* Note: this method first calls unbind() if needed.
*/
public void terminate();
/**
* Continue a halted session. Execution of the ActionScript
* will commence until a reason for halting exists. That
* is, a breakpoint is reached or the <code>suspend()</code> method is called.
* <p>
* This method will NOT block. It will return immediately
* after the Player resumes execution. Use the isSuspended
* method to determine when the Player has halted.
*
* @throws NoResponseException if times out
* @throws NotSuspendedException if Player is already running
* @throws NotConnectedException if Player is disconnected from Session
*/
public void resume() throws NotSuspendedException, NotConnectedException, NoResponseException;
/**
* Halt a running session. Execution of the ActionScript
* will stop at the next possible breakpoint.
* <p>
* This method WILL BLOCK until the Player halts for some
* reason or an error occurs. During this period, one or
* more callbacks may be initiated.
*
* @throws NoResponseException if times out
* @throws SuspendedException if Player is already suspended
* @throws NotConnectedException if Player is disconnected from Session
*/
public void suspend() throws SuspendedException, NotConnectedException, NoResponseException;
/**
* Is the Player currently halted awaiting requests, such as continue,
* stepOut, stepIn, stepOver. This function is guaranteed to be thread-safe.
*
* @return true if player halted
* @throws NotConnectedException
* if Player is disconnected from Session
*/
public boolean isSuspended() throws NotConnectedException;
/**
* Returns a SuspendReason integer which indicates
* why the Player has suspended execution.
* @return see SuspendReason
* @throws NotConnectedException if Player is disconnected from Session
*/
public int suspendReason() throws NotConnectedException;
/**
* Returns an array of frames that identify the location and contain
* arguments, locals and 'this' information for each frame on the
* function call stack. The 0th frame contains the current location
* and context for the actionscript program. Likewise
* getFrames[getFrames().length] is the topmost (or outermost) frame
* of the call stack.
* @return array of call frames with 0th element representing the current frame.
* @throws NotConnectedException if Player is disconnected from Session
*/
public Frame[] getFrames() throws NotConnectedException;
/**
* Step to the next executable source line within the
* program, will enter into functions.
* <p>
* This method will NOT block. It will return immediately
* after the Player resumes execution. Use the isSuspended
* method to determine when the Player has halted.
*
* @throws NoResponseException if times out
* @throws NotSuspendedException if Player is running
* @throws NotConnectedException if Player is disconnected from Session
*/
public void stepInto() throws NotSuspendedException, NoResponseException, NotConnectedException;
/**
* Step out of the current method/function onto the
* next executable soruce line.
* <p>
* This method will NOT block. It will return immediately
* after the Player resumes execution. Use the isSuspended
* method to determine when the Player has halted.
*
* @throws NoResponseException if times out
* @throws NotSuspendedException if Player is running
* @throws NotConnectedException if Player is disconnected from Session
*/
public void stepOut() throws NotSuspendedException, NoResponseException, NotConnectedException;
/**
* Step to the next executable source line within
* the program, will NOT enter into functions.
* <p>
* This method will NOT block. It will return immediately
* after the Player resumes execution. Use the isSuspended
* method to determine when the Player has halted.
*
* @throws NoResponseException if times out
* @throws NotSuspendedException if Player is running
* @throws NotConnectedException if Player is disconnected from Session
*/
public void stepOver() throws NotSuspendedException, NoResponseException, NotConnectedException;
/**
* Continue the process of stepping.
* This call should only be issued if a previous
* stepXXX() call was made and the Player suspended
* execution due to a breakpoint being hit.
* That is getSuspendReason() == SuspendReason.Break
* This operation can be used for assisting with
* the processing of conditional breakpoints.
* @throws NoResponseException if times out
* @throws NotSuspendedException if Player is running
* @throws NotConnectedException if Player is disconnected from Session
*/
public void stepContinue() throws NotSuspendedException, NoResponseException, NotConnectedException;
/**
* Obtain information about the various SWF(s) that have been
* loaded into the Player, for this session.
*
* Note: As SWFs are loaded by the Player a SwfLoadedEvent is
* fired. At this point, a call to getSwfInfo() will provide
* updated information.
*
* @return array of records describing the SWFs
* @throws NoResponseException if times out
*/
public SwfInfo[] getSwfs() throws NoResponseException;
/**
* Get a list of the current breakpoints. No specific ordering
* of the breakpoints is implied by the array.
* @return breakpoints currently set.
* @throws NoResponseException if times out
* @throws NotConnectedException if Player is disconnected from Session
*/
public Location[] getBreakpointList() throws NoResponseException, NotConnectedException;
/**
* Set a breakpoint on a line within the given file.
* <p>
* <em>Warning:</em> <code>setBreakpoint()</code> and
* <code>clearBreakpoint()</code> do not keep track of how many times they
* have been called for a given Location. For example, if you make two calls
* to <code>setBreakpoint()</code> for file X.as line 10, and then one
* call to <code>clearBreakpoint()</code> for that same file and line,
* then the breakpoint is gone. So, the caller is responsible for keeping
* track of whether the user has set two breakpoints at the same location.
*
* @return null if breakpoint not set, otherwise
* Location of breakpoint.
* @throws NoResponseException if times out
* @throws NotConnectedException if Player is disconnected from Session
*/
public Location setBreakpoint(int fileId, int lineNum) throws NoResponseException, NotConnectedException;
/**
* Remove a breakpoint at given location. The Location obtain can be a
* clone/copy of a Location object returned from a previous call to
* getBreakpointList().
* <p>
* <em>Warning:</em> <code>setBreakpoint()</code> and
* <code>clearBreakpoint()</code> do not keep track of how many times they
* have been called for a given Location. For example, if you make two calls
* to <code>setBreakpoint()</code> for file X.as line 10, and then one
* call to <code>clearBreakpoint()</code> for that same file and line,
* then the breakpoint is gone. So, the caller is responsible for keeping
* track of whether the user has set two breakpoints at the same location.
*
* @return null if breakpoint was not removed.
* @throws NoResponseException
* if times out
* @throws NotConnectedException
* if Player is disconnected from Session
*/
public Location clearBreakpoint(Location location) throws NoResponseException, NotConnectedException;
/**
* Get a list of the current watchpoint. No specific ordering
* of the watchpoints is implied by the array. Also, the
* list may contain watchpoints that are no longer relevant due
* to the variable going out of scope.
* @return watchpoints currently set.
* @throws NoResponseException if times out
* @throws NotConnectedException if Player is disconnected from Session
* @since Version 2
*/
public Watch[] getWatchList() throws NoResponseException, NotConnectedException;
/**
* Set a watchpoint on a given variable. A watchpoint is used
* to suspend Player execution upon access of a particular variable.
* If the variable upon which the watchpoint is set goes out of scope,
* the watchpoint will NOT be automatically removed.
* <p>
* Specification of the variable item to be watched requires two
* pieces of information (similar to setScalarMember())
* The Variable and the name of the particular member to be watched
* within the variable.
* For example if the watchpoint is to be applied to 'a.b.c'. First the
* Value for object 'a.b' must be obtained and then the call
* setWatch(v, "c", ...) can be issued.
* The watchpoint can be triggered (i.e. the Player suspended) when either a read
* or write (or either) occurs on the variable. If the Player is suspended
* due to a watchpoint being fired, then the suspendReason() call will
* return SuspendReason.WATCH.
* <p>
* Setting a watchpoint multiple times on the same variable will result
* in the old watchpoint being removed from the list and a new watchpoint
* being added to the end of the list.
* <p>
* Likewise, if a previously existing watchpoint is modified by
* specifiying a different kind variable then the old watchpoint
* will be removed from the list and a new watchpoint will be added
* to the end of the list.
*
* @param v the variable, upon whose member, the watch is to be placed.
* @param varName is the mmeber name upon which the watch
* should be placed. This variable name may NOT contain the dot ('.')
* character and MUST be a member of v.
* @param kind access type that will trigger the watchpoint to fire --
* read, write, or read/write. See <code>WatchKind</code>.
* @return null if watchpoint was not created.
* @throws NoResponseException if times out
* @throws NotConnectedException if Player is disconnected from Session
* @throws NotSupportedException if the Player does not support watchpoints,
* or does not support watchpoints on this particular member (e.g. because
* it is a getter or a dynamic variable).
* @since Version 2
* @see WatchKind
*/
public Watch setWatch(Value v, String memberName, int kind) throws NoResponseException, NotConnectedException, NotSupportedException;
/**
* Enables or disables a watchpoint.
*
* @param watch
* the watch to enable or disable
* @param enabled
* whether to enable it or disable it
* @throws NotSupportedException
* @throws NotConnectedException
* @throws NoResponseException
*/
public Watch setWatch(Watch watch) throws NoResponseException, NotConnectedException, NotSupportedException;
/**
* Remove a previously created watchpoint. The watchpoint
* that was removed will be returned upon a sucessful call.
* @return null if watchpoint was not removed.
* @throws NoResponseException if times out
* @throws NotConnectedException if Player is disconnected from Session
* @since Version 2
*/
public Watch clearWatch(Watch watch) throws NoResponseException, NotConnectedException;
/**
* Obtains a list of variables that are local to the current
* halted state.
* @deprecated As of version 2.
* @see Frame#getLocals
*/
public Variable[] getVariableList() throws NotSuspendedException, NoResponseException, NotConnectedException, VersionException;
/**
* From a given value identifier return a Value. This call
* allows tools to access a specific value whenever the Player has
* suspended. A Value's id is maintained for the life of the
* Value and is guaranteed not to change. Values that
* go out of scope are no longer accessible and will result
* in a null being returned. Also note, that scalar
* variables do not contain an id that can be referenced in
* this manner. Therefore the caller must also maintain the
* 'context' in which the variable was obtained. For example
* if a Number b exists on a, then the reference 'a.b' must be
* managed, as the id of 'a' will be needed to obtain the
* value of 'b'.
* @param valueId identifier from Value class or
* from a call to Value.getId()
* @return null, if value cannot be found or
* value with the specific id.
* @throws NoResponseException if times out
* @throws NotSuspendedException if Player is running
* @throws NotConnectedException if Player is disconnected from Session
*/
public Value getValue(long valueId) throws NotSuspendedException, NoResponseException, NotConnectedException;
/**
* Looks up a global name, like "MyClass", "String", etc.
*
* @return its value, or <code>null</code> if the global does not exist.
*/
public Value getGlobal(String name) throws NotSuspendedException, NoResponseException, NotConnectedException;
/**
* Events provide a mechanism whereby status information is provided from
* the Player in a timely fashion.
* <p>
* The caller has the option of either polling the event queue via
* <code>nextEvent()</code> or calling <code>waitForEvent()</code> which
* blocks the calling thread until one or more events exist in the queue.
*
* @throws NotConnectedException
* if Session is disconnected from Player
* @throws InterruptedException
*/
public void waitForEvent() throws NotConnectedException, InterruptedException;
/**
* Returns the number of events currently in the queue. This function
* is guaranteed to be thread-safe.
*/
public int getEventCount();
/**
* Removes and returns the next event from queue
*/
public DebugEvent nextEvent();
/**
* Gets the SourceLocator for this session. If none has been
* specified, returns null.
*/
public SourceLocator getSourceLocator();
/**
* Sets the SourceLocator for this session. This can be used in order
* to override the default rules used for finding source files.
*/
public void setSourceLocator(SourceLocator sourceLocator);
/**
* Invokes a constructor in the player. Returns the newly created object.
* Not supported in Player 9 or AIR 1.0. If you call this function and the
* player to which you are connected doesn't support this feature, this will
* throw a PlayerDebugException.
*/
public Value callConstructor(String classname, Value[] args) throws PlayerDebugException;
/**
* Invokes a function. For example, calling
* <code>callFunction(myobj, "toString", new Value[0])</code> will call
* <code>myobj.toString()</code>. Not supported in Player 9 or AIR 1.0.
* If you call this function and the player to which you are connected
* doesn't support this feature, this will throw a PlayerDebugException.
*/
public Value callFunction(Value thisObject, String functionName, Value[] args) throws PlayerDebugException;
/**
* The player always halts on exceptions that are not going to be caught;
* this call allows the debugger to control its behavior when an exception
* that *will* be caught is thrown.
*
* @throws NotSupportedException
* thrown by older players that don't support this feature.
* @throws NoResponseException
*/
public void breakOnCaughtExceptions(boolean b) throws NotSupportedException, NoResponseException;
/**
* Evaluate the ActionScript expression "value is type"
*
* @throws PlayerDebugException
* @throws PlayerFaultException
*/
public boolean evalIs(Value value, Value type) throws PlayerDebugException, PlayerFaultException;
/**
* Evaluate the ActionScript expression "value is type"
*
* @throws PlayerDebugException
* @throws PlayerFaultException
*/
public boolean evalIs(Value value, String type) throws PlayerDebugException, PlayerFaultException;
/**
* Evaluate the ActionScript expression "value instanceof type"
*
* @throws PlayerFaultException
* @throws PlayerDebugException
*/
public boolean evalInstanceof(Value value, Value type) throws PlayerDebugException, PlayerFaultException;
/**
* Evaluate the ActionScript expression "value instanceof type"
*
* @throws PlayerFaultException
* @throws PlayerDebugException
*/
public boolean evalInstanceof(Value value, String type) throws PlayerDebugException, PlayerFaultException;
/**
* Evaluate the ActionScript expression "property in object"
*
* @throws PlayerFaultException
* @throws PlayerDebugException
*/
public boolean evalIn(Value property, Value object) throws PlayerDebugException, PlayerFaultException;
/**
* Evaluate the ActionScript expression "value as type"
*
* @throws PlayerDebugException
* @throws PlayerFaultException
*/
public Value evalAs(Value value, Value type) throws PlayerDebugException, PlayerFaultException;
/**
* Returns whether the target player supports watchpoints.
* @see #setWatch(Value, String, int)
*/
public boolean supportsWatchpoints();
/**
* Returns the root SocketException that caused the rxMessage()
* thread to shut down. This works in conjunction with
* PREF_SOCKET_TIMEOUT and helps in detecting broken connections.
*/
public Exception getDisconnectCause();
/**
* Set an exception breakpoint. Returns true if succeeded.
* @param exceptionClass
* @return
* @throws NoResponseException
* @throws NotConnectedException
*/
public boolean setExceptionBreakpoint(String exceptionClass) throws NoResponseException, NotConnectedException;
/**
* Clears an exception breakpoint. Returns true if succeeded.
* @param exceptionClass
* @return
* @throws NoResponseException
* @throws NotConnectedException
*/
public boolean clearExceptionBreakpoint(String exceptionClass) throws NoResponseException, NotConnectedException;
// Concurrency begin
/**
* Returns whether the target player supports concurrency.
* @see #setActiveIsolate(Value)
*/
public boolean supportsConcurrency();
/**
* Get an array of all workers that the debugger knows of.
*/
public Isolate[] getWorkers();
/**
* Ask the player again for a list of all workers. Use this
* method with caution as it will also reset all state about
* workers that the debugger is aware of.
*/
public Isolate[] refreshWorkers() throws NotSupportedException, NotSuspendedException, NoResponseException, NotConnectedException;
/**
* Return the worker specific session object that can be used
* to communicate with that worker.
*/
public IsolateSession getWorkerSession(int isolateId);
/**
*
* Sets the ILauncher instance which is associated with this session.
* ILauncher instance is used to terminate the process at the end of the debugging session.
*
* @param launcher
* ILauncher instance used to launch & terminate the process.
*/
public void setLauncher(ILauncher launcher);
}