org.chromium.sdk/src/org/chromium/sdk/internal/tools/v8/V8Helper.java
changeset 355 8726e95bcbba
parent 276 f2f4a1259de8
--- a/org.chromium.sdk/src/org/chromium/sdk/internal/tools/v8/V8Helper.java	Mon Jun 07 16:33:07 2010 -0700
+++ b/org.chromium.sdk/src/org/chromium/sdk/internal/tools/v8/V8Helper.java	Mon Jun 07 16:51:19 2010 -0700
@@ -19,6 +19,7 @@
 import org.chromium.sdk.internal.PropertyHoldingValueMirror;
 import org.chromium.sdk.internal.PropertyReference;
 import org.chromium.sdk.internal.ScopeMirror;
+import org.chromium.sdk.internal.ScriptImpl;
 import org.chromium.sdk.internal.ScriptManager;
 import org.chromium.sdk.internal.SubpropertiesMirror;
 import org.chromium.sdk.internal.ValueLoadException;
@@ -34,6 +35,7 @@
 import org.chromium.sdk.internal.protocol.data.ScriptHandle;
 import org.chromium.sdk.internal.protocol.data.ValueHandle;
 import org.chromium.sdk.internal.protocolparser.JsonProtocolParseException;
+import org.chromium.sdk.internal.tools.v8.request.ContextlessDebuggerMessage;
 import org.chromium.sdk.internal.tools.v8.request.DebuggerMessageFactory;
 import org.chromium.sdk.internal.tools.v8.request.ScriptsMessage;
 
@@ -42,13 +44,7 @@
  */
 public class V8Helper {
 
-  /**
-   * The debug context in which the operations are performed.
-   */
-  private final DebugSession debugSession;
-
   public V8Helper(DebugSession debugSession) {
-    this.debugSession = debugSession;
   }
 
   public interface ScriptLoadCallback {
@@ -63,13 +59,33 @@
    */
   public static void reloadAllScriptsAsync(final DebugSession debugSession,
       final ScriptLoadCallback callback, SyncCallback syncCallback) {
+    reloadScriptAsync(debugSession, null, callback, syncCallback);
+  }
+
+  /**
+   * Loads specified scripts or all existing scripts and stores them in ScriptManager.
+   * @param ids ids of requested scripts or null for all scripts
+   * @param callback to invoke when the script reloading has completed
+   * @param syncCallback to invoke after callback, regardless of whether it has returned normally
+   *        or thrown an exception
+   */
+  public static void reloadScriptAsync(final DebugSession debugSession, final List<Long> ids,
+      final ScriptLoadCallback callback, SyncCallback syncCallback) {
+    ContextlessDebuggerMessage message = DebuggerMessageFactory.scripts(ids, true);
+    if (ids == null) {
+      message = DebuggerMessageFactory.scripts(ScriptsMessage.SCRIPTS_NORMAL, true);
+    } else {
+      message = DebuggerMessageFactory.scripts(ids, true);
+    }
     debugSession.sendMessageAsync(
-        DebuggerMessageFactory.scripts(ScriptsMessage.SCRIPTS_NORMAL, true),
+        message,
         true,
         new V8CommandCallbackBase() {
           @Override
           public void failure(String message) {
-            callback.failure(message);
+            if (callback != null) {
+              callback.failure(message);
+            }
           }
 
           @Override
@@ -83,13 +99,24 @@
             ScriptManager scriptManager = debugSession.getScriptManager();
             for (int i = 0; i < body.size(); ++i) {
               ScriptHandle scriptHandle = body.get(i);
+              if (ChromeDevToolSessionManager.JAVASCRIPT_VOID.equals(scriptHandle.source())) {
+                continue;
+              }
               Long id = V8ProtocolUtil.getScriptIdFromResponse(scriptHandle);
-              if (scriptManager.findById(id) == null &&
-                  !ChromeDevToolSessionManager.JAVASCRIPT_VOID.equals(scriptHandle.source())) {
+              ScriptImpl scriptById = scriptManager.findById(id);
+              if (scriptById == null) {
                 scriptManager.addScript(scriptHandle, successResponse.getRefs());
+              } else {
+                // A scrupulous refactoring note:
+                // do not call setSource in a legacy case, when ids parameter is null.
+                if (ids != null) {
+                  scriptById.setSource(scriptHandle.source());
+                }
               }
             }
-            callback.success();
+            if (callback != null) {
+              callback.success();
+            }
           }
         },
         syncCallback);