# HG changeset patch # User Eugene Ostroukhov # Date 1264635927 28800 # Node ID f577ea64429ee2bccdb94fad325e7dca9e2df00c # Parent e64c52f5ee56b960b999c51bb286a32b88891aaa Migrated to unmodified Chromium Development Tools version diff -r e64c52f5ee56 -r f577ea64429e org.chromium.debug.core/META-INF/MANIFEST.MF --- a/org.chromium.debug.core/META-INF/MANIFEST.MF Wed Jan 27 10:42:14 2010 -0800 +++ b/org.chromium.debug.core/META-INF/MANIFEST.MF Wed Jan 27 15:45:27 2010 -0800 @@ -2,7 +2,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.chromium.debug.core;singleton:=true -Bundle-Version: 0.1.3.qualifier +Bundle-Version: 0.1.5.qualifier Bundle-Activator: org.chromium.debug.core.ChromiumDebugPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -12,7 +12,7 @@ org.eclipse.ui;bundle-version="3.4.1", org.eclipse.jface.text;bundle-version="3.4.1", org.eclipse.ui.workbench.texteditor;bundle-version="3.4.1", - org.chromium.sdk;bundle-version="0.1.3" + org.chromium.sdk;bundle-version="0.1.5" Bundle-ActivationPolicy: lazy Bundle-ClassPath: bin/, . diff -r e64c52f5ee56 -r f577ea64429e org.chromium.debug.core/src/org/chromium/debug/core/ChromiumDebugPlugin.java --- a/org.chromium.debug.core/src/org/chromium/debug/core/ChromiumDebugPlugin.java Wed Jan 27 10:42:14 2010 -0800 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/ChromiumDebugPlugin.java Wed Jan 27 15:45:27 2010 -0800 @@ -24,9 +24,6 @@ /** The plug-in ID. */ public static final String PLUGIN_ID = "org.chromium.debug.core"; //$NON-NLS-1$ - /** The debug model ID. */ - public static final String DEBUG_MODEL_ID = "org.chromium.debug"; //$NON-NLS-1$ - /** The JavaScript line breakpoint marker. */ public static final String BP_MARKER = PLUGIN_ID + ".LineBP"; //$NON-NLS-1$ diff -r e64c52f5ee56 -r f577ea64429e org.chromium.debug.core/src/org/chromium/debug/core/model/ArrayValue.java --- a/org.chromium.debug.core/src/org/chromium/debug/core/model/ArrayValue.java Wed Jan 27 10:42:14 2010 -0800 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/ArrayValue.java Wed Jan 27 15:45:27 2010 -0800 @@ -22,7 +22,7 @@ private final IVariable[] elements; - public ArrayValue(IChromiumDebugTarget debugTarget, JsArray array) { + public ArrayValue(DebugTargetImpl debugTarget, JsArray array) { super(debugTarget, array); this.elements = createElements(); } diff -r e64c52f5ee56 -r f577ea64429e org.chromium.debug.core/src/org/chromium/debug/core/model/BreakpointAdapterFactory.java --- a/org.chromium.debug.core/src/org/chromium/debug/core/model/BreakpointAdapterFactory.java Wed Jan 27 10:42:14 2010 -0800 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/BreakpointAdapterFactory.java Wed Jan 27 15:45:27 2010 -0800 @@ -24,7 +24,7 @@ if (resource != null) { String extension = resource.getFileExtension(); if (extension != null && ChromiumDebugPluginUtil.CHROMIUM_EXTENSION.equals(extension)) { - return new LineBreakpointAdapter(); + return new LineBreakpointAdapter.ForVirtualProject(); } } } diff -r e64c52f5ee56 -r f577ea64429e org.chromium.debug.core/src/org/chromium/debug/core/model/ChromiumLineBreakpoint.java --- a/org.chromium.debug.core/src/org/chromium/debug/core/model/ChromiumLineBreakpoint.java Wed Jan 27 10:42:14 2010 -0800 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/ChromiumLineBreakpoint.java Wed Jan 27 15:45:27 2010 -0800 @@ -104,7 +104,7 @@ } public String getModelIdentifier() { - return ChromiumDebugPlugin.DEBUG_MODEL_ID; + return VProjectWorkspaceBridge.DEBUG_MODEL_ID; } public void changed() { diff -r e64c52f5ee56 -r f577ea64429e org.chromium.debug.core/src/org/chromium/debug/core/model/ConnectionLoggerImpl.java --- a/org.chromium.debug.core/src/org/chromium/debug/core/model/ConnectionLoggerImpl.java Wed Jan 27 10:42:14 2010 -0800 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/ConnectionLoggerImpl.java Wed Jan 27 15:45:27 2010 -0800 @@ -5,10 +5,10 @@ package org.chromium.debug.core.model; import java.io.IOException; -import java.io.Reader; import java.io.Writer; import org.chromium.sdk.ConnectionLogger; +import org.chromium.sdk.LineReader; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.model.ITerminate; @@ -46,45 +46,83 @@ this.lifecycleListener = lifecycleListener; } - public Writer wrapWriter(final Writer streamWriter) { - return new Writer() { + /** + * We mix 2 streams into a single console. This type helps to annotate them textually. + */ + private interface StreamId { + String getStreamName(); + } + + public LoggableWriter wrapWriter(final LoggableWriter originalLoggableWriter) { + final StreamId streamId = new StreamId() { + public String getStreamName() { + return Messages.ConnectionLoggerImpl_SentToChrome; + } + }; + final Writer originalWriter = originalLoggableWriter.getWriter(); + final Writer wrappedWriter = new Writer() { @Override public void close() throws IOException { - streamWriter.close(); + originalWriter.close(); flushLogWriter(); } @Override public void flush() throws IOException { - streamWriter.flush(); + originalWriter.flush(); flushLogWriter(); } @Override public void write(char[] cbuf, int off, int len) throws IOException { - streamWriter.write(cbuf, off, len); - - writeToLog(cbuf, off, len, this, - Messages.ConnectionLoggerImpl_SentToChrome); + originalWriter.write(cbuf, off, len); + writeToLog(cbuf, off, len, streamId); + } + }; + return new LoggableWriter() { + public Writer getWriter() { + return wrappedWriter; + } + public void markSeparatorForLog() { + writeToLog(MESSAGE_SEPARATOR, streamId); + flushLogWriter(); } }; } - public Reader wrapReader(final Reader streamReader) { - return new Reader() { - @Override - public void close() throws IOException { - streamReader.close(); - flushLogWriter(); + + public LoggableReader wrapReader(final LoggableReader loggableReader) { + final StreamId streamId = new StreamId() { + public String getStreamName() { + return Messages.ConnectionLoggerImpl_ReceivedFromChrome; } - - @Override + }; + final LineReader streamReader = loggableReader.getReader(); + final LineReader wrappedReader = new LineReader() { public int read(char[] cbuf, int off, int len) throws IOException { int res = streamReader.read(cbuf, off, len); if (res > 0) { - writeToLog(cbuf, off, res, this, - Messages.ConnectionLoggerImpl_ReceivedFromChrome); + writeToLog(cbuf, off, res, streamId); flushLogWriter(); } return res; } + + public String readLine() throws IOException { + String res = streamReader.readLine(); + if (res != null) { + writeToLog(res + '\n', streamId); + flushLogWriter(); + } + return res; + } + }; + return new LoggableReader() { + public LineReader getReader() { + return wrappedReader; + } + + public void markSeparatorForLog() { + writeToLog(MESSAGE_SEPARATOR, streamId); + flushLogWriter(); + } }; } @@ -105,21 +143,31 @@ this.connectionCloser = connectionCloser; } - private synchronized void writeToLog(char[] cbuf, int off, int len, Object source, - String sourceName) { + private synchronized void writeToLog(String str, StreamId streamId) { try { - if (lastSource != source) { - if (lastSource != null) { - logWriter.append('\n'); - } - logWriter.append("> ").append(sourceName).append('\n'); //$NON-NLS-1$ - lastSource = source; - } + printHead(streamId); + logWriter.append(str); + } catch (IOException e) { + DebugPlugin.log(e); + } + } + private synchronized void writeToLog(char[] cbuf, int off, int len, StreamId streamId) { + try { + printHead(streamId); logWriter.write(cbuf, off, len); } catch (IOException e) { DebugPlugin.log(e); } } + private void printHead(StreamId streamId) throws IOException { + if (lastSource != streamId) { + if (lastSource != null) { + logWriter.append('\n'); + } + logWriter.append("> ").append(streamId.getStreamName()).append('\n'); //$NON-NLS-1$ + lastSource = streamId; + } + } private void flushLogWriter() { try { logWriter.flush(); @@ -130,7 +178,7 @@ private final Writer logWriter; private final LogLifecycleListener lifecycleListener; - private Object lastSource = null; + private StreamId lastSource = null; private volatile ConnectionCloser connectionCloser = null; private volatile boolean isClosed = false; @@ -151,4 +199,6 @@ connectionCloser0.closeConnection(); } }; + + private static final String MESSAGE_SEPARATOR = Messages.ConnectionLoggerImpl_MessageSeparator; } diff -r e64c52f5ee56 -r f577ea64429e org.chromium.debug.core/src/org/chromium/debug/core/model/DebugElementImpl.java --- a/org.chromium.debug.core/src/org/chromium/debug/core/model/DebugElementImpl.java Wed Jan 27 10:42:14 2010 -0800 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/DebugElementImpl.java Wed Jan 27 15:45:27 2010 -0800 @@ -4,7 +4,6 @@ package org.chromium.debug.core.model; -import org.chromium.debug.core.ChromiumDebugPlugin; import org.eclipse.core.runtime.PlatformObject; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.model.IDebugElement; @@ -14,13 +13,17 @@ */ public class DebugElementImpl extends PlatformObject implements IDebugElement { - private final IChromiumDebugTarget debugTarget; + /** + * Instance of {@link DebugTargetImpl} or {@code null} if this is {@link DebugTargetImpl}. + * TODO(peter.rybin): Do we really need this null value? + */ + private final DebugTargetImpl debugTarget; - public DebugElementImpl(IChromiumDebugTarget debugTarget) { + public DebugElementImpl(DebugTargetImpl debugTarget) { this.debugTarget = debugTarget; } - public IChromiumDebugTarget getDebugTarget() { + public DebugTargetImpl getDebugTarget() { return debugTarget; } @@ -29,7 +32,7 @@ } public String getModelIdentifier() { - return ChromiumDebugPlugin.DEBUG_MODEL_ID; + return getDebugTarget().getChromiumModelIdentifier(); } @Override diff -r e64c52f5ee56 -r f577ea64429e org.chromium.debug.core/src/org/chromium/debug/core/model/DebugTargetImpl.java --- a/org.chromium.debug.core/src/org/chromium/debug/core/model/DebugTargetImpl.java Wed Jan 27 10:42:14 2010 -0800 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/DebugTargetImpl.java Wed Jan 27 15:45:27 2010 -0800 @@ -4,11 +4,7 @@ package org.chromium.debug.core.model; -import java.util.Collection; - import org.chromium.debug.core.ChromiumDebugPlugin; -import org.chromium.debug.core.util.ChromiumDebugPluginUtil; -import org.chromium.sdk.Breakpoint; import org.chromium.sdk.CallFrame; import org.chromium.sdk.DebugContext; import org.chromium.sdk.DebugEventListener; @@ -17,11 +13,8 @@ import org.chromium.sdk.Script; import org.chromium.sdk.DebugContext.State; import org.chromium.sdk.DebugContext.StepAction; -import org.chromium.sdk.JavascriptVm.BreakpointCallback; -import org.chromium.sdk.JavascriptVm.ScriptsCallback; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarkerDelta; -import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; @@ -30,47 +23,43 @@ import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugPlugin; -import org.eclipse.debug.core.IBreakpointManager; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchListener; import org.eclipse.debug.core.model.IBreakpoint; +import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IMemoryBlock; import org.eclipse.debug.core.model.IProcess; -import org.eclipse.debug.core.model.ISourceLocator; -import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.debug.core.model.IThread; /** * An IDebugTarget implementation for remote JavaScript debugging. * Can debug any target that supports the ChromeDevTools protocol. */ -public class DebugTargetImpl extends DebugElementImpl implements IChromiumDebugTarget { +public class DebugTargetImpl extends DebugElementImpl implements IDebugTarget { private static final IThread[] EMPTY_THREADS = new IThread[0]; - private static final long OPERATION_TIMEOUT_MS = 15000L; - private final ILaunch launch; private final JavascriptThread[] threads; private JavascriptVmEmbedder vmEmbedder = STUB_VM_EMBEDDER; - private ResourceManager resourceManager; - - private BreakpointRegistry breakpointRegistry; - - private IProject debugProject = null; - - private DebugContext debugContext; + private volatile DebugContext debugContext; private boolean isSuspended = false; private boolean isDisconnected = false; + private final WorkspaceBridge.Factory workspaceBridgeFactory; - public DebugTargetImpl(ILaunch launch) { + private WorkspaceBridge workspaceRelations = null; + + private final ListenerBlock listenerBlock = new ListenerBlock(); + + public DebugTargetImpl(ILaunch launch, WorkspaceBridge.Factory workspaceBridgeFactory) { super(null); + this.workspaceBridgeFactory = workspaceBridgeFactory; this.launch = launch; this.threads = new JavascriptThread[] { new JavascriptThread(this) }; } @@ -80,28 +69,23 @@ * Loads browser tabs, consults the {@code selector} which of the tabs to * attach to, and if any has been selected, requests an attachment to the tab. * - * @param projectNameBase to create for the browser scripts * @param remoteServer embedding application we are connected with - * @param attachCallback to invoke on successful attachment + * @param attachCallback to invoke on successful attachment, can fail to be called * @param monitor to report the progress to * @return whether the target has attached to a tab * @throws CoreException */ - public boolean attach(String projectNameBase, - JavascriptVmEmbedder.ConnectionToRemote remoteServer, DestructingGuard destructingGuard, - Runnable attachCallback, IProgressMonitor monitor) throws CoreException { + public boolean attach(JavascriptVmEmbedder.ConnectionToRemote remoteServer, + DestructingGuard destructingGuard, Runnable attachCallback, + IProgressMonitor monitor) throws CoreException { monitor.beginTask("", 2); //$NON-NLS-1$ JavascriptVmEmbedder.VmConnector connector = remoteServer.selectVm(); if (connector == null) { return false; } monitor.worked(1); - return performAttach(projectNameBase, connector, destructingGuard, attachCallback); - } - - private boolean performAttach(String projectNameBase, JavascriptVmEmbedder.VmConnector connector, - DestructingGuard destructingGuard, Runnable attachCallback) throws CoreException { final JavascriptVmEmbedder embedder = connector.attach(embedderListener, debugEventListener); + // From this moment V8 may call our listeners. We block them by listenerBlock for a while. Destructable embedderDestructor = new Destructable() { public void destruct() { @@ -111,88 +95,44 @@ destructingGuard.addValue(embedderDestructor); - vmEmbedder = embedder; + this.vmEmbedder = embedder; - // We might want to add some url-specific suffix here - String projectName = projectNameBase; // We'd like to know when launch is removed to remove our project. DebugPlugin.getDefault().getLaunchManager().addLaunchListener(launchListener); - this.debugProject = ChromiumDebugPluginUtil.createEmptyProject(projectName); - this.breakpointRegistry = new BreakpointRegistry(); - this.resourceManager = new ResourceManager(debugProject, breakpointRegistry); - onAttach(projectName, attachCallback); - return true; - } - private void onAttach(String projectName, Runnable attachCallback) { + this.workspaceRelations = workspaceBridgeFactory.attachedToVm(this, + vmEmbedder.getJavascriptVm()); + listenerBlock.unblock(); + DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this); reloadScriptsAndPossiblyResume(attachCallback); + + return true; } private void reloadScriptsAndPossiblyResume(final Runnable attachCallback) { - reloadScripts(true, new Runnable() { - public void run() { - try { - if (attachCallback != null) { - attachCallback.run(); - } - } finally { - fireCreationEvent(); - } - Job job = new Job("Update debugger state") { - @Override - protected IStatus run(IProgressMonitor monitor) { - debugEventListener.resumedByDefault(); - return Status.OK_STATUS; - } - }; - job.schedule(); - } - }); - } + workspaceRelations.reloadScriptsAtStart(); - private void reloadScripts(boolean isSync, final Runnable runnable) { - Runnable command = new Runnable() { - public void run() { - vmEmbedder.getJavascriptVm().getScripts(new ScriptsCallback() { - public void failure(String errorMessage) { - ChromiumDebugPlugin.logError(errorMessage); - } + try { + if (attachCallback != null) { + attachCallback.run(); + } + } finally { + fireCreationEvent(); + } - public void success(Collection