| Index: editor/tools/plugins/com.google.dart.tools.debug.core/src/com/google/dart/tools/debug/core/configs/ChromeAppLaunchConfigurationDelegate.java
|
| ===================================================================
|
| --- editor/tools/plugins/com.google.dart.tools.debug.core/src/com/google/dart/tools/debug/core/configs/ChromeAppLaunchConfigurationDelegate.java (revision 21601)
|
| +++ editor/tools/plugins/com.google.dart.tools.debug.core/src/com/google/dart/tools/debug/core/configs/ChromeAppLaunchConfigurationDelegate.java (working copy)
|
| @@ -1,251 +1,251 @@
|
| -/*
|
| - * Copyright (c) 2013, the Dart project authors.
|
| - *
|
| - * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
|
| - * in compliance with the License. You may obtain a copy of the License at
|
| - *
|
| - * http://www.eclipse.org/legal/epl-v10.html
|
| - *
|
| - * Unless required by applicable law or agreed to in writing, software distributed under the License
|
| - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
| - * or implied. See the License for the specific language governing permissions and limitations under
|
| - * the License.
|
| - */
|
| -
|
| -package com.google.dart.tools.debug.core.configs;
|
| -
|
| -import com.google.dart.engine.utilities.instrumentation.InstrumentationBuilder;
|
| -import com.google.dart.tools.core.model.DartSdkManager;
|
| -import com.google.dart.tools.debug.core.DartDebugCorePlugin;
|
| -import com.google.dart.tools.debug.core.DartLaunchConfigWrapper;
|
| -import com.google.dart.tools.debug.core.DartLaunchConfigurationDelegate;
|
| -import com.google.dart.tools.debug.core.DebugUIHelper;
|
| -import com.google.dart.tools.debug.core.util.BrowserManager;
|
| -
|
| -import org.eclipse.core.resources.IContainer;
|
| -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.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.ILaunchManager;
|
| -import org.eclipse.debug.core.model.IProcess;
|
| -
|
| -import java.io.File;
|
| -import java.io.IOException;
|
| -import java.util.ArrayList;
|
| -import java.util.HashMap;
|
| -import java.util.List;
|
| -import java.util.Map;
|
| -
|
| -//[ {
|
| -// "devtoolsFrontendUrl": "/devtools/devtools.html?ws=localhost:1234/devtools/page/1",
|
| -// "faviconUrl": "",
|
| -// "id": "1",
|
| -// "thumbnailUrl": "/thumb/chrome://newtab/",
|
| -// "title": "New Tab",
|
| -// "type": "page",
|
| -// "url": "chrome://newtab/",
|
| -// "webSocketDebuggerUrl": "ws://localhost:1234/devtools/page/1"
|
| -//}, {
|
| -// "devtoolsFrontendUrl": "/devtools/devtools.html?ws=localhost:1234/devtools/page/2",
|
| -// "faviconUrl": "",
|
| -// "id": "2",
|
| -// "thumbnailUrl": "/thumb/chrome-extension://becjelbpddbpmopbobpojhgneicbhlgj/_generated_background_page.html",
|
| -// "title": "chrome-extension://becjelbpddbpmopbobpojhgneicbhlgj/_generated_background_page.html",
|
| -// "type": "other",
|
| -// "url": "chrome-extension://becjelbpddbpmopbobpojhgneicbhlgj/_generated_background_page.html",
|
| -// "webSocketDebuggerUrl": "ws://localhost:1234/devtools/page/2"
|
| -//}, {
|
| -// "devtoolsFrontendUrl": "/devtools/devtools.html?ws=localhost:1234/devtools/page/3",
|
| -// "faviconUrl": "",
|
| -// "id": "3",
|
| -// "thumbnailUrl": "/thumb/chrome-extension://becjelbpddbpmopbobpojhgneicbhlgj/packy.html",
|
| -// "title": "Packy",
|
| -// "type": "other",
|
| -// "url": "chrome-extension://becjelbpddbpmopbobpojhgneicbhlgj/packy.html",
|
| -// "webSocketDebuggerUrl": "ws://localhost:1234/devtools/page/3"
|
| -//} ]
|
| -
|
| -// TODO(devoncarew): connect debugger to chrome-extension://becj... * ...bhlgj/_generated_background_page.html ?
|
| -// will we get console.log output, even though it starts running before we connect?
|
| -
|
| -/**
|
| - * A ILaunchConfigurationDelegate implementation that can launch Chrome applications. We
|
| - * conceptually launch the manifest.json file which specifies a Chrome app. We currently send
|
| - * Dartium the path to the manifest file's parent directory via the --load-extension flag.
|
| - */
|
| -public class ChromeAppLaunchConfigurationDelegate extends DartLaunchConfigurationDelegate {
|
| -
|
| - private static Process chromeAppBrowserProcess;
|
| -
|
| - /**
|
| - * Create a new ChromeAppLaunchConfigurationDelegate.
|
| - */
|
| - public ChromeAppLaunchConfigurationDelegate() {
|
| -
|
| - }
|
| -
|
| - @Override
|
| - public void doLaunch(ILaunchConfiguration configuration, String mode, ILaunch launch,
|
| - IProgressMonitor monitor, InstrumentationBuilder instrumentation) throws CoreException {
|
| -
|
| - if (!ILaunchManager.RUN_MODE.equals(mode) && !ILaunchManager.DEBUG_MODE.equals(mode)) {
|
| - throw new CoreException(DartDebugCorePlugin.createErrorStatus("Execution mode '" + mode
|
| - + "' is not supported."));
|
| - }
|
| -
|
| - boolean enableDebugging = ILaunchManager.DEBUG_MODE.equals(mode);
|
| -
|
| - File dartium = DartSdkManager.getManager().getSdk().getDartiumExecutable();
|
| -
|
| - if (dartium == null) {
|
| - throw new CoreException(new Status(
|
| - IStatus.ERROR,
|
| - DartDebugCorePlugin.PLUGIN_ID,
|
| - "Could not find Dartium"));
|
| - }
|
| -
|
| - DartLaunchConfigWrapper wrapper = new DartLaunchConfigWrapper(configuration);
|
| - wrapper.markAsLaunched();
|
| -
|
| - IResource jsonResource = wrapper.getApplicationResource();
|
| -
|
| - if (jsonResource == null) {
|
| - throw newDebugException("No file specified to launch");
|
| - }
|
| -
|
| - File cwd = getWorkingDirectory(jsonResource);
|
| - String extensionPath = jsonResource.getParent().getLocation().toFile().getAbsolutePath();
|
| -
|
| - List<String> commandsList = new ArrayList<String>();
|
| -
|
| - commandsList.add(dartium.getAbsolutePath());
|
| - commandsList.add("--enable-udd-profiles");
|
| - commandsList.add("--user-data-dir="
|
| - + BrowserManager.getCreateUserDataDirectoryPath("chrome-apps"));
|
| - commandsList.add("--profile-directory=editor");
|
| - commandsList.add("--no-first-run");
|
| - commandsList.add("--no-default-browser-check");
|
| - commandsList.add("--enable-extension-activity-logging");
|
| - commandsList.add("--enable-extension-activity-ui");
|
| - //commandsList.add("--load-extension=" + extensionPath);
|
| - commandsList.add("--load-and-launch-app=" + extensionPath);
|
| - //commandsList.add("--remote-debugging-port=1234");
|
| -
|
| - if (enableDebugging) {
|
| - // TODO(devoncarew):
|
| -
|
| - }
|
| -
|
| - monitor.beginTask("Dartium", IProgressMonitor.UNKNOWN);
|
| -
|
| - terminatePreviousLaunch();
|
| -
|
| - String[] commands = commandsList.toArray(new String[commandsList.size()]);
|
| - ProcessBuilder processBuilder = new ProcessBuilder(commands);
|
| - processBuilder.directory(cwd);
|
| -
|
| - Process runtimeProcess = null;
|
| -
|
| - try {
|
| - runtimeProcess = processBuilder.start();
|
| - } catch (IOException ioe) {
|
| - throw newDebugException(ioe);
|
| - }
|
| -
|
| - Map<String, String> processAttributes = new HashMap<String, String>();
|
| -
|
| - processAttributes.put(IProcess.ATTR_PROCESS_TYPE, "Dartium");
|
| -
|
| - IProcess eclipseProcess = DebugPlugin.newProcess(
|
| - launch,
|
| - runtimeProcess,
|
| - configuration.getName(),
|
| - processAttributes);
|
| -
|
| - if (eclipseProcess == null) {
|
| - throw newDebugException("Error starting Dartium");
|
| - }
|
| -
|
| - saveLaunchedProcess(runtimeProcess);
|
| -
|
| - if (enableDebugging) {
|
| - // TODO(devoncarew):
|
| -
|
| - }
|
| -
|
| - // TODO(devoncarew): we need to wait until the process is started before we can try and activate
|
| - // the window. We need to find a better way to do this then just a fixed delay.
|
| - sleep(1000);
|
| -
|
| - DebugUIHelper.getHelper().activateApplication(dartium, "Chromium");
|
| -
|
| - monitor.done();
|
| - }
|
| -
|
| - /**
|
| - * Return the parent of the Chrome app directory. The Chrome app directory contains the given
|
| - * manifest.json file.
|
| - *
|
| - * @param jsonResource
|
| - * @return
|
| - */
|
| - private File getWorkingDirectory(IResource jsonResource) {
|
| - IContainer containingDir = jsonResource.getParent();
|
| - File containingFile = containingDir.getLocation().toFile();
|
| -
|
| - // Return the parent of this directory.
|
| - return containingFile.getParentFile();
|
| - }
|
| -
|
| - private DebugException newDebugException(String message) {
|
| - return new DebugException(new Status(IStatus.ERROR, DartDebugCorePlugin.PLUGIN_ID, message));
|
| - }
|
| -
|
| - private DebugException newDebugException(Throwable t) {
|
| - return new DebugException(new Status(
|
| - IStatus.ERROR,
|
| - DartDebugCorePlugin.PLUGIN_ID,
|
| - t.toString(),
|
| - t));
|
| - }
|
| -
|
| - /**
|
| - * Store the successfully launched process into a static variable;
|
| - *
|
| - * @param process
|
| - */
|
| - private void saveLaunchedProcess(Process process) {
|
| - chromeAppBrowserProcess = process;
|
| - }
|
| -
|
| - private void sleep(int millis) {
|
| - try {
|
| - Thread.sleep(millis);
|
| - } catch (Exception exception) {
|
| -
|
| - }
|
| - }
|
| -
|
| - private void terminatePreviousLaunch() {
|
| - if (chromeAppBrowserProcess != null) {
|
| - try {
|
| - chromeAppBrowserProcess.exitValue();
|
| - chromeAppBrowserProcess = null;
|
| - } catch (IllegalThreadStateException ex) {
|
| - // exitValue() will throw if the process has not yet stopped. In that case, we ask it to.
|
| - chromeAppBrowserProcess.destroy();
|
| - chromeAppBrowserProcess = null;
|
| -
|
| - // Delay a bit.
|
| - sleep(100);
|
| - }
|
| - }
|
| - }
|
| -
|
| -}
|
| +/*
|
| + * Copyright (c) 2013, the Dart project authors.
|
| + *
|
| + * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
|
| + * in compliance with the License. You may obtain a copy of the License at
|
| + *
|
| + * http://www.eclipse.org/legal/epl-v10.html
|
| + *
|
| + * Unless required by applicable law or agreed to in writing, software distributed under the License
|
| + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
| + * or implied. See the License for the specific language governing permissions and limitations under
|
| + * the License.
|
| + */
|
| +
|
| +package com.google.dart.tools.debug.core.configs;
|
| +
|
| +import com.google.dart.engine.utilities.instrumentation.InstrumentationBuilder;
|
| +import com.google.dart.tools.core.model.DartSdkManager;
|
| +import com.google.dart.tools.debug.core.DartDebugCorePlugin;
|
| +import com.google.dart.tools.debug.core.DartLaunchConfigWrapper;
|
| +import com.google.dart.tools.debug.core.DartLaunchConfigurationDelegate;
|
| +import com.google.dart.tools.debug.core.DebugUIHelper;
|
| +import com.google.dart.tools.debug.core.util.BrowserManager;
|
| +
|
| +import org.eclipse.core.resources.IContainer;
|
| +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.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.ILaunchManager;
|
| +import org.eclipse.debug.core.model.IProcess;
|
| +
|
| +import java.io.File;
|
| +import java.io.IOException;
|
| +import java.util.ArrayList;
|
| +import java.util.HashMap;
|
| +import java.util.List;
|
| +import java.util.Map;
|
| +
|
| +//[ {
|
| +// "devtoolsFrontendUrl": "/devtools/devtools.html?ws=localhost:1234/devtools/page/1",
|
| +// "faviconUrl": "",
|
| +// "id": "1",
|
| +// "thumbnailUrl": "/thumb/chrome://newtab/",
|
| +// "title": "New Tab",
|
| +// "type": "page",
|
| +// "url": "chrome://newtab/",
|
| +// "webSocketDebuggerUrl": "ws://localhost:1234/devtools/page/1"
|
| +//}, {
|
| +// "devtoolsFrontendUrl": "/devtools/devtools.html?ws=localhost:1234/devtools/page/2",
|
| +// "faviconUrl": "",
|
| +// "id": "2",
|
| +// "thumbnailUrl": "/thumb/chrome-extension://becjelbpddbpmopbobpojhgneicbhlgj/_generated_background_page.html",
|
| +// "title": "chrome-extension://becjelbpddbpmopbobpojhgneicbhlgj/_generated_background_page.html",
|
| +// "type": "other",
|
| +// "url": "chrome-extension://becjelbpddbpmopbobpojhgneicbhlgj/_generated_background_page.html",
|
| +// "webSocketDebuggerUrl": "ws://localhost:1234/devtools/page/2"
|
| +//}, {
|
| +// "devtoolsFrontendUrl": "/devtools/devtools.html?ws=localhost:1234/devtools/page/3",
|
| +// "faviconUrl": "",
|
| +// "id": "3",
|
| +// "thumbnailUrl": "/thumb/chrome-extension://becjelbpddbpmopbobpojhgneicbhlgj/packy.html",
|
| +// "title": "Packy",
|
| +// "type": "other",
|
| +// "url": "chrome-extension://becjelbpddbpmopbobpojhgneicbhlgj/packy.html",
|
| +// "webSocketDebuggerUrl": "ws://localhost:1234/devtools/page/3"
|
| +//} ]
|
| +
|
| +// TODO(devoncarew): connect debugger to chrome-extension://becj... * ...bhlgj/_generated_background_page.html ?
|
| +// will we get console.log output, even though it starts running before we connect?
|
| +
|
| +/**
|
| + * A ILaunchConfigurationDelegate implementation that can launch Chrome applications. We
|
| + * conceptually launch the manifest.json file which specifies a Chrome app. We currently send
|
| + * Dartium the path to the manifest file's parent directory via the --load-extension flag.
|
| + */
|
| +public class ChromeAppLaunchConfigurationDelegate extends DartLaunchConfigurationDelegate {
|
| +
|
| + private static Process chromeAppBrowserProcess;
|
| +
|
| + /**
|
| + * Create a new ChromeAppLaunchConfigurationDelegate.
|
| + */
|
| + public ChromeAppLaunchConfigurationDelegate() {
|
| +
|
| + }
|
| +
|
| + @Override
|
| + public void doLaunch(ILaunchConfiguration configuration, String mode, ILaunch launch,
|
| + IProgressMonitor monitor, InstrumentationBuilder instrumentation) throws CoreException {
|
| +
|
| + if (!ILaunchManager.RUN_MODE.equals(mode) && !ILaunchManager.DEBUG_MODE.equals(mode)) {
|
| + throw new CoreException(DartDebugCorePlugin.createErrorStatus("Execution mode '" + mode
|
| + + "' is not supported."));
|
| + }
|
| +
|
| + boolean enableDebugging = ILaunchManager.DEBUG_MODE.equals(mode);
|
| +
|
| + File dartium = DartSdkManager.getManager().getSdk().getDartiumExecutable();
|
| +
|
| + if (dartium == null) {
|
| + throw new CoreException(new Status(
|
| + IStatus.ERROR,
|
| + DartDebugCorePlugin.PLUGIN_ID,
|
| + "Could not find Dartium"));
|
| + }
|
| +
|
| + DartLaunchConfigWrapper wrapper = new DartLaunchConfigWrapper(configuration);
|
| + wrapper.markAsLaunched();
|
| +
|
| + IResource jsonResource = wrapper.getApplicationResource();
|
| +
|
| + if (jsonResource == null) {
|
| + throw newDebugException("No file specified to launch");
|
| + }
|
| +
|
| + File cwd = getWorkingDirectory(jsonResource);
|
| + String extensionPath = jsonResource.getParent().getLocation().toFile().getAbsolutePath();
|
| +
|
| + List<String> commandsList = new ArrayList<String>();
|
| +
|
| + commandsList.add(dartium.getAbsolutePath());
|
| + commandsList.add("--enable-udd-profiles");
|
| + commandsList.add("--user-data-dir="
|
| + + BrowserManager.getCreateUserDataDirectoryPath("chrome-apps"));
|
| + commandsList.add("--profile-directory=editor");
|
| + commandsList.add("--no-first-run");
|
| + commandsList.add("--no-default-browser-check");
|
| + commandsList.add("--enable-extension-activity-logging");
|
| + commandsList.add("--enable-extension-activity-ui");
|
| + //commandsList.add("--load-extension=" + extensionPath);
|
| + commandsList.add("--load-and-launch-app=" + extensionPath);
|
| + //commandsList.add("--remote-debugging-port=1234");
|
| +
|
| + if (enableDebugging) {
|
| + // TODO(devoncarew):
|
| +
|
| + }
|
| +
|
| + monitor.beginTask("Dartium", IProgressMonitor.UNKNOWN);
|
| +
|
| + terminatePreviousLaunch();
|
| +
|
| + String[] commands = commandsList.toArray(new String[commandsList.size()]);
|
| + ProcessBuilder processBuilder = new ProcessBuilder(commands);
|
| + processBuilder.directory(cwd);
|
| +
|
| + Process runtimeProcess = null;
|
| +
|
| + try {
|
| + runtimeProcess = processBuilder.start();
|
| + } catch (IOException ioe) {
|
| + throw newDebugException(ioe);
|
| + }
|
| +
|
| + Map<String, String> processAttributes = new HashMap<String, String>();
|
| +
|
| + processAttributes.put(IProcess.ATTR_PROCESS_TYPE, "Dartium");
|
| +
|
| + IProcess eclipseProcess = DebugPlugin.newProcess(
|
| + launch,
|
| + runtimeProcess,
|
| + configuration.getName(),
|
| + processAttributes);
|
| +
|
| + if (eclipseProcess == null) {
|
| + throw newDebugException("Error starting Dartium");
|
| + }
|
| +
|
| + saveLaunchedProcess(runtimeProcess);
|
| +
|
| + if (enableDebugging) {
|
| + // TODO(devoncarew):
|
| +
|
| + }
|
| +
|
| + // TODO(devoncarew): we need to wait until the process is started before we can try and activate
|
| + // the window. We need to find a better way to do this then just a fixed delay.
|
| + sleep(1000);
|
| +
|
| + DebugUIHelper.getHelper().activateApplication(dartium, "Chromium");
|
| +
|
| + monitor.done();
|
| + }
|
| +
|
| + /**
|
| + * Return the parent of the Chrome app directory. The Chrome app directory contains the given
|
| + * manifest.json file.
|
| + *
|
| + * @param jsonResource
|
| + * @return
|
| + */
|
| + private File getWorkingDirectory(IResource jsonResource) {
|
| + IContainer containingDir = jsonResource.getParent();
|
| + File containingFile = containingDir.getLocation().toFile();
|
| +
|
| + // Return the parent of this directory.
|
| + return containingFile.getParentFile();
|
| + }
|
| +
|
| + private DebugException newDebugException(String message) {
|
| + return new DebugException(new Status(IStatus.ERROR, DartDebugCorePlugin.PLUGIN_ID, message));
|
| + }
|
| +
|
| + private DebugException newDebugException(Throwable t) {
|
| + return new DebugException(new Status(
|
| + IStatus.ERROR,
|
| + DartDebugCorePlugin.PLUGIN_ID,
|
| + t.toString(),
|
| + t));
|
| + }
|
| +
|
| + /**
|
| + * Store the successfully launched process into a static variable;
|
| + *
|
| + * @param process
|
| + */
|
| + private void saveLaunchedProcess(Process process) {
|
| + chromeAppBrowserProcess = process;
|
| + }
|
| +
|
| + private void sleep(int millis) {
|
| + try {
|
| + Thread.sleep(millis);
|
| + } catch (Exception exception) {
|
| +
|
| + }
|
| + }
|
| +
|
| + private void terminatePreviousLaunch() {
|
| + if (chromeAppBrowserProcess != null) {
|
| + try {
|
| + chromeAppBrowserProcess.exitValue();
|
| + chromeAppBrowserProcess = null;
|
| + } catch (IllegalThreadStateException ex) {
|
| + // exitValue() will throw if the process has not yet stopped. In that case, we ask it to.
|
| + chromeAppBrowserProcess.destroy();
|
| + chromeAppBrowserProcess = null;
|
| +
|
| + // Delay a bit.
|
| + sleep(100);
|
| + }
|
| + }
|
| + }
|
| +
|
| +}
|
|
|