Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Side by Side Diff: runtime/observatory/lib/src/elements/debugger.dart

Issue 1007863003: Allow Observatory debugger to switch isolates. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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:html'; 8 import 'dart:html';
9 import 'observatory_element.dart'; 9 import 'observatory_element.dart';
10 import 'package:observatory/cli.dart'; 10 import 'package:observatory/cli.dart';
(...skipping 12 matching lines...) Expand all
23 String get helpLong; 23 String get helpLong;
24 } 24 }
25 25
26 // TODO(turnidge): Rewrite HelpCommand so that it is a general utility 26 // TODO(turnidge): Rewrite HelpCommand so that it is a general utility
27 // provided by the cli library. 27 // provided by the cli library.
28 class HelpCommand extends DebuggerCommand { 28 class HelpCommand extends DebuggerCommand {
29 HelpCommand(Debugger debugger) : super(debugger, 'help', []); 29 HelpCommand(Debugger debugger) : super(debugger, 'help', []);
30 30
31 String _nameAndAlias(Command cmd) { 31 String _nameAndAlias(Command cmd) {
32 if (cmd.alias == null) { 32 if (cmd.alias == null) {
33 return cmd.name; 33 return cmd.fullName;
34 } else { 34 } else {
35 return '${cmd.name}, ${cmd.alias}'; 35 return '${cmd.fullName}, ${cmd.alias}';
36 } 36 }
37 } 37 }
38 38
39 Future run(List<String> args) { 39 Future run(List<String> args) {
40 var con = debugger.console; 40 var con = debugger.console;
41 if (args.length == 0) { 41 if (args.length == 0) {
42 // Print list of all top-level commands. 42 // Print list of all top-level commands.
43 var commands = debugger.cmd.matchCommand([], false); 43 var commands = debugger.cmd.matchCommand([], false);
44 commands.sort((a, b) => a.name.compareTo(b.name)); 44 commands.sort((a, b) => a.name.compareTo(b.name));
45 con.print('List of commands:\n'); 45 con.print('List of commands:\n');
46 for (var command in commands) { 46 for (var command in commands) {
47 con.print('${_nameAndAlias(command).padRight(12)} ' 47 con.print('${_nameAndAlias(command).padRight(12)} '
48 '- ${command.helpShort}'); 48 '- ${command.helpShort}');
49 } 49 }
50 con.print( 50 con.print(
51 "\nFor more information on a specific command type 'help <command>'\n" 51 "\nFor more information on a specific command type 'help <command>'\n"
52 "\n" 52 "\n"
53 "Command prefixes are accepted (e.g. 'h' for 'help')\n" 53 "Command prefixes are accepted (e.g. 'h' for 'help')\n"
54 "Hit [TAB] to complete a command (try 'i[TAB][TAB]')\n" 54 "Hit [TAB] to complete a command (try 'is[TAB][TAB]')\n"
55 "Hit [ENTER] to repeat the last command\n" 55 "Hit [ENTER] to repeat the last command\n"
56 "Use up/down arrow for command history\n"); 56 "Use up/down arrow for command history\n");
57 return new Future.value(null); 57 return new Future.value(null);
58 } else { 58 } else {
59 // Print any matching commands. 59 // Print any matching commands.
60 var commands = debugger.cmd.matchCommand(args, true); 60 var commands = debugger.cmd.matchCommand(args, true);
61 commands.sort((a, b) => a.name.compareTo(b.name)); 61 commands.sort((a, b) => a.name.compareTo(b.name));
62 if (commands.isEmpty) { 62 if (commands.isEmpty) {
63 var line = args.join(' '); 63 var line = args.join(' ');
64 con.print("No command matches '${line}'"); 64 con.print("No command matches '${line}'");
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 } else { 402 } else {
403 // TODO(turnidge): Adding a duplicate breakpoint is 403 // TODO(turnidge): Adding a duplicate breakpoint is
404 // currently ignored. May want to change the protocol to 404 // currently ignored. May want to change the protocol to
405 // inform us when this happens. 405 // inform us when this happens.
406 } 406 }
407 return new Future.value(null); 407 return new Future.value(null);
408 } 408 }
409 409
410 Future<List<String>> complete(List<String> args) { 410 Future<List<String>> complete(List<String> args) {
411 if (args.length != 1) { 411 if (args.length != 1) {
412 return new Future.value([]); 412 return new Future.value([args.join('')]);
413 } 413 }
414 // TODO - fix SourceLocation complete 414 // TODO - fix SourceLocation complete
415 return new Future.value(SourceLocation.complete(debugger, args[0])); 415 return new Future.value(SourceLocation.complete(debugger, args[0]));
416 } 416 }
417 417
418 String helpShort = 'Add a breakpoint by source location or function name'; 418 String helpShort = 'Add a breakpoint by source location or function name';
419 419
420 String helpLong = 420 String helpLong =
421 'Add a breakpoint by source location or function name.\n' 421 'Add a breakpoint by source location or function name.\n'
422 '\n' 422 '\n'
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 } 486 }
487 debugger.console.print('No breakpoint found at ${loc}'); 487 debugger.console.print('No breakpoint found at ${loc}');
488 } else { 488 } else {
489 debugger.console.print(loc.errorMessage); 489 debugger.console.print(loc.errorMessage);
490 } 490 }
491 }); 491 });
492 } 492 }
493 493
494 Future<List<String>> complete(List<String> args) { 494 Future<List<String>> complete(List<String> args) {
495 if (args.length != 1) { 495 if (args.length != 1) {
496 return new Future.value([]); 496 return new Future.value([args.join('')]);
497 } 497 }
498 return new Future.value(SourceLocation.complete(debugger, args[0])); 498 return new Future.value(SourceLocation.complete(debugger, args[0]));
499 } 499 }
500 500
501 String helpShort = 'Remove a breakpoint by source location or function name'; 501 String helpShort = 'Remove a breakpoint by source location or function name';
502 502
503 String helpLong = 503 String helpLong =
504 'Remove a breakpoint by source location or function name.\n' 504 'Remove a breakpoint by source location or function name.\n'
505 '\n' 505 '\n'
506 'Syntax: clear ' 506 'Syntax: clear '
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 } 596 }
597 597
598 String helpShort = 'List all breakpoints'; 598 String helpShort = 'List all breakpoints';
599 599
600 String helpLong = 600 String helpLong =
601 'List all breakpoints.\n' 601 'List all breakpoints.\n'
602 '\n' 602 '\n'
603 'Syntax: info breakpoints\n'; 603 'Syntax: info breakpoints\n';
604 } 604 }
605 605
606 class InfoIsolatesCommand extends DebuggerCommand { 606 class InfoFrameCommand extends DebuggerCommand {
607 InfoIsolatesCommand(Debugger debugger) : super(debugger, 'isolates', []); 607 InfoFrameCommand(Debugger debugger) : super(debugger, 'frame', []);
608 608
609 Future run(List<String> args) { 609 Future run(List<String> args) {
610 for (var isolate in debugger.isolate.vm.isolates) { 610 if (args.length > 0) {
611 String current = (isolate == debugger.isolate ? ' *' : ''); 611 debugger.console.print('info frame expects no arguments');
612 debugger.console.print( 612 return new Future.value(null);
613 "Isolate ${isolate.id} '${isolate.name}'${current}"); 613 }
614 debugger.console.print('frame = ${debugger.currentFrame}');
615 return new Future.value(null);
616 }
617
618 String helpShort = 'Show current frame';
619
620 String helpLong =
621 'Show current frame.\n'
622 '\n'
623 'Syntax: info frame\n';
624 }
625
626 class IsolateCommand extends DebuggerCommand {
627 IsolateCommand(Debugger debugger) : super(debugger, 'isolate', [
628 new IsolateListCommand(debugger),
629 new IsolateNameCommand(debugger),
630 ]) {
631 alias = 'i';
632 }
633
634 Future run(List<String> args) {
635 if (args.length != 1) {
636 debugger.console.print('isolate expects one argument');
637 return new Future.value(null);
638 }
639 var arg = args[0].trim();
640 var num = int.parse(arg, onError:(_) => null);
641
642 var candidate;
643 for (var isolate in debugger.vm.isolates) {
644 if (num != null && num == isolate.number) {
645 candidate = isolate;
646 break;
647 } else if (arg == isolate.name) {
648 if (candidate != null) {
649 debugger.console.print(
650 "Isolate identifier '${arg}' is ambiguous: "
651 'use the isolate number instead');
652 return new Future.value(null);
653 }
654 candidate = isolate;
655 }
656 }
657 if (candidate == null) {
658 debugger.console.print("Invalid isolate identifier '${arg}'");
659 } else {
660 if (candidate == debugger.isolate) {
661 debugger.console.print(
662 "Current isolate is already ${candidate.number} '${candidate.name}'" );
663 } else {
664 debugger.console.print(
665 "Switching to isolate ${candidate.number} '${candidate.name}'");
666 debugger.isolate = candidate;
667 }
614 } 668 }
615 return new Future.value(null); 669 return new Future.value(null);
616 } 670 }
671
672 Future<List<String>> complete(List<String> args) {
673 if (args.length != 1) {
674 return new Future.value([args.join('')]);
675 }
676 var isolates = debugger.vm.isolates.toList();
677 isolates.sort((a, b) => a.startTime.compareTo(b.startTime));
678 var result = [];
679 for (var isolate in isolates) {
680 var str = isolate.number.toString();
681 if (str.startsWith(args[0])) {
682 result.add('$str ');
683 }
684 }
685 for (var isolate in isolates) {
686 if (isolate.name.startsWith(args[0])) {
687 result.add('${isolate.name} ');
688 }
689 }
690 return new Future.value(result);
691 }
692 String helpShort = 'Switch the current isolate';
693
694 String helpLong =
695 'Switch the current isolate.\n'
696 '\n'
697 'Syntax: isolate <number>\n'
698 ' isolate <name>\n';
699 }
700
701 class IsolateListCommand extends DebuggerCommand {
702 IsolateListCommand(Debugger debugger) : super(debugger, 'list', []);
703
704 Future run(List<String> args) {
705 if (debugger.vm == null) {
706 debugger.console.print(
707 "Internal error: vm has not been set");
708 return new Future.value(null);
709 }
710 var isolates = debugger.vm.isolates.toList();
711 isolates.sort((a, b) => a.startTime.compareTo(b.startTime));
712 for (var isolate in isolates) {
713 String current = (isolate == debugger.isolate ? ' *' : '');
714 debugger.console.print(
715 "Isolate ${isolate.number} '${isolate.name}'${current}");
716 }
717 return new Future.value(null);
718 }
617 719
618 String helpShort = 'List all isolates'; 720 String helpShort = 'List all isolates';
619 721
620 String helpLong = 722 String helpLong =
621 'List all isolates.\n' 723 'List all isolates.\n'
622 '\n' 724 '\n'
623 'Syntax: info isolates\n'; 725 'Syntax: isolate list\n';
624 } 726 }
625 727
626 class InfoFrameCommand extends DebuggerCommand { 728 class IsolateNameCommand extends DebuggerCommand {
627 InfoFrameCommand(Debugger debugger) : super(debugger, 'frame', []); 729 IsolateNameCommand(Debugger debugger) : super(debugger, 'name', []);
628 730
629 Future run(List<String> args) { 731 Future run(List<String> args) {
630 if (args.length > 0) { 732 if (args.length != 1) {
631 debugger.console.print('info frame expects 1 argument'); 733 debugger.console.print('isolate name expects one argument');
632 return new Future.value(null); 734 return new Future.value(null);
633 } 735 }
634 debugger.console.print('frame = ${debugger.currentFrame}'); 736 return debugger.isolate.setName(args[0]);
635 return new Future.value(null);
636 } 737 }
637 738
638 String helpShort = 'Show current frame'; 739 String helpShort = 'Rename an isolate';
639 740
640 String helpLong = 741 String helpLong =
641 'Show current frame.\n' 742 'Rename an isolate.\n'
642 '\n' 743 '\n'
643 'Syntax: info frame\n'; 744 'Syntax: isolate name <name>\n';
644 } 745 }
645 746
646 class InfoCommand extends DebuggerCommand { 747 class InfoCommand extends DebuggerCommand {
647 InfoCommand(Debugger debugger) : super(debugger, 'info', [ 748 InfoCommand(Debugger debugger) : super(debugger, 'info', [
648 new InfoBreakpointsCommand(debugger), 749 new InfoBreakpointsCommand(debugger),
649 new InfoIsolatesCommand(debugger), 750 new InfoFrameCommand(debugger)]);
650 new InfoFrameCommand(debugger),
651 ]);
652 751
653 Future run(List<String> args) { 752 Future run(List<String> args) {
654 debugger.console.print("'info' expects a subcommand (see 'help info')"); 753 debugger.console.print("'info' expects a subcommand (see 'help info')");
655 return new Future.value(null); 754 return new Future.value(null);
656 } 755 }
657 756
658 String helpShort = 'Show information on a variety of topics'; 757 String helpShort = 'Show information on a variety of topics';
659 758
660 String helpLong = 759 String helpLong =
661 'Show information on a variety of topics.\n' 760 'Show information on a variety of topics.\n'
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
717 816
718 String helpLong = 817 String helpLong =
719 'Refresh debugging information of various sorts.\n' 818 'Refresh debugging information of various sorts.\n'
720 '\n' 819 '\n'
721 'Syntax: refresh <subcommand>\n'; 820 'Syntax: refresh <subcommand>\n';
722 } 821 }
723 822
724 // Tracks the state for an isolate debugging session. 823 // Tracks the state for an isolate debugging session.
725 class ObservatoryDebugger extends Debugger { 824 class ObservatoryDebugger extends Debugger {
726 RootCommand cmd; 825 RootCommand cmd;
826 DebuggerPageElement page;
727 DebuggerConsoleElement console; 827 DebuggerConsoleElement console;
728 DebuggerStackElement stackElement; 828 DebuggerStackElement stackElement;
729 ServiceMap stack; 829 ServiceMap stack;
730 830
731 int get currentFrame => _currentFrame; 831 int get currentFrame => _currentFrame;
732 void set currentFrame(int value) { 832 void set currentFrame(int value) {
733 if (value != null && (value < 0 || value >= stackDepth)) { 833 if (value != null && (value < 0 || value >= stackDepth)) {
734 throw new RangeError.range(value, 0, stackDepth); 834 throw new RangeError.range(value, 0, stackDepth);
735 } 835 }
736 _currentFrame = value; 836 _currentFrame = value;
(...skipping 14 matching lines...) Expand all
751 new FrameCommand(this), 851 new FrameCommand(this),
752 new PauseCommand(this), 852 new PauseCommand(this),
753 new ContinueCommand(this), 853 new ContinueCommand(this),
754 new NextCommand(this), 854 new NextCommand(this),
755 new StepCommand(this), 855 new StepCommand(this),
756 new FinishCommand(this), 856 new FinishCommand(this),
757 new BreakCommand(this), 857 new BreakCommand(this),
758 new ClearCommand(this), 858 new ClearCommand(this),
759 new DeleteCommand(this), 859 new DeleteCommand(this),
760 new InfoCommand(this), 860 new InfoCommand(this),
861 new IsolateCommand(this),
761 new RefreshCommand(this), 862 new RefreshCommand(this),
762 ]); 863 ]);
763 } 864 }
764 865
765 void set isolate(Isolate iso) { 866 VM get vm => page.app.vm;
867
868 void updateIsolate(Isolate iso) {
766 _isolate = iso; 869 _isolate = iso;
767 if (_isolate != null) { 870 if (_isolate != null) {
768 _isolate.reload().then((_) { 871 _isolate.reload().then((response) {
769 // TODO(turnidge): Currently the debugger relies on all libs 872 // TODO(turnidge): Currently the debugger relies on all libs
770 // being loaded. Fix this. 873 // being loaded. Fix this.
771 var pending = []; 874 var pending = [];
772 for (var lib in _isolate.libraries) { 875 for (var lib in _isolate.libraries) {
773 if (!lib.loaded) { 876 if (!lib.loaded) {
774 pending.add(lib.load()); 877 pending.add(lib.load());
775 } 878 }
776 } 879 }
777 Future.wait(pending).then((_) { 880 Future.wait(pending).then((_) {
778 _isolate.vm.events.stream.listen(_onEvent); 881 if (_subscription == null) {
882 _subscription = vm.events.stream.listen(_onEvent);
883 }
779 _refreshStack(isolate.pauseEvent).then((_) { 884 _refreshStack(isolate.pauseEvent).then((_) {
780 reportStatus(); 885 reportStatus();
781 }); 886 });
782 }); 887 });
783 }); 888 });
889 } else {
890 reportStatus();
784 } 891 }
785 } 892 }
893
894 void set isolate(Isolate iso) {
895 // Setting the page's isolate will trigger updateIsolate to be called.
896 //
897 // TODO(turnidge): Rework ownership of the ObservatoryDebugger in another
898 // change.
899 page.isolate = iso;
900 }
786 Isolate get isolate => _isolate; 901 Isolate get isolate => _isolate;
787 Isolate _isolate; 902 Isolate _isolate;
903 var _subscription;
788 904
789 void init() { 905 void init() {
790 console.newline(); 906 console.newline();
791 console.printBold("Type 'h' for help"); 907 console.printBold("Type 'h' for help");
908 // Wait a bit and if polymer still hasn't set up the isolate,
909 // report this to the user.
910 new Timer(const Duration(seconds:1), () {
911 if (isolate == null) {
912 reportStatus();
913 }
914 });
792 } 915 }
793 916
794 Future refreshStack() { 917 Future refreshStack() {
795 return _refreshStack(isolate.pauseEvent).then((_) { 918 return _refreshStack(isolate.pauseEvent).then((_) {
796 reportStatus(); 919 reportStatus();
797 }); 920 });
798 } 921 }
799 922
800 bool isolatePaused() { 923 bool isolatePaused() {
801 // TODO(turnidge): Stop relying on the isolate to track the last 924 // TODO(turnidge): Stop relying on the isolate to track the last
802 // pause event. Since we listen to events directly in the 925 // pause event. Since we listen to events directly in the
803 // debugger, this could introduce a race. 926 // debugger, this could introduce a race.
804 return (isolate != null && 927 return (isolate != null &&
805 isolate.pauseEvent != null && 928 isolate.pauseEvent != null &&
806 isolate.pauseEvent.eventType != ServiceEvent.kResume); 929 isolate.pauseEvent.eventType != ServiceEvent.kResume);
807 } 930 }
(...skipping 15 matching lines...) Expand all
823 stackElement.updateStack(stack, pauseEvent); 946 stackElement.updateStack(stack, pauseEvent);
824 if (stack['frames'].length > 0) { 947 if (stack['frames'].length > 0) {
825 currentFrame = 0; 948 currentFrame = 0;
826 } else { 949 } else {
827 currentFrame = null; 950 currentFrame = null;
828 } 951 }
829 }); 952 });
830 } 953 }
831 954
832 void reportStatus() { 955 void reportStatus() {
833 if (_isolate.idle) { 956 if (_isolate == null) {
957 console.print('No current isolate');
958 } else if (_isolate.idle) {
834 console.print('Isolate is idle'); 959 console.print('Isolate is idle');
835 } else if (_isolate.running) { 960 } else if (_isolate.running) {
836 console.print("Isolate is running (type 'pause' to interrupt)"); 961 console.print("Isolate is running (type 'pause' to interrupt)");
837 } else if (_isolate.pauseEvent != null) { 962 } else if (_isolate.pauseEvent != null) {
838 _reportPause(_isolate.pauseEvent); 963 _reportPause(_isolate.pauseEvent);
839 } else { 964 } else {
840 console.print('Isolate is in unknown state'); 965 console.print('Isolate is in unknown state');
841 } 966 }
842 } 967 }
843 968
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
895 console.print( 1020 console.print(
896 'Breakpoint ${bpId} ${verb} at ${script.name}:${line}:${col}'); 1021 'Breakpoint ${bpId} ${verb} at ${script.name}:${line}:${col}');
897 } else { 1022 } else {
898 console.print( 1023 console.print(
899 'Future breakpoint ${bpId} ${verb} at ${script.name}:${line}:${col}' ); 1024 'Future breakpoint ${bpId} ${verb} at ${script.name}:${line}:${col}' );
900 } 1025 }
901 }); 1026 });
902 } 1027 }
903 1028
904 void _onEvent(ServiceEvent event) { 1029 void _onEvent(ServiceEvent event) {
905 if (event.owner != isolate) {
906 return;
907 }
908 switch(event.eventType) { 1030 switch(event.eventType) {
909 case ServiceEvent.kIsolateExit: 1031 case ServiceEvent.kIsolateStart: {
910 console.print('Isolate shutdown'); 1032 var iso = event.owner;
911 isolate = null; 1033 console.print(
1034 "Isolate ${iso.number} '${iso.name}' has been created");
1035 break;
1036 }
1037
1038 case ServiceEvent.kIsolateExit: {
1039 var iso = event.owner;
1040 if (iso == isolate) {
1041 console.print("The current isolate has exited");
1042 } else {
1043 console.print(
1044 "Isolate ${iso.number} '${iso.name}' has exited");
1045 }
1046 break;
1047 }
1048
1049 case ServiceEvent.kIsolateUpdate:
1050 var iso = event.owner;
1051 console.print("Isolate ${iso.number} renamed to '${iso.name}'");
912 break; 1052 break;
913 1053
914 case ServiceEvent.kPauseStart: 1054 case ServiceEvent.kPauseStart:
915 case ServiceEvent.kPauseExit: 1055 case ServiceEvent.kPauseExit:
916 case ServiceEvent.kPauseBreakpoint: 1056 case ServiceEvent.kPauseBreakpoint:
917 case ServiceEvent.kPauseInterrupted: 1057 case ServiceEvent.kPauseInterrupted:
918 case ServiceEvent.kPauseException: 1058 case ServiceEvent.kPauseException:
919 _refreshStack(event).then((_) { 1059 if (event.owner == isolate) {
920 _reportPause(event); 1060 _refreshStack(event).then((_) {
921 }); 1061 _reportPause(event);
1062 });
1063 }
922 break; 1064 break;
923 1065
924 case ServiceEvent.kResume: 1066 case ServiceEvent.kResume:
925 console.print('Continuing...'); 1067 if (event.owner == isolate) {
1068 console.print('Continuing...');
1069 }
926 break; 1070 break;
927 1071
928 case ServiceEvent.kBreakpointAdded: 1072 case ServiceEvent.kBreakpointAdded:
929 case ServiceEvent.kBreakpointResolved: 1073 case ServiceEvent.kBreakpointResolved:
930 case ServiceEvent.kBreakpointRemoved: 1074 case ServiceEvent.kBreakpointRemoved:
931 _reportBreakpointEvent(event); 1075 if (event.owner == isolate) {
1076 _reportBreakpointEvent(event);
1077 }
932 break; 1078 break;
933 1079
934 case ServiceEvent.kIsolateStart: 1080 case ServiceEvent.kIsolateStart:
935 case ServiceEvent.kGraph: 1081 case ServiceEvent.kGraph:
936 case ServiceEvent.kGC: 1082 case ServiceEvent.kGC:
937 // Ignore these events for now.
938 break; 1083 break;
939 1084
940 default: 1085 default:
941 console.print('Unrecognized event: $event'); 1086 console.print('Unrecognized event: $event');
942 break; 1087 break;
943 } 1088 }
944 } 1089 }
945 1090
946 static String _commonPrefix(String a, String b) { 1091 static String _commonPrefix(String a, String b) {
947 int pos = 0; 1092 int pos = 0;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1001 return cmd.historyPrev(command); 1146 return cmd.historyPrev(command);
1002 } 1147 }
1003 1148
1004 String historyNext(String command) { 1149 String historyNext(String command) {
1005 return cmd.historyNext(command); 1150 return cmd.historyNext(command);
1006 } 1151 }
1007 } 1152 }
1008 1153
1009 @CustomTag('debugger-page') 1154 @CustomTag('debugger-page')
1010 class DebuggerPageElement extends ObservatoryElement { 1155 class DebuggerPageElement extends ObservatoryElement {
1156 @published ObservatoryApplication app;
1011 @published Isolate isolate; 1157 @published Isolate isolate;
1012 1158
1013 isolateChanged(oldValue) { 1159 isolateChanged(oldValue) {
1014 if (isolate != null) { 1160 if (isolate != null) {
1015 debugger.isolate = isolate; 1161 debugger.updateIsolate(isolate);
1016 } 1162 }
1017 } 1163 }
1018 ObservatoryDebugger debugger = new ObservatoryDebugger(); 1164 ObservatoryDebugger debugger = new ObservatoryDebugger();
1019 1165
1020 DebuggerPageElement.created() : super.created(); 1166 DebuggerPageElement.created() : super.created() {
1167 debugger.page = this;
1168 }
1021 1169
1022 @override 1170 @override
1023 void attached() { 1171 void attached() {
1024 super.attached(); 1172 super.attached();
1025 1173
1026 var navbarDiv = $['navbarDiv']; 1174 var navbarDiv = $['navbarDiv'];
1027 var stackDiv = $['stackDiv']; 1175 var stackDiv = $['stackDiv'];
1028 var splitterDiv = $['splitterDiv']; 1176 var splitterDiv = $['splitterDiv'];
1029 var cmdDiv = $['commandDiv']; 1177 var cmdDiv = $['commandDiv'];
1030 var consoleDiv = $['consoleDiv']; 1178 var consoleDiv = $['consoleDiv'];
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
1346 default: 1494 default:
1347 busy = false; 1495 busy = false;
1348 break; 1496 break;
1349 } 1497 }
1350 }); 1498 });
1351 } 1499 }
1352 1500
1353 DebuggerInputElement.created() : super.created(); 1501 DebuggerInputElement.created() : super.created();
1354 } 1502 }
1355 1503
OLDNEW
« no previous file with comments | « runtime/observatory/lib/src/debugger/debugger.dart ('k') | runtime/observatory/lib/src/elements/isolate_summary.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698