@@ -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