# HG changeset patch # User Eugene Ostroukhov # Date 1268938619 25200 # Node ID f2f4a1259de86e75d97e0f903c5f1cedc73d75b2 # Parent 12c2ea2194c748e518d664933c11e78de69a7b21 Bug 2065 - Pull updated Chrome Developer Tools into the workspace diff -r 12c2ea2194c7 -r f2f4a1259de8 chrome-dev-tools-patches/Chrome-Java5-Patch.txt --- a/chrome-dev-tools-patches/Chrome-Java5-Patch.txt Thu Mar 18 11:10:35 2010 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,181 +0,0 @@ -### Eclipse Workspace Patch 1.0 -#P org.chromium.sdk -Index: src/org/chromium/sdk/ChromiumIOException.java -=================================================================== ---- src/org/chromium/sdk/ChromiumIOException.java (revision 0) -+++ src/org/chromium/sdk/ChromiumIOException.java (revision 0) -@@ -0,0 +1,23 @@ -+package org.chromium.sdk; -+ -+import java.io.IOException; -+ -+public class ChromiumIOException extends IOException { -+ private static final long serialVersionUID = 3412049732071131594L; -+ private final Throwable cause; -+ -+ public ChromiumIOException(Throwable cause) { -+ super(); -+ this.cause = cause; -+ } -+ -+ public ChromiumIOException(String message, Throwable cause) { -+ super(message); -+ this.cause = cause; -+ } -+ -+ @Override -+ public Throwable getCause() { -+ return cause; -+ } -+} -Index: src/org/chromium/sdk/internal/BrowserImpl.java -=================================================================== ---- src/org/chromium/sdk/internal/BrowserImpl.java (revision 306) -+++ src/org/chromium/sdk/internal/BrowserImpl.java (working copy) -@@ -17,6 +17,7 @@ - - import org.chromium.sdk.Browser; - import org.chromium.sdk.BrowserTab; -+import org.chromium.sdk.ChromiumIOException; - import org.chromium.sdk.TabDebugEventListener; - import org.chromium.sdk.UnsupportedVersionException; - import org.chromium.sdk.Version; -@@ -102,7 +103,7 @@ - try { - serverVersionString = devToolsHandler.version(OPERATION_TIMEOUT_MS); - } catch (TimeoutException e) { -- throw new IOException("Failed to get protocol version from remote", e); -+ throw new ChromiumIOException("Failed to get protocol version from remote", e); - } - if (serverVersionString == null) { - throw new UnsupportedVersionException(BrowserImpl.PROTOCOL_VERSION, null); -@@ -291,7 +292,7 @@ - ticket = connectInternal(); - } catch (UnsupportedVersionException e) { - // This exception should have happened on tab fetcher creation. -- throw new IOException("Unexpected version problem", e); -+ throw new ChromiumIOException("Unexpected version problem", e); - } - - Session session = ticket.getSession(); -Index: META-INF/MANIFEST.MF -=================================================================== ---- META-INF/MANIFEST.MF (revision 306) -+++ META-INF/MANIFEST.MF (working copy) -@@ -13,4 +13,5 @@ - org.chromium.sdk.internal.tools.v8.processor;x-internal:=true, - org.chromium.sdk.internal.tools.v8.request;x-internal:=true, - org.chromium.sdk.internal.transport;x-internal:=true --Bundle-RequiredExecutionEnvironment: JavaSE-1.6 -+Bundle-RequiredExecutionEnvironment: J2SE-1.5, -+ JavaSE-1.6 -Index: src/org/chromium/sdk/internal/BrowserTabImpl.java -=================================================================== ---- src/org/chromium/sdk/internal/BrowserTabImpl.java (revision 306) -+++ src/org/chromium/sdk/internal/BrowserTabImpl.java (working copy) -@@ -8,6 +8,7 @@ - - import org.chromium.sdk.Browser; - import org.chromium.sdk.BrowserTab; -+import org.chromium.sdk.ChromiumIOException; - import org.chromium.sdk.DebugEventListener; - import org.chromium.sdk.TabDebugEventListener; - import org.chromium.sdk.internal.tools.ToolHandler; -@@ -89,7 +90,7 @@ - try { - result = devToolSessionManager.attachToTab(); - } catch (AttachmentFailureException e) { -- throw new IOException(e); -+ throw new ChromiumIOException(e); - } - if (Result.OK != result) { - throw new IOException("Failed to attach with result: " + result); -Index: src/org/chromium/sdk/internal/StandaloneVmImpl.java -=================================================================== ---- src/org/chromium/sdk/internal/StandaloneVmImpl.java (revision 306) -+++ src/org/chromium/sdk/internal/StandaloneVmImpl.java (working copy) -@@ -12,6 +12,7 @@ - import java.util.logging.Level; - import java.util.logging.Logger; - -+import org.chromium.sdk.ChromiumIOException; - import org.chromium.sdk.DebugEventListener; - import org.chromium.sdk.StandaloneVm; - import org.chromium.sdk.UnsupportedVersionException; -@@ -121,9 +122,9 @@ - } catch (InterruptedException e) { - throw new RuntimeException(e); - } catch (ExecutionException e) { -- throw new IOException("Failed to get version", e); -+ throw new ChromiumIOException("Failed to get version", e); - } catch (TimeoutException e) { -- throw new IOException("Timed out waiting for version", e); -+ throw new ChromiumIOException("Timed out waiting for version", e); - } - - String versionString = remoteInfo.getProtocolVersion(); -Index: src/org/chromium/sdk/internal/transport/Handshaker.java -=================================================================== ---- src/org/chromium/sdk/internal/transport/Handshaker.java (revision 306) -+++ src/org/chromium/sdk/internal/transport/Handshaker.java (working copy) -@@ -10,8 +10,8 @@ - import java.util.concurrent.ExecutionException; - import java.util.concurrent.Future; - import java.util.concurrent.FutureTask; --import java.util.concurrent.RunnableFuture; - -+import org.chromium.sdk.ChromiumIOException; - import org.chromium.sdk.LineReader; - import org.chromium.sdk.internal.transport.Message.MalformedMessageException; - -@@ -85,7 +85,7 @@ - return runnableFuture; - } - -- private final RunnableFuture runnableFuture = -+ private final FutureTask runnableFuture = - new FutureTask(new HandshakeTaks()); - - private LineReader input = null; -@@ -100,7 +100,7 @@ - } catch (InterruptedException e) { - throw new RuntimeException(e); - } catch (ExecutionException e) { -- throw new IOException("Failed to perform handshake", e); -+ throw new ChromiumIOException("Failed to perform handshake", e); - } - - } -@@ -111,7 +111,7 @@ - try { - message = Message.fromBufferedReader(input); - } catch (MalformedMessageException e) { -- throw new IOException("Unrecognized handshake message from remote", e); -+ throw new ChromiumIOException("Unrecognized handshake message from remote", e); - } - if (message == null) { - throw new IOException("End of stream"); -#P org.chromium.debug.core -Index: META-INF/MANIFEST.MF -=================================================================== ---- META-INF/MANIFEST.MF (revision 306) -+++ META-INF/MANIFEST.MF (working copy) -@@ -20,4 +20,5 @@ - org.chromium.debug.core.model, - org.chromium.debug.core.util - Eclipse-LazyStart: true --Bundle-RequiredExecutionEnvironment: JavaSE-1.6 -+Bundle-RequiredExecutionEnvironment: J2SE-1.5, -+ JavaSE-1.6 -#P org.chromium.debug.ui -Index: META-INF/MANIFEST.MF -=================================================================== ---- META-INF/MANIFEST.MF (revision 306) -+++ META-INF/MANIFEST.MF (working copy) -@@ -16,4 +16,5 @@ - org.chromium.debug.core;bundle-version="0.1.5", - org.chromium.sdk;bundle-version="0.1.5" - Bundle-ActivationPolicy: lazy --Bundle-RequiredExecutionEnvironment: JavaSE-1.6 -+Bundle-RequiredExecutionEnvironment: J2SE-1.5, -+ JavaSE-1.6 diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.debug.core/META-INF/MANIFEST.MF --- a/org.chromium.debug.core/META-INF/MANIFEST.MF Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.debug.core/META-INF/MANIFEST.MF Thu Mar 18 11:56:59 2010 -0700 @@ -20,5 +20,4 @@ org.chromium.debug.core.model, org.chromium.debug.core.util Eclipse-LazyStart: true -Bundle-RequiredExecutionEnvironment: J2SE-1.5, - JavaSE-1.6 +Bundle-RequiredExecutionEnvironment: J2SE-1.5 diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.debug.core/build.properties --- a/org.chromium.debug.core/build.properties Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.debug.core/build.properties Thu Mar 18 11:56:59 2010 -0700 @@ -6,8 +6,3 @@ source.. = src/ output.. = bin/ src.includes = LICENSE -# javac -javacSource=1.5 -javacTarget=1.5 -javacVerbose=true - diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.debug.core/src/org/chromium/debug/core/efs/ChromiumScriptFileSystem.java --- a/org.chromium.debug.core/src/org/chromium/debug/core/efs/ChromiumScriptFileSystem.java Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/efs/ChromiumScriptFileSystem.java Thu Mar 18 11:56:59 2010 -0700 @@ -42,6 +42,10 @@ } } + public static boolean isChromiumDebugURI(URI uri) { + return CHROMIUMDEBUG_SCHEME.equals(uri.getScheme()); + } + /** * Converts a chromiumdebug FS FileStore URI into a path relative to the FS root. * diff -r 12c2ea2194c7 -r f2f4a1259de8 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 Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/ArrayValue.java Thu Mar 18 11:56:59 2010 -0700 @@ -4,12 +4,10 @@ package org.chromium.debug.core.model; -import java.util.ArrayList; -import java.util.List; -import java.util.SortedMap; +import java.util.Collections; +import java.util.Set; import org.chromium.sdk.JsArray; -import org.chromium.sdk.JsVariable; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IIndexedValue; import org.eclipse.debug.core.model.IVariable; @@ -28,12 +26,11 @@ } private IVariable[] createElements() { - SortedMap elements = ((JsArray) getJsValue()).toSparseArray(); - List variables = new ArrayList(elements.size()); - for (JsVariable jsVar : elements.values()) { - variables.add(new Variable(getDebugTarget(), jsVar, false)); - } - return variables.toArray(new IVariable[variables.size()]); + JsArray jsArray = (JsArray) getJsValue(); + return StackFrame.wrapVariables(getDebugTarget(), jsArray.getProperties(), + ARRAY_HIDDEN_PROPERTY_NAMES, + // Do not show internal properties for arrays (this may be an option). + null); } public int getInitialOffset() { @@ -64,4 +61,5 @@ return elements.length > 0; } + private static final Set ARRAY_HIDDEN_PROPERTY_NAMES = Collections.singleton("length"); } diff -r 12c2ea2194c7 -r f2f4a1259de8 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 Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/DebugTargetImpl.java Thu Mar 18 11:56:59 2010 -0700 @@ -57,7 +57,7 @@ private WorkspaceBridge workspaceRelations = null; - private final ListenerBlock listenerBlock = new ListenerBlock(); + private ListenerBlock listenerBlock = null; public DebugTargetImpl(ILaunch launch, WorkspaceBridge.Factory workspaceBridgeFactory) { super(null); @@ -86,25 +86,30 @@ return false; } monitor.worked(1); - final JavascriptVmEmbedder embedder = connector.attach(embedderListener, debugEventListener); - // From this moment V8 may call our listeners. We block them by listenerBlock for a while. + this.listenerBlock = new ListenerBlock(); + try { + 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() { - embedder.getJavascriptVm().detach(); - } - }; + Destructable embedderDestructor = new Destructable() { + public void destruct() { + embedder.getJavascriptVm().detach(); + } + }; - destructingGuard.addValue(embedderDestructor); + destructingGuard.addValue(embedderDestructor); - this.vmEmbedder = embedder; + this.vmEmbedder = embedder; + + // We'd like to know when launch is removed to remove our project. + DebugPlugin.getDefault().getLaunchManager().addLaunchListener(launchListener); - // We'd like to know when launch is removed to remove our project. - DebugPlugin.getDefault().getLaunchManager().addLaunchListener(launchListener); - - this.workspaceRelations = workspaceBridgeFactory.attachedToVm(this, - vmEmbedder.getJavascriptVm()); - listenerBlock.unblock(); + this.workspaceRelations = workspaceBridgeFactory.attachedToVm(this, + vmEmbedder.getJavascriptVm()); + listenerBlock.setProperlyInitialized(); + } finally { + listenerBlock.unblock(); + } DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this); reloadScriptsAndPossiblyResume(attachCallback); @@ -417,29 +422,26 @@ private void logExceptionFromContext(DebugContext context) { ExceptionData exceptionData = context.getExceptionData(); List callFrames = context.getCallFrames(); + String scriptName; + Object lineNumber; if (callFrames.size() > 0) { CallFrame topFrame = callFrames.get(0); Script script = topFrame.getScript(); - ChromiumDebugPlugin.logError( - Messages.DebugTargetImpl_LogExceptionFormat, - exceptionData.isUncaught() - ? Messages.DebugTargetImpl_Uncaught - : Messages.DebugTargetImpl_Caught, - exceptionData.getExceptionMessage(), - script != null ? script.getName() : "", //$NON-NLS-1$ - topFrame.getLineNumber(), - trim(exceptionData.getSourceText(), 80)); + scriptName = script != null ? script.getName() : Messages.DebugTargetImpl_Unknown; + lineNumber = topFrame.getLineNumber(); } else { - ChromiumDebugPlugin.logError( - Messages.DebugTargetImpl_LogExceptionFormat, - exceptionData.isUncaught() - ? Messages.DebugTargetImpl_Uncaught - : Messages.DebugTargetImpl_Caught, - exceptionData.getExceptionMessage(), - "", //$NON-NLS-1$ - "", - trim(exceptionData.getSourceText(), 80)); + scriptName = Messages.DebugTargetImpl_Unknown; + lineNumber = Messages.DebugTargetImpl_Unknown; } + ChromiumDebugPlugin.logError( + Messages.DebugTargetImpl_LogExceptionFormat, + exceptionData.isUncaught() + ? Messages.DebugTargetImpl_Uncaught + : Messages.DebugTargetImpl_Caught, + exceptionData.getExceptionMessage(), + scriptName, + lineNumber, + trim(exceptionData.getSourceText(), 80)); } private final JavascriptVmEmbedder.Listener embedderListener = @@ -489,33 +491,39 @@ public WorkspaceBridge.JsLabelProvider getLabelProvider() { return workspaceBridgeFactory.getLabelProvider(); } + + public int getLineNumber(CallFrame stackFrame) { + return workspaceRelations.getLineNumber(stackFrame); + } private static class ListenerBlock { private volatile boolean isBlocked = true; + private volatile boolean hasBeenProperlyInitialized = false; private final Object monitor = new Object(); void waitUntilReady() { if (isBlocked) { - return; - } - synchronized (monitor) { - while (isBlocked) { - try { - monitor.wait(); - } catch (InterruptedException e) { - throw new RuntimeException(e); + synchronized (monitor) { + while (isBlocked) { + try { + monitor.wait(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } } } } + if (!hasBeenProperlyInitialized) { + throw new RuntimeException("DebugTarget has not been properly initialized"); //$NON-NLS-1$ + } + } + void setProperlyInitialized() { + hasBeenProperlyInitialized = true; } void unblock() { - isBlocked = true; + isBlocked = false; synchronized (monitor) { monitor.notifyAll(); } } } - - public int getLineNumber(CallFrame stackFrame) { - return workspaceRelations.getLineNumber(stackFrame); - } } diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.debug.core/src/org/chromium/debug/core/model/Messages.java --- a/org.chromium.debug.core/src/org/chromium/debug/core/model/Messages.java Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/Messages.java Thu Mar 18 11:56:59 2010 -0700 @@ -41,6 +41,8 @@ public static String DebugTargetImpl_Uncaught; + public static String DebugTargetImpl_Unknown; + public static String JavascriptVmEmbedderFactory_TargetName0; public static String JavascriptVmEmbedderFactory_Terminated; diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.debug.core/src/org/chromium/debug/core/model/StackFrame.java --- a/org.chromium.debug.core/src/org/chromium/debug/core/model/StackFrame.java Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/StackFrame.java Thu Mar 18 11:56:59 2010 -0700 @@ -9,6 +9,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Set; import org.chromium.debug.core.ChromiumDebugPlugin; import org.chromium.sdk.CallFrame; @@ -79,16 +80,22 @@ static IVariable[] wrapVariables( DebugTargetImpl debugTarget, Collection jsVars, + Set propertyNameBlackList, Collection jsInternalProperties) { List vars = new ArrayList(jsVars.size()); for (JsVariable jsVar : jsVars) { + if (propertyNameBlackList.contains(jsVar.getName())) { + continue; + } vars.add(new Variable(debugTarget, jsVar, false)); } // Sort all regular properties by name. Collections.sort(vars, VARIABLE_COMPARATOR); // Always put internal properties in the end. - for (JsVariable jsMetaVar : jsInternalProperties) { - vars.add(new Variable(debugTarget, jsMetaVar, true)); + if (jsInternalProperties != null) { + for (JsVariable jsMetaVar : jsInternalProperties) { + vars.add(new Variable(debugTarget, jsMetaVar, true)); + } } return vars.toArray(new IVariable[vars.size()]); } @@ -194,7 +201,6 @@ } public int getLineNumber() throws DebugException { - // convert 0-based to 1-based return getDebugTarget().getLineNumber(stackFrame); } @@ -307,8 +313,40 @@ private final static Comparator VARIABLE_COMPARATOR = new Comparator() { public int compare(Variable var1, Variable var2) { - return var1.getName().compareTo(var2.getName()); + return compareNameObjects(getNameObject(var1), getNameObject(var2)); + } + // Get property name as String or Integer. + private Object getNameObject(Variable var) { + String name = var.getName(); + int len = name.length(); + if (len >= 3 && name.charAt(0) == '[' && name.charAt(len-1) == ']') { + Integer i = Integer.valueOf(name.substring(1, len - 1)); + return i; + } + return name; } + // Compare property name (either string or integer). + private int compareNameObjects(Object nameObj1, Object nameObj2) { + if (nameObj1 instanceof Integer) { + Integer i1 = (Integer) nameObj1; + if (nameObj2 instanceof Integer) { + Integer i2 = (Integer) nameObj2; + return i1.compareTo(i2); + } else { + return COMPARE_INT_WITH_STRING; + } + } else { + String s1 = (String) nameObj1; + if (nameObj2 instanceof String) { + String s2 = (String) nameObj2; + return s1.compareTo(s2); + } else { + return -COMPARE_INT_WITH_STRING; + } + } + } + // Strings go before numbers. + private static final int COMPARE_INT_WITH_STRING = 1; }; @Override diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.debug.core/src/org/chromium/debug/core/model/VProjectWorkspaceBridge.java --- a/org.chromium.debug.core/src/org/chromium/debug/core/model/VProjectWorkspaceBridge.java Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/VProjectWorkspaceBridge.java Thu Mar 18 11:56:59 2010 -0700 @@ -233,7 +233,8 @@ }; public int getLineNumber(CallFrame stackFrame) { - return stackFrame.getLineNumber() + 1; + // convert 0-based to 1-based + return stackFrame.getLineNumber() + 1; } /** @@ -267,13 +268,22 @@ public String getThreadLabel(JavascriptThread thread) { String url = thread.getDebugTarget().getJavascriptEmbedder().getThreadName(); - return NLS.bind(Messages.JsThread_ThreadLabelFormat, getThreadStateLabel(thread), (url.length() > 0 - ? (" : " + url) : "")); //$NON-NLS-1$ //$NON-NLS-2$ + return NLS.bind(Messages.JsThread_ThreadLabelFormat, + getThreadStateLabel(thread), + (url.length() > 0 ? (" : " + url) : "")); //$NON-NLS-1$ //$NON-NLS-2$ } private String getThreadStateLabel(JavascriptThread thread) { + DebugContext context; if (thread.isSuspended()) { - DebugContext context = thread.getDebugTarget().getDebugContext(); + // Theoretically the context may be null. + context = thread.getDebugTarget().getDebugContext(); + } else { + context = null; + } + if (context == null) { + return Messages.JsThread_ThreadLabelRunning; + } else { ExceptionData exceptionData = context.getExceptionData(); if (exceptionData != null) { return NLS.bind(Messages.JsThread_ThreadLabelSuspendedExceptionFormat, @@ -281,8 +291,6 @@ } else { return Messages.JsThread_ThreadLabelSuspended; } - } else { - return Messages.JsThread_ThreadLabelRunning; } } diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.debug.core/src/org/chromium/debug/core/model/Value.java --- a/org.chromium.debug.core/src/org/chromium/debug/core/model/Value.java Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/Value.java Thu Mar 18 11:56:59 2010 -0700 @@ -4,6 +4,8 @@ package org.chromium.debug.core.model; +import java.util.Collections; + import org.chromium.debug.core.ChromiumDebugPlugin; import org.chromium.debug.core.util.JsValueStringifier; import org.chromium.sdk.JsArray; @@ -56,7 +58,8 @@ try { if (variables == null) { if (value.asObject() != null) { - variables = StackFrame.wrapVariables(getDebugTarget(), value.asObject().getProperties(), + variables = StackFrame.wrapVariables(getDebugTarget(), + value.asObject().getProperties(), Collections.emptySet(), value.asObject().getInternalProperties()); } else { variables = EMPTY_VARIABLES; diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.debug.core/src/org/chromium/debug/core/model/WorkspaceBridge.java --- a/org.chromium.debug.core/src/org/chromium/debug/core/model/WorkspaceBridge.java Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/WorkspaceBridge.java Thu Mar 18 11:56:59 2010 -0700 @@ -119,5 +119,4 @@ */ String getStackFrameLabel(StackFrame stackFrame) throws DebugException; } - } diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.debug.core/src/org/chromium/debug/core/model/messages.properties --- a/org.chromium.debug.core/src/org/chromium/debug/core/model/messages.properties Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/messages.properties Thu Mar 18 11:56:59 2010 -0700 @@ -16,6 +16,7 @@ DebugTargetImpl_LogExceptionFormat={0} {1} (in {2}:{3}): {4} DebugTargetImpl_TargetName=Chromium DebugTargetImpl_Uncaught=Uncaught +DebugTargetImpl_Unknown= JavascriptVmEmbedderFactory_TargetName0=Remote "{0}" embedding V8 {1} JavascriptVmEmbedderFactory_Terminated=terminated JavascriptVmEmbedderFactory_TerminatedWithReason=terminated: {0} @@ -23,7 +24,7 @@ JsThread_ThreadLabelFormat=JavaScript Thread ({0}){1} JsThread_ThreadLabelRunning=Running JsThread_ThreadLabelSuspended=Suspended -JsThread_ThreadLabelSuspendedExceptionFormat=Suspended (exception ''{0}'') +JsThread_ThreadLabelSuspendedExceptionFormat=Suspended (exception "{0}") ResourceManager_UnnamedScriptName=(program) StackFrame_NameFormat={0} [{1}:{2}] StackFrame_UnknownScriptName= diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.debug.core/src/org/chromium/debug/core/util/ChromiumDebugPluginUtil.java --- a/org.chromium.debug.core/src/org/chromium/debug/core/util/ChromiumDebugPluginUtil.java Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/util/ChromiumDebugPluginUtil.java Thu Mar 18 11:56:59 2010 -0700 @@ -20,9 +20,9 @@ import org.eclipse.core.resources.ResourceAttributes; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.widgets.Display; @@ -71,14 +71,13 @@ /** * Creates an empty workspace project with the name starting with the given projectNameBase. * Created project is guaranteed to be new in EFS, but workspace may happen to - * alreay have project with such url (left uncleaned from previous runs). Such project + * already have project with such url (left uncleaned from previous runs). Such project * silently gets deleted. * @param projectNameBase project name template * @return the newly created project, or {@code null} if the creation failed */ public static IProject createEmptyProject(String projectNameBase) { - URI projectUri; - String projectName; + ProjectCheckData projectProject; try { for (int uniqueNumber = 0; ; uniqueNumber++) { String projectNameTry; @@ -87,14 +86,8 @@ } else { projectNameTry = projectNameBase + " (" + uniqueNumber + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } - URI projectUriTry = ChromiumScriptFileSystem.getFileStoreUri( - new Path(null, "/" + projectNameTry)); //$NON-NLS-1$ - IFileStore projectStore = EFS.getStore(projectUriTry); - if (projectStore.fetchInfo().exists()) { - continue; - } else { - projectUri = projectUriTry; - projectName = projectNameTry; + projectProject = checkProjectName(projectNameTry); + if (projectProject != null) { break; } } @@ -102,15 +95,21 @@ ChromiumDebugPlugin.log(e); return null; } - IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName); + IProject project = projectProject.getProject(); + if (project.exists()) { + try { + project.delete(true, null); + } catch (CoreException e) { + ChromiumDebugPlugin.log(e); + return null; + } + } + IProjectDescription description = - ResourcesPlugin.getWorkspace().newProjectDescription(projectName); - description.setLocationURI(projectUri); + ResourcesPlugin.getWorkspace().newProjectDescription(project.getName()); + description.setLocationURI(projectProject.getProjectUri()); description.setNatureIds(new String[] { JS_DEBUG_PROJECT_NATURE }); try { - if (project.exists()) { - project.delete(true, null); - } project.create(description, null); project.open(null); @@ -118,9 +117,44 @@ return project; } catch (CoreException e) { ChromiumDebugPlugin.log(e); + return null; } + } + + private interface ProjectCheckData { + IProject getProject(); + URI getProjectUri(); + } - return null; + /** + * Checks whether debug virtual project can be created. + * @param projectNameTry desired project name + * @return project project with parameters data or null if project with desired name cannot be + * created + */ + private static ProjectCheckData checkProjectName(String projectNameTry) throws CoreException { + final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectNameTry); + if (project.exists()) { + URI projectURI = project.getLocationURI(); + if (!ChromiumScriptFileSystem.isChromiumDebugURI(projectURI)) { + // This is not our project. Do not touch it. + return null; + } + } + IPath newPath = project.getFullPath(); + final URI projectUriTry = ChromiumScriptFileSystem.getFileStoreUri(newPath); + IFileStore projectStore = EFS.getStore(projectUriTry); + if (projectStore.fetchInfo().exists()) { + return null; + } + return new ProjectCheckData() { + public IProject getProject() { + return project; + } + public URI getProjectUri() { + return projectUriTry; + } + }; } diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.debug.ui/META-INF/MANIFEST.MF --- a/org.chromium.debug.ui/META-INF/MANIFEST.MF Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.debug.ui/META-INF/MANIFEST.MF Thu Mar 18 11:56:59 2010 -0700 @@ -16,5 +16,4 @@ org.chromium.debug.core;bundle-version="0.1.5", org.chromium.sdk;bundle-version="0.1.5" Bundle-ActivationPolicy: lazy -Bundle-RequiredExecutionEnvironment: J2SE-1.5, - JavaSE-1.6 +Bundle-RequiredExecutionEnvironment: J2SE-1.5 diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.debug.ui/build.properties --- a/org.chromium.debug.ui/build.properties Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.debug.ui/build.properties Thu Mar 18 11:56:59 2010 -0700 @@ -7,9 +7,3 @@ source.. = src/ output.. = bin/ src.includes = LICENSE - -# javac -javacSource=1.5 -javacTarget=1.5 -javacVerbose=true - diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.sdk/META-INF/MANIFEST.MF --- a/org.chromium.sdk/META-INF/MANIFEST.MF Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.sdk/META-INF/MANIFEST.MF Thu Mar 18 11:56:59 2010 -0700 @@ -13,5 +13,4 @@ org.chromium.sdk.internal.tools.v8.processor;x-internal:=true, org.chromium.sdk.internal.tools.v8.request;x-internal:=true, org.chromium.sdk.internal.transport;x-internal:=true -Bundle-RequiredExecutionEnvironment: J2SE-1.5, - JavaSE-1.6 +Bundle-RequiredExecutionEnvironment: J2SE-1.5 diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.sdk/build.properties --- a/org.chromium.sdk/build.properties Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.sdk/build.properties Thu Mar 18 11:56:59 2010 -0700 @@ -6,9 +6,3 @@ source.. = src/ output.. = bin/ src.includes = LICENSE - -# javac -javacSource=1.5 -javacTarget=1.5 -javacVerbose=true - diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.sdk/src/org/chromium/sdk/ChromiumIOException.java --- a/org.chromium.sdk/src/org/chromium/sdk/ChromiumIOException.java Thu Mar 18 11:10:35 2010 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -package org.chromium.sdk; - -import java.io.IOException; - -public class ChromiumIOException extends IOException { - private static final long serialVersionUID = 1L; - - private final Throwable cause; - - public ChromiumIOException(Throwable cause) { - this.cause = cause; - } - - public ChromiumIOException(String message, Throwable cause) { - super(message); - this.cause = cause; - } - - @Override - public Throwable getCause() { - return cause; - } -} diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.sdk/src/org/chromium/sdk/JavascriptVm.java --- a/org.chromium.sdk/src/org/chromium/sdk/JavascriptVm.java Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.sdk/src/org/chromium/sdk/JavascriptVm.java Thu Mar 18 11:56:59 2010 -0700 @@ -70,6 +70,8 @@ * may be {@code null} * @throws MethodIsBlockingException if called from a callback because it * blocks until scripts are received + * TODO(peter.rybin): get rid of callback (return result explicitly) + * TODO(peter.rybin): support notification about collected scripts */ void getScripts(ScriptsCallback callback) throws MethodIsBlockingException; diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.sdk/src/org/chromium/sdk/internal/BrowserImpl.java --- a/org.chromium.sdk/src/org/chromium/sdk/internal/BrowserImpl.java Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.sdk/src/org/chromium/sdk/internal/BrowserImpl.java Thu Mar 18 11:56:59 2010 -0700 @@ -17,7 +17,6 @@ import org.chromium.sdk.Browser; import org.chromium.sdk.BrowserTab; -import org.chromium.sdk.ChromiumIOException; import org.chromium.sdk.TabDebugEventListener; import org.chromium.sdk.UnsupportedVersionException; import org.chromium.sdk.Version; @@ -103,7 +102,7 @@ try { serverVersionString = devToolsHandler.version(OPERATION_TIMEOUT_MS); } catch (TimeoutException e) { - throw new ChromiumIOException("Failed to get protocol version from remote", e); + throw JavascriptVmImpl.newIOException("Failed to get protocol version from remote", e); } if (serverVersionString == null) { throw new UnsupportedVersionException(BrowserImpl.PROTOCOL_VERSION, null); @@ -292,7 +291,7 @@ ticket = connectInternal(); } catch (UnsupportedVersionException e) { // This exception should have happened on tab fetcher creation. - throw new ChromiumIOException("Unexpected version problem", e); + throw JavascriptVmImpl.newIOException("Unexpected version problem", e); } Session session = ticket.getSession(); diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.sdk/src/org/chromium/sdk/internal/BrowserTabImpl.java --- a/org.chromium.sdk/src/org/chromium/sdk/internal/BrowserTabImpl.java Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.sdk/src/org/chromium/sdk/internal/BrowserTabImpl.java Thu Mar 18 11:56:59 2010 -0700 @@ -8,7 +8,6 @@ import org.chromium.sdk.Browser; import org.chromium.sdk.BrowserTab; -import org.chromium.sdk.ChromiumIOException; import org.chromium.sdk.DebugEventListener; import org.chromium.sdk.TabDebugEventListener; import org.chromium.sdk.internal.tools.ToolHandler; @@ -90,7 +89,7 @@ try { result = devToolSessionManager.attachToTab(); } catch (AttachmentFailureException e) { - throw new ChromiumIOException(e); + throw newIOException(null, e); } if (Result.OK != result) { throw new IOException("Failed to attach with result: " + result); diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.sdk/src/org/chromium/sdk/internal/CallFrameImpl.java --- a/org.chromium.sdk/src/org/chromium/sdk/internal/CallFrameImpl.java Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.sdk/src/org/chromium/sdk/internal/CallFrameImpl.java Thu Mar 18 11:56:59 2010 -0700 @@ -98,7 +98,9 @@ ValueLoader valueLoader = context.getValueLoader(); ValueMirror mirror = valueLoader.getOrLoadValueFromRefs(Collections.singletonList(ref)).get(0); - this.receiverVariable = new JsVariableImpl(this.context, mirror, ref.getName()); + // This name should be string. We are making it string as a fall-back strategy. + String varNameStr = ref.getName().toString(); + this.receiverVariable = new JsVariableImpl(this.context, mirror, varNameStr); } this.receiverVariableLoaded = true; } @@ -145,7 +147,9 @@ List mirrors = context.getValueLoader().getOrLoadValueFromRefs(refs); Collection result = new ArrayList(refs.size()); for (int i = 0; i < refs.size(); i++) { - result.add(new JsVariableImpl(this.context, mirrors.get(i), refs.get(i).getName())); + // This name should be string. We are making it string as a fall-back strategy. + String varNameStr = refs.get(i).getName().toString(); + result.add(new JsVariableImpl(this.context, mirrors.get(i), varNameStr)); } return result; } diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.sdk/src/org/chromium/sdk/internal/ContextBuilder.java --- a/org.chromium.sdk/src/org/chromium/sdk/internal/ContextBuilder.java Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.sdk/src/org/chromium/sdk/internal/ContextBuilder.java Thu Mar 18 11:56:59 2010 -0700 @@ -16,8 +16,8 @@ import org.chromium.sdk.JsEvaluateContext; import org.chromium.sdk.Script; import org.chromium.sdk.SyncCallback; -import org.chromium.sdk.internal.protocol.CommandResponse; import org.chromium.sdk.internal.protocol.SuccessCommandResponse; +import org.chromium.sdk.internal.tools.v8.V8CommandCallbackBase; import org.chromium.sdk.internal.tools.v8.V8CommandProcessor; import org.chromium.sdk.internal.tools.v8.V8CommandProcessor.V8HandlerCallback; import org.chromium.sdk.internal.tools.v8.request.DebuggerMessage; @@ -281,14 +281,9 @@ DebuggerMessage message = DebuggerMessageFactory.goOn(stepAction, stepCount); V8CommandProcessor.V8HandlerCallback commandCallback - = new V8CommandProcessor.V8HandlerCallback() { - public void messageReceived(CommandResponse response) { - SuccessCommandResponse successResponse = response.asSuccess(); - if (successResponse == null) { - this.failure(response.asFailure().getMessage()); - return; - } - + = new V8CommandCallbackBase() { + @Override + public void success(SuccessCommandResponse successResponse) { contextDismissed(UserContext.this); if (callback != null) { @@ -296,6 +291,7 @@ } getDebugSession().getDebugEventListener().resumed(); } + @Override public void failure(String message) { synchronized (sendContextCommandsMonitor) { // resurrected diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.sdk/src/org/chromium/sdk/internal/DebugSession.java --- a/org.chromium.sdk/src/org/chromium/sdk/internal/DebugSession.java Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.sdk/src/org/chromium/sdk/internal/DebugSession.java Thu Mar 18 11:56:59 2010 -0700 @@ -4,11 +4,15 @@ package org.chromium.sdk.internal; +import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.List; import org.chromium.sdk.Breakpoint; import org.chromium.sdk.DebugEventListener; import org.chromium.sdk.InvalidContextException; +import org.chromium.sdk.Script; import org.chromium.sdk.SyncCallback; import org.chromium.sdk.Version; import org.chromium.sdk.JavascriptVm.ScriptsCallback; @@ -19,11 +23,11 @@ import org.chromium.sdk.internal.tools.v8.BreakpointManager; import org.chromium.sdk.internal.tools.v8.DefaultResponseHandler; import org.chromium.sdk.internal.tools.v8.V8BlockingCallback; +import org.chromium.sdk.internal.tools.v8.V8CommandCallbackBase; import org.chromium.sdk.internal.tools.v8.V8CommandOutput; import org.chromium.sdk.internal.tools.v8.V8CommandProcessor; import org.chromium.sdk.internal.tools.v8.V8Helper; import org.chromium.sdk.internal.tools.v8.V8ProtocolUtil; -import org.chromium.sdk.internal.tools.v8.V8CommandProcessor.V8HandlerCallback; import org.chromium.sdk.internal.tools.v8.request.ContextlessDebuggerMessage; import org.chromium.sdk.internal.tools.v8.request.DebuggerMessageFactory; @@ -122,20 +126,15 @@ } public void suspend(final SuspendCallback suspendCallback) { - V8CommandProcessor.V8HandlerCallback v8Callback = new V8CommandProcessor.V8HandlerCallback() { + V8CommandProcessor.V8HandlerCallback v8Callback = new V8CommandCallbackBase() { + @Override public void failure(String message) { if (suspendCallback != null) { suspendCallback.failure(new Exception(message)); } } - public void messageReceived(CommandResponse response) { - SuccessCommandResponse successResponse = response.asSuccess(); - if (successResponse == null) { - if (suspendCallback != null) { - suspendCallback.failure(new Exception("Unsuccessful command")); - } - return; - } + @Override + public void success(SuccessCommandResponse successResponse) { if (suspendCallback != null) { suspendCallback.success(); } @@ -154,38 +153,34 @@ public class ScriptLoader { - /** Whether the initial script loading has completed. */ - private volatile boolean doneInitialScriptLoad = false; + private final Object monitor = new Object(); + /** + * Stores the callbacks that are waiting for result. + * This field being reset to null means that result is ready (loaded into ScriptManager) + * and no more callbacks are accepted. + */ + private List pendingCallbacks = new ArrayList(2); + private List pendingSyncCallbacks = new ArrayList(2); /** * Loads all scripts from the remote if necessary, and feeds them into the * callback provided (if any). - * - * @param callback nullable callback to invoke when the scripts are ready */ - public void loadAllScripts(final ScriptsCallback callback, SyncCallback syncCallback) { - if (!doneInitialScriptLoad) { - this.doneInitialScriptLoad = true; - // Not loaded the scripts initially, do full load. - v8Helper.reloadAllScriptsAsync(new V8HandlerCallback() { - public void messageReceived(CommandResponse response) { - if (callback != null) { - SuccessCommandResponse successResponse = response.asSuccess(); - if (successResponse != null) { - callback.success(getScriptManager().allScripts()); - } else { - callback.failure(response.asFailure().getMessage()); - } - } - } - - public void failure(String message) { - if (callback != null) { - callback.failure(message); - } - } - }, syncCallback); - } else { + public void loadAllScripts(ScriptsCallback callback, SyncCallback syncCallback) { + boolean resultIsReady; + boolean sendMessage; + synchronized (monitor) { + if (pendingCallbacks == null) { + resultIsReady = true; + sendMessage = false; + } else { + resultIsReady = false; + sendMessage = pendingCallbacks.isEmpty(); + pendingCallbacks.add(callback); + pendingSyncCallbacks.add(syncCallback); + } + } + if (resultIsReady) { try { if (callback != null) { callback.success(getScriptManager().allScripts()); @@ -195,8 +190,68 @@ syncCallback.callbackDone(null); } } + return; + } + if (sendMessage) { + sendAsyncMessage(); } } + private void sendAsyncMessage() { + V8Helper.ScriptLoadCallback groupCallback = new V8Helper.ScriptLoadCallback() { + public void success() { + final Collection