Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(470)

Unified Diff: plugins/org.chromium.sdk/src/org/chromium/sdk/internal/tools/v8/BreakpointManager.java

Issue 3402011: Support 'break on exception' feature (Closed)
Patch Set: follow codereview Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: plugins/org.chromium.sdk/src/org/chromium/sdk/internal/tools/v8/BreakpointManager.java
diff --git a/plugins/org.chromium.sdk/src/org/chromium/sdk/internal/tools/v8/BreakpointManager.java b/plugins/org.chromium.sdk/src/org/chromium/sdk/internal/tools/v8/BreakpointManager.java
index c6ed93ed0750e5083604fcce2dd3af8d81ddcd6d..9325f9947a09608e5e4c58f57d2da60f68b266d9 100644
--- a/plugins/org.chromium.sdk/src/org/chromium/sdk/internal/tools/v8/BreakpointManager.java
+++ b/plugins/org.chromium.sdk/src/org/chromium/sdk/internal/tools/v8/BreakpointManager.java
@@ -9,15 +9,22 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import org.chromium.sdk.Breakpoint;
import org.chromium.sdk.JavascriptVm;
import org.chromium.sdk.SyncCallback;
import org.chromium.sdk.JavascriptVm.BreakpointCallback;
+import org.chromium.sdk.JavascriptVm.ExceptionCatchType;
import org.chromium.sdk.JavascriptVm.ListBreakpointsCallback;
+import org.chromium.sdk.JavascriptVm.SetValueCallback;
import org.chromium.sdk.internal.DebugSession;
import org.chromium.sdk.internal.protocol.BreakpointBody;
+import org.chromium.sdk.internal.protocol.CommandResponse;
import org.chromium.sdk.internal.protocol.CommandResponseBody;
+import org.chromium.sdk.internal.protocol.FlagsBody;
+import org.chromium.sdk.internal.protocol.FlagsBody.FlagInfo;
import org.chromium.sdk.internal.protocol.ListBreakpointsBody;
import org.chromium.sdk.internal.protocol.SuccessCommandResponse;
import org.chromium.sdk.internal.protocol.data.BreakpointInfo;
@@ -27,6 +34,9 @@ import org.chromium.sdk.internal.tools.v8.request.FlagsMessage;
import org.chromium.sdk.internal.tools.v8.request.ListBreakpointsMessage;
public class BreakpointManager {
+ /** The class logger. */
+ private static final Logger LOGGER = Logger.getLogger(BreakpointManager.class.getName());
+
/**
* This map shall contain only breakpoints with valid IDs.
*/
@@ -179,9 +189,69 @@ public class BreakpointManager {
debugSession.sendMessageAsync(new ListBreakpointsMessage(), true, v8Callback, syncCallback);
}
- public void enableBreakpoints(boolean enabled, Void callback, SyncCallback syncCallback) {
- Map<String, Object> flagMap = Collections.singletonMap("breakPointsActive", (Object) enabled);
- debugSession.sendMessageAsync(new FlagsMessage(flagMap), true, null, syncCallback);
+ public void enableBreakpoints(Boolean enabled, final SetValueCallback<Boolean> callback,
+ SyncCallback syncCallback) {
+ setRemoteFlag("breakPointsActive", enabled, callback, syncCallback);
+ }
+
+ public void setBreakOnException(ExceptionCatchType catchType, Boolean enabled,
+ final SetValueCallback<Boolean> callback, SyncCallback syncCallback) {
+ String flagName;
+ switch (catchType) {
+ case CAUGHT:
+ flagName = "breakOnCaughtException";
+ break;
+ case UNCAUGHT:
+ flagName = "breakOnUncaughtException";
+ break;
+ default:
+ throw new RuntimeException();
+ }
+ setRemoteFlag(flagName, enabled, callback, syncCallback);
+ }
+
+ private void setRemoteFlag(final String flagName, Boolean enabled,
+ final SetValueCallback<Boolean> callback, SyncCallback syncCallback) {
+ Map<String, Object> flagMap = Collections.singletonMap(flagName, (Object) enabled);
+ V8CommandProcessor.V8HandlerCallback v8Callback;
+ if (callback == null) {
+ v8Callback = null;
+ } else {
+ v8Callback = new V8CommandCallbackBase() {
+ @Override public void success(SuccessCommandResponse successResponse) {
+ FlagsBody body;
+ try {
+ body = successResponse.getBody().asFlagsBody();
+ } catch (JsonProtocolParseException e) {
+ throw new RuntimeException(e);
+ }
+ FlagsBody.FlagInfo flag;
+ List<FlagInfo> flagList = body.flags();
+ findCorrectFlag: {
+ for (int i = 0; i < flagList.size(); i++) {
+ if (flagName.equals(flagList.get(i).name())) {
+ flag = flagList.get(i);
+ break findCorrectFlag;
+ }
+ }
+ throw new RuntimeException("Failed to find the correct flag in response");
+ }
+ Object value = flag.value();
+ Boolean resValue;
+ if (value instanceof Boolean == false) {
+ LOGGER.info("Flag value has a wrong type");
+ resValue = null;
+ } else {
+ resValue = (Boolean) value;
+ }
+ callback.success(resValue);
+ }
+ @Override public void failure(String message) {
+ callback.failure(new Exception(message));
+ }
+ };
+ }
+ debugSession.sendMessageAsync(new FlagsMessage(flagMap), true, v8Callback, syncCallback);
}
private static Integer toNullableInteger(int value) {

Powered by Google App Engine
This is Rietveld 408576698