Adapt to changes in vscode-chrome-debug-core
This commit is contained in:
Родитель
6d8f1dabaa
Коммит
3578c20977
|
@ -1,8 +1,18 @@
|
|||
/*---------------------------------------------------------
|
||||
* Copyright (C) Microsoft Corporation. All rights reserved.
|
||||
*--------------------------------------------------------*/
|
||||
|
||||
import {ChromeDebugSession} from 'vscode-chrome-debug-core';
|
||||
import {IOSDebugSession} from './iosDebugSession';
|
||||
|
||||
ChromeDebugSession.run(IOSDebugSession);
|
||||
import * as path from 'path';
|
||||
import {ChromeDebugSession, ChromeConnection, chromeTargetDiscoveryStrategy, logger} from 'vscode-chrome-debug-core';
|
||||
import {IOSDebugAdapter} from './iosDebugAdapter';
|
||||
|
||||
const targetFilter = target => target && (!target.type || target.type === 'page');
|
||||
const connection = new ChromeConnection(chromeTargetDiscoveryStrategy.getChromeTargetWebSocketURL, targetFilter);
|
||||
|
||||
ChromeDebugSession.run(ChromeDebugSession.getSession({
|
||||
logFileDirectory: path.resolve(__dirname, '../../'),
|
||||
targetFilter: targetFilter,
|
||||
adapter: new IOSDebugAdapter(connection)
|
||||
}));
|
||||
|
||||
logger.log('debugger-for-ios-web: ' + require('../../package.json').version);
|
|
@ -2,32 +2,33 @@
|
|||
* Copyright (C) Microsoft Corporation. All rights reserved.
|
||||
*--------------------------------------------------------*/
|
||||
|
||||
import {ChromeDebugAdapter, Utils, Logger} from 'vscode-chrome-debug-core';
|
||||
import * as iosUtils from './utilities';
|
||||
import {spawn, ChildProcess} from 'child_process';
|
||||
import * as Url from 'url';
|
||||
import * as localtunnel from 'localtunnel';
|
||||
|
||||
import {ChromeDebugAdapter, utils, logger} from 'vscode-chrome-debug-core';
|
||||
import * as iosUtils from './utilities';
|
||||
import {IProxySettings} from './iosDebugAdapterInterfaces';
|
||||
|
||||
export class IOSDebugAdapter extends ChromeDebugAdapter {
|
||||
private _proxyProc: ChildProcess;
|
||||
private _localTunnel: ILocalTunnelInfoObject;
|
||||
|
||||
public constructor() {
|
||||
super();
|
||||
|
||||
constructor(chromeConnection) {
|
||||
super(chromeConnection)
|
||||
}
|
||||
|
||||
|
||||
public launch(args: any): Promise<void> {
|
||||
if (args.port == null) {
|
||||
return Utils.errP('The "port" field is required in the launch config.');
|
||||
return utils.errP('The "port" field is required in the launch config.');
|
||||
}
|
||||
|
||||
this.initializeLogging('launch-ios', args);
|
||||
super.setupLogging(args);
|
||||
|
||||
// Process the launch arguments
|
||||
const settings = this._getProxySettings(args);
|
||||
if (typeof settings == "string") {
|
||||
return Utils.errP(settings);
|
||||
return utils.errP('Passed settings object is a string');
|
||||
}
|
||||
|
||||
let tunnelPort = args.tunnelPort || 0;
|
||||
|
@ -35,20 +36,20 @@ export class IOSDebugAdapter extends ChromeDebugAdapter {
|
|||
|
||||
if (tunnelPort) {
|
||||
launchPromise = new Promise((resolve, reject) => {
|
||||
Logger.log('Launching localtunnel against port ' + tunnelPort, Logger.LogLevel.Log);
|
||||
logger.log('Launching localtunnel against port ' + tunnelPort);
|
||||
localtunnel(tunnelPort, (err: Error, tunnel: ILocalTunnelInfoObject) => {
|
||||
// Navigate the to the given tunneled url
|
||||
if (err) {
|
||||
Logger.log('Failed to launch localtunnel.', Logger.LogLevel.Error);
|
||||
return Utils.errP(err);
|
||||
logger.error('Failed to launch localtunnel.');
|
||||
return utils.errP(err);
|
||||
}
|
||||
|
||||
Logger.log('Success.' + tunnelPort, Logger.LogLevel.Log);
|
||||
logger.log('Success.' + tunnelPort);
|
||||
|
||||
// Set the store member and listen for any errors
|
||||
this._localTunnel = tunnel;
|
||||
this._localTunnel.on('error', (err) => {
|
||||
Logger.log('Tunneling proxy error: ' + err);
|
||||
logger.log('Tunneling proxy error: ' + err);
|
||||
this.terminateSession();
|
||||
});
|
||||
|
||||
|
@ -70,22 +71,22 @@ export class IOSDebugAdapter extends ChromeDebugAdapter {
|
|||
return this._spawnProxy(<IProxySettings>settings).then(() => {
|
||||
return launchPromise;
|
||||
}).then(url => {
|
||||
Logger.log('Navigating to ' + url, Logger.LogLevel.Log);
|
||||
logger.log('Navigating to ' + url);
|
||||
(<any>this)._chromeConnection.sendMessage("Page.navigate", {url: url});
|
||||
});
|
||||
}
|
||||
|
||||
public attach(args: any): Promise<void> {
|
||||
if (args.port == null) {
|
||||
return Utils.errP('The "port" field is required in the attach config.');
|
||||
return utils.errP('The "port" field is required in the attach config.');
|
||||
}
|
||||
|
||||
this.initializeLogging('attach-ios', args);
|
||||
super.setupLogging(args);
|
||||
|
||||
// Process the attach arguments
|
||||
const settings = this._getProxySettings(args);
|
||||
if (typeof settings == "string") {
|
||||
return Utils.errP(settings);
|
||||
return utils.errP('Passed settings object is a string');
|
||||
}
|
||||
|
||||
return this._spawnProxy(<IProxySettings>settings);
|
||||
|
@ -112,7 +113,7 @@ export class IOSDebugAdapter extends ChromeDebugAdapter {
|
|||
// Check that the proxy exists
|
||||
const proxyPath = args.proxyExecutable || iosUtils.getProxyPath();
|
||||
if (!proxyPath) {
|
||||
if (Utils.getPlatform() != Utils.Platform.Windows) {
|
||||
if (utils.getPlatform() != utils.Platform.Windows) {
|
||||
errorMessage = `No iOS proxy was found. Install an iOS proxy (https://github.com/google/ios-webkit-debug-proxy) and specify a valid 'proxyExecutable' path`;
|
||||
} else {
|
||||
errorMessage = `No iOS proxy was found. Run 'npm install -g vs-libimobile' and specify a valid 'proxyExecutable' path`;
|
||||
|
@ -152,15 +153,15 @@ export class IOSDebugAdapter extends ChromeDebugAdapter {
|
|||
|
||||
private _spawnProxy(settings: IProxySettings): Promise<void> {
|
||||
// Spawn the proxy with the specified settings
|
||||
Logger.log(`spawn('${settings.proxyPath}', ${JSON.stringify(settings.proxyArgs) })`);
|
||||
logger.log(`spawn('${settings.proxyPath}', ${JSON.stringify(settings.proxyArgs) })`);
|
||||
this._proxyProc = spawn(settings.proxyPath, settings.proxyArgs, {
|
||||
detached: true,
|
||||
stdio: ['ignore']
|
||||
});
|
||||
(<any>this._proxyProc).unref();
|
||||
this._proxyProc.on('error', (err) => {
|
||||
Logger.log('device proxy error: ' + err);
|
||||
Logger.log('Do you have the iTunes drivers installed?');
|
||||
logger.log('device proxy error: ' + err);
|
||||
logger.log('Do you have the iTunes drivers installed?');
|
||||
this.terminateSession();
|
||||
});
|
||||
|
||||
|
@ -175,7 +176,7 @@ export class IOSDebugAdapter extends ChromeDebugAdapter {
|
|||
|
||||
private _attachToDevice(proxyPort: number, deviceName: string): Promise<number> {
|
||||
// Attach to a device over the proxy
|
||||
return Utils.getURL(`http://localhost:${proxyPort}/json`).then(jsonResponse => {
|
||||
return utils.getURL(`http://localhost:${proxyPort}/json`).then(jsonResponse => {
|
||||
let devicePort = proxyPort;
|
||||
|
||||
try {
|
||||
|
@ -187,7 +188,7 @@ export class IOSDebugAdapter extends ChromeDebugAdapter {
|
|||
if (deviceName !== "*") {
|
||||
const matchingDevices = devices.filter(deviceInfo => deviceInfo.deviceName && deviceInfo.deviceName.toLowerCase() === deviceName.toLowerCase());
|
||||
if (!matchingDevices.length) {
|
||||
Logger.log(`Warning: Can't find a device with deviceName: ${deviceName}. Available devices: ${JSON.stringify(devices.map(d => d.deviceName))}`, Logger.LogLevel.Error);
|
||||
logger.log(`Warning: Can't find a device with deviceName: ${deviceName}. Available devices: ${JSON.stringify(devices.map(d => d.deviceName))}`);
|
||||
} else {
|
||||
devices = matchingDevices;
|
||||
}
|
||||
|
@ -195,7 +196,7 @@ export class IOSDebugAdapter extends ChromeDebugAdapter {
|
|||
|
||||
if (devices.length) {
|
||||
if (devices.length > 1 && deviceName !== "*") {
|
||||
Logger.log(`Warning: Found more than one valid target device. Attaching to the first one. Available devices: ${JSON.stringify(devices.map(d => d.deviceName))}`, Logger.LogLevel.Error);
|
||||
logger.log(`Warning: Found more than one valid target device. Attaching to the first one. Available devices: ${JSON.stringify(devices.map(d => d.deviceName))}`);
|
||||
}
|
||||
|
||||
// Get the port for the actual device endpoint
|
||||
|
@ -216,7 +217,7 @@ export class IOSDebugAdapter extends ChromeDebugAdapter {
|
|||
return devicePort;
|
||||
},
|
||||
e => {
|
||||
return Utils.errP('Cannot connect to the proxy: ' + e.message);
|
||||
return utils.errP('Cannot connect to the proxy: ' + e.message);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
/*---------------------------------------------------------
|
||||
* Copyright (C) Microsoft Corporation. All rights reserved.
|
||||
*--------------------------------------------------------*/
|
||||
|
||||
import {ChromeDebugSession, Logger} from 'vscode-chrome-debug-core';
|
||||
import {IOSDebugAdapter} from './iosDebugAdapter';
|
||||
|
||||
export class IOSDebugSession extends ChromeDebugSession {
|
||||
|
||||
public constructor(targetLinesStartAt1: boolean, isServer: boolean = false) {
|
||||
let version = "iOS." + require('../../package.json').version;
|
||||
Logger.log(version);
|
||||
super(targetLinesStartAt1, isServer, new IOSDebugAdapter());
|
||||
}
|
||||
}
|
|
@ -2,14 +2,14 @@
|
|||
* Copyright (C) Microsoft Corporation. All rights reserved.
|
||||
*--------------------------------------------------------*/
|
||||
|
||||
import {Utils} from 'vscode-chrome-debug-core';
|
||||
import { utils } from 'vscode-chrome-debug-core';
|
||||
import * as path from 'path';
|
||||
|
||||
export function getProxyPath(): string {
|
||||
const platform = Utils.getPlatform();
|
||||
if (platform === Utils.Platform.Windows) {
|
||||
const platform = utils.getPlatform();
|
||||
if (platform === utils.Platform.Windows) {
|
||||
var proxy = path.resolve(__dirname, "../../node_modules/vs-libimobile/lib/ios_webkit_debug_proxy.exe");
|
||||
if (Utils.existsSync(proxy)) {
|
||||
if (utils.existsSync(proxy)) {
|
||||
return proxy;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,16 +5,20 @@
|
|||
import * as mockery from 'mockery';
|
||||
import * as assert from 'assert';
|
||||
import * as sinon from 'sinon';
|
||||
import {Utils, ChromeDebugAdapter, Logger} from 'vscode-chrome-debug-core';
|
||||
import {utils, ChromeDebugAdapter, ChromeConnection, chromeTargetDiscoveryStrategy, logger} from 'vscode-chrome-debug-core';
|
||||
|
||||
/** Not mocked - use for type only */
|
||||
import {IOSDebugAdapter as _IOSDebugAdapter} from '../src/iosDebugAdapter';
|
||||
|
||||
const MODULE_UNDER_TEST = '../src/iosDebugAdapter';
|
||||
suite('IOSDebugAdapter', () => {
|
||||
|
||||
function createAdapter(): _IOSDebugAdapter {
|
||||
const IOSDebugAdapter: typeof _IOSDebugAdapter = require(MODULE_UNDER_TEST).IOSDebugAdapter;
|
||||
return new IOSDebugAdapter();
|
||||
const targetFilter = target => target && (!target.type || target.type === 'page');
|
||||
const connection = new ChromeConnection(chromeTargetDiscoveryStrategy.getChromeTargetWebSocketURL, targetFilter);
|
||||
|
||||
return new IOSDebugAdapter(connection);
|
||||
};
|
||||
|
||||
setup(() => {
|
||||
|
@ -44,8 +48,8 @@ suite('IOSDebugAdapter', () => {
|
|||
test('if no port, rejects the launch promise', done => {
|
||||
mockery.registerMock('vscode-chrome-debug-core', {
|
||||
ChromeDebugAdapter: () => { },
|
||||
Utils: Utils,
|
||||
Logger: Logger
|
||||
utils: utils,
|
||||
logger: logger
|
||||
});
|
||||
|
||||
const adapter = createAdapter();
|
||||
|
@ -85,13 +89,13 @@ suite('IOSDebugAdapter', () => {
|
|||
|
||||
mockery.registerMock('vscode-chrome-debug-core', {
|
||||
ChromeDebugAdapter: MockAdapter,
|
||||
Utils: MockUtilities,
|
||||
Logger: Logger
|
||||
utils: MockUtilities,
|
||||
logger: logger
|
||||
});
|
||||
mockery.registerMock('child_process', MockChildProcess);
|
||||
|
||||
adapterMock = sinon.mock(MockAdapter.prototype);
|
||||
adapterMock.expects('initializeLogging').once();
|
||||
adapterMock.expects('setupLogging').once();
|
||||
adapterMock.expects('attach').returns(Promise.resolve(''));
|
||||
|
||||
chromeConnectionMock = sinon.mock(MockChromeConnection);
|
||||
|
@ -206,8 +210,8 @@ suite('IOSDebugAdapter', () => {
|
|||
test('if no port, rejects the attach promise', done => {
|
||||
mockery.registerMock('vscode-chrome-debug-core', {
|
||||
ChromeDebugAdapter: () => { },
|
||||
Utils: Utils,
|
||||
Logger: Logger
|
||||
utils: utils,
|
||||
logger: logger
|
||||
});
|
||||
|
||||
const adapter = createAdapter();
|
||||
|
@ -232,13 +236,13 @@ suite('IOSDebugAdapter', () => {
|
|||
|
||||
mockery.registerMock('vscode-chrome-debug-core', {
|
||||
ChromeDebugAdapter: MockAdapter,
|
||||
Utils: MockUtilities,
|
||||
Logger: Logger
|
||||
utils: MockUtilities,
|
||||
logger: logger
|
||||
});
|
||||
mockery.registerMock('child_process', MockChildProcess);
|
||||
|
||||
adapterMock = sinon.mock(MockAdapter.prototype);
|
||||
adapterMock.expects('initializeLogging').once();
|
||||
adapterMock.expects('setupLogging').once();
|
||||
|
||||
utilitiesMock = sinon.mock(MockUtilities);
|
||||
sinon.stub(MockUtilities, 'errP', () => Promise.reject(''));
|
||||
|
@ -326,13 +330,13 @@ suite('IOSDebugAdapter', () => {
|
|||
|
||||
mockery.registerMock('vscode-chrome-debug-core', {
|
||||
ChromeDebugAdapter: MockAdapter,
|
||||
Utils: MockUtilities,
|
||||
Logger: Logger
|
||||
utils: MockUtilities,
|
||||
logger: logger
|
||||
});
|
||||
mockery.registerMock('child_process', MockChildProcess);
|
||||
|
||||
adapterMock = sinon.mock(MockAdapter.prototype);
|
||||
adapterMock.expects('initializeLogging').once();
|
||||
adapterMock.expects('setupLogging').once();
|
||||
|
||||
utilitiesMock = sinon.mock(MockUtilities);
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
import * as mockery from 'mockery';
|
||||
import * as assert from 'assert';
|
||||
import {Utils} from 'vscode-chrome-debug-core';
|
||||
import { utils } from 'vscode-chrome-debug-core';
|
||||
|
||||
/** Not mocked - use for type only */
|
||||
import * as _Utilities from '../src/utilities';
|
||||
|
@ -28,9 +28,9 @@ suite('Utilities', () => {
|
|||
suite('getProxyPath()', () => {
|
||||
test('if windows and path exists, returns correct path', () => {
|
||||
mockery.registerMock('vscode-chrome-debug-core', {
|
||||
Utils: {
|
||||
utils: {
|
||||
Platform: { Windows: 0, OSX: 1, Linux: 2 },
|
||||
getPlatform: () => Utils.Platform.Windows,
|
||||
getPlatform: () => utils.Platform.Windows,
|
||||
existsSync: () => true
|
||||
}
|
||||
});
|
||||
|
@ -45,9 +45,9 @@ suite('Utilities', () => {
|
|||
|
||||
test('if windows and path not found, returns null', () => {
|
||||
mockery.registerMock('vscode-chrome-debug-core', {
|
||||
Utils: {
|
||||
utils: {
|
||||
Platform: { Windows: 0, OSX: 1, Linux: 2 },
|
||||
getPlatform: () => Utils.Platform.Windows,
|
||||
getPlatform: () => utils.Platform.Windows,
|
||||
existsSync: () => false
|
||||
}
|
||||
});
|
||||
|
@ -62,9 +62,9 @@ suite('Utilities', () => {
|
|||
|
||||
test('if osx, returns null', () => {
|
||||
mockery.registerMock('vscode-chrome-debug-core', {
|
||||
Utils: {
|
||||
utils: {
|
||||
Platform: { Windows: 0, OSX: 1, Linux: 2 },
|
||||
getPlatform: () => Utils.Platform.OSX
|
||||
getPlatform: () => utils.Platform.OSX
|
||||
}
|
||||
});
|
||||
mockery.registerMock('path', {});
|
||||
|
@ -75,9 +75,9 @@ suite('Utilities', () => {
|
|||
|
||||
test('if linux, returns null', () => {
|
||||
mockery.registerMock('vscode-chrome-debug-core', {
|
||||
Utils: {
|
||||
utils: {
|
||||
Platform: { Windows: 0, OSX: 1, Linux: 2 },
|
||||
getPlatform: () => Utils.Platform.Linux
|
||||
getPlatform: () => utils.Platform.Linux
|
||||
}
|
||||
});
|
||||
mockery.registerMock('path', {});
|
||||
|
|
Загрузка…
Ссылка в новой задаче