isomorfeus-puppetmaster 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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): [![CircleCI](https://circleci.com/gh/isomorfeus/isomorfeus-puppetmaster/tree/master.svg?style=svg)](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): [![Build Status](https://travis-ci.org/isomorfeus/isomorfeus-puppetmaster.svg?branch=master)](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
|