isomorfeus-puppetmaster 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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' }, {}), 401, 'Content-Type' => 'application/json').finish
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
@@ -1,3 +1,3 @@
1
1
  module Isomorfeus
2
- PUPPETMASTER_VERSION = '0.3.1'
2
+ PUPPETMASTER_VERSION = '0.4.0'
3
3
  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.3.1
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: 2020-01-14 00:00:00.000000000 Z
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.2.11
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.2.11
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: unparser
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: agoo
126
+ name: unparser
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - "~>"
129
+ - - ">="
116
130
  - !ruby/object:Gem::Version
117
- version: 2.11.3
118
- type: :development
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: 2.11.3
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.30.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.30.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.0'
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.0'
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.10.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.10.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: 1.3.3
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: 1.3.3
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: 4.2.1
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: 4.2.1
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: '2.0'
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: '2.0'
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.0.6
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