Index: dart/editor/tools/plugins/com.google.dart.tools.debug.core/src/com/google/dart/tools/debug/core/mobile/MobileLaunchConfigurationDelegate.java |
=================================================================== |
--- dart/editor/tools/plugins/com.google.dart.tools.debug.core/src/com/google/dart/tools/debug/core/mobile/MobileLaunchConfigurationDelegate.java (revision 37106) |
+++ dart/editor/tools/plugins/com.google.dart.tools.debug.core/src/com/google/dart/tools/debug/core/mobile/MobileLaunchConfigurationDelegate.java (working copy) |
@@ -15,6 +15,7 @@ |
import com.google.dart.engine.utilities.instrumentation.InstrumentationBuilder; |
import com.google.dart.tools.core.mobile.AndroidDebugBridge; |
+import com.google.dart.tools.core.mobile.AndroidDevice; |
import com.google.dart.tools.debug.core.DartDebugCorePlugin; |
import com.google.dart.tools.debug.core.DartLaunchConfigWrapper; |
import com.google.dart.tools.debug.core.DartLaunchConfigurationDelegate; |
@@ -22,27 +23,76 @@ |
import com.google.dart.tools.debug.core.pubserve.PubCallback; |
import com.google.dart.tools.debug.core.pubserve.PubResult; |
import com.google.dart.tools.debug.core.pubserve.PubServeManager; |
+import com.google.dart.tools.debug.core.pubserve.PubServeResourceResolver; |
+import com.google.dart.tools.debug.core.util.BrowserManager; |
+import com.google.dart.tools.debug.core.util.IRemoteConnectionDelegate; |
+import com.google.dart.tools.debug.core.util.IResourceResolver; |
import com.google.dart.tools.debug.core.util.ResourceServer; |
import com.google.dart.tools.debug.core.util.ResourceServerManager; |
+import com.google.dart.tools.debug.core.webkit.ChromiumTabInfo; |
+import com.google.dart.tools.debug.core.webkit.DefaultChromiumTabChooser; |
+import com.google.dart.tools.debug.core.webkit.IChromiumTabChooser; |
import org.eclipse.core.resources.IResource; |
import org.eclipse.core.runtime.CoreException; |
import org.eclipse.core.runtime.IProgressMonitor; |
import org.eclipse.core.runtime.IStatus; |
+import org.eclipse.core.runtime.NullProgressMonitor; |
import org.eclipse.core.runtime.Status; |
+import org.eclipse.debug.core.DebugException; |
import org.eclipse.debug.core.DebugPlugin; |
import org.eclipse.debug.core.ILaunch; |
import org.eclipse.debug.core.ILaunchConfiguration; |
+import org.eclipse.debug.core.model.IDebugTarget; |
import java.io.IOException; |
import java.net.URI; |
import java.net.URISyntaxException; |
+import java.util.List; |
/** |
* A LaunchConfigurationDelegate to launch in the browser on a connected device. |
*/ |
-public class MobileLaunchConfigurationDelegate extends DartLaunchConfigurationDelegate { |
+public class MobileLaunchConfigurationDelegate extends DartLaunchConfigurationDelegate implements |
+ IRemoteConnectionDelegate { |
+ /** |
+ * A class to choose a tab from the given list of tabs. |
+ */ |
+ public static class ChromeTabChooser implements IChromiumTabChooser { |
+ public ChromeTabChooser() { |
+ |
+ } |
+ |
+ @Override |
+ public ChromiumTabInfo chooseTab(final List<ChromiumTabInfo> tabs) { |
+ if (tabs.size() == 0) { |
+ return null; |
+ } |
+ |
+ int tabCount = 0; |
+ |
+ for (ChromiumTabInfo tab : tabs) { |
+ if (!tab.isChromeExtension()) { |
+ tabCount++; |
+ } |
+ } |
+ |
+ if (tabCount == 1) { |
+ return tabs.get(0); |
+ } |
+ |
+ for (ChromiumTabInfo tab : tabs) { |
+ if (!tab.isChromeExtension()) { |
+ return tab; |
+ } |
+ |
+ } |
+ |
+ return new DefaultChromiumTabChooser().chooseTab(tabs); |
+ } |
+ } |
+ |
private PubCallback<String> pubConnectionCallback = new PubCallback<String>() { |
@Override |
public void handleResult(PubResult<String> result) { |
@@ -55,7 +105,7 @@ |
try { |
String launchUrl = result.getResult(); |
- launchOnMobile(launchUrl); |
+ launchOnMobile(launchUrl, true, new NullProgressMonitor()); |
} catch (CoreException e) { |
DartDebugCorePlugin.logError(e); |
DebugUIHelper.getHelper().showError("Dartium Launch Error", e.getMessage()); |
@@ -65,8 +115,9 @@ |
}; |
private DartLaunchConfigWrapper wrapper; |
- private static final String DEBUG_PORT = "9222"; |
+ private static final int REMOTE_DEBUG_PORT = 9224; |
+ |
@Override |
public void doLaunch(ILaunchConfiguration configuration, String mode, ILaunch launch, |
IProgressMonitor monitor, InstrumentationBuilder instrumentation) throws CoreException { |
@@ -76,6 +127,8 @@ |
String launchUrl = ""; |
+ boolean usePubServe = wrapper.getUsePubServe(); |
+ |
if (wrapper.getShouldLaunchFile()) { |
IResource resource = wrapper.getApplicationResource(); |
@@ -90,7 +143,6 @@ |
instrumentation.data("Resource-Name", resource.getName()); |
try { |
- boolean usePubServe = true; // TODO(keertip): get from launch config |
if (usePubServe) { |
PubServeManager manager = PubServeManager.getManager(); |
@@ -106,7 +158,7 @@ |
} else { |
launchUrl = getUrlFromResourceServer(resource); |
- launchOnMobile(launchUrl); |
+ launchOnMobile(launchUrl, usePubServe, monitor); |
} |
} catch (Exception e) { |
@@ -123,7 +175,7 @@ |
if (scheme == null) { // add scheme else browser will not launch |
launchUrl = "http://" + launchUrl; |
- launchOnMobile(launchUrl); |
+ launchOnMobile(launchUrl, usePubServe, monitor); |
} |
} catch (URISyntaxException e) { |
throw new CoreException(new Status( |
@@ -136,32 +188,64 @@ |
DebugPlugin.getDefault().getLaunchManager().removeLaunch(launch); |
} |
- protected void launchOnMobile(String launchUrl) throws CoreException { |
+ @Override |
+ public IDebugTarget performRemoteConnection(String host, int port, IProgressMonitor monitor, |
+ boolean usePubServe) throws CoreException { |
+ BrowserManager browserManager = new BrowserManager(); |
+ |
+ IResourceResolver resolver = null; |
+ try { |
+ resolver = usePubServe ? new PubServeResourceResolver() : ResourceServerManager.getServer(); |
+ } catch (IOException e) { |
+ return null; |
+ } |
+ |
+ return browserManager.performRemoteConnection( |
+ new ChromeTabChooser(), |
+ host, |
+ port, |
+ monitor, |
+ resolver); |
+ |
+ } |
+ |
+ protected void launchOnMobile(String launchUrl, boolean usePubServe, IProgressMonitor monitor) |
+ throws CoreException { |
+ |
AndroidDebugBridge devBridge = AndroidDebugBridge.getAndroidDebugBridge(); |
devBridge.startAdbServer(); |
- String deviceId = devBridge.getConnectedDevice(); |
- if (deviceId == null) { |
+ AndroidDevice device = devBridge.getConnectedDevice(); |
+ if (device == null) { |
throw new CoreException(new Status( |
IStatus.ERROR, |
DartDebugCorePlugin.PLUGIN_ID, |
"No devices detected.\n\nConnect device, enable USB debugging and try again.")); |
} |
+ if (device.getDeviceId() == null) { |
+ throw new CoreException(new Status( |
+ IStatus.ERROR, |
+ DartDebugCorePlugin.PLUGIN_ID, |
+ "Unauthorized device detected.\n\nAuthorize device and try again.")); |
+ } |
- if (wrapper.getLaunchContentShell()) { |
- if (wrapper.getInstallContentShell()) { |
- if (!devBridge.installContentShellApk(deviceId)) { |
- throw new CoreException(new Status( |
- IStatus.ERROR, |
- DartDebugCorePlugin.PLUGIN_ID, |
- "Failed to install content shell on mobile")); |
- } |
+ if (wrapper.getInstallContentShell()) { |
+ if (!devBridge.installContentShellApk(device.getDeviceId())) { |
+ throw new CoreException(new Status( |
+ IStatus.ERROR, |
+ DartDebugCorePlugin.PLUGIN_ID, |
+ "Failed to install content shell on mobile")); |
} |
- devBridge.launchContentShell(deviceId, launchUrl); |
- } else { |
- devBridge.launchChromeBrowser(launchUrl); |
} |
+ devBridge.launchContentShell(device.getDeviceId(), launchUrl); |
+ |
+ // check if remote connection is alive |
+ if (!isRemoteConnected()) { |
+ devBridge.setupPortForwarding(Integer.toString(REMOTE_DEBUG_PORT)); |
+ // TODO(keertip): check if host needs to be the ip for wifi connections |
+ performRemoteConnection("localhost", REMOTE_DEBUG_PORT, monitor, usePubServe); |
+ } |
} |
private String getUrlFromResourceServer(IResource resource) throws IOException, CoreException, |
@@ -185,4 +269,19 @@ |
return launchUrl; |
} |
+ private boolean isRemoteConnected() { |
+ |
+ IDebugTarget[] targets = DebugPlugin.getDefault().getLaunchManager().getDebugTargets(); |
+ for (IDebugTarget target : targets) { |
+ try { |
+ if (target.getName().equals("Remote") && !target.getProcess().isTerminated()) { |
+ return true; |
+ } |
+ } catch (DebugException e) { |
+ |
+ } |
+ } |
+ return false; |
+ } |
+ |
} |