// 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.processor; import java.util.Collection; import java.util.Collections; import java.util.List; import org.chromium.sdk.DebugContext; import org.chromium.sdk.JavascriptVm; import org.chromium.sdk.Script; import org.chromium.sdk.internal.protocolparser.JsonProtocolParseException; import org.chromium.sdk.internal.v8native.ContextBuilder; import org.chromium.sdk.internal.v8native.DebugSession; import org.chromium.sdk.internal.v8native.DebuggerCommand; import org.chromium.sdk.internal.v8native.V8CommandProcessor; import org.chromium.sdk.internal.v8native.protocol.input.BacktraceCommandBody; import org.chromium.sdk.internal.v8native.protocol.input.CommandResponse; import org.chromium.sdk.internal.v8native.protocol.input.FrameObject; import org.chromium.sdk.internal.v8native.protocol.input.SuccessCommandResponse; import org.chromium.sdk.internal.v8native.protocol.input.data.SomeHandle; import org.chromium.sdk.internal.v8native.value.ValueLoaderImpl; /** * Handles the "backtrace" V8 command replies. */ public class BacktraceProcessor implements V8CommandProcessor.V8HandlerCallback { private final ContextBuilder.ExpectingBacktraceStep step2; BacktraceProcessor(ContextBuilder.ExpectingBacktraceStep step2) { this.step2 = step2; } @Override public void messageReceived(CommandResponse response) { String commandString = response.command(); DebuggerCommand command = DebuggerCommand.forString(commandString); if (command != DebuggerCommand.BACKTRACE) { handleWrongStacktrace(); } SuccessCommandResponse successResponse = response.asSuccess(); if (successResponse == null) { handleWrongStacktrace(); } final DebugContext debugContext = setFrames(successResponse, step2); final DebugSession debugSession = step2.getInternalContext().getDebugSession(); JavascriptVm.ScriptsCallback afterScriptsAreLoaded = new JavascriptVm.ScriptsCallback() { @Override public void failure(String errorMessage) { handleWrongStacktrace(); } @Override public void success(Collection<Script> scripts) { debugSession.getDebugEventListener().suspended(debugContext); } }; debugSession.getScriptManagerProxy().getAllScripts(afterScriptsAreLoaded, null); } public static DebugContext setFrames(SuccessCommandResponse response, ContextBuilder.ExpectingBacktraceStep step2) { BacktraceCommandBody body; try { body = response.body().asBacktraceCommandBody(); } catch (JsonProtocolParseException e) { throw new RuntimeException(e); } List<FrameObject> jsonFrames = body.frames(); if (jsonFrames == null) { jsonFrames = Collections.emptyList(); } ValueLoaderImpl valueLoader = step2.getInternalContext().getValueLoader(); for (SomeHandle handle : response.refs()) { valueLoader.addHandleFromRefs(handle); } return step2.setFrames(jsonFrames); } @Override public void failure(String message) { handleWrongStacktrace(); } private void handleWrongStacktrace() { step2.getInternalContext().getContextBuilder().buildSequenceFailure(); } }