| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library debugger_page_element; | 5 library debugger_page_element; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:svg'; | 8 import 'dart:svg'; |
| 9 import 'dart:html'; | 9 import 'dart:html'; |
| 10 import 'dart:math'; | 10 import 'dart:math'; |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 return new Future.value(null); | 202 return new Future.value(null); |
| 203 } | 203 } |
| 204 if (debugger.currentFrame == null) { | 204 if (debugger.currentFrame == null) { |
| 205 debugger.console.print('No stack'); | 205 debugger.console.print('No stack'); |
| 206 return new Future.value(null); | 206 return new Future.value(null); |
| 207 } | 207 } |
| 208 try { | 208 try { |
| 209 debugger.downFrame(count); | 209 debugger.downFrame(count); |
| 210 debugger.console.print('frame = ${debugger.currentFrame}'); | 210 debugger.console.print('frame = ${debugger.currentFrame}'); |
| 211 } catch (e) { | 211 } catch (e) { |
| 212 debugger.console.print( | 212 debugger.console.print('frame must be in range [${e.start}..${e.end-1}]'); |
| 213 'frame must be in range [${e.start}..${e.end-1}]'); | |
| 214 } | 213 } |
| 215 return new Future.value(null); | 214 return new Future.value(null); |
| 216 } | 215 } |
| 217 | 216 |
| 218 String helpShort = 'Move down one or more frames (hotkey: [Page Down])'; | 217 String helpShort = 'Move down one or more frames (hotkey: [Page Down])'; |
| 219 | 218 |
| 220 String helpLong = 'Move down one or more frames.\n' | 219 String helpLong = 'Move down one or more frames.\n' |
| 221 '\n' | 220 '\n' |
| 222 'Hotkey: [Page Down]\n' | 221 'Hotkey: [Page Down]\n' |
| 223 '\n' | 222 '\n' |
| (...skipping 13 matching lines...) Expand all Loading... |
| 237 return new Future.value(null); | 236 return new Future.value(null); |
| 238 } | 237 } |
| 239 if (debugger.currentFrame == null) { | 238 if (debugger.currentFrame == null) { |
| 240 debugger.console.print('No stack'); | 239 debugger.console.print('No stack'); |
| 241 return new Future.value(null); | 240 return new Future.value(null); |
| 242 } | 241 } |
| 243 try { | 242 try { |
| 244 debugger.upFrame(count); | 243 debugger.upFrame(count); |
| 245 debugger.console.print('frame = ${debugger.currentFrame}'); | 244 debugger.console.print('frame = ${debugger.currentFrame}'); |
| 246 } on RangeError catch (e) { | 245 } on RangeError catch (e) { |
| 247 debugger.console.print( | 246 debugger.console.print('frame must be in range [${e.start}..${e.end-1}]'); |
| 248 'frame must be in range [${e.start}..${e.end-1}]'); | |
| 249 } | 247 } |
| 250 return new Future.value(null); | 248 return new Future.value(null); |
| 251 } | 249 } |
| 252 | 250 |
| 253 String helpShort = 'Move up one or more frames (hotkey: [Page Up])'; | 251 String helpShort = 'Move up one or more frames (hotkey: [Page Up])'; |
| 254 | 252 |
| 255 String helpLong = 'Move up one or more frames.\n' | 253 String helpLong = 'Move up one or more frames.\n' |
| 256 '\n' | 254 '\n' |
| 257 'Hotkey: [Page Up]\n' | 255 'Hotkey: [Page Up]\n' |
| 258 '\n' | 256 '\n' |
| (...skipping 15 matching lines...) Expand all Loading... |
| 274 return new Future.value(null); | 272 return new Future.value(null); |
| 275 } | 273 } |
| 276 if (debugger.currentFrame == null) { | 274 if (debugger.currentFrame == null) { |
| 277 debugger.console.print('No stack'); | 275 debugger.console.print('No stack'); |
| 278 return new Future.value(null); | 276 return new Future.value(null); |
| 279 } | 277 } |
| 280 try { | 278 try { |
| 281 debugger.currentFrame = frame; | 279 debugger.currentFrame = frame; |
| 282 debugger.console.print('frame = ${debugger.currentFrame}'); | 280 debugger.console.print('frame = ${debugger.currentFrame}'); |
| 283 } on RangeError catch (e) { | 281 } on RangeError catch (e) { |
| 284 debugger.console.print( | 282 debugger.console.print('frame must be in range [${e.start}..${e.end-1}]'); |
| 285 'frame must be in range [${e.start}..${e.end-1}]'); | |
| 286 } | 283 } |
| 287 return new Future.value(null); | 284 return new Future.value(null); |
| 288 } | 285 } |
| 289 | 286 |
| 290 String helpShort = 'Set the current frame'; | 287 String helpShort = 'Set the current frame'; |
| 291 | 288 |
| 292 String helpLong = 'Set the current frame.\n' | 289 String helpLong = 'Set the current frame.\n' |
| 293 '\n' | 290 '\n' |
| 294 'Syntax: frame <number>\n' | 291 'Syntax: frame <number>\n' |
| 295 ' f <count>\n'; | 292 ' f <count>\n'; |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 | 408 |
| 412 Future run(List<String> args) async { | 409 Future run(List<String> args) async { |
| 413 try { | 410 try { |
| 414 int count = 1; | 411 int count = 1; |
| 415 if (args.length == 1) { | 412 if (args.length == 1) { |
| 416 count = int.parse(args[0]); | 413 count = int.parse(args[0]); |
| 417 } else if (args.length > 1) { | 414 } else if (args.length > 1) { |
| 418 debugger.console.print('rewind expects 0 or 1 argument'); | 415 debugger.console.print('rewind expects 0 or 1 argument'); |
| 419 return; | 416 return; |
| 420 } else if (count < 1 || count > debugger.stackDepth) { | 417 } else if (count < 1 || count > debugger.stackDepth) { |
| 421 debugger.console.print( | 418 debugger.console |
| 422 'frame must be in range [1..${debugger.stackDepth - 1}]'); | 419 .print('frame must be in range [1..${debugger.stackDepth - 1}]'); |
| 423 return; | 420 return; |
| 424 } | 421 } |
| 425 await debugger.rewind(count); | 422 await debugger.rewind(count); |
| 426 } on S.ServerRpcException catch(e) { | 423 } on S.ServerRpcException catch (e) { |
| 427 if (e.code == S.ServerRpcException.kCannotResume) { | 424 if (e.code == S.ServerRpcException.kCannotResume) { |
| 428 debugger.console.printRed(e.data['details']); | 425 debugger.console.printRed(e.data['details']); |
| 429 } else { | 426 } else { |
| 430 rethrow; | 427 rethrow; |
| 431 } | 428 } |
| 432 } | 429 } |
| 433 } | 430 } |
| 434 | 431 |
| 435 String helpShort = 'Rewind the stack to a previous frame'; | 432 String helpShort = 'Rewind the stack to a previous frame'; |
| 436 | 433 |
| 437 String helpLong = | 434 String helpLong = 'Rewind the stack to a previous frame.\n' |
| 438 'Rewind the stack to a previous frame.\n' | |
| 439 '\n' | 435 '\n' |
| 440 'Syntax: rewind\n' | 436 'Syntax: rewind\n' |
| 441 ' rewind <count>\n'; | 437 ' rewind <count>\n'; |
| 442 } | 438 } |
| 443 | 439 |
| 444 class ReloadCommand extends DebuggerCommand { | 440 class ReloadCommand extends DebuggerCommand { |
| 445 ReloadCommand(Debugger debugger) : super(debugger, 'reload', []); | 441 ReloadCommand(Debugger debugger) : super(debugger, 'reload', []); |
| 446 | 442 |
| 447 Future run(List<String> args) async { | 443 Future run(List<String> args) async { |
| 448 try { | 444 try { |
| 449 int count = 1; | 445 int count = 1; |
| 450 if (args.length > 0) { | 446 if (args.length > 0) { |
| 451 debugger.console.print('reload expects no arguments'); | 447 debugger.console.print('reload expects no arguments'); |
| 452 return; | 448 return; |
| 453 } | 449 } |
| 454 await debugger.isolate.reloadSources(); | 450 await debugger.isolate.reloadSources(); |
| 455 debugger.console.print('reload complete'); | 451 debugger.console.print('reload complete'); |
| 456 await debugger.refreshStack(); | 452 await debugger.refreshStack(); |
| 457 } on S.ServerRpcException catch(e) { | 453 } on S.ServerRpcException catch (e) { |
| 458 if (e.code == S.ServerRpcException.kIsolateReloadBarred || | 454 if (e.code == S.ServerRpcException.kIsolateReloadBarred || |
| 459 e.code == S.ServerRpcException.kIsolateReloadFailed || | 455 e.code == S.ServerRpcException.kIsolateReloadFailed || |
| 460 e.code == S.ServerRpcException.kIsolateIsReloading) { | 456 e.code == S.ServerRpcException.kIsolateIsReloading) { |
| 461 debugger.console.printRed(e.data['details']); | 457 debugger.console.printRed(e.data['details']); |
| 462 } else { | 458 } else { |
| 463 rethrow; | 459 rethrow; |
| 464 } | 460 } |
| 465 } | 461 } |
| 466 } | 462 } |
| 467 | 463 |
| 468 String helpShort = 'Reload the sources for the current isolate'; | 464 String helpShort = 'Reload the sources for the current isolate'; |
| 469 | 465 |
| 470 String helpLong = | 466 String helpLong = 'Reload the sources for the current isolate.\n' |
| 471 'Reload the sources for the current isolate.\n' | |
| 472 '\n' | 467 '\n' |
| 473 'Syntax: reload\n'; | 468 'Syntax: reload\n'; |
| 474 } | 469 } |
| 475 | 470 |
| 476 class ClsCommand extends DebuggerCommand { | 471 class ClsCommand extends DebuggerCommand { |
| 477 ClsCommand(Debugger debugger) : super(debugger, 'cls', []) {} | 472 ClsCommand(Debugger debugger) : super(debugger, 'cls', []) {} |
| 478 | 473 |
| 479 Future run(List<String> args) { | 474 Future run(List<String> args) { |
| 480 debugger.console.clear(); | 475 debugger.console.clear(); |
| 481 debugger.console.newline(); | 476 debugger.console.newline(); |
| (...skipping 1344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1826 // TODO(turnidge): Implement real command line history. | 1821 // TODO(turnidge): Implement real command line history. |
| 1827 String lastCommand; | 1822 String lastCommand; |
| 1828 | 1823 |
| 1829 Future run(String command) { | 1824 Future run(String command) { |
| 1830 if (command == '' && lastCommand != null) { | 1825 if (command == '' && lastCommand != null) { |
| 1831 command = lastCommand; | 1826 command = lastCommand; |
| 1832 } | 1827 } |
| 1833 console.printBold('\$ $command'); | 1828 console.printBold('\$ $command'); |
| 1834 return cmd.runCommand(command).then((_) { | 1829 return cmd.runCommand(command).then((_) { |
| 1835 lastCommand = command; | 1830 lastCommand = command; |
| 1836 }).catchError( | 1831 }).catchError((e, s) { |
| 1837 (e, s) { | 1832 console.printRed('Unable to execute command because the connection ' |
| 1838 console.printRed('Unable to execute command because the connection ' | 1833 'to the VM has been closed'); |
| 1839 'to the VM has been closed'); | 1834 }, test: (e) => e is S.NetworkRpcException).catchError((e, s) { |
| 1840 }, test: (e) => e is S.NetworkRpcException | 1835 console.printRed(e.toString()); |
| 1841 ).catchError( | 1836 }, test: (e) => e is CommandException).catchError((e, s) { |
| 1842 (e, s) { | 1837 if (s != null) { |
| 1843 console.printRed(e.toString()); | 1838 console.printRed('Internal error: $e\n$s'); |
| 1844 }, test: (e) => e is CommandException | 1839 } else { |
| 1845 ).catchError( | 1840 console.printRed('Internal error: $e\n'); |
| 1846 (e, s) { | |
| 1847 if (s != null) { | |
| 1848 console.printRed('Internal error: $e\n$s'); | |
| 1849 } else { | |
| 1850 console.printRed('Internal error: $e\n'); | |
| 1851 } | |
| 1852 } | 1841 } |
| 1853 ); | 1842 }); |
| 1854 } | 1843 } |
| 1855 | 1844 |
| 1856 String historyPrev(String command) { | 1845 String historyPrev(String command) { |
| 1857 return cmd.historyPrev(command); | 1846 return cmd.historyPrev(command); |
| 1858 } | 1847 } |
| 1859 | 1848 |
| 1860 String historyNext(String command) { | 1849 String historyNext(String command) { |
| 1861 return cmd.historyNext(command); | 1850 return cmd.historyNext(command); |
| 1862 } | 1851 } |
| 1863 | 1852 |
| (...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2410 | 2399 |
| 2411 // Is this the current frame? | 2400 // Is this the current frame? |
| 2412 bool _current = false; | 2401 bool _current = false; |
| 2413 | 2402 |
| 2414 // Has this frame been pinned open? | 2403 // Has this frame been pinned open? |
| 2415 bool _pinned = false; | 2404 bool _pinned = false; |
| 2416 | 2405 |
| 2417 bool _expanded = false; | 2406 bool _expanded = false; |
| 2418 | 2407 |
| 2419 void setCurrent(bool value) { | 2408 void setCurrent(bool value) { |
| 2420 Future load = | 2409 Future load = (_frame.function != null) |
| 2421 (_frame.function != null) ? | 2410 ? _frame.function.load() |
| 2422 _frame.function.load() : | 2411 : new Future.value(null); |
| 2423 new Future.value(null); | |
| 2424 load.then((func) { | 2412 load.then((func) { |
| 2425 _current = value; | 2413 _current = value; |
| 2426 if (_current) { | 2414 if (_current) { |
| 2427 _expand(); | 2415 _expand(); |
| 2428 scrollIntoView(); | 2416 scrollIntoView(); |
| 2429 } else { | 2417 } else { |
| 2430 if (_pinned) { | 2418 if (_pinned) { |
| 2431 _expand(); | 2419 _expand(); |
| 2432 } else { | 2420 } else { |
| 2433 _unexpand(); | 2421 _unexpand(); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2473 classes.add('current'); | 2461 classes.add('current'); |
| 2474 } else { | 2462 } else { |
| 2475 classes.remove('current'); | 2463 classes.remove('current'); |
| 2476 } | 2464 } |
| 2477 if ((_frame.kind == M.FrameKind.asyncSuspensionMarker) || | 2465 if ((_frame.kind == M.FrameKind.asyncSuspensionMarker) || |
| 2478 (_frame.kind == M.FrameKind.asyncCausal)) { | 2466 (_frame.kind == M.FrameKind.asyncCausal)) { |
| 2479 classes.add('causalFrame'); | 2467 classes.add('causalFrame'); |
| 2480 } | 2468 } |
| 2481 if (_frame.kind == M.FrameKind.asyncSuspensionMarker) { | 2469 if (_frame.kind == M.FrameKind.asyncSuspensionMarker) { |
| 2482 final content = <Element>[ | 2470 final content = <Element>[ |
| 2483 new SpanElement() | 2471 new SpanElement()..children = _createMarkerHeader(_frame.marker) |
| 2484 ..children = _createMarkerHeader(_frame.marker) | |
| 2485 ]; | 2472 ]; |
| 2486 children = content; | 2473 children = content; |
| 2487 return; | 2474 return; |
| 2488 } | 2475 } |
| 2489 ButtonElement expandButton; | 2476 ButtonElement expandButton; |
| 2490 final content = <Element>[ | 2477 final content = <Element>[ |
| 2491 expandButton = new ButtonElement() | 2478 expandButton = new ButtonElement() |
| 2492 ..children = _createHeader() | 2479 ..children = _createHeader() |
| 2493 ..onClick.listen((e) async { | 2480 ..onClick.listen((e) async { |
| 2494 if (e.target is AnchorElement) { | 2481 if (e.target is AnchorElement) { |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2596 new DivElement() | 2583 new DivElement() |
| 2597 ..classes = ['frameId'] | 2584 ..classes = ['frameId'] |
| 2598 ..text = 'Frame ${_frame.index}', | 2585 ..text = 'Frame ${_frame.index}', |
| 2599 new SpanElement()..text = '$marker', | 2586 new SpanElement()..text = '$marker', |
| 2600 ] | 2587 ] |
| 2601 ]; | 2588 ]; |
| 2602 return [ | 2589 return [ |
| 2603 new DivElement() | 2590 new DivElement() |
| 2604 ..classes = ['frameSummary'] | 2591 ..classes = ['frameSummary'] |
| 2605 ..children = content | 2592 ..children = content |
| 2606 ]; | 2593 ]; |
| 2607 } | 2594 } |
| 2608 | 2595 |
| 2609 List<Element> _createHeader() { | 2596 List<Element> _createHeader() { |
| 2610 final content = [ | 2597 final content = [ |
| 2611 new DivElement() | 2598 new DivElement() |
| 2612 ..classes = ['frameSummaryText'] | 2599 ..classes = ['frameSummaryText'] |
| 2613 ..children = [ | 2600 ..children = [ |
| 2614 new DivElement() | 2601 new DivElement() |
| 2615 ..classes = ['frameId'] | 2602 ..classes = ['frameId'] |
| 2616 ..text = 'Frame ${_frame.index}', | 2603 ..text = 'Frame ${_frame.index}', |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2650 } | 2637 } |
| 2651 | 2638 |
| 2652 bool matchFrame(S.Frame newFrame) { | 2639 bool matchFrame(S.Frame newFrame) { |
| 2653 if (newFrame.kind != _frame.kind) { | 2640 if (newFrame.kind != _frame.kind) { |
| 2654 return false; | 2641 return false; |
| 2655 } | 2642 } |
| 2656 if (newFrame.function == null) { | 2643 if (newFrame.function == null) { |
| 2657 return frame.function == null; | 2644 return frame.function == null; |
| 2658 } | 2645 } |
| 2659 return (newFrame.function.id == _frame.function.id && | 2646 return (newFrame.function.id == _frame.function.id && |
| 2660 newFrame.location.script.id == | 2647 newFrame.location.script.id == frame.location.script.id); |
| 2661 frame.location.script.id); | |
| 2662 } | 2648 } |
| 2663 | 2649 |
| 2664 void updateFrame(S.Frame newFrame) { | 2650 void updateFrame(S.Frame newFrame) { |
| 2665 assert(matchFrame(newFrame)); | 2651 assert(matchFrame(newFrame)); |
| 2666 _frame = newFrame; | 2652 _frame = newFrame; |
| 2667 } | 2653 } |
| 2668 | 2654 |
| 2669 S.Script get script => _frame.location.script; | 2655 S.Script get script => _frame.location.script; |
| 2670 | 2656 |
| 2671 int _varsTop(varsDiv) { | 2657 int _varsTop(varsDiv) { |
| (...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3335 ..setAttribute('height', '24') | 3321 ..setAttribute('height', '24') |
| 3336 ..children = [ | 3322 ..children = [ |
| 3337 new PathElement() | 3323 new PathElement() |
| 3338 ..setAttribute( | 3324 ..setAttribute( |
| 3339 'd', | 3325 'd', |
| 3340 'M11 17h2v-6h-2v6zm1-15C6.48 2 2 6.48 2 12s4.48 10 ' | 3326 'M11 17h2v-6h-2v6zm1-15C6.48 2 2 6.48 2 12s4.48 10 ' |
| 3341 '10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 ' | 3327 '10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 ' |
| 3342 '0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zM11 ' | 3328 '0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zM11 ' |
| 3343 '9h2V7h-2v2z') | 3329 '9h2V7h-2v2z') |
| 3344 ]; | 3330 ]; |
| OLD | NEW |