isomorfeus-puppetmaster 0.3.1 → 0.4.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 +3 -9
- data/lib/isomorfeus-puppetmaster.rb +1 -4
- data/lib/isomorfeus/puppetmaster/document.rb +35 -23
- data/lib/isomorfeus/puppetmaster/driver/puppeteer.rb +41 -35
- data/lib/isomorfeus/puppetmaster/driver/puppeteer_document.rb +30 -8
- data/lib/isomorfeus/puppetmaster/driver_registration.rb +2 -12
- data/lib/isomorfeus/puppetmaster/self_forwardable.rb +8 -0
- data/lib/isomorfeus/puppetmaster/server.rb +13 -9
- data/lib/isomorfeus/puppetmaster/server/executor_middleware.rb +17 -8
- data/lib/isomorfeus/puppetmaster/version.rb +1 -1
- metadata +41 -44
- data/lib/isomorfeus/puppetmaster/driver/jsdom.rb +0 -373
- data/lib/isomorfeus/puppetmaster/driver/jsdom_document.rb +0 -917
- data/lib/isomorfeus/puppetmaster/driver/jsdom_node.rb +0 -842
@@ -14,18 +14,27 @@ module Isomorfeus
|
|
14
14
|
def call(env)
|
15
15
|
if env['PATH_INFO'] == '/__executor__' && env['REQUEST_METHOD'] == 'POST'
|
16
16
|
request = Rack::Request.new(env)
|
17
|
+
response = nil
|
17
18
|
unless request.body.nil?
|
18
|
-
request_hash = Oj.load(request.body.read,
|
19
|
+
request_hash = Oj.load(request.body.read, mode: :strict)
|
19
20
|
if request_hash['key'] != @@request_key
|
20
|
-
Rack::Response.new(Oj.dump({ 'error' => 'wrong key given, execution denied' }
|
21
|
+
response = Rack::Response.new(Oj.dump({ 'error' => 'wrong key given, execution denied' }),
|
22
|
+
401,
|
23
|
+
'Content-Type' => 'application/json')
|
24
|
+
else
|
25
|
+
begin
|
26
|
+
result = TOPLEVEL_BINDING.eval('self').instance_eval(request_hash['code']) if request_hash['code']
|
27
|
+
response = Rack::Response.new(Oj.dump({ 'result' => result }),
|
28
|
+
200,
|
29
|
+
'Content-Type' => 'application/json')
|
30
|
+
rescue Exception => e
|
31
|
+
response = Rack::Response.new(Oj.dump({ 'error' => "#{e.class}: #{e.message}", 'backtrace' => e.backtrace.join("\n") }),
|
32
|
+
200,
|
33
|
+
'Content-Type' => 'application/json')
|
34
|
+
end
|
21
35
|
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
36
|
end
|
37
|
+
response.finish
|
29
38
|
else
|
30
39
|
@app.call(env)
|
31
40
|
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.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Biedermann
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.3.1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: 0.3.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: method_source
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: oj
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 3.11.1
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 3.11.1
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: opal
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,7 +109,7 @@ dependencies:
|
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
112
|
+
name: tty-which
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
115
|
- - ">="
|
@@ -109,19 +123,19 @@ dependencies:
|
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
126
|
+
name: unparser
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
|
-
- - "
|
129
|
+
- - ">="
|
116
130
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
118
|
-
type: :
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
|
-
- - "
|
136
|
+
- - ">="
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
138
|
+
version: '0'
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: chunky_png
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,14 +156,14 @@ dependencies:
|
|
142
156
|
requirements:
|
143
157
|
- - "~>"
|
144
158
|
- !ruby/object:Gem::Version
|
145
|
-
version: 0.
|
159
|
+
version: 0.38.0
|
146
160
|
type: :development
|
147
161
|
prerelease: false
|
148
162
|
version_requirements: !ruby/object:Gem::Requirement
|
149
163
|
requirements:
|
150
164
|
- - "~>"
|
151
165
|
- !ruby/object:Gem::Version
|
152
|
-
version: 0.
|
166
|
+
version: 0.38.0
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
168
|
name: fastimage
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,20 +178,6 @@ dependencies:
|
|
164
178
|
- - ">="
|
165
179
|
- !ruby/object:Gem::Version
|
166
180
|
version: '0'
|
167
|
-
- !ruby/object:Gem::Dependency
|
168
|
-
name: iodine
|
169
|
-
requirement: !ruby/object:Gem::Requirement
|
170
|
-
requirements:
|
171
|
-
- - "~>"
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: 0.7.36
|
174
|
-
type: :development
|
175
|
-
prerelease: false
|
176
|
-
version_requirements: !ruby/object:Gem::Requirement
|
177
|
-
requirements:
|
178
|
-
- - "~>"
|
179
|
-
- !ruby/object:Gem::Version
|
180
|
-
version: 0.7.36
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
182
|
name: irb
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,28 +198,28 @@ dependencies:
|
|
198
198
|
requirements:
|
199
199
|
- - "~>"
|
200
200
|
- !ruby/object:Gem::Version
|
201
|
-
version: '2.
|
201
|
+
version: '2.5'
|
202
202
|
type: :development
|
203
203
|
prerelease: false
|
204
204
|
version_requirements: !ruby/object:Gem::Requirement
|
205
205
|
requirements:
|
206
206
|
- - "~>"
|
207
207
|
- !ruby/object:Gem::Version
|
208
|
-
version: '2.
|
208
|
+
version: '2.5'
|
209
209
|
- !ruby/object:Gem::Dependency
|
210
210
|
name: nokogiri
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|
212
212
|
requirements:
|
213
213
|
- - "~>"
|
214
214
|
- !ruby/object:Gem::Version
|
215
|
-
version: 1.
|
215
|
+
version: 1.11.0
|
216
216
|
type: :development
|
217
217
|
prerelease: false
|
218
218
|
version_requirements: !ruby/object:Gem::Requirement
|
219
219
|
requirements:
|
220
220
|
- - "~>"
|
221
221
|
- !ruby/object:Gem::Version
|
222
|
-
version: 1.
|
222
|
+
version: 1.11.0
|
223
223
|
- !ruby/object:Gem::Dependency
|
224
224
|
name: os
|
225
225
|
requirement: !ruby/object:Gem::Requirement
|
@@ -240,28 +240,28 @@ dependencies:
|
|
240
240
|
requirements:
|
241
241
|
- - ">="
|
242
242
|
- !ruby/object:Gem::Version
|
243
|
-
version:
|
243
|
+
version: 2.4.0
|
244
244
|
type: :development
|
245
245
|
prerelease: false
|
246
246
|
version_requirements: !ruby/object:Gem::Requirement
|
247
247
|
requirements:
|
248
248
|
- - ">="
|
249
249
|
- !ruby/object:Gem::Version
|
250
|
-
version:
|
250
|
+
version: 2.4.0
|
251
251
|
- !ruby/object:Gem::Dependency
|
252
252
|
name: puma
|
253
253
|
requirement: !ruby/object:Gem::Requirement
|
254
254
|
requirements:
|
255
255
|
- - "~>"
|
256
256
|
- !ruby/object:Gem::Version
|
257
|
-
version:
|
257
|
+
version: 5.3.0
|
258
258
|
type: :development
|
259
259
|
prerelease: false
|
260
260
|
version_requirements: !ruby/object:Gem::Requirement
|
261
261
|
requirements:
|
262
262
|
- - "~>"
|
263
263
|
- !ruby/object:Gem::Version
|
264
|
-
version:
|
264
|
+
version: 5.3.0
|
265
265
|
- !ruby/object:Gem::Dependency
|
266
266
|
name: rake
|
267
267
|
requirement: !ruby/object:Gem::Requirement
|
@@ -296,14 +296,14 @@ dependencies:
|
|
296
296
|
requirements:
|
297
297
|
- - "~>"
|
298
298
|
- !ruby/object:Gem::Version
|
299
|
-
version:
|
299
|
+
version: 2.1.0
|
300
300
|
type: :development
|
301
301
|
prerelease: false
|
302
302
|
version_requirements: !ruby/object:Gem::Requirement
|
303
303
|
requirements:
|
304
304
|
- - "~>"
|
305
305
|
- !ruby/object:Gem::Version
|
306
|
-
version:
|
306
|
+
version: 2.1.0
|
307
307
|
description: Acceptance testing for isomorfeus.
|
308
308
|
email: jan@kursator.de
|
309
309
|
executables: []
|
@@ -317,9 +317,6 @@ files:
|
|
317
317
|
- lib/isomorfeus/puppetmaster/console_message.rb
|
318
318
|
- lib/isomorfeus/puppetmaster/cookie.rb
|
319
319
|
- lib/isomorfeus/puppetmaster/document.rb
|
320
|
-
- lib/isomorfeus/puppetmaster/driver/jsdom.rb
|
321
|
-
- lib/isomorfeus/puppetmaster/driver/jsdom_document.rb
|
322
|
-
- lib/isomorfeus/puppetmaster/driver/jsdom_node.rb
|
323
320
|
- lib/isomorfeus/puppetmaster/driver/puppeteer.rb
|
324
321
|
- lib/isomorfeus/puppetmaster/driver/puppeteer_document.rb
|
325
322
|
- lib/isomorfeus/puppetmaster/driver/puppeteer_node.rb
|
@@ -361,7 +358,7 @@ licenses:
|
|
361
358
|
- MIT
|
362
359
|
metadata:
|
363
360
|
github_repo: ssh://github.com/isomorfeus/gems
|
364
|
-
post_install_message:
|
361
|
+
post_install_message:
|
365
362
|
rdoc_options: []
|
366
363
|
require_paths:
|
367
364
|
- lib
|
@@ -376,8 +373,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
376
373
|
- !ruby/object:Gem::Version
|
377
374
|
version: '0'
|
378
375
|
requirements: []
|
379
|
-
rubygems_version: 3.
|
380
|
-
signing_key:
|
376
|
+
rubygems_version: 3.2.15
|
377
|
+
signing_key:
|
381
378
|
specification_version: 4
|
382
379
|
summary: Acceptance testing for isomorfeus.
|
383
380
|
test_files: []
|
@@ -1,373 +0,0 @@
|
|
1
|
-
module Isomorfeus
|
2
|
-
module Puppetmaster
|
3
|
-
module Driver
|
4
|
-
class Jsdom
|
5
|
-
include Isomorfeus::Puppetmaster::Driver::JsdomDocument
|
6
|
-
include Isomorfeus::Puppetmaster::Driver::JsdomNode
|
7
|
-
|
8
|
-
VIEWPORT_DEFAULT_WIDTH = 1024
|
9
|
-
VIEWPORT_DEFAULT_HEIGHT = 768
|
10
|
-
VIEWPORT_MAX_WIDTH = 1366
|
11
|
-
VIEWPORT_MAX_HEIGHT = 768
|
12
|
-
TIMEOUT = 30 # seconds
|
13
|
-
REACTION_TIMEOUT = 0.5
|
14
|
-
EVENTS = {
|
15
|
-
blur: ['FocusEvent', {}],
|
16
|
-
focus: ['FocusEvent', {}],
|
17
|
-
focusin: ['FocusEvent', { bubbles: true }],
|
18
|
-
focusout: ['FocusEvent', { bubbles: true }],
|
19
|
-
click: ['MouseEvent', { bubbles: true, cancelable: true }],
|
20
|
-
dblckick: ['MouseEvent', { bubbles: true, cancelable: true }],
|
21
|
-
mousedown: ['MouseEvent', { bubbles: true, cancelable: true }],
|
22
|
-
mouseup: ['MouseEvent', { bubbles: true, cancelable: true }],
|
23
|
-
mouseenter: ['MouseEvent', {}],
|
24
|
-
mouseleave: ['MouseEvent', {}],
|
25
|
-
mousemove: ['MouseEvent', { bubbles: true, cancelable: true }],
|
26
|
-
mouseover: ['MouseEvent', { bubbles: true, cancelable: true }],
|
27
|
-
mouseout: ['MouseEvent', { bubbles: true, cancelable: true }],
|
28
|
-
context_menu: ['MouseEvent', { bubble: true, cancelable: true }],
|
29
|
-
submit: ['Event', { bubbles: true, cancelable: true }],
|
30
|
-
change: ['Event', { bubbles: true, cacnelable: false }],
|
31
|
-
input: ['InputEvent', { bubbles: true, cacnelable: false }],
|
32
|
-
wheel: ['WheelEvent', { bubbles: true, cancelable: true }]
|
33
|
-
}.freeze
|
34
|
-
|
35
|
-
attr_accessor :default_document
|
36
|
-
|
37
|
-
def initialize(options = {})
|
38
|
-
@app = options.delete(:app)
|
39
|
-
@options = options.dup
|
40
|
-
@canvas = @options.delete(:canvas) { false }
|
41
|
-
@ignore_https_errors = !!@options.delete(:ignore_https_errors)
|
42
|
-
@max_width = @options.delete(:max_width) { VIEWPORT_MAX_WIDTH }
|
43
|
-
@max_height = @options.delete(:max_height) { VIEWPORT_MAX_HEIGHT }
|
44
|
-
@width = @options.delete(:width) { VIEWPORT_DEFAULT_WIDTH > @max_width ? @max_width : VIEWPORT_DEFAULT_WIDTH }
|
45
|
-
@height = @options.delete(:height) { VIEWPORT_DEFAULT_HEIGHT > @max_height ? @max_height : VIEWPORT_DEFAULT_HEIGHT }
|
46
|
-
@timeout = @options.delete(:timeout) { TIMEOUT }
|
47
|
-
@max_wait = @options.delete(:max_wait) { @timeout + 1 }
|
48
|
-
@reaction_timeout = @options.delete(:reaction_timeout) { REACTION_TIMEOUT }
|
49
|
-
@jsdom_timeout = @timeout * 1000
|
50
|
-
@jsdom_reaction_timeout = @reaction_timeout * 1000
|
51
|
-
@url_blacklist = @options.delete(:url_blacklist) { [] }
|
52
|
-
@context = ExecJS.permissive_compile(jsdom_launch)
|
53
|
-
page_handle, @browser = await_result
|
54
|
-
@default_document = Isomorfeus::Puppetmaster::Document.new(self, page_handle, Isomorfeus::Puppetmaster::Response.new('status' => 200))
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.document_handle_disposer(driver, handle)
|
58
|
-
cjs = <<~JAVASCRIPT
|
59
|
-
delete AllDomHandles[#{handle}];
|
60
|
-
delete ConsoleMessages[#{handle}];
|
61
|
-
JAVASCRIPT
|
62
|
-
proc { driver.execute_script(cjs) }
|
63
|
-
end
|
64
|
-
|
65
|
-
def self.node_handle_disposer(driver, handle)
|
66
|
-
cjs = <<~JAVASCRIPT
|
67
|
-
if (AllElementHandles[#{handle}]) { AllElementHandles[#{handle}].dispose(); }
|
68
|
-
delete AllElementHandles[#{handle}];
|
69
|
-
JAVASCRIPT
|
70
|
-
proc { driver.execute_script(cjs) }
|
71
|
-
end
|
72
|
-
|
73
|
-
def browser
|
74
|
-
@browser
|
75
|
-
end
|
76
|
-
|
77
|
-
def document_handles
|
78
|
-
@context.eval 'Object.keys(AllDomHandles)'
|
79
|
-
end
|
80
|
-
|
81
|
-
##### frame, all todo
|
82
|
-
|
83
|
-
def frame_all_text(frame)
|
84
|
-
await <<~JAVASCRIPT
|
85
|
-
LastResult = await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
|
86
|
-
return frame.contentDocument.documentElement.textContent;
|
87
|
-
}, AllElementHandles[#{frame.handle}]);
|
88
|
-
JAVASCRIPT
|
89
|
-
end
|
90
|
-
|
91
|
-
def frame_body(frame)
|
92
|
-
node_data = await <<~JAVASCRIPT
|
93
|
-
var tt = await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
|
94
|
-
node = frame.contentDocument.body;
|
95
|
-
var name = node.nodeName;
|
96
|
-
var tag = node.tagName.toLowerCase();
|
97
|
-
var type = null;
|
98
|
-
if (tag === 'input') { type = node.getAttribute('type'); }
|
99
|
-
return [name, tag, type];
|
100
|
-
}, AllElementHandles[#{frame.handle}]);
|
101
|
-
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2]};
|
102
|
-
JAVASCRIPT
|
103
|
-
if node_data
|
104
|
-
node_data[:css_selector] = 'body'
|
105
|
-
Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def frame_focus(frame)
|
110
|
-
await <<~JAVASCRIPT
|
111
|
-
await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
|
112
|
-
frame.contentDocument.documentElement.focus();
|
113
|
-
}, AllElementHandles[#{frame.handle}]);
|
114
|
-
JAVASCRIPT
|
115
|
-
end
|
116
|
-
|
117
|
-
def frame_head(frame)
|
118
|
-
node_data = await <<~JAVASCRIPT
|
119
|
-
var tt = await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
|
120
|
-
node = frame.contentDocument.head;
|
121
|
-
var name = node.nodeName;
|
122
|
-
var tag = node.tagName.toLowerCase();
|
123
|
-
var type = null;
|
124
|
-
if (tag === 'input') { type = node.getAttribute('type'); }
|
125
|
-
return [name, tag, type];
|
126
|
-
}, AllElementHandles[#{frame.handle}]);
|
127
|
-
LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2]};
|
128
|
-
JAVASCRIPT
|
129
|
-
if node_data
|
130
|
-
node_data[:css_selector] = 'body'
|
131
|
-
Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
def frame_html(frame)
|
136
|
-
await <<~JAVASCRIPT
|
137
|
-
LastResult = await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
|
138
|
-
return frame.contentDocument.documentElement.outerHTML;
|
139
|
-
}, AllElementHandles[#{frame.handle}]);
|
140
|
-
JAVASCRIPT
|
141
|
-
end
|
142
|
-
|
143
|
-
def frame_title(frame)
|
144
|
-
await <<~JAVASCRIPT
|
145
|
-
LastResult = await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
|
146
|
-
return frame.contentDocument.title;
|
147
|
-
}, AllElementHandles[#{frame.handle}]);
|
148
|
-
JAVASCRIPT
|
149
|
-
end
|
150
|
-
|
151
|
-
def frame_url(frame)
|
152
|
-
await <<~JAVASCRIPT
|
153
|
-
LastResult = await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
|
154
|
-
return frame.contentDocument.location.href;
|
155
|
-
}, AllElementHandles[#{frame.handle}]);
|
156
|
-
JAVASCRIPT
|
157
|
-
end
|
158
|
-
|
159
|
-
def frame_visible_text(frame)
|
160
|
-
# if node is AREA, check visibility of relevant image
|
161
|
-
text = await <<~JAVASCRIPT
|
162
|
-
LastResult = await AllElementHandles[#{frame.handle}].executionContext().evaluate((frame) => {
|
163
|
-
var node = frame.contentDocument.body;
|
164
|
-
var temp_node = node;
|
165
|
-
while (temp_node) {
|
166
|
-
style = window.getComputedStyle(node);
|
167
|
-
if (style.display === "none" || style.visibility === "hidden" || parseFloat(style.opacity) === 0) { return ''; }
|
168
|
-
temp_node = temp_node.parentElement;
|
169
|
-
}
|
170
|
-
if (node.nodeName == "TEXTAREA" || node instanceof SVGElement) { return node.textContent; }
|
171
|
-
else { return node.innerText; }
|
172
|
-
}, AllElementHandles[#{frame.handle}]);
|
173
|
-
JAVASCRIPT
|
174
|
-
text.gsub(/\A[[:space:]&&[^\u00a0]]+/, "").gsub(/[[:space:]&&[^\u00a0]]+\z/, "").gsub(/\n+/, "\n").tr("\u00a0", " ")
|
175
|
-
end
|
176
|
-
|
177
|
-
private
|
178
|
-
|
179
|
-
def need_alt?(modifiers)
|
180
|
-
(modifiers & %i[alt alt_left alt_right]).size > 0
|
181
|
-
end
|
182
|
-
|
183
|
-
def need_control?(modifiers)
|
184
|
-
(modifiers & %i[control control_left control_rigth]).size > 0
|
185
|
-
end
|
186
|
-
|
187
|
-
def need_meta?(modifiers)
|
188
|
-
(modifiers & %i[meta meta_left meta_right]).size > 0
|
189
|
-
end
|
190
|
-
|
191
|
-
def need_shift?(modifiers)
|
192
|
-
(modifiers & %i[shift shift_left shift_right]).size > 0
|
193
|
-
end
|
194
|
-
|
195
|
-
def await(script)
|
196
|
-
@context.eval <<~JAVASCRIPT
|
197
|
-
(async () => {
|
198
|
-
try {
|
199
|
-
LastExecutionFinished = false;
|
200
|
-
LastResult = null;
|
201
|
-
LastErr = null;
|
202
|
-
#{script}
|
203
|
-
LastExecutionFinished = true;
|
204
|
-
} catch(err) {
|
205
|
-
LastResult = null;
|
206
|
-
LastErr = err;
|
207
|
-
LastExecutionFinished = true;
|
208
|
-
}
|
209
|
-
})()
|
210
|
-
JAVASCRIPT
|
211
|
-
await_result
|
212
|
-
end
|
213
|
-
|
214
|
-
def await_result
|
215
|
-
start_time = Time.now
|
216
|
-
while !execution_finished? && !timed_out?(start_time)
|
217
|
-
sleep 0.01
|
218
|
-
end
|
219
|
-
get_result
|
220
|
-
end
|
221
|
-
|
222
|
-
def determine_error(message)
|
223
|
-
if message.include?('Error: certificate has expired')
|
224
|
-
Isomorfeus::Puppetmaster::CertificateError.new(message) unless @ignore_https_errors
|
225
|
-
elsif message.include?('Error: getaddrinfo')
|
226
|
-
Isomorfeus::Puppetmaster::DNSError.new(message)
|
227
|
-
elsif message.include?('Unknown key: ')
|
228
|
-
Isomorfeus::Puppetmaster::KeyError.new(message)
|
229
|
-
elsif message.include?('Execution context was destroyed, most likely because of a navigation.')
|
230
|
-
Isomorfeus::Puppetmaster::ExecutionContextError.new(message)
|
231
|
-
elsif message.include?('Unable to find ')
|
232
|
-
Isomorfeus::Puppetmaster::ElementNotFound.new(message)
|
233
|
-
elsif (message.include?('SyntaxError:') && (message.include?('unknown pseudo-class selector') || message.include?('is not a valid selector'))) || message.include?('invalid xpath query')
|
234
|
-
Isomorfeus::Puppetmaster::DOMException.new(message)
|
235
|
-
else
|
236
|
-
Isomorfeus::Puppetmaster::JavaScriptError.new(message)
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
def execution_finished?
|
241
|
-
@context.eval 'LastExecutionFinished'
|
242
|
-
end
|
243
|
-
|
244
|
-
def get_result
|
245
|
-
res, err_msg = @context.eval 'GetLastResult()'
|
246
|
-
raise determine_error(err_msg) if err_msg
|
247
|
-
res
|
248
|
-
end
|
249
|
-
|
250
|
-
def jsdom_launch
|
251
|
-
<<~JAVASCRIPT
|
252
|
-
#{"const canvas = require('canvas');" if @canvas}
|
253
|
-
const jsdom = require('jsdom');
|
254
|
-
const Cookie = jsdom.toughCookie.Cookie;
|
255
|
-
const MemoryCookieStore = jsdom.toughCookie.MemoryCookieStore;
|
256
|
-
const { JSDOM } = jsdom;
|
257
|
-
|
258
|
-
const JSDOMOptions = {pretendToBeVisual: true, resources: 'usable', runScripts: 'dangerously'};
|
259
|
-
|
260
|
-
var LastResponse = null;
|
261
|
-
var LastResult = null;
|
262
|
-
var LastErr = null;
|
263
|
-
var LastExecutionFinished = false;
|
264
|
-
var LastHandleId = 0;
|
265
|
-
|
266
|
-
var AllDomHandles = {};
|
267
|
-
var AllElementHandles = {};
|
268
|
-
var AllConsoleHandles = {};
|
269
|
-
var ConsoleMessages = {};
|
270
|
-
|
271
|
-
var ModalText = null;
|
272
|
-
var ModalTextMatched = false;
|
273
|
-
|
274
|
-
const GetLastResult = function() {
|
275
|
-
if (LastExecutionFinished === true) {
|
276
|
-
var err = LastErr;
|
277
|
-
var res = LastResult;
|
278
|
-
|
279
|
-
LastErr = null;
|
280
|
-
LastRes = null;
|
281
|
-
LastExecutionFinished = false;
|
282
|
-
|
283
|
-
if (err) { return [null, err.toString() + "\\n" + err.stack]; }
|
284
|
-
else { return [res, null]; }
|
285
|
-
|
286
|
-
} else {
|
287
|
-
return [null, (new Error('Last command did not yet finish execution!')).message];
|
288
|
-
}
|
289
|
-
};
|
290
|
-
|
291
|
-
const DialogAcceptHandler = async (dialog) => {
|
292
|
-
var msg = dialog.message()
|
293
|
-
ModalTextMatched = (ModalText === msg);
|
294
|
-
ModalText = msg;
|
295
|
-
await dialog.accept();
|
296
|
-
}
|
297
|
-
|
298
|
-
const DialogDismissHandler = async (dialog) => {
|
299
|
-
var msg = dialog.message()
|
300
|
-
ModalTextMatched = (ModalText === msg);
|
301
|
-
ModalText = msg;
|
302
|
-
await dialog.dismiss();
|
303
|
-
}
|
304
|
-
|
305
|
-
const RegisterElementHandle = function(element_handle) {
|
306
|
-
var entries = Object.entries(AllElementHandles);
|
307
|
-
for(var i = 0; i < entries.length; i++) {
|
308
|
-
if (entries[i][1] === element_handle) { return entries[i][0]; }
|
309
|
-
}
|
310
|
-
LastHandleId++;
|
311
|
-
AllElementHandles[LastHandleId] = element_handle;
|
312
|
-
return LastHandleId;
|
313
|
-
};
|
314
|
-
|
315
|
-
const RegisterElementHandleArray = function(element_handle_array) {
|
316
|
-
var registered_handles = [];
|
317
|
-
element_handle_array.forEach(function(handle){
|
318
|
-
registered_handles.push(RegisterElementHandle(handle));
|
319
|
-
});
|
320
|
-
return registered_handles;
|
321
|
-
};
|
322
|
-
|
323
|
-
const RegisterCon = function(con) {
|
324
|
-
var entries = Object.entries(ConsoleMessages);
|
325
|
-
for(var i = 0; i < entries.length; i++) {
|
326
|
-
if (entries[i][1] === con) { return entries[i][0]; }
|
327
|
-
}
|
328
|
-
LastHandleId++;
|
329
|
-
AllConsoleHandles[LastHandleId] = con;
|
330
|
-
ConsoleMessages[LastHandleId] = [];
|
331
|
-
return LastHandleId;
|
332
|
-
};
|
333
|
-
const RegisterDom = function(dom, handle_id) {
|
334
|
-
var entries = Object.entries(AllDomHandles);
|
335
|
-
for(var i = 0; i < entries.length; i++) {
|
336
|
-
if (entries[i][1] === dom) { return entries[i][0]; }
|
337
|
-
}
|
338
|
-
AllDomHandles[handle_id] = dom;
|
339
|
-
return handle_id;
|
340
|
-
};
|
341
|
-
|
342
|
-
(async () => {
|
343
|
-
try {
|
344
|
-
var con = new jsdom.VirtualConsole();
|
345
|
-
var jar = new jsdom.CookieJar(new MemoryCookieStore(), {rejectPublicSuffixes: false, looseMode: true});
|
346
|
-
var handle_id = RegisterCon(con);
|
347
|
-
con.on('error', (msg) => { ConsoleMessages[handle_id].push({level: 'error', location: '', text: msg}); });
|
348
|
-
con.on('warn', (msg) => { ConsoleMessages[handle_id].push({level: 'warn', location: '', text: msg}); });
|
349
|
-
con.on('info', (msg) => { ConsoleMessages[handle_id].push({level: 'info', location: '', text: msg}); });
|
350
|
-
con.on('log', (msg) => { ConsoleMessages[handle_id].push({level: 'dir', location: '', text: msg}); });
|
351
|
-
con.on('debug', (msg) => { ConsoleMessages[handle_id].push({level: 'dir', location: '', text: msg}); });
|
352
|
-
var dom = new JSDOM('', Object.assign({}, JSDOMOptions, { virtualConsole: con }));
|
353
|
-
var browser = dom.window.navigator.userAgent;
|
354
|
-
LastResult = [RegisterDom(dom, handle_id), browser];
|
355
|
-
LastExecutionFinished = true;
|
356
|
-
} catch (err) {
|
357
|
-
LastErr = err;
|
358
|
-
LastExecutionFinished = true;
|
359
|
-
}
|
360
|
-
})();
|
361
|
-
JAVASCRIPT
|
362
|
-
end
|
363
|
-
|
364
|
-
def timed_out?(start_time)
|
365
|
-
if (Time.now - start_time) > @timeout
|
366
|
-
raise "Command Execution timed out!"
|
367
|
-
end
|
368
|
-
false
|
369
|
-
end
|
370
|
-
end
|
371
|
-
end
|
372
|
-
end
|
373
|
-
end
|