isomorfeus-puppetmaster 0.1.0 → 0.2.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/README.md +21 -1
- data/lib/isomorfeus-puppetmaster.rb +8 -2
- data/lib/isomorfeus/puppetmaster.rb +19 -3
- data/lib/isomorfeus/puppetmaster/document.rb +31 -0
- data/lib/isomorfeus/puppetmaster/driver/jsdom.rb +6 -4
- data/lib/isomorfeus/puppetmaster/driver/jsdom_document.rb +27 -18
- data/lib/isomorfeus/puppetmaster/driver/jsdom_node.rb +15 -9
- data/lib/isomorfeus/puppetmaster/driver/puppeteer.rb +7 -5
- data/lib/isomorfeus/puppetmaster/driver/puppeteer_document.rb +29 -21
- data/lib/isomorfeus/puppetmaster/driver/puppeteer_node.rb +18 -12
- data/lib/isomorfeus/puppetmaster/dsl.rb +14 -10
- data/lib/isomorfeus/puppetmaster/node.rb +27 -1
- data/lib/isomorfeus/puppetmaster/server.rb +25 -0
- data/lib/isomorfeus/puppetmaster/server/executor_middleware.rb +36 -0
- data/lib/isomorfeus/puppetmaster/version.rb +1 -1
- metadata +73 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd75e7d5e87decf7b2360c99c4f17cd80c3f08fe3366bb5d536c61ed24287289
|
4
|
+
data.tar.gz: 3ac555d46df4ba4e4884ed25f137e6053c55504ce3b8140844d808298690aff1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ad2e07e9036fb54be28d75a2f727a7a088a141eb5961b97ce98c73fa452d9a688029664ae5a7506bd78dbb5a494ba457b6e734cb731fb411b91e7758bdcd733
|
7
|
+
data.tar.gz: 0e6a588c8a19722957e1578b9b4dec0fc5d3222c8dbb6b06c6cd48b1640080589b972d90f7b84864cc83c569fa65265d46a020e555b673c685f01d6b6c376d99
|
data/README.md
CHANGED
@@ -2,13 +2,14 @@
|
|
2
2
|
|
3
3
|
A framework for acceptance tests or simply running tests in a headless browser.
|
4
4
|
Comes with drivers for chromium headless, firefox and jsdom.
|
5
|
+
Allows for writing javascript tests in pure ruby.
|
5
6
|
|
6
7
|
## Chat
|
7
8
|
At our [Gitter Isomorfeus Lobby](http://gitter.im/isomorfeus/Lobby)
|
8
9
|
|
9
10
|
## Running on:
|
10
11
|
- [CircleCI](https://circleci.com): [](https://circleci.com/gh/isomorfeus/isomorfeus-puppetmaster/tree/master)
|
11
|
-
- [SemaphoreCI 2.0](https://semaphoreci.com): (
|
12
|
+
- [SemaphoreCI 2.0](https://semaphoreci.com): (not yet available)
|
12
13
|
- [TravisCI](https://travis-ci.org): [](https://travis-ci.org/isomorfeus/isomorfeus-puppetmaster)
|
13
14
|
|
14
15
|
## Installation
|
@@ -107,9 +108,28 @@ Both open documents can then be independently interacted with:
|
|
107
108
|
doc.visit('/go')
|
108
109
|
doc2.goto('/location')
|
109
110
|
```
|
111
|
+
### Documents and Ruby
|
112
|
+
|
113
|
+
Ruby can be executed within documents by simply providing a block or a string:
|
114
|
+
```ruby
|
115
|
+
doc.evaluate_ruby do
|
116
|
+
$document['my_id'].class_names
|
117
|
+
end
|
118
|
+
|
119
|
+
# or
|
120
|
+
|
121
|
+
doc.evaluate_ruby "$document['my_id'].class_names"
|
122
|
+
```
|
123
|
+
|
124
|
+
The complete API of [opal-browser](https://github.com/opal/opal-browser) is available.
|
110
125
|
|
111
126
|
### Documents and Javascript
|
112
127
|
|
128
|
+
Javascript can be be evaluated within documents by simply providing a string:
|
129
|
+
```ruby
|
130
|
+
doc.evaluate_javascript '1+1' # => 2
|
131
|
+
```
|
132
|
+
|
113
133
|
#### Executing Javascript
|
114
134
|
|
115
135
|
TODO
|
@@ -2,7 +2,11 @@ require 'active_support/core_ext/string'
|
|
2
2
|
require 'uri'
|
3
3
|
require 'net/http'
|
4
4
|
require 'rack'
|
5
|
-
|
5
|
+
require 'opal'
|
6
|
+
require 'opal-browser'
|
7
|
+
require 'unparser'
|
8
|
+
require 'method_source'
|
9
|
+
require 'securerandom'
|
6
10
|
require 'isomorfeus-speednode'
|
7
11
|
|
8
12
|
# use execjs speednode for sure, unless something else has been specified
|
@@ -10,6 +14,8 @@ unless ENV["EXECJS_RUNTIME"]
|
|
10
14
|
ExecJS.runtime = ExecJS::Runtimes::Speednode
|
11
15
|
end
|
12
16
|
|
17
|
+
# require 'uglifier'
|
18
|
+
|
13
19
|
require 'isomorfeus/puppetmaster'
|
14
20
|
require 'isomorfeus/puppetmaster/self_forwardable'
|
15
21
|
require 'isomorfeus/puppetmaster/errors'
|
@@ -34,7 +40,7 @@ require 'isomorfeus/puppetmaster/driver/jsdom_document'
|
|
34
40
|
require 'isomorfeus/puppetmaster/driver/jsdom_node'
|
35
41
|
require 'isomorfeus/puppetmaster/driver/jsdom'
|
36
42
|
require 'isomorfeus/puppetmaster/driver_registration'
|
37
|
-
|
43
|
+
require 'isomorfeus/puppetmaster/server/executor_middleware'
|
38
44
|
require 'isomorfeus/puppetmaster/server/middleware'
|
39
45
|
require 'isomorfeus/puppetmaster/server/checker'
|
40
46
|
require 'isomorfeus/puppetmaster/server'
|
@@ -2,13 +2,19 @@ module Isomorfeus
|
|
2
2
|
module Puppetmaster
|
3
3
|
class << self
|
4
4
|
attr_accessor :app, :server_port, :session
|
5
|
-
attr_writer :
|
5
|
+
attr_writer :download_path, :server_host, :server_scheme
|
6
6
|
attr_reader :served_app, :server
|
7
7
|
|
8
8
|
def boot_app
|
9
9
|
@served_app = Isomorfeus::Puppetmaster::Server.new(app, port: server_port, host: server_host).boot
|
10
10
|
end
|
11
11
|
|
12
|
+
def block_source_code(&block)
|
13
|
+
source_block = Parser::CurrentRuby.parse(block.source).children.last
|
14
|
+
source_block = source_block.children.last if source_block.type == :block
|
15
|
+
Unparser.unparse(source_block)
|
16
|
+
end
|
17
|
+
|
12
18
|
def driver
|
13
19
|
@driver ||= :chromium
|
14
20
|
end
|
@@ -22,6 +28,10 @@ module Isomorfeus
|
|
22
28
|
@drivers ||= {}
|
23
29
|
end
|
24
30
|
|
31
|
+
def opal_prelude
|
32
|
+
@opal_prelude ||= build_opal_prelude
|
33
|
+
end
|
34
|
+
|
25
35
|
def register_driver(name, &block)
|
26
36
|
drivers[name.to_sym] = block
|
27
37
|
end
|
@@ -30,8 +40,8 @@ module Isomorfeus
|
|
30
40
|
servers[name.to_sym] = block
|
31
41
|
end
|
32
42
|
|
33
|
-
def
|
34
|
-
@
|
43
|
+
def download_path
|
44
|
+
@download_path ||= Dir.pwd
|
35
45
|
end
|
36
46
|
|
37
47
|
def server=(name)
|
@@ -57,6 +67,12 @@ module Isomorfeus
|
|
57
67
|
def servers
|
58
68
|
@servers ||= {}
|
59
69
|
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def build_opal_prelude
|
74
|
+
js = Opal::Builder.new.build_str("require 'opal'\nrequire 'opal-browser'", 'puppetmaster_opal_prelude').to_s
|
75
|
+
end
|
60
76
|
end
|
61
77
|
end
|
62
78
|
end
|
@@ -69,6 +69,24 @@ module Isomorfeus
|
|
69
69
|
@driver.browser
|
70
70
|
end
|
71
71
|
|
72
|
+
def evaluate_ruby(ruby_source = '', &block)
|
73
|
+
ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
|
74
|
+
compiled_ruby = compile_ruby_source(ruby_source)
|
75
|
+
if compiled_ruby.start_with?('/*')
|
76
|
+
start_of_code = compiled_ruby.index('*/') + 3
|
77
|
+
compiled_ruby = compiled_ruby[start_of_code..-1]
|
78
|
+
end
|
79
|
+
javascript = <<~JAVASCRIPT
|
80
|
+
(function(){
|
81
|
+
if (typeof Opal === "undefined") {
|
82
|
+
#{Isomorfeus::Puppetmaster.opal_prelude}
|
83
|
+
}
|
84
|
+
return #{compiled_ruby}
|
85
|
+
})()
|
86
|
+
JAVASCRIPT
|
87
|
+
evaluate_script(javascript)
|
88
|
+
end
|
89
|
+
|
72
90
|
def go_back
|
73
91
|
@response = @driver.document_go_back(self)
|
74
92
|
self
|
@@ -105,6 +123,12 @@ module Isomorfeus
|
|
105
123
|
body.has_xpath?(query, options)
|
106
124
|
end
|
107
125
|
|
126
|
+
def isomorphic(ruby_source = '', &block)
|
127
|
+
ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
|
128
|
+
Isomorfeus::Puppetmaster.served_app.on_server(ruby_source)
|
129
|
+
evaluate_ruby(ruby_source)
|
130
|
+
end
|
131
|
+
|
108
132
|
def method_missing(name, *args)
|
109
133
|
method_name = name.to_s
|
110
134
|
if method_name.start_with?('find_by_')
|
@@ -155,6 +179,13 @@ module Isomorfeus
|
|
155
179
|
# :assert_no_current_path
|
156
180
|
# assert_title
|
157
181
|
# assert_no_title
|
182
|
+
|
183
|
+
protected
|
184
|
+
|
185
|
+
def compile_ruby_source(source_code)
|
186
|
+
# TODO maybe use compile server
|
187
|
+
Opal.compile(source_code, parse_comments: false)
|
188
|
+
end
|
158
189
|
end
|
159
190
|
end
|
160
191
|
end
|
@@ -91,12 +91,13 @@ module Isomorfeus
|
|
91
91
|
node_data = await <<~JAVASCRIPT
|
92
92
|
var tt = await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
|
93
93
|
node = frame.contentDocument.body;
|
94
|
+
var name = node.nodeName;
|
94
95
|
var tag = node.tagName.toLowerCase();
|
95
96
|
var type = null;
|
96
97
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
97
|
-
return [tag, type];
|
98
|
+
return [name, tag, type];
|
98
99
|
}, AllElementHandles[#{frame.handle}]);
|
99
|
-
LastResult = {handle: node_handle,
|
100
|
+
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2]};
|
100
101
|
JAVASCRIPT
|
101
102
|
if node_data
|
102
103
|
node_data[:css_selector] = 'body'
|
@@ -116,12 +117,13 @@ module Isomorfeus
|
|
116
117
|
node_data = await <<~JAVASCRIPT
|
117
118
|
var tt = await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
|
118
119
|
node = frame.contentDocument.head;
|
120
|
+
var name = node.nodeName;
|
119
121
|
var tag = node.tagName.toLowerCase();
|
120
122
|
var type = null;
|
121
123
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
122
|
-
return [tag, type];
|
124
|
+
return [name, tag, type];
|
123
125
|
}, AllElementHandles[#{frame.handle}]);
|
124
|
-
LastResult = {handle: node_handle,
|
126
|
+
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2]};
|
125
127
|
JAVASCRIPT
|
126
128
|
if node_data
|
127
129
|
node_data[:css_selector] = 'body'
|
@@ -94,8 +94,9 @@ module Isomorfeus
|
|
94
94
|
node_data = @context.exec <<~JAVASCRIPT
|
95
95
|
var node = AllDomHandles[#{document.handle}].window.document.body;
|
96
96
|
var node_handle = RegisterElementHandle(node);
|
97
|
+
var name = node.nodeName;
|
97
98
|
var tag = node.tagName.toLowerCase();
|
98
|
-
return {handle: node_handle, tag: tag, type: null, content_editable: node.isContentEditable};
|
99
|
+
return {handle: node_handle, name: name, tag: tag, type: null, content_editable: node.isContentEditable};
|
99
100
|
JAVASCRIPT
|
100
101
|
if node_data
|
101
102
|
node_data[:css_selector] = 'body'
|
@@ -282,8 +283,8 @@ module Isomorfeus
|
|
282
283
|
def document_evaluate_script(document, script, *args)
|
283
284
|
@context.eval <<~JAVASCRIPT
|
284
285
|
AllDomHandles[#{document.handle}].window.eval(
|
285
|
-
|
286
|
-
#{script}
|
286
|
+
"var arguments = #{ "#{args}".gsub('"', '\"') };" +
|
287
|
+
"#{script.gsub('\\', '\\\\\\').gsub('"', '\"').gsub("\n", "\\n")}"
|
287
288
|
)
|
288
289
|
JAVASCRIPT
|
289
290
|
rescue ExecJS::ProgramError => e
|
@@ -293,9 +294,9 @@ module Isomorfeus
|
|
293
294
|
def document_execute_script(document, script, *args)
|
294
295
|
@context.eval <<~JAVASCRIPT
|
295
296
|
AllDomHandles[#{document.handle}].window.eval(
|
296
|
-
|
297
|
-
|
298
|
-
})()
|
297
|
+
"(function() { var arguments = #{ "#{args}".gsub('"', '\"') };" +
|
298
|
+
"#{script.gsub('\\', '\\\\\\').gsub('"', '\"').gsub("\n", "\\n")}" +
|
299
|
+
"})()"
|
299
300
|
)
|
300
301
|
JAVASCRIPT
|
301
302
|
rescue ExecJS::ProgramError => e
|
@@ -308,10 +309,11 @@ module Isomorfeus
|
|
308
309
|
var node = AllDomHandles[#{document.handle}].window.document.querySelector("#{js_escaped_selector}");
|
309
310
|
if (node) {
|
310
311
|
var node_handle = RegisterElementHandle(node);
|
311
|
-
var tag = node.tagName.toLowerCase();
|
312
|
+
var tag = node.tagName ? node.tagName.toLowerCase() : '';
|
313
|
+
var name = node.nodeName;
|
312
314
|
var type = null;
|
313
315
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
314
|
-
return {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
|
316
|
+
return {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
|
315
317
|
}
|
316
318
|
JAVASCRIPT
|
317
319
|
if node_data
|
@@ -331,11 +333,13 @@ module Isomorfeus
|
|
331
333
|
var node_data_array = [];
|
332
334
|
if (node_array) {
|
333
335
|
for (var i=0; i<node_array.length; i++) {
|
336
|
+
var node = node_array[i];
|
334
337
|
var node_handle = RegisterElementHandle(node_array[i]);
|
335
|
-
var tag = node.tagName.toLowerCase();
|
338
|
+
var tag = node.tagName ? node.tagName.toLowerCase() : '';
|
339
|
+
var name = node.nodeName;
|
336
340
|
var type = null;
|
337
341
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
338
|
-
node_data_array.push({handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable});
|
342
|
+
node_data_array.push({handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable});
|
339
343
|
}
|
340
344
|
}
|
341
345
|
return node_data_array;
|
@@ -354,12 +358,13 @@ module Isomorfeus
|
|
354
358
|
var xpath_result = document.evaluate("#{js_escaped_query}", document, null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
|
355
359
|
var node;
|
356
360
|
var node_data_array = [];
|
357
|
-
while (node = xpath_result.iterateNext) {
|
361
|
+
while (node = xpath_result.iterateNext()) {
|
358
362
|
var node_handle = RegisterElementHandle(node);
|
359
|
-
var tag = node.tagName.toLowerCase();
|
363
|
+
var tag = node.tagName ? node.tagName.toLowerCase() : '';
|
364
|
+
var name = node.nodeName;
|
360
365
|
var type = null;
|
361
366
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
362
|
-
node_data_array.push({handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable});
|
367
|
+
node_data_array.push({handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable});
|
363
368
|
}
|
364
369
|
return node_data_array;
|
365
370
|
JAVASCRIPT
|
@@ -378,10 +383,11 @@ module Isomorfeus
|
|
378
383
|
var node = xpath_result.singleNodeValue;
|
379
384
|
if (node) {
|
380
385
|
var node_handle = RegisterElementHandle(node);
|
381
|
-
var tag = node.tagName.toLowerCase();
|
386
|
+
var tag = node.tagName ? node.tagName.toLowerCase() : '';
|
387
|
+
var name = node.nodeName;
|
382
388
|
var type = null;
|
383
389
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
384
|
-
return {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
|
390
|
+
return {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
|
385
391
|
}
|
386
392
|
JAVASCRIPT
|
387
393
|
if node_data
|
@@ -467,8 +473,9 @@ module Isomorfeus
|
|
467
473
|
node_data = @context.exec <<~JAVASCRIPT
|
468
474
|
var node = AllDomHandles[#{document.handle}].window.document.head;
|
469
475
|
var node_handle = RegisterElementHandle(node);
|
476
|
+
var name = node.nodeName;
|
470
477
|
var tag = node.tagName.toLowerCase();
|
471
|
-
return {handle: node_handle, tag: tag, type: null, content_editable: node.isContentEditable};
|
478
|
+
return {handle: node_handle, name: name, tag: tag, type: null, content_editable: node.isContentEditable};
|
472
479
|
JAVASCRIPT
|
473
480
|
if node_data
|
474
481
|
node_data[:css_selector] = 'body'
|
@@ -855,10 +862,11 @@ module Isomorfeus
|
|
855
862
|
node = AllDomHandles[#{document.handle}].window.document.querySelector("#{js_escaped_selector}");
|
856
863
|
if (node) {
|
857
864
|
var node_handle = RegisterElementHandle(node);
|
865
|
+
var name = node.nodeName;
|
858
866
|
var tag = node.tagName.toLowerCase();
|
859
867
|
var type = null;
|
860
868
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
861
|
-
LastResult = {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
|
869
|
+
LastResult = {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
|
862
870
|
resolve(true);
|
863
871
|
}
|
864
872
|
else if ((new Date() - start_time) > #{@jsdom_timeout}) { resolve(true); }
|
@@ -885,10 +893,11 @@ module Isomorfeus
|
|
885
893
|
node = xpath_result.singleNodeValue;
|
886
894
|
if (node) {
|
887
895
|
var node_handle = RegisterElementHandle(node);
|
896
|
+
var name = node.nodeName;
|
888
897
|
var tag = node.tagName.toLowerCase();
|
889
898
|
var type = null;
|
890
899
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
891
|
-
LastResult = {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
|
900
|
+
LastResult = {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
|
892
901
|
resolve(true);
|
893
902
|
}
|
894
903
|
else if ((new Date() - start_time) > #{@jsdom_timeout}) { resolve(true); }
|
@@ -228,7 +228,7 @@ module Isomorfeus
|
|
228
228
|
end
|
229
229
|
|
230
230
|
def node_execute_script(node, script, *args)
|
231
|
-
# TODO
|
231
|
+
# TODO this wont work yet
|
232
232
|
await <<~JAVASCRIPT
|
233
233
|
var node_handle = #{node.handle};
|
234
234
|
await AllElementHandles[node_handle].executionContext().evaluateHandle((node, arguments) => {
|
@@ -239,7 +239,7 @@ module Isomorfeus
|
|
239
239
|
end
|
240
240
|
|
241
241
|
def node_evaluate_script(node, script, *args)
|
242
|
-
# TODO
|
242
|
+
# TODO this wont work yet
|
243
243
|
await <<~JAVASCRIPT
|
244
244
|
var node_handle = #{node.handle};
|
245
245
|
await AllElementHandles[node_handle].executionContext().evaluateHandle((node, arguments) => {
|
@@ -256,10 +256,11 @@ module Isomorfeus
|
|
256
256
|
var node = AllElementHandles[#{node.handle}].querySelector("#{js_escaped_selector}");
|
257
257
|
if (node) {
|
258
258
|
var node_handle = RegisterElementHandle(node);
|
259
|
+
var name = node.nodeName;
|
259
260
|
var tag = node.tagName.toLowerCase();
|
260
261
|
var type = null;
|
261
262
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
262
|
-
return {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
|
263
|
+
return {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
|
263
264
|
}
|
264
265
|
JAVASCRIPT
|
265
266
|
if node_data
|
@@ -280,10 +281,11 @@ module Isomorfeus
|
|
280
281
|
if (node_array) {
|
281
282
|
for (var i=0; i<node_array.length; i++) {
|
282
283
|
var node_handle = RegisterElementHandle(node_array[i]);
|
284
|
+
var name = node_array[i].nodeName;
|
283
285
|
var tag = node_array[i].tagName.toLowerCase();
|
284
286
|
var type = null;
|
285
287
|
if (tag === 'input') { type = node_array[i].getAttribute('type'); }
|
286
|
-
node_data_array.push({handle: node_handle, tag: tag, type: type, content_editable: node_array[i].isContentEditable});
|
288
|
+
node_data_array.push({handle: node_handle, name: name, tag: tag, type: type, content_editable: node_array[i].isContentEditable});
|
287
289
|
}
|
288
290
|
}
|
289
291
|
return node_data_array;
|
@@ -302,12 +304,13 @@ module Isomorfeus
|
|
302
304
|
var xpath_result = document.evaluate("#{js_escaped_query}", AllElementHandles[#{node.handle}], null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
|
303
305
|
var node;
|
304
306
|
var node_data_array = [];
|
305
|
-
while (node = xpath_result.iterateNext) {
|
307
|
+
while (node = xpath_result.iterateNext()) {
|
306
308
|
var node_handle = RegisterElementHandle(node);
|
309
|
+
var name = node.nodeName;
|
307
310
|
var tag = node.tagName.toLowerCase();
|
308
311
|
var type = null;
|
309
312
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
310
|
-
node_data_array.push({handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable});
|
313
|
+
node_data_array.push({handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable});
|
311
314
|
}
|
312
315
|
return node_data_array;
|
313
316
|
JAVASCRIPT
|
@@ -326,10 +329,11 @@ module Isomorfeus
|
|
326
329
|
var node = xpath_result.singleNodeValue;
|
327
330
|
if (node) {
|
328
331
|
var node_handle = RegisterElementHandle(node);
|
332
|
+
var name = node.nodeName;
|
329
333
|
var tag = node.tagName.toLowerCase();
|
330
334
|
var type = null;
|
331
335
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
332
|
-
return {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
|
336
|
+
return {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
|
333
337
|
}
|
334
338
|
JAVASCRIPT
|
335
339
|
if node_data
|
@@ -784,10 +788,11 @@ module Isomorfeus
|
|
784
788
|
var node = AllElementHandles[#{node.handle}].querySelector("#{js_escaped_selector}");
|
785
789
|
if (node) {
|
786
790
|
var node_handle = RegisterElementHandle(node);
|
791
|
+
var name = node.nodeName;
|
787
792
|
var tag = node.tagName.toLowerCase();
|
788
793
|
var type = null;
|
789
794
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
790
|
-
LastResult = {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
|
795
|
+
LastResult = {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
|
791
796
|
resolve(true);
|
792
797
|
}
|
793
798
|
else if ((new Date() - start_time) > #{@jsdom_timeout}) { resolve(true); }
|
@@ -813,10 +818,11 @@ module Isomorfeus
|
|
813
818
|
var node = xpath_result.singleNodeValue;
|
814
819
|
if (node) {
|
815
820
|
var node_handle = RegisterElementHandle(node);
|
821
|
+
var name = node.nodeName;
|
816
822
|
var tag = node.tagName.toLowerCase();
|
817
823
|
var type = null;
|
818
824
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
819
|
-
LastResult = {handle: node_handle, tag: tag, type: type, content_editable: node.isContentEditable};
|
825
|
+
LastResult = {handle: node_handle, name: name, tag: tag, type: type, content_editable: node.isContentEditable};
|
820
826
|
resolve(true);
|
821
827
|
}
|
822
828
|
else if ((new Date() - start_time) > #{@jsdom_timeout}) { resolve(true); }
|
@@ -102,12 +102,13 @@ module Isomorfeus
|
|
102
102
|
node_data = await <<~JAVASCRIPT
|
103
103
|
var tt = await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
|
104
104
|
node = frame.contentDocument.body;
|
105
|
+
var name = node.nodeName;
|
105
106
|
var tag = node.tagName.toLowerCase();
|
106
107
|
var type = null;
|
107
108
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
108
|
-
return [tag, type];
|
109
|
+
return [name, tag, type];
|
109
110
|
}, AllElementHandles[#{frame.handle}]);
|
110
|
-
LastResult = {handle: node_handle,
|
111
|
+
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2]};
|
111
112
|
JAVASCRIPT
|
112
113
|
if node_data
|
113
114
|
node_data[:css_selector] = 'body'
|
@@ -127,12 +128,13 @@ module Isomorfeus
|
|
127
128
|
node_data = await <<~JAVASCRIPT
|
128
129
|
var tt = await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
|
129
130
|
node = frame.contentDocument.head;
|
131
|
+
var name = node.nodeName;
|
130
132
|
var tag = node.tagName.toLowerCase();
|
131
133
|
var type = null;
|
132
134
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
133
|
-
return [tag, type];
|
135
|
+
return [name, tag, type];
|
134
136
|
}, AllElementHandles[#{frame.handle}]);
|
135
|
-
LastResult = {handle: node_handle,
|
137
|
+
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2]};
|
136
138
|
JAVASCRIPT
|
137
139
|
if node_data
|
138
140
|
node_data[:css_selector] = 'body'
|
@@ -371,7 +373,7 @@ module Isomorfeus
|
|
371
373
|
if (!(BrowserType === 'firefox')) {
|
372
374
|
var target = page.target();
|
373
375
|
var cdp_session = await target.createCDPSession();
|
374
|
-
await cdp_session.send('Page.setDownloadBehavior', {behavior: 'allow', downloadPath: '#{Isomorfeus::Puppetmaster.
|
376
|
+
await cdp_session.send('Page.setDownloadBehavior', {behavior: 'allow', downloadPath: '#{Isomorfeus::Puppetmaster.download_path}'});
|
375
377
|
if (#{@url_blacklist}.length > 0) { await cdp_session.send('Network.setBlockedURLs', {urls: #{@url_blacklist}}); }
|
376
378
|
await cdp_session.detach();
|
377
379
|
}
|
@@ -92,10 +92,11 @@ module Isomorfeus
|
|
92
92
|
if (element_handle) {
|
93
93
|
var node_handle = RegisterElementHandle(element_handle);
|
94
94
|
var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
|
95
|
+
var name = node.nodeName;
|
95
96
|
var tag = node.tagName.toLowerCase();
|
96
|
-
return [tag, null, node.isContentEditable];
|
97
|
+
return [name, tag, null, node.isContentEditable];
|
97
98
|
}, AllElementHandles[node_handle]);
|
98
|
-
LastResult = {handle: node_handle,
|
99
|
+
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
|
99
100
|
}
|
100
101
|
JAVASCRIPT
|
101
102
|
if node_data
|
@@ -342,12 +343,13 @@ module Isomorfeus
|
|
342
343
|
if (element_handle) {
|
343
344
|
var node_handle = RegisterElementHandle(element_handle);
|
344
345
|
var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
|
345
|
-
var tag = node.tagName.toLowerCase();
|
346
|
+
var tag = node.tagName ? node.tagName.toLowerCase() : '';
|
347
|
+
var name = node.nodeName;
|
346
348
|
var type = null;
|
347
349
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
348
|
-
return [tag, type, node.isContentEditable];
|
350
|
+
return [name, tag, type, node.isContentEditable];
|
349
351
|
}, AllElementHandles[node_handle]);
|
350
|
-
LastResult = {handle: node_handle,
|
352
|
+
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
|
351
353
|
}
|
352
354
|
JAVASCRIPT
|
353
355
|
if node_data
|
@@ -367,12 +369,13 @@ module Isomorfeus
|
|
367
369
|
for (var i=0; i<element_handle_array.length; i++) {
|
368
370
|
var node_handle = RegisterElementHandle(element_handle_array[i]);
|
369
371
|
var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
|
370
|
-
var tag = node.tagName.toLowerCase();
|
372
|
+
var tag = node.tagName ? node.tagName.toLowerCase() : '';
|
373
|
+
var name = node.nodeName;
|
371
374
|
var type = null;
|
372
375
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
373
|
-
return [tag, type, node.isContentEditable];
|
376
|
+
return [name, tag, type, node.isContentEditable];
|
374
377
|
}, AllElementHandles[node_handle]);
|
375
|
-
node_data_array.push({handle: node_handle,
|
378
|
+
node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
|
376
379
|
}
|
377
380
|
}
|
378
381
|
LastResult = node_data_array;
|
@@ -392,12 +395,13 @@ module Isomorfeus
|
|
392
395
|
for (var i=0; i<element_handle_array.length; i++) {
|
393
396
|
var node_handle = RegisterElementHandle(element_handle_array[i]);
|
394
397
|
var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
|
395
|
-
var tag = node.tagName.toLowerCase();
|
398
|
+
var tag = node.tagName ? node.tagName.toLowerCase() : '';
|
399
|
+
var name = node.nodeName;
|
396
400
|
var type = null;
|
397
401
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
398
|
-
return [tag, type, node.isContentEditable];
|
402
|
+
return [name, tag, type, node.isContentEditable];
|
399
403
|
}, AllElementHandles[node_handle]);
|
400
|
-
node_data_array.push({handle: node_handle,
|
404
|
+
node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
|
401
405
|
}
|
402
406
|
}
|
403
407
|
LastResult = node_data_array;
|
@@ -416,12 +420,13 @@ module Isomorfeus
|
|
416
420
|
if (element_handle) {
|
417
421
|
var node_handle = RegisterElementHandle(element_handle);
|
418
422
|
var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
|
419
|
-
var tag = node.tagName.toLowerCase();
|
423
|
+
var tag = node.tagName ? node.tagName.toLowerCase() : '';
|
424
|
+
var name = node.nodeName;
|
420
425
|
var type = null;
|
421
426
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
422
|
-
return [tag, type, node.isContentEditable];
|
427
|
+
return [name, tag, type, node.isContentEditable];
|
423
428
|
}, AllElementHandles[node_handle]);
|
424
|
-
LastResult = {handle: node_handle,
|
429
|
+
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
|
425
430
|
}
|
426
431
|
JAVASCRIPT
|
427
432
|
if node_data
|
@@ -553,10 +558,11 @@ module Isomorfeus
|
|
553
558
|
if (element_handle) {
|
554
559
|
var node_handle = RegisterElementHandle(element_handle);
|
555
560
|
var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
|
561
|
+
var name = node.nodeName;
|
556
562
|
var tag = node.tagName.toLower();
|
557
|
-
return [tag, null, node.isContentEditable];
|
563
|
+
return [name, tag, null, node.isContentEditable];
|
558
564
|
}, AllElementHandles[node_handle]);
|
559
|
-
LastResult = {handle: node_handle,
|
565
|
+
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
|
560
566
|
}
|
561
567
|
JAVASCRIPT
|
562
568
|
if node_data
|
@@ -586,7 +592,7 @@ module Isomorfeus
|
|
586
592
|
if (!(BrowserType === 'firefox')) {
|
587
593
|
var new_target = new_page.target();
|
588
594
|
var cdp_session = await new_target.createCDPSession();
|
589
|
-
await cdp_session.send('Page.setDownloadBehavior', {behavior: 'allow', downloadPath: '#{Isomorfeus::Puppetmaster.
|
595
|
+
await cdp_session.send('Page.setDownloadBehavior', {behavior: 'allow', downloadPath: '#{Isomorfeus::Puppetmaster.download_path}'});
|
590
596
|
if (#{@url_blacklist}.length > 0) { await cdp_session.send('Network.setBlockedURLs', {urls: #{@url_blacklist}}); }
|
591
597
|
await cdp_session.detach();
|
592
598
|
}
|
@@ -900,12 +906,13 @@ module Isomorfeus
|
|
900
906
|
if (element_handle) {
|
901
907
|
var node_handle = RegisterElementHandle(element_handle);
|
902
908
|
var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
|
909
|
+
var name = node.nodeName;
|
903
910
|
var tag = node.tagName.toLowerCase();
|
904
911
|
var type = null;
|
905
912
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
906
|
-
return [tag, type, node.isContentEditable];
|
913
|
+
return [name, tag, type, node.isContentEditable];
|
907
914
|
}, AllElementHandles[node_handle]);
|
908
|
-
LastResult = {handle: node_handle,
|
915
|
+
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
|
909
916
|
}
|
910
917
|
JAVASCRIPT
|
911
918
|
if node_data
|
@@ -923,12 +930,13 @@ module Isomorfeus
|
|
923
930
|
if (element_handle) {
|
924
931
|
var node_handle = RegisterElementHandle(element_handle);
|
925
932
|
var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
|
933
|
+
var name = node.nodeName;
|
926
934
|
var tag = node.tagName.toLowerCase();
|
927
935
|
var type = null;
|
928
936
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
929
|
-
return [tag, type, node.isContentEditable];
|
937
|
+
return [name, tag, type, node.isContentEditable];
|
930
938
|
}, AllElementHandles[node_handle]);
|
931
|
-
LastResult = {handle: node_handle,
|
939
|
+
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
|
932
940
|
}
|
933
941
|
JAVASCRIPT
|
934
942
|
if node_data
|
@@ -312,12 +312,13 @@ module Isomorfeus
|
|
312
312
|
if (element_handle) {
|
313
313
|
var node_handle = RegisterElementHandle(element_handle);
|
314
314
|
var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
|
315
|
+
var name = node.nodeName;
|
315
316
|
var tag = node.tagName.toLowerCase();
|
316
317
|
var type = null;
|
317
318
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
318
|
-
return [tag, type, node.isContentEditable];
|
319
|
+
return [name, tag, type, node.isContentEditable];
|
319
320
|
}, AllElementHandles[node_handle]);
|
320
|
-
LastResult = {handle: node_handle,
|
321
|
+
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
|
321
322
|
}
|
322
323
|
JAVASCRIPT
|
323
324
|
if node_data
|
@@ -338,12 +339,13 @@ module Isomorfeus
|
|
338
339
|
for (var i=0; i<element_handle_array.length; i++) {
|
339
340
|
var node_handle = RegisterElementHandle(element_handle_array[i]);
|
340
341
|
var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
|
342
|
+
var name = node.nodeName;
|
341
343
|
var tag = node.tagName.toLowerCase();
|
342
344
|
var type = null;
|
343
345
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
344
|
-
return [tag, type, node.isContentEditable];
|
346
|
+
return [name, tag, type, node.isContentEditable];
|
345
347
|
}, AllElementHandles[node_handle]);
|
346
|
-
node_data_array.push({handle: node_handle,
|
348
|
+
node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
|
347
349
|
}
|
348
350
|
}
|
349
351
|
LastResult = node_data_array;
|
@@ -363,12 +365,13 @@ module Isomorfeus
|
|
363
365
|
for (var i=0; i<element_handle_array.length; i++) {
|
364
366
|
var node_handle = RegisterElementHandle(element_handle_array[i]);
|
365
367
|
var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
|
368
|
+
var name = node.nodeName;
|
366
369
|
var tag = node.tagName.toLowerCase();
|
367
370
|
var type = null;
|
368
371
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
369
|
-
return [tag, type, node.isContentEditable];
|
372
|
+
return [name, tag, type, node.isContentEditable];
|
370
373
|
}, AllElementHandles[node_handle]);
|
371
|
-
node_data_array.push({handle: node_handle,
|
374
|
+
node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
|
372
375
|
}
|
373
376
|
}
|
374
377
|
LastResult = node_data_array;
|
@@ -387,12 +390,13 @@ module Isomorfeus
|
|
387
390
|
if (element_handle) {
|
388
391
|
var node_handle = RegisterElementHandle(element_handle);
|
389
392
|
var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
|
393
|
+
var name = node.nodeName;
|
390
394
|
var tag = node.tagName.toLowerCase();
|
391
395
|
var type = null;
|
392
396
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
393
|
-
return [tag, type, node.isContentEditable];
|
397
|
+
return [name, tag, type, node.isContentEditable];
|
394
398
|
}, AllElementHandles[node_handle]);
|
395
|
-
LastResult = {handle: node_handle,
|
399
|
+
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
|
396
400
|
}
|
397
401
|
JAVASCRIPT
|
398
402
|
if node_data
|
@@ -822,13 +826,14 @@ module Isomorfeus
|
|
822
826
|
if (element_handle) {
|
823
827
|
var node_handle = RegisterElementHandle(element_handle);
|
824
828
|
var handle = await AllElementHandles[node_handle].evaluate((node) => {
|
829
|
+
var name = node.nodeName;
|
825
830
|
var tag = node.tagName.toLower();
|
826
831
|
var type = null;
|
827
832
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
828
|
-
return [tag, type];
|
833
|
+
return [name, tag, type, node.isContentEditable];
|
829
834
|
}, AllElementHandles[node_handle]);
|
830
835
|
var tt = await handle.jsonValue();
|
831
|
-
LastResult = {handle: node_handle,
|
836
|
+
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
|
832
837
|
}
|
833
838
|
JAVASCRIPT
|
834
839
|
if node_data
|
@@ -846,13 +851,14 @@ module Isomorfeus
|
|
846
851
|
if (element_handle) {
|
847
852
|
var node_handle = RegisterElementHandle(element_handle);
|
848
853
|
var handle = await AllElementHandles[node_handle].evaluate((node) => {
|
854
|
+
var name = node.nodeName;
|
849
855
|
var tag = node.tagName.toLower();
|
850
856
|
var type = null;
|
851
857
|
if (tag === 'input') { type = node.getAttribute('type'); }
|
852
|
-
return [tag, type];
|
858
|
+
return [name, tag, type, node.isContentEditable];
|
853
859
|
}, AllElementHandles[node_handle]);
|
854
860
|
var tt = await handle.jsonValue();
|
855
|
-
LastResult = {handle: node_handle,
|
861
|
+
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
|
856
862
|
}
|
857
863
|
JAVASCRIPT
|
858
864
|
if node_data
|
@@ -1,13 +1,24 @@
|
|
1
1
|
module Isomorfeus
|
2
2
|
module Puppetmaster
|
3
3
|
module DSL
|
4
|
+
def default_document
|
5
|
+
@puppetmaster_default_document ||= get_default_document
|
6
|
+
end
|
7
|
+
|
4
8
|
def goto(uri)
|
5
|
-
puppetmaster_session.document_goto(
|
9
|
+
puppetmaster_session.document_goto(default_document, uri)
|
6
10
|
@puppetmaster_default_document
|
7
11
|
end
|
8
|
-
|
9
12
|
alias_method :visit, :goto
|
10
13
|
|
14
|
+
def on_server(ruby_source = '', &block)
|
15
|
+
Isomorfeus::Puppetmaster.served_app.on_server(ruby_source, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def open_new_session(app = nil, driver = nil)
|
19
|
+
Isomorfeus::Puppetmaster.drivers[driver ? driver : Isomorfeus::Puppetmaster.driver].call(app ? app : Isomorfeus::Puppetmaster.served_app)
|
20
|
+
end
|
21
|
+
|
11
22
|
def open_new_document(uri = nil)
|
12
23
|
puppetmaster_session.document_open_new_document(uri)
|
13
24
|
end
|
@@ -24,17 +35,10 @@ module Isomorfeus
|
|
24
35
|
puppetmaster_session.document_open_new_document('about:blank')
|
25
36
|
end
|
26
37
|
|
27
|
-
def puppetmaster_default_document
|
28
|
-
@puppetmaster_default_document ||= get_default_document
|
29
|
-
end
|
30
|
-
|
31
38
|
def puppetmaster_session
|
32
|
-
@@puppetmaster_session ||=
|
39
|
+
@@puppetmaster_session ||= open_new_session(Isomorfeus::Puppetmaster.served_app)
|
33
40
|
end
|
34
41
|
|
35
|
-
def new_session(app = nil, driver = nil)
|
36
|
-
Isomorfeus::Puppetmaster.drivers[driver ? driver : Isomorfeus::Puppetmaster.driver].call(app ? app : Isomorfeus::Puppetmaster.served_app)
|
37
|
-
end
|
38
42
|
end
|
39
43
|
end
|
40
44
|
end
|
@@ -84,7 +84,7 @@ module Isomorfeus
|
|
84
84
|
wait_for_xpath
|
85
85
|
]
|
86
86
|
|
87
|
-
attr_reader :document, :handle, :css_selector, :tag, :xpath_query
|
87
|
+
attr_reader :document, :handle, :css_selector, :name, :tag, :xpath_query
|
88
88
|
|
89
89
|
SUPPORTED_HTML_ELEMENTS.each do |element|
|
90
90
|
is_name = element == 'a' ? :is_link? : "is_#{element}?".to_sym
|
@@ -123,6 +123,7 @@ module Isomorfeus
|
|
123
123
|
@document = document
|
124
124
|
@driver = driver
|
125
125
|
@handle = node_data[:handle] || node_data['handle']
|
126
|
+
@name = node_data[:name] || node_data['name']
|
126
127
|
@tag = node_data[:tag] || node_data['tag']
|
127
128
|
@type = node_data[:type] || node_data['type']
|
128
129
|
@xpath_query = node_data[:xpath_query] || node_data['xpath_query']
|
@@ -137,6 +138,24 @@ module Isomorfeus
|
|
137
138
|
@driver.node_equal(self, other)
|
138
139
|
end
|
139
140
|
|
141
|
+
def evaluate_ruby(ruby_source = '', &block)
|
142
|
+
ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
|
143
|
+
compiled_ruby = compile_ruby_source(ruby_source)
|
144
|
+
if compiled_ruby.start_with?('/*')
|
145
|
+
start_of_code = compiled_ruby.index('*/') + 3
|
146
|
+
compiled_ruby = compiled_ruby[start_of_code..-1]
|
147
|
+
end
|
148
|
+
javascript = <<~JAVASCRIPT
|
149
|
+
(function(){
|
150
|
+
if (typeof Opal === "undefined") {
|
151
|
+
#{Isomorfeus::Puppetmaster.opal_prelude}
|
152
|
+
}
|
153
|
+
return #{compiled_ruby}
|
154
|
+
})()
|
155
|
+
JAVASCRIPT
|
156
|
+
evaluate_script(javascript)
|
157
|
+
end
|
158
|
+
|
140
159
|
def get_attribute(attribute)
|
141
160
|
attribute = attribute.to_s
|
142
161
|
if !(attribute.start_with?('aria-') || attribute.start_with?('data-'))
|
@@ -236,6 +255,13 @@ module Isomorfeus
|
|
236
255
|
# :assert_none_of_selectors,
|
237
256
|
# :assert_no_text,
|
238
257
|
# :refute_selector
|
258
|
+
|
259
|
+
protected
|
260
|
+
|
261
|
+
def compile_ruby_source(source_code)
|
262
|
+
# TODO maybe use compile server
|
263
|
+
Opal.compile(source_code, parse_comments: false)
|
264
|
+
end
|
239
265
|
end
|
240
266
|
end
|
241
267
|
end
|
@@ -40,6 +40,12 @@ module Isomorfeus
|
|
40
40
|
extra_middleware: [])
|
41
41
|
@app = app
|
42
42
|
@extra_middleware = extra_middleware
|
43
|
+
@request_key = Isomorfeus::Puppetmaster::Server::ExecutorMiddleware.class_variable_get(:@@request_key)
|
44
|
+
unless @request_key
|
45
|
+
@request_key = SecureRandom.alphanumeric(128)
|
46
|
+
Isomorfeus::Puppetmaster::Server::ExecutorMiddleware.class_variable_set(:@@request_key, @request_key)
|
47
|
+
end
|
48
|
+
@extra_middleware << Isomorfeus::Puppetmaster::Server::ExecutorMiddleware
|
43
49
|
@server_thread = nil # suppress warnings
|
44
50
|
@host = host
|
45
51
|
@port = port
|
@@ -56,6 +62,25 @@ module Isomorfeus
|
|
56
62
|
middleware.error
|
57
63
|
end
|
58
64
|
|
65
|
+
def on_server(ruby_source = '', &block)
|
66
|
+
ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
|
67
|
+
request_hash = { 'key' => @request_key, 'code' => ruby_source }
|
68
|
+
response = if using_ssl?
|
69
|
+
http = Net::HTTP.start(@host, @port, { use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_NONE })
|
70
|
+
http.post('/__executor__', Oj.dump(request_hash, {}))
|
71
|
+
else
|
72
|
+
http = Net::HTTP.start(@host, @port)
|
73
|
+
http.post('/__executor__', Oj.dump(request_hash, {}))
|
74
|
+
end
|
75
|
+
if response.code == '200'
|
76
|
+
result_hash = Oj.load(response.body, {})
|
77
|
+
raise result_hash['error'] if result_hash.has_key?('error')
|
78
|
+
result_hash['result']
|
79
|
+
else
|
80
|
+
raise 'A error occured.'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
59
84
|
def using_ssl?
|
60
85
|
@checker.ssl?
|
61
86
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Isomorfeus
|
4
|
+
module Puppetmaster
|
5
|
+
class Server
|
6
|
+
class ExecutorMiddleware
|
7
|
+
@@request_key = nil
|
8
|
+
|
9
|
+
def initialize(app)
|
10
|
+
raise '@@request_key not set!' unless @@request_key
|
11
|
+
@app = app
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
if env['PATH_INFO'] == '/__executor__' && env['REQUEST_METHOD'] == 'POST'
|
16
|
+
request = Rack::Request.new(env)
|
17
|
+
unless request.body.nil?
|
18
|
+
request_hash = Oj.load(request.body.read, {})
|
19
|
+
if request_hash['key'] != @@request_key
|
20
|
+
Rack::Response.new(Oj.dump({ 'error' => 'wrong key given, execution denied' }, {}), 401, 'Content-Type' => 'application/json').finish
|
21
|
+
end
|
22
|
+
begin
|
23
|
+
result = Object.instance_eval(request_hash['code']) if request_hash['code']
|
24
|
+
rescue Exception => e
|
25
|
+
Rack::Response.new(Oj.dump({ 'error' => "#{e.class}: #{e.message}" }, {}), 200, 'Content-Type' => 'application/json').finish
|
26
|
+
end
|
27
|
+
Rack::Response.new(Oj.dump({ 'result' => result }, {}), 200, 'Content-Type' => 'application/json').finish
|
28
|
+
end
|
29
|
+
else
|
30
|
+
@app.call(env)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: isomorfeus-puppetmaster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Biedermann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -38,6 +38,76 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.2.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: method_source
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: opal
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.11.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.11.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: opal-browser
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.2.0
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.2.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: parser
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: unparser
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
41
111
|
- !ruby/object:Gem::Dependency
|
42
112
|
name: agoo
|
43
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -253,6 +323,7 @@ files:
|
|
253
323
|
- lib/isomorfeus/puppetmaster/self_forwardable.rb
|
254
324
|
- lib/isomorfeus/puppetmaster/server.rb
|
255
325
|
- lib/isomorfeus/puppetmaster/server/checker.rb
|
326
|
+
- lib/isomorfeus/puppetmaster/server/executor_middleware.rb
|
256
327
|
- lib/isomorfeus/puppetmaster/server/middleware.rb
|
257
328
|
- lib/isomorfeus/puppetmaster/server_registration.rb
|
258
329
|
- lib/isomorfeus/puppetmaster/version.rb
|