// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.sdk;
/**
* A breakpoint in the browser JavaScript virtual machine. The {@code set*}
* method invocations will not take effect until
* {@link #flush} is called.
*/
public interface Breakpoint {
/**
* This value is used when the corresponding parameter is absent.
*
* @see JavascriptVm#setBreakpoint
*/
int EMPTY_VALUE = -1;
/**
* A breakpoint has this ID if it does not reflect an actual breakpoint in a
* JavaScript VM debugger.
*/
long INVALID_ID = -1;
/**
* @return where this breakpoint was targeted to (e.g. script with a particular name or
* script with specified id)
*/
Target getTarget();
/**
* @return the breakpoint unique ID or {@link #INVALID_ID} if breakpoint was deleted
*/
long getId();
/**
* Returns line number of the breakpoint. As source is changed (typically with LiveEdit feature,
* and particularly by calling {@link UpdatableScript#setSourceOnRemote}) this value
* may become stale. It gets updated when {@link JavascriptVm#listBreakpoints} asynchronous
* method completes.
*
* @return 1-based line number in script source
*/
long getLineNumber();
/**
* @return whether this breakpoint is enabled
*/
boolean isEnabled();
/**
* Sets whether this breakpoint is enabled.
* Requires subsequent {@link #flush} call.
* @param enabled whether the breakpoint should be enabled
*/
void setEnabled(boolean enabled);
/**
* @return breakpoint condition as plain JavaScript or {@code null} if none
*/
String getCondition();
/**
* Sets the breakpoint condition as plain JavaScript ({@code null} to clear).
* Requires subsequent {@link #flush} call.
* @param condition the new breakpoint condition
*/
void setCondition(String condition);
/**
* Removes the breakpoint from the JS debugger and invokes the
* callback once the operation has finished. This operation does <strong>not</strong> require
* a {@code flush} invocation.
*
* @param callback to invoke once the operation result is available
*/
RelayOk clear(JavascriptVm.BreakpointCallback callback, SyncCallback syncCallback);
/**
* Flushes the breakpoint parameter changes (set* methods) into the browser
* and invokes the callback once the operation has finished. This method must
* be called for the set* method invocations to take effect.
*
* @param callback to invoke once the operation result is available
*/
RelayOk flush(JavascriptVm.BreakpointCallback callback, SyncCallback syncCallback);
/**
* @return extension that supports ignore count property of breakpoint, same instance
* that {@link JavascriptVm#getBreakpointTypeExtension()} returns
*/
IgnoreCountBreakpointExtension getIgnoreCountBreakpointExtension();
/**
* A reference to some JavaScript text that you can set breakpoints on. The reference may
* be in form of script name, script id etc.
* This type is essentially an Algebraic Type with several cases. Additional cases are provided
* in form of optional extensions.
* @see Target.ScriptName
* @see Target.ScriptId
* @see BreakpointTypeExtension
*/
abstract class Target {
/**
* Dispatches call on the actual Target type.
* @param visitor user-provided {@link Visitor} that may also implement some additional
* interfaces (for extended types) that is checked on runtime
* @see BreakpointTypeExtension
*/
public abstract <R> R accept(Visitor<R> visitor);
public interface Visitor<R> {
R visitScriptName(String scriptName);
R visitScriptId(Object scriptId);
R visitUnknown(Target target);
}
/**
* A target that refers to a script by its id.
*/
public static class ScriptId extends Target {
private final Object id;
public ScriptId(Object id) {
this.id = id;
}
@Override public <R> R accept(Visitor<R> visitor) {
return visitor.visitScriptId(id);
}
}
/**
* A target that refers to a script by its name. After {@link JavascriptVm#setBreakpoint}
* is called, breakpoint will be set on every matching script currently loaded in VM.
* E.g. you can safely set a breakpoint before the script is actually loaded.
*/
public static class ScriptName extends Target {
private final String name;
public ScriptName(String name) {
this.name = name;
}
@Override public <R> R accept(Visitor<R> visitor) {
return visitor.visitScriptName(name);
}
}
}
}