Skip to content

Commit 693f424

Browse files
author
ono-max
committed
Update Evaluation part in CDP to support for the current change
1 parent bd6947b commit 693f424

File tree

1 file changed

+74
-22
lines changed

1 file changed

+74
-22
lines changed

lib/debug/server_cdp.rb

Lines changed: 74 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -322,8 +322,13 @@ def process_protocol_request req
322322
when 'Debugger.stepOver', 'Debugger.stepInto', 'Debugger.stepOut', 'Debugger.resume', 'Debugger.getScriptSource'
323323
@tc << [:cdp, :backtrace, req]
324324
when 'Debugger.evaluateOnCallFrame'
325-
expr = req.dig('params', 'expression')
326-
@tc << [:cdp, :evaluate, req, expr]
325+
frame_id = req.dig('params', 'callFrameId')
326+
if fid = @frame_map[frame_id]
327+
expr = req.dig('params', 'expression')
328+
@tc << [:cdp, :evaluate, req, fid, expr]
329+
else
330+
@ui.respond req
331+
end
327332
when 'Runtime.getProperties'
328333
oid = req.dig('params', 'objectId')
329334
case @scope_map[oid]
@@ -344,7 +349,8 @@ def cdp_event args
344349

345350
case type
346351
when :backtrace
347-
result[:callFrames].each do |frame|
352+
result[:callFrames].each.with_index do |frame, i|
353+
@frame_map[frame[:callFrameId]] = i
348354
s_id = frame.dig(:location, :scriptId)
349355
if File.exist?(s_id) && !@script_paths.include?(s_id)
350356
src = File.read(s_id)
@@ -462,26 +468,72 @@ def process_cdp args
462468
}
463469
when :evaluate
464470
res = {}
465-
expr = args.shift
466-
begin
467-
orig_stdout = $stdout
468-
$stdout = StringIO.new
469-
result = current_frame.binding.eval(expr.to_s, '(DEBUG CONSOLE)')
470-
rescue Exception => e
471-
result = e
472-
b = result.backtrace.map{|e| " #{e}\n"}
473-
line = b.first.match('.*:(\d+):in .*')[1].to_i
474-
res[:exceptionDetails] = {
475-
exceptionId: 1,
476-
text: 'Uncaught',
477-
lineNumber: line - 1,
478-
columnNumber: 0,
479-
exception: evaluate_result(result),
480-
}
481-
ensure
482-
output = $stdout.string
483-
$stdout = orig_stdout
471+
fid, expr = args
472+
frame = @target_frames[fid]
473+
474+
if frame && (b = frame.binding)
475+
b = b.dup
476+
special_local_variables current_frame do |name, var|
477+
b.local_variable_set(name, var) if /\%/ !~name
478+
end
479+
480+
result = nil
481+
482+
case req.dig('params', 'objectGroup')
483+
when 'popover'
484+
case expr
485+
# Chrome doesn't read instance variables
486+
when /\A\$\S/
487+
global_variables.each{|gvar|
488+
if gvar.to_s == expr
489+
result = eval(gvar.to_s)
490+
break false
491+
end
492+
} and (result = Exception.new("Error: Not defined global variable: #{expr.inspect}"))
493+
when /\A[A-Z]/
494+
unless result = search_const(b, expr)
495+
result = Exception.new("Error: Not defined global variable: #{expr.inspect}")
496+
end
497+
else
498+
begin
499+
$stderr.puts expr
500+
# try to check local variables
501+
b.local_variable_defined?(expr) or raise NameError
502+
result = b.local_variable_get(expr)
503+
rescue NameError
504+
# try to check method
505+
if b.receiver.respond_to? expr, include_all: true
506+
result = b.receiver.method(expr)
507+
else
508+
message = "Error: Can not evaluate: #{expr.inspect}"
509+
end
510+
end
511+
end
512+
else
513+
begin
514+
orig_stdout = $stdout
515+
$stdout = StringIO.new
516+
result = current_frame.binding.eval(expr.to_s, '(DEBUG CONSOLE)')
517+
rescue Exception => e
518+
result = e
519+
b = result.backtrace.map{|e| " #{e}\n"}
520+
line = b.first.match('.*:(\d+):in .*')[1].to_i
521+
res[:exceptionDetails] = {
522+
exceptionId: 1,
523+
text: 'Uncaught',
524+
lineNumber: line - 1,
525+
columnNumber: 0,
526+
exception: evaluate_result(result),
527+
}
528+
ensure
529+
output = $stdout.string
530+
$stdout = orig_stdout
531+
end
532+
end
533+
else
534+
result = Exception.new("Error: Can not evaluate on this frame")
484535
end
536+
485537
res[:result] = evaluate_result(result)
486538
event! :cdp_result, :evaluate, req, response: res, output: output
487539
when :properties

0 commit comments

Comments
 (0)