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

Unified Diff: runtime/bin/vmservice/client/lib/src/app/target_manager.dart

Issue 335463008: Allow Observatory to run as a hosted web service (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: runtime/bin/vmservice/client/lib/src/app/target_manager.dart
diff --git a/runtime/bin/vmservice/client/lib/src/app/target_manager.dart b/runtime/bin/vmservice/client/lib/src/app/target_manager.dart
new file mode 100644
index 0000000000000000000000000000000000000000..6620db056d86183b04709361da4998c209357dd5
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/app/target_manager.dart
@@ -0,0 +1,130 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of app;
+
+class ChromiumTargetLister {
+ /// Fetch the list of chromium [NetworkVMTargets].
+ static Future<List<WebSocketVMTarget>> fetch(String networkAddress) {
+ if (networkAddress == null) {
+ return new Future.error(null);
+ }
+ var encoded = Uri.encodeComponent(networkAddress);
+ var url = '/crdptargets/$encoded';
+ return HttpRequest.getString(url).then((String responseText) {
+ var list = JSON.decode(responseText);
+ if (list == null) {
+ return list;
+ }
+ for (var i = 0; i < list.length; i++) {
+ list[i] = new WebSocketVMTarget.fromMap(list[i]);
+ }
+ return list;
+ }).catchError((e) {
+ // An error occured while getting the list of Chrome targets.
+ // We eagerly request the list of targets, meaning this error can occur
+ // regularly. By catching it and dropping it, we avoid spamming errors
+ // on the console.
+ });
+ }
+}
+
+class TargetManager extends Observable {
+ static const _historyKey = 'history';
+ final SettingsGroup _settings = new SettingsGroup('targetManager');
+ final List history = new ObservableList();
+ WebSocketVMTarget defaultTarget;
+
+ String _networkAddressOfDefaultTarget() {
+ if (Utils.runningInJavaScript()) {
+ // We are running as JavaScript, use the same host that Observatory has
+ // been loaded from.
+ return 'ws://${window.location.host}/ws';
+ } else {
+ // Otherwise, assume we are running from Dart Editor and want to connect
+ // to the default host.
+ return 'ws://localhost:8181/ws';
+ }
+ }
+ TargetManager() {
+ _restore();
+ // Add a default standalone VM target.
+ defaultTarget = findOrMake(_networkAddressOfDefaultTarget());
+ assert(defaultTarget != null);
+ add(defaultTarget);
+ }
+
+ void clearHistory() {
+ history.clear();
+ _store();
+ }
+
+ WebSocketVMTarget findOrMake(String networkAddress) {
+ var target;
+ target = _find(networkAddress);
+ if (target != null) {
+ return target;
+ }
+ target = new WebSocketVMTarget(networkAddress);
+ return target;
+ }
+
+ /// Find by networkAddress.
+ WebSocketVMTarget _find(String networkAddress) {
+ var r;
+ history.forEach((item) {
+ if ((item.networkAddress == networkAddress) && (item.chrome == false)) {
+ r = item;
+ }
+ });
+ return r;
+ }
+
+ void add(WebSocketVMTarget item) {
+ if (item.chrome) {
+ // We don't store chrome tabs.
+ return;
+ }
+ if (history.contains(item)) {
+ return;
+ }
+ // Not inserting duplicates.
+ assert(_find(item.networkAddress) == null);
+ history.add(item);
+ _sort();
+ _store();
+ }
+
+ void remove(WebSocketVMTarget target) {
+ history.remove(target);
+ _sort();
+ _store();
+ }
+
+ void _sort() {
+ this.history.sort((WebSocketVMTarget a, WebSocketVMTarget b) {
+ return b.lastConnectionTime.compareTo(a.lastConnectionTime);
+ });
+ }
+
+ /// After making a change, update settings.
+ void _store() {
+ _sort();
+ _settings.set(_historyKey, history);
+ }
+
+ /// Read settings from data store.
+ void _restore() {
+ this.history.clear();
+ var loaded = _settings.get(_historyKey);
+ if (loaded == null) {
+ return;
+ }
+ for (var i = 0; i < loaded.length; i++) {
+ loaded[i] = new WebSocketVMTarget.fromMap(loaded[i]);
+ }
+ this.history.addAll(loaded);
+ _sort();
+ }
+}
« no previous file with comments | « runtime/bin/vmservice/client/lib/src/app/settings.dart ('k') | runtime/bin/vmservice/client/lib/src/app/utils.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698