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) { |