// 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.debug.core.model; import java.util.Collection; import org.chromium.sdk.Breakpoint; import org.chromium.sdk.JavascriptVm; import org.chromium.sdk.Script; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.IBreakpointListener; import org.eclipse.debug.core.IBreakpointManager; import org.eclipse.debug.core.IBreakpointManagerListener; import org.eclipse.debug.core.model.IBreakpoint; /** * This interface draws a connection between V8 debug target and Eclipse workspace with its * resources. Instance of this interface corresponds to a particular target. It is oriented * to "virtual project" model, when all source files are virtual and downloaded right from * running V8. "Native" model, when all source files are regular files of Eclipse workspace * (and are only supposed to correspond to scripts that are actually running in remote V8) * is also supported and assumes stub implementations for most of methods. */ public interface WorkspaceBridge { /** * A factory interface for {@link WorkspaceBridge}. It seems to tend to become * a workspace relations type object, that is not tied to a particular {@link DebugTargetImpl}, * but so far it only has 1 additional method. */ interface Factory { /** * Creates new instance of {@link WorkspaceBridge} when connection to V8 VM is already * established. */ WorkspaceBridge attachedToVm(ConnectedTargetData connectedTargetData, JavascriptVm javascriptVm); String getDebugModelIdentifier(); /** * Since we define here how scripts are mapped to workspace, we may want to specify * labels in UI. Each type of bridges provides its own label providers here. * User may cache value of this method. */ JsLabelProvider getLabelProvider(); } Collection<? extends VmResource> findVmResourcesFromWorkspaceFile(IFile resource) throws CoreException; /** * Called after session has been started. It should start process of debug session initialization * (downloading scripts from remove, synchronizing breakpoints etc). * This method should be non-blocking. */ void startInitialization(); /** * Initiates script reloading from remote VM. */ void reloadScript(Script script); /** * Reports about new script loaded in JavaScript VM. */ void scriptLoaded(Script newScript); /** * Reports about the script having been collected and disposed in JavaScript VM. */ void scriptCollected(Script script); /** * Handles reset event in JavaScript VM (e.g. Chromium tab reload or navigate event). * The whole context changes. */ void handleVmResetEvent(); /** * Detach command is about to be sent to JavaScript VM. */ void beforeDetach(); /** * Virtual project is expected to stay live until launch is removed from Launches view. Then * it has to go. */ void launchRemoved(); /** * Returns instance of breakpoint handler. Should be a simple getter, caller may cache result * value. */ BreakpointHandler getBreakpointHandler(); /** * Breakpoint-related aspect of {@link WorkspaceBridge} interface. */ interface BreakpointHandler extends IBreakpointListener, IBreakpointManagerListener { boolean supportsBreakpoint(IBreakpoint breakpoint); /** * @return SDK breakpoint that corresponds to UI breakpoint or null if none */ Breakpoint getSdkBreakpoint(ChromiumLineBreakpoint uiBreakpoint); /** * Returns Eclipse counterpart objects for breakpoints and resets their ignore count. * Consider splitting the operation into 2 independent operations. */ Collection<? extends IBreakpoint> breakpointsHit( Collection<? extends Breakpoint> breakpointsHit); /** * Returns Eclipse representation of exception breakpoints. */ Collection<? extends IBreakpoint> exceptionBreakpointHit(boolean isUncaught); void initBreakpointManagerListenerState(IBreakpointManager breakpointManager); } /** * Label provider for several debug elements. This object should be stateless. */ interface JsLabelProvider { /** * Label for the debug target to be shown in the Debug view. */ String getTargetLabel(DebugTargetImpl debugTarget) throws DebugException; /** * Label for JavaScript thread to be shown in the Debug view. */ String getThreadLabel(JavascriptThread thread) throws DebugException; /** * Label for stack frame to be shown in the Debug view. */ String getStackFrameLabel(StackFrame stackFrame) throws DebugException; } /** * Performs breakpoint synchronization between remote VM and Eclipse IDE. This operation is * partially asynchronous: it blocks for reading breakpoints, but returns before all remote * changes are performed. When operations is fully complete, callback gets invoked. */ void synchronizeBreakpoints(BreakpointSynchronizer.Direction direction, BreakpointSynchronizer.Callback callback); /** * @return {@link VmResource} representation of the file inside virtual project or null */ VmResource getVProjectVmResource(IFile file); /** * Creates a temporary file associated with the debug session. The created file should be * represented as a {@link VmResource}. */ VmResource createTemporaryFile(VmResource.Metadata metadata, String proposedFileName); }