opal 1.6.1 → 1.7.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/build.yml +17 -0
- data/Gemfile +1 -0
- data/HACKING.md +47 -26
- data/UNRELEASED.md +28 -0
- 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 +91 -52
- 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
@@ -1,11 +1,20 @@
|
|
1
1
|
'use strict';
|
2
2
|
|
3
3
|
const EventEmitter = require('events');
|
4
|
+
const dns = require('dns');
|
4
5
|
|
5
|
-
const devtools = require('./lib/devtools');
|
6
|
-
const Chrome = require('./lib/chrome');
|
6
|
+
const devtools = require('./lib/devtools.js');
|
7
|
+
const Chrome = require('./lib/chrome.js');
|
7
8
|
|
8
|
-
|
9
|
+
// XXX reset the default that has been changed in
|
10
|
+
// (https://github.com/nodejs/node/pull/39987) to prefer IPv4. since
|
11
|
+
// implementations alway bind on 127.0.0.1 this solution should be fairly safe
|
12
|
+
// (see #467)
|
13
|
+
if (dns.setDefaultResultOrder) {
|
14
|
+
dns.setDefaultResultOrder('ipv4first');
|
15
|
+
}
|
16
|
+
|
17
|
+
function CDP(options, callback) {
|
9
18
|
if (typeof options === 'function') {
|
10
19
|
callback = options;
|
11
20
|
options = undefined;
|
@@ -13,24 +22,20 @@ module.exports = function (options, callback) {
|
|
13
22
|
const notifier = new EventEmitter();
|
14
23
|
if (typeof callback === 'function') {
|
15
24
|
// allow to register the error callback later
|
16
|
-
process.nextTick(
|
25
|
+
process.nextTick(() => {
|
17
26
|
new Chrome(options, notifier);
|
18
27
|
});
|
19
28
|
return notifier.once('connect', callback);
|
20
29
|
} else {
|
21
|
-
return new Promise(
|
30
|
+
return new Promise((fulfill, reject) => {
|
22
31
|
notifier.once('connect', fulfill);
|
23
32
|
notifier.once('error', reject);
|
24
33
|
new Chrome(options, notifier);
|
25
34
|
});
|
26
35
|
}
|
27
|
-
}
|
28
|
-
|
29
|
-
// for backward compatibility
|
30
|
-
module.exports.listTabs = devtools.List;
|
31
|
-
module.exports.spawnTab = devtools.New;
|
32
|
-
module.exports.closeTab = devtools.Close;
|
36
|
+
}
|
33
37
|
|
38
|
+
module.exports = CDP;
|
34
39
|
module.exports.Protocol = devtools.Protocol;
|
35
40
|
module.exports.List = devtools.List;
|
36
41
|
module.exports.New = devtools.New;
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
function arrayToObject(parameters) {
|
4
4
|
const keyValue = {};
|
5
|
-
parameters.forEach(
|
5
|
+
parameters.forEach((parameter) =>{
|
6
6
|
const name = parameter.name;
|
7
7
|
delete parameter.name;
|
8
8
|
keyValue[name] = parameter;
|
@@ -12,7 +12,7 @@ function arrayToObject(parameters) {
|
|
12
12
|
|
13
13
|
function decorate(to, category, object) {
|
14
14
|
to.category = category;
|
15
|
-
Object.keys(object).forEach(
|
15
|
+
Object.keys(object).forEach((field) => {
|
16
16
|
// skip the 'name' field as it is part of the function prototype
|
17
17
|
if (field === 'name') {
|
18
18
|
return;
|
@@ -28,56 +28,64 @@ function decorate(to, category, object) {
|
|
28
28
|
}
|
29
29
|
|
30
30
|
function addCommand(chrome, domainName, command) {
|
31
|
-
const
|
32
|
-
|
31
|
+
const commandName = `${domainName}.${command.name}`;
|
32
|
+
const handler = (params, sessionId, callback) => {
|
33
|
+
return chrome.send(commandName, params, sessionId, callback);
|
33
34
|
};
|
34
35
|
decorate(handler, 'command', command);
|
35
|
-
chrome[domainName][command.name] = handler;
|
36
|
+
chrome[commandName] = chrome[domainName][command.name] = handler;
|
36
37
|
}
|
37
38
|
|
38
39
|
function addEvent(chrome, domainName, event) {
|
39
|
-
const eventName = domainName
|
40
|
-
const handler =
|
40
|
+
const eventName = `${domainName}.${event.name}`;
|
41
|
+
const handler = (sessionId, handler) => {
|
42
|
+
if (typeof sessionId === 'function') {
|
43
|
+
handler = sessionId;
|
44
|
+
sessionId = undefined;
|
45
|
+
}
|
46
|
+
const rawEventName = sessionId ? `${eventName}.${sessionId}` : eventName;
|
41
47
|
if (typeof handler === 'function') {
|
42
|
-
chrome.on(
|
48
|
+
chrome.on(rawEventName, handler);
|
49
|
+
return () => chrome.removeListener(rawEventName, handler);
|
43
50
|
} else {
|
44
|
-
return new Promise(
|
45
|
-
chrome.once(
|
51
|
+
return new Promise((fulfill, reject) => {
|
52
|
+
chrome.once(rawEventName, fulfill);
|
46
53
|
});
|
47
54
|
}
|
48
55
|
};
|
49
56
|
decorate(handler, 'event', event);
|
50
|
-
chrome[domainName][event.name] = handler;
|
57
|
+
chrome[eventName] = chrome[domainName][event.name] = handler;
|
51
58
|
}
|
52
59
|
|
53
60
|
function addType(chrome, domainName, type) {
|
61
|
+
const typeName = `${domainName}.${type.id}`;
|
54
62
|
const help = {};
|
55
63
|
decorate(help, 'type', type);
|
56
|
-
chrome[domainName][type.id] = help;
|
64
|
+
chrome[typeName] = chrome[domainName][type.id] = help;
|
57
65
|
}
|
58
66
|
|
59
|
-
function prepare(protocol) {
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
(domain.types || []).forEach(function (type) {
|
77
|
-
addType(chrome, domainName, type);
|
78
|
-
});
|
67
|
+
function prepare(object, protocol) {
|
68
|
+
// assign the protocol and generate the shorthands
|
69
|
+
object.protocol = protocol;
|
70
|
+
protocol.domains.forEach((domain) => {
|
71
|
+
const domainName = domain.domain;
|
72
|
+
object[domainName] = {};
|
73
|
+
// add commands
|
74
|
+
(domain.commands || []).forEach((command) => {
|
75
|
+
addCommand(object, domainName, command);
|
76
|
+
});
|
77
|
+
// add events
|
78
|
+
(domain.events || []).forEach((event) => {
|
79
|
+
addEvent(object, domainName, event);
|
80
|
+
});
|
81
|
+
// add types
|
82
|
+
(domain.types || []).forEach((type) => {
|
83
|
+
addType(object, domainName, type);
|
79
84
|
});
|
80
|
-
|
85
|
+
// add utility listener for each domain
|
86
|
+
object[domainName].on = (eventName, handler) => {
|
87
|
+
return object[domainName][eventName](handler);
|
88
|
+
};
|
81
89
|
});
|
82
90
|
}
|
83
91
|
|