// 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.internal.v8native;
import java.io.IOException;
import org.chromium.sdk.Breakpoint;
import org.chromium.sdk.BreakpointTypeExtension;
import org.chromium.sdk.CallbackSemaphore;
import org.chromium.sdk.FunctionScopeExtension;
import org.chromium.sdk.IgnoreCountBreakpointExtension;
import org.chromium.sdk.JavascriptVm;
import org.chromium.sdk.RelayOk;
import org.chromium.sdk.RestartFrameExtension;
import org.chromium.sdk.SyncCallback;
import org.chromium.sdk.Version;
import org.chromium.sdk.internal.v8native.value.JsFunctionImpl;
import org.chromium.sdk.util.GenericCallback;
import org.chromium.sdk.util.MethodIsBlockingException;
/**
* Base implementation of JavascriptVm.
*/
public abstract class JavascriptVmImpl implements JavascriptVm {
protected JavascriptVmImpl() {
}
@Override
public void suspend(SuspendCallback callback) {
getDebugSession().suspend(callback);
}
// TODO: make sure we do not return those scripts that are reported compiled but not loaded yet.
@Override
public void getScripts(ScriptsCallback callback) throws MethodIsBlockingException {
CallbackSemaphore callbackSemaphore = new CallbackSemaphore();
RelayOk relayOk =
getDebugSession().getScriptManagerProxy().getAllScripts(callback, callbackSemaphore);
boolean res = callbackSemaphore.tryAcquireDefault(relayOk);
if (!res) {
callback.failure("Timeout");
}
}
@Override
public RelayOk setBreakpoint(Breakpoint.Target target, int line,
int column, boolean enabled, String condition,
BreakpointCallback callback, SyncCallback syncCallback) {
return getDebugSession().getBreakpointManager()
.setBreakpoint(target, line, column, enabled, condition, callback, syncCallback);
}
@Override
public RelayOk listBreakpoints(final ListBreakpointsCallback callback,
SyncCallback syncCallback) {
return getDebugSession().getBreakpointManager().reloadBreakpoints(callback, syncCallback);
}
@Override
public RelayOk enableBreakpoints(Boolean enabled, GenericCallback<Boolean> callback,
SyncCallback syncCallback) {
return getDebugSession().getBreakpointManager().enableBreakpoints(enabled,
callback, syncCallback);
}
@Override
public RelayOk setBreakOnException(ExceptionCatchMode catchMode,
GenericCallback<ExceptionCatchMode> callback, SyncCallback syncCallback) {
return getDebugSession().getBreakpointManager().setBreakOnException(catchMode,
callback, syncCallback);
}
@Override
public Version getVersion() {
return getDebugSession().getVmVersion();
}
@Override
public BreakpointTypeExtension getBreakpointTypeExtension() {
return getDebugSession().getBreakpointManager().getBreakpointTypeExtension();
}
@Override
public IgnoreCountBreakpointExtension getIgnoreCountBreakpointExtension() {
return BreakpointImpl.IGNORE_COUNT_EXTENSION;
}
@Override
public FunctionScopeExtension getFunctionScopeExtension() {
if (!V8VersionFeatures.isFunctionScopeSupported(getDebugSession().getVmVersion())) {
return null;
}
return JsFunctionImpl.FUNCTION_SCOPE_EXTENSION;
}
@Override
public RestartFrameExtension getRestartFrameExtension() {
if (!V8VersionFeatures.isRestartFrameSupported(getDebugSession().getVmVersion())) {
return null;
}
return CallFrameImpl.RESTART_FRAME_EXTENSION;
}
protected abstract DebugSession getDebugSession();
// TODO(peter.rybin): This message will be obsolete in JavaSE-1.6.
public static IOException newIOException(String message, Throwable cause) {
IOException result = new IOException(message);
result.initCause(cause);
return result;
}
}