opal 1.6.1 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/build.yml +17 -0
- data/CHANGELOG.md +35 -1
- data/Gemfile +1 -0
- data/HACKING.md +47 -26
- data/benchmark/benchmarks +415 -103
- data/benchmark/bm_call_overhead.yml +28 -0
- data/benchmark/run.rb +61 -40
- data/docs/cdp_common.json +3364 -0
- data/docs/cdp_common.md +18 -0
- data/docs/{headless_chrome.md → headless_browsers.md} +31 -12
- data/lib/opal/ast/builder.rb +1 -1
- data/lib/opal/builder.rb +6 -1
- data/lib/opal/builder_processors.rb +5 -3
- data/lib/opal/cache.rb +1 -7
- data/lib/opal/cli_options.rb +72 -58
- data/lib/opal/cli_runners/chrome.rb +47 -9
- data/lib/opal/cli_runners/chrome_cdp_interface.rb +238 -112
- data/lib/opal/cli_runners/compiler.rb +146 -13
- data/lib/opal/cli_runners/deno.rb +32 -0
- data/lib/opal/cli_runners/firefox.rb +350 -0
- data/lib/opal/cli_runners/firefox_cdp_interface.rb +212 -0
- data/lib/opal/cli_runners/node_modules/.bin/chrome-remote-interface.cmd +17 -0
- data/lib/opal/cli_runners/node_modules/.bin/chrome-remote-interface.ps1 +28 -0
- data/lib/opal/cli_runners/node_modules/.package-lock.json +41 -0
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/LICENSE +1 -1
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/README.md +322 -182
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/bin/client.js +99 -114
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/chrome-remote-interface.js +1 -11
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/index.js +16 -11
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/api.js +41 -33
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/chrome.js +224 -214
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/devtools.js +71 -191
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/external-request.js +26 -6
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/protocol.json +20788 -9049
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/websocket-wrapper.js +10 -3
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/package.json +59 -123
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/webpack.config.js +25 -32
- data/lib/opal/cli_runners/node_modules/commander/History.md +298 -0
- data/lib/opal/cli_runners/node_modules/commander/LICENSE +22 -0
- data/lib/opal/cli_runners/node_modules/commander/Readme.md +217 -61
- data/lib/opal/cli_runners/node_modules/commander/index.js +431 -145
- data/lib/opal/cli_runners/node_modules/commander/package.json +16 -79
- data/lib/opal/cli_runners/node_modules/ws/README.md +334 -98
- data/lib/opal/cli_runners/node_modules/ws/browser.js +8 -0
- data/lib/opal/cli_runners/node_modules/ws/index.js +5 -10
- data/lib/opal/cli_runners/node_modules/ws/lib/buffer-util.js +129 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/constants.js +10 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/event-target.js +184 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/extension.js +223 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/limiter.js +55 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/permessage-deflate.js +518 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/receiver.js +607 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/sender.js +409 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/stream.js +180 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/validation.js +104 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/websocket-server.js +447 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/websocket.js +1195 -0
- data/lib/opal/cli_runners/node_modules/ws/package.json +40 -106
- data/lib/opal/cli_runners/package-lock.json +62 -0
- data/lib/opal/cli_runners/package.json +1 -1
- data/lib/opal/cli_runners.rb +26 -4
- data/lib/opal/nodes/args/prepare_post_args.rb +2 -2
- data/lib/opal/nodes/def.rb +8 -8
- data/lib/opal/nodes/iter.rb +12 -12
- data/lib/opal/nodes/logic.rb +1 -1
- data/lib/opal/nodes/masgn.rb +2 -2
- data/lib/opal/parser/with_ruby_lexer.rb +1 -1
- data/lib/opal/paths.rb +14 -0
- data/lib/opal/rewriter.rb +2 -0
- data/lib/opal/rewriters/forward_args.rb +52 -4
- data/lib/opal/rewriters/targeted_patches.rb +94 -0
- data/lib/opal/version.rb +1 -1
- data/opal/corelib/basic_object.rb +1 -1
- data/opal/corelib/boolean.rb +2 -2
- data/opal/corelib/class.rb +11 -0
- data/opal/corelib/constants.rb +3 -3
- data/opal/corelib/enumerable.rb +4 -0
- data/opal/corelib/enumerator.rb +1 -1
- data/opal/corelib/hash.rb +2 -2
- data/opal/corelib/helpers.rb +1 -1
- data/opal/corelib/kernel.rb +3 -3
- data/opal/corelib/method.rb +1 -1
- data/opal/corelib/module.rb +29 -8
- data/opal/corelib/proc.rb +7 -5
- data/opal/corelib/runtime.js +141 -78
- data/opal/corelib/set.rb +252 -0
- data/opal/corelib/string.rb +2 -1
- data/opal/corelib/time.rb +2 -2
- data/opal/opal.rb +1 -0
- data/opal.gemspec +1 -0
- data/spec/filters/bugs/array.rb +22 -13
- data/spec/filters/bugs/base64.rb +5 -5
- data/spec/filters/bugs/basicobject.rb +16 -8
- data/spec/filters/bugs/bigdecimal.rb +161 -160
- data/spec/filters/bugs/binding.rb +10 -10
- data/spec/filters/bugs/class.rb +8 -8
- data/spec/filters/bugs/complex.rb +2 -1
- data/spec/filters/bugs/date.rb +79 -81
- data/spec/filters/bugs/datetime.rb +29 -29
- data/spec/filters/bugs/delegate.rb +1 -3
- data/spec/filters/bugs/encoding.rb +69 -69
- data/spec/filters/bugs/enumerable.rb +22 -20
- data/spec/filters/bugs/enumerator.rb +88 -85
- data/spec/filters/bugs/exception.rb +46 -40
- data/spec/filters/bugs/file.rb +32 -32
- data/spec/filters/bugs/float.rb +26 -21
- data/spec/filters/bugs/freeze.rb +88 -0
- data/spec/filters/bugs/hash.rb +39 -38
- data/spec/filters/bugs/integer.rb +57 -44
- data/spec/filters/bugs/io.rb +1 -1
- data/spec/filters/bugs/kernel.rb +349 -269
- data/spec/filters/bugs/language.rb +220 -188
- data/spec/filters/bugs/main.rb +5 -3
- data/spec/filters/bugs/marshal.rb +38 -38
- data/spec/filters/bugs/math.rb +2 -1
- data/spec/filters/bugs/method.rb +73 -62
- data/spec/filters/bugs/module.rb +163 -143
- data/spec/filters/bugs/numeric.rb +6 -6
- data/spec/filters/bugs/objectspace.rb +16 -16
- data/spec/filters/bugs/openstruct.rb +1 -1
- data/spec/filters/bugs/pack_unpack.rb +51 -51
- data/spec/filters/bugs/pathname.rb +7 -7
- data/spec/filters/bugs/proc.rb +63 -63
- data/spec/filters/bugs/random.rb +7 -6
- data/spec/filters/bugs/range.rb +12 -9
- data/spec/filters/bugs/rational.rb +8 -7
- data/spec/filters/bugs/regexp.rb +49 -48
- data/spec/filters/bugs/ruby-32.rb +56 -0
- data/spec/filters/bugs/set.rb +30 -30
- data/spec/filters/bugs/singleton.rb +4 -4
- data/spec/filters/bugs/string.rb +187 -99
- data/spec/filters/bugs/stringio.rb +7 -0
- data/spec/filters/bugs/stringscanner.rb +68 -68
- data/spec/filters/bugs/struct.rb +11 -9
- data/spec/filters/bugs/symbol.rb +1 -1
- data/spec/filters/bugs/time.rb +78 -63
- data/spec/filters/bugs/trace_point.rb +4 -4
- data/spec/filters/bugs/unboundmethod.rb +32 -17
- data/spec/filters/bugs/warnings.rb +8 -12
- data/spec/filters/unsupported/array.rb +24 -107
- data/spec/filters/unsupported/basicobject.rb +12 -12
- data/spec/filters/unsupported/bignum.rb +27 -52
- data/spec/filters/unsupported/class.rb +1 -2
- data/spec/filters/unsupported/delegator.rb +3 -3
- data/spec/filters/unsupported/enumerable.rb +2 -9
- data/spec/filters/unsupported/enumerator.rb +2 -11
- data/spec/filters/unsupported/file.rb +1 -1
- data/spec/filters/unsupported/float.rb +28 -47
- data/spec/filters/unsupported/hash.rb +8 -14
- data/spec/filters/unsupported/integer.rb +75 -91
- data/spec/filters/unsupported/kernel.rb +17 -35
- data/spec/filters/unsupported/language.rb +11 -19
- data/spec/filters/unsupported/marshal.rb +22 -41
- data/spec/filters/unsupported/matchdata.rb +28 -52
- data/spec/filters/unsupported/math.rb +1 -1
- data/spec/filters/unsupported/privacy.rb +229 -285
- data/spec/filters/unsupported/range.rb +1 -5
- data/spec/filters/unsupported/regexp.rb +40 -66
- data/spec/filters/unsupported/set.rb +2 -2
- data/spec/filters/unsupported/singleton.rb +4 -4
- data/spec/filters/unsupported/string.rb +305 -508
- data/spec/filters/unsupported/struct.rb +3 -4
- data/spec/filters/unsupported/symbol.rb +15 -18
- data/spec/filters/unsupported/thread.rb +1 -7
- data/spec/filters/unsupported/time.rb +159 -202
- data/spec/filters/unsupported/usage_of_files.rb +170 -259
- data/spec/lib/builder_spec.rb +4 -4
- data/spec/lib/rewriters/forward_args_spec.rb +32 -12
- data/spec/mspec-opal/runner.rb +2 -0
- data/spec/ruby_specs +4 -0
- data/stdlib/deno/base.rb +28 -0
- data/stdlib/deno/file.rb +340 -0
- data/stdlib/{headless_chrome.rb → headless_browser/base.rb} +1 -1
- data/stdlib/headless_browser/file.rb +15 -0
- data/stdlib/headless_browser.rb +4 -0
- data/stdlib/native.rb +1 -1
- data/stdlib/nodejs/file.rb +5 -0
- data/stdlib/opal/platform.rb +8 -6
- data/stdlib/opal-platform.rb +14 -8
- data/stdlib/set.rb +1 -258
- data/tasks/benchmarking.rake +62 -19
- data/tasks/performance.rake +1 -1
- data/tasks/testing.rake +5 -3
- data/test/nodejs/test_file.rb +29 -10
- data/test/opal/http_server.rb +28 -11
- data/test/opal/unsupported_and_bugs.rb +2 -1
- metadata +89 -50
- data/lib/opal/cli_runners/node_modules/ultron/LICENSE +0 -22
- data/lib/opal/cli_runners/node_modules/ultron/index.js +0 -138
- data/lib/opal/cli_runners/node_modules/ultron/package.json +0 -112
- data/lib/opal/cli_runners/node_modules/ws/SECURITY.md +0 -33
- data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.fallback.js +0 -56
- data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.js +0 -15
- data/lib/opal/cli_runners/node_modules/ws/lib/ErrorCodes.js +0 -28
- data/lib/opal/cli_runners/node_modules/ws/lib/EventTarget.js +0 -158
- data/lib/opal/cli_runners/node_modules/ws/lib/Extensions.js +0 -69
- data/lib/opal/cli_runners/node_modules/ws/lib/PerMessageDeflate.js +0 -339
- data/lib/opal/cli_runners/node_modules/ws/lib/Receiver.js +0 -520
- data/lib/opal/cli_runners/node_modules/ws/lib/Sender.js +0 -438
- data/lib/opal/cli_runners/node_modules/ws/lib/Validation.fallback.js +0 -9
- data/lib/opal/cli_runners/node_modules/ws/lib/Validation.js +0 -17
- data/lib/opal/cli_runners/node_modules/ws/lib/WebSocket.js +0 -705
- data/lib/opal/cli_runners/node_modules/ws/lib/WebSocketServer.js +0 -336
- data/spec/filters/bugs/boolean.rb +0 -3
- data/spec/filters/bugs/matrix.rb +0 -3
- data/spec/filters/unsupported/fixnum.rb +0 -15
- data/spec/filters/unsupported/freeze.rb +0 -102
- data/spec/filters/unsupported/pathname.rb +0 -4
- data/spec/filters/unsupported/proc.rb +0 -4
- data/spec/filters/unsupported/random.rb +0 -5
- data/spec/filters/unsupported/taint.rb +0 -162
@@ -3,243 +3,123 @@
|
|
3
3
|
const http = require('http');
|
4
4
|
const https = require('https');
|
5
5
|
|
6
|
-
const defaults = require('./defaults');
|
7
|
-
const externalRequest = require('./external-request');
|
6
|
+
const defaults = require('./defaults.js');
|
7
|
+
const externalRequest = require('./external-request.js');
|
8
8
|
|
9
|
-
// callback(err,
|
10
|
-
|
9
|
+
// options.path must be specified; callback(err, data)
|
10
|
+
function devToolsInterface(path, options, callback) {
|
11
|
+
const transport = options.secure ? https : http;
|
12
|
+
const requestOptions = {
|
13
|
+
host: options.host || defaults.HOST,
|
14
|
+
port: options.port || defaults.PORT,
|
15
|
+
useHostName: options.useHostName,
|
16
|
+
path: (options.alterPath ? options.alterPath(path) : path)
|
17
|
+
};
|
18
|
+
externalRequest(transport, requestOptions, callback);
|
19
|
+
}
|
20
|
+
|
21
|
+
// wrapper that allows to return a promise if the callback is omitted, it works
|
22
|
+
// for DevTools methods
|
23
|
+
function promisesWrapper(func) {
|
24
|
+
return (options, callback) => {
|
25
|
+
// options is an optional argument
|
26
|
+
if (typeof options === 'function') {
|
27
|
+
callback = options;
|
28
|
+
options = undefined;
|
29
|
+
}
|
30
|
+
options = options || {};
|
31
|
+
// just call the function otherwise wrap a promise around its execution
|
32
|
+
if (typeof callback === 'function') {
|
33
|
+
func(options, callback);
|
34
|
+
return undefined;
|
35
|
+
} else {
|
36
|
+
return new Promise((fulfill, reject) => {
|
37
|
+
func(options, (err, result) => {
|
38
|
+
if (err) {
|
39
|
+
reject(err);
|
40
|
+
} else {
|
41
|
+
fulfill(result);
|
42
|
+
}
|
43
|
+
});
|
44
|
+
});
|
45
|
+
}
|
46
|
+
};
|
47
|
+
}
|
48
|
+
|
49
|
+
function Protocol(options, callback) {
|
11
50
|
// if the local protocol is requested
|
12
|
-
if (
|
51
|
+
if (options.local) {
|
13
52
|
const localDescriptor = require('./protocol.json');
|
14
|
-
callback(null,
|
15
|
-
'remote': false,
|
16
|
-
'descriptor': localDescriptor
|
17
|
-
});
|
53
|
+
callback(null, localDescriptor);
|
18
54
|
return;
|
19
55
|
}
|
20
|
-
// try to
|
21
|
-
|
56
|
+
// try to fetch the protocol remotely
|
57
|
+
devToolsInterface('/json/protocol', options, (err, descriptor) => {
|
22
58
|
if (err) {
|
23
59
|
callback(err);
|
24
|
-
return;
|
25
|
-
}
|
26
|
-
// fetch the reported browser info (Node.js returns an array)
|
27
|
-
const browser = (info[0] || info).Browser;
|
28
|
-
// use the proper protocol fetcher
|
29
|
-
let fetcher;
|
30
|
-
if (browser.match(/^(Headless)?Chrome\//)) {
|
31
|
-
// https://bugs.chromium.org/p/chromium/issues/detail?id=538300#c10
|
32
|
-
const firstJsonProtocolVersion = '60.0.3097.0';
|
33
|
-
const firstJsonProtocolBuild = explodeChromeVersion(firstJsonProtocolVersion)[2];
|
34
|
-
const chromeBuild = explodeChromeVersion(info.Browser.split('/')[1])[2];
|
35
|
-
if (chromeBuild < firstJsonProtocolBuild) {
|
36
|
-
fetcher = fetchFromChromeRepo;
|
37
|
-
} else {
|
38
|
-
fetcher = fetchFromHttpEndpoint;
|
39
|
-
}
|
40
|
-
} else if (browser.match(/^Microsoft Edge /)) {
|
41
|
-
fetcher = fetchFromHttpEndpoint;
|
42
|
-
} else if (browser.match(/^node.js\//)) {
|
43
|
-
fetcher = fetchFromHttpEndpoint;
|
44
60
|
} else {
|
45
|
-
callback(
|
46
|
-
return;
|
61
|
+
callback(null, JSON.parse(descriptor));
|
47
62
|
}
|
48
|
-
fetcher(options, info, function (err, descriptor) {
|
49
|
-
if (err) {
|
50
|
-
callback(err);
|
51
|
-
return;
|
52
|
-
}
|
53
|
-
// use the remotely fetched descriptor
|
54
|
-
callback(null, {
|
55
|
-
'remote': true,
|
56
|
-
'descriptor': descriptor
|
57
|
-
});
|
58
|
-
});
|
59
63
|
});
|
60
|
-
}
|
64
|
+
}
|
61
65
|
|
62
|
-
|
63
|
-
|
64
|
-
devToolsInterface(options, function (err, tabs) {
|
66
|
+
function List(options, callback) {
|
67
|
+
devToolsInterface('/json/list', options, (err, tabs) => {
|
65
68
|
if (err) {
|
66
69
|
callback(err);
|
67
70
|
} else {
|
68
71
|
callback(null, JSON.parse(tabs));
|
69
72
|
}
|
70
73
|
});
|
71
|
-
}
|
74
|
+
}
|
72
75
|
|
73
|
-
|
74
|
-
|
76
|
+
function New(options, callback) {
|
77
|
+
let path = '/json/new';
|
75
78
|
if (Object.prototype.hasOwnProperty.call(options, 'url')) {
|
76
|
-
|
79
|
+
path += `?${options.url}`;
|
77
80
|
}
|
78
|
-
devToolsInterface(options,
|
81
|
+
devToolsInterface(path, options, (err, tab) => {
|
79
82
|
if (err) {
|
80
83
|
callback(err);
|
81
84
|
} else {
|
82
85
|
callback(null, JSON.parse(tab));
|
83
86
|
}
|
84
87
|
});
|
85
|
-
}
|
88
|
+
}
|
86
89
|
|
87
|
-
|
88
|
-
|
89
|
-
devToolsInterface(options, function (err) {
|
90
|
+
function Activate(options, callback) {
|
91
|
+
devToolsInterface('/json/activate/' + options.id, options, (err) => {
|
90
92
|
if (err) {
|
91
93
|
callback(err);
|
92
94
|
} else {
|
93
95
|
callback(null);
|
94
96
|
}
|
95
97
|
});
|
96
|
-
}
|
98
|
+
}
|
97
99
|
|
98
|
-
|
99
|
-
|
100
|
-
devToolsInterface(options, function (err) {
|
100
|
+
function Close(options, callback) {
|
101
|
+
devToolsInterface('/json/close/' + options.id, options, (err) => {
|
101
102
|
if (err) {
|
102
103
|
callback(err);
|
103
104
|
} else {
|
104
105
|
callback(null);
|
105
106
|
}
|
106
107
|
});
|
107
|
-
}
|
108
|
+
}
|
108
109
|
|
109
|
-
|
110
|
-
|
111
|
-
devToolsInterface(options, function (err, versionInfo) {
|
110
|
+
function Version(options, callback) {
|
111
|
+
devToolsInterface('/json/version', options, (err, versionInfo) => {
|
112
112
|
if (err) {
|
113
113
|
callback(err);
|
114
114
|
} else {
|
115
115
|
callback(null, JSON.parse(versionInfo));
|
116
116
|
}
|
117
117
|
});
|
118
|
-
});
|
119
|
-
|
120
|
-
// options.path must be specified; callback(err, data)
|
121
|
-
function devToolsInterface(options, callback) {
|
122
|
-
options.host = options.host || defaults.HOST;
|
123
|
-
options.port = options.port || defaults.PORT;
|
124
|
-
options.secure = !!(options.secure);
|
125
|
-
externalRequest(options.secure ? https : http, options, callback);
|
126
118
|
}
|
127
119
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
callback = options;
|
135
|
-
options = undefined;
|
136
|
-
}
|
137
|
-
options = options || {};
|
138
|
-
// just call the function otherwise wrap a promise around its execution
|
139
|
-
if (typeof callback === 'function') {
|
140
|
-
func(options, callback);
|
141
|
-
} else {
|
142
|
-
return new Promise(function (fulfill, reject) {
|
143
|
-
func(options, function (err, result) {
|
144
|
-
if (err) {
|
145
|
-
reject(err);
|
146
|
-
} else {
|
147
|
-
fulfill(result);
|
148
|
-
}
|
149
|
-
});
|
150
|
-
});
|
151
|
-
}
|
152
|
-
};
|
153
|
-
}
|
154
|
-
|
155
|
-
function explodeChromeVersion(v) {
|
156
|
-
return v.split('.').map(function (x) {
|
157
|
-
return parseInt(x);
|
158
|
-
});
|
159
|
-
}
|
160
|
-
|
161
|
-
// callback(err, descriptor)
|
162
|
-
// XXX this function needs a proper refactor but the inconsistency of the
|
163
|
-
// fetching process makes it useless for now
|
164
|
-
function fetchFromChromeRepo(options, info, callback) {
|
165
|
-
// attempt to fetch the protocol directly from the Chromium repository
|
166
|
-
// according to the current version
|
167
|
-
//
|
168
|
-
// Thanks to Paul Irish.
|
169
|
-
// (see https://github.com/cyrus-and/chrome-remote-interface/issues/10#issuecomment-146032907)
|
170
|
-
const webKitVersion = info['WebKit-Version'];
|
171
|
-
const v8Version = info['V8-Version'];
|
172
|
-
const match = webKitVersion.match(/\s\(@(\b[0-9a-f]{5,40}\b)/);
|
173
|
-
const hash = match[1];
|
174
|
-
const fromChromiumDotOrg = (hash <= 202666);
|
175
|
-
let urls;
|
176
|
-
if (fromChromiumDotOrg) {
|
177
|
-
urls = [`https://src.chromium.org/blink/trunk/Source/devtools/protocol.json?p=${hash}`];
|
178
|
-
} else {
|
179
|
-
const lastBeforeSplitChromeVersion = '53.0.2758.1'; // before the split (https://crbug.com/580337)
|
180
|
-
const lastBeforeV8ChromeVersion = '55.0.2854.3'; // before using the JSON from the V8 repo
|
181
|
-
const chromeVersion = explodeChromeVersion(info.Browser.split('/')[1]);
|
182
|
-
// according to https://www.chromium.org/developers/version-numbers (patch not meaningful)
|
183
|
-
const beforeSplit = (chromeVersion[2] <= explodeChromeVersion(lastBeforeSplitChromeVersion)[2]);
|
184
|
-
const beforeFromV8 = (chromeVersion[2] <= explodeChromeVersion(lastBeforeV8ChromeVersion)[2]);
|
185
|
-
if (beforeSplit) {
|
186
|
-
urls = [`https://chromium.googlesource.com/chromium/src/+/${hash}/third_party/WebKit/Source/devtools/protocol.json?format=TEXT`];
|
187
|
-
} else if (beforeFromV8) {
|
188
|
-
urls = [`https://chromium.googlesource.com/chromium/src/+/${hash}/third_party/WebKit/Source/core/inspector/browser_protocol.json?format=TEXT`,
|
189
|
-
`https://chromium.googlesource.com/chromium/src/+/${hash}/third_party/WebKit/Source/platform/v8_inspector/js_protocol.json?format=TEXT`];
|
190
|
-
} else if (v8Version) {
|
191
|
-
urls = [`https://chromium.googlesource.com/chromium/src/+/${hash}/third_party/WebKit/Source/core/inspector/browser_protocol.json?format=TEXT`,
|
192
|
-
`https://chromium.googlesource.com/v8/v8/+/${v8Version}/src/inspector/js_protocol.json?format=TEXT`];
|
193
|
-
} else {
|
194
|
-
console.error('Warning: the protocol might be outdated, see: https://groups.google.com/d/topic/chrome-debugging-protocol/HjyOKainKus/discussion');
|
195
|
-
// releases which do not provide a V8 version get an old version of the V8 protocol
|
196
|
-
urls = [`https://chromium.googlesource.com/chromium/src/+/${hash}/third_party/WebKit/Source/core/inspector/browser_protocol.json?format=TEXT`,
|
197
|
-
`https://chromium.googlesource.com/chromium/src/+/${lastBeforeV8ChromeVersion}/third_party/WebKit/Source/platform/v8_inspector/js_protocol.json?format=TEXT`];
|
198
|
-
}
|
199
|
-
}
|
200
|
-
const descriptors = [];
|
201
|
-
urls.forEach(function (url) {
|
202
|
-
externalRequest(https, url, function (err, data) {
|
203
|
-
let descriptor;
|
204
|
-
if (!err) {
|
205
|
-
try {
|
206
|
-
// the file is served base64 encoded from googlesource.com
|
207
|
-
if (!fromChromiumDotOrg) {
|
208
|
-
data = new Buffer(data, 'base64').toString();
|
209
|
-
}
|
210
|
-
descriptor = JSON.parse(data);
|
211
|
-
} catch (_) {
|
212
|
-
// abort later
|
213
|
-
}
|
214
|
-
}
|
215
|
-
descriptors.push(descriptor);
|
216
|
-
if (descriptors.length === urls.length) {
|
217
|
-
// all must be defined
|
218
|
-
if (descriptors.indexOf(undefined) !== -1) {
|
219
|
-
callback(new Error('Cannot fetch from Chromium repo'));
|
220
|
-
return;
|
221
|
-
}
|
222
|
-
// merge the domains
|
223
|
-
descriptors.forEach(function (descriptor, i) {
|
224
|
-
if (i === 0) {
|
225
|
-
return;
|
226
|
-
}
|
227
|
-
Array.prototype.push.apply(descriptors[0].domains, descriptor.domains);
|
228
|
-
});
|
229
|
-
callback(null, descriptors[0]);
|
230
|
-
}
|
231
|
-
});
|
232
|
-
});
|
233
|
-
}
|
234
|
-
|
235
|
-
// callback(err, descriptor)
|
236
|
-
function fetchFromHttpEndpoint(options, info, callback) {
|
237
|
-
options.path = '/json/protocol';
|
238
|
-
devToolsInterface(options, function (err, descriptor) {
|
239
|
-
if (err) {
|
240
|
-
callback(err);
|
241
|
-
} else {
|
242
|
-
callback(null, JSON.parse(descriptor));
|
243
|
-
}
|
244
|
-
});
|
245
|
-
}
|
120
|
+
module.exports.Protocol = promisesWrapper(Protocol);
|
121
|
+
module.exports.List = promisesWrapper(List);
|
122
|
+
module.exports.New = promisesWrapper(New);
|
123
|
+
module.exports.Activate = promisesWrapper(Activate);
|
124
|
+
module.exports.Close = promisesWrapper(Close);
|
125
|
+
module.exports.Version = promisesWrapper(Version);
|
@@ -1,13 +1,32 @@
|
|
1
1
|
'use strict';
|
2
2
|
|
3
|
+
const dns = require('dns');
|
4
|
+
const util = require('util');
|
5
|
+
|
6
|
+
const REQUEST_TIMEOUT = 10000;
|
7
|
+
|
3
8
|
// callback(err, data)
|
4
|
-
function externalRequest(transport, options, callback) {
|
5
|
-
|
9
|
+
async function externalRequest(transport, options, callback) {
|
10
|
+
// perform the DNS lookup manually so that the HTTP host header generated by
|
11
|
+
// http.get will contain the IP address, this is needed because since Chrome
|
12
|
+
// 66 the host header cannot contain an host name different than localhost
|
13
|
+
// (see https://github.com/cyrus-and/chrome-remote-interface/issues/340)
|
14
|
+
if (!options.useHostName) {
|
15
|
+
try {
|
16
|
+
const {address} = await util.promisify(dns.lookup)(options.host);
|
17
|
+
options.host = address;
|
18
|
+
} catch (err) {
|
19
|
+
callback(err);
|
20
|
+
return;
|
21
|
+
}
|
22
|
+
}
|
23
|
+
// perform the actual request
|
24
|
+
const request = transport.get(options, (response) => {
|
6
25
|
let data = '';
|
7
|
-
response.on('data',
|
26
|
+
response.on('data', (chunk) => {
|
8
27
|
data += chunk;
|
9
28
|
});
|
10
|
-
response.on('end',
|
29
|
+
response.on('end', () => {
|
11
30
|
if (response.statusCode === 200) {
|
12
31
|
callback(null, data);
|
13
32
|
} else {
|
@@ -15,9 +34,10 @@ function externalRequest(transport, options, callback) {
|
|
15
34
|
}
|
16
35
|
});
|
17
36
|
});
|
18
|
-
request.
|
19
|
-
|
37
|
+
request.setTimeout(REQUEST_TIMEOUT, () => {
|
38
|
+
request.abort();
|
20
39
|
});
|
40
|
+
request.on('error', callback);
|
21
41
|
}
|
22
42
|
|
23
43
|
module.exports = externalRequest;
|