Index: chrome/browser/resources/media_router/elements/media_router_sink_picker/media_router_sink_picker.js |
diff --git a/chrome/browser/resources/media_router/elements/media_router_sink_picker/media_router_sink_picker.js b/chrome/browser/resources/media_router/elements/media_router_sink_picker/media_router_sink_picker.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..85f0fcbf891e24b07fd5d77c2832452229e254b9 |
--- /dev/null |
+++ b/chrome/browser/resources/media_router/elements/media_router_sink_picker/media_router_sink_picker.js |
@@ -0,0 +1,123 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Shows a list of discovered sinks and their routes, if they exist. |
+Polymer('media-router-sink-picker', { |
+ publish: { |
+ /** |
+ * List of current routes. |
+ * |
+ * @attribute routeList |
+ * @type {!Array<!media_router.Route>} |
+ * @default [] |
+ */ |
+ routeList: [], |
+ |
+ /** |
+ * List of discovered sinks. |
+ * |
+ * @attribute sinkList |
+ * @type {!Array<!media_router.Sink>} |
+ * @default [] |
+ */ |
+ sinkList: [], |
+ }, |
+ |
+ observe: { |
+ routeList: 'rebuildRouteMaps', |
+ sinkList: 'rebuildSinkMap', |
+ }, |
+ |
+ created: function() { |
+ /** |
+ * Maps media_router.Sink.id to corresponding media_router.Sink. |
+ * @type {!Object<string, !media_router.Sink>} |
+ */ |
+ this.sinkMap = {}; |
+ |
+ /** |
+ * Maps media_router.Route.id to corresponding media_router.Route. |
+ * @type {!Object<string, !media_router.Route>} |
+ */ |
+ this.routeMap = {}; |
+ |
+ /** |
+ * Maps media_router.Sink.id to corresponding media_router.Route.id. |
+ * @type {!Object<string, string>} |
+ */ |
+ this.sinkToRouteMap = {}; |
+ }, |
+ |
+ /** |
+ * Called when routeList is updated. Rebuilds routeMap and sinkToRouteMap. |
+ */ |
+ rebuildRouteMaps: function() { |
+ // Reset routeMap and sinkToRouteMap. |
+ this.routeMap = {}; |
+ this.sinkToRouteMap = {}; |
+ |
+ // Rebuild routeMap and sinkToRouteMap. |
+ this.routeList.forEach(function(route) { |
+ this.routeMap[route.id] = route; |
+ this.sinkToRouteMap[route.sinkId] = route.id; |
+ }, this); |
+ }, |
+ |
+ /** |
+ * Called when sinkList is updated. Rebuilds sinkMap. |
+ */ |
+ rebuildSinkMap: function() { |
+ // Reset sinkMap. |
+ this.sinkMap = {}; |
+ |
+ // Rebuild sinkMap. |
+ this.sinkList.forEach(function(sink) { |
+ this.sinkMap[sink.id] = sink; |
+ }, this); |
+ }, |
+ |
+ /** |
+ * Adds route to routeList. |
+ * |
+ * @param {!media_router.Route} route The route to add. |
+ */ |
+ addRoute: function(route) { |
+ // Check if the route already exists or if its associated sink |
+ // does not exist. |
+ if (this.routeMap[route.id] || !this.sinkMap[route.sinkId]) |
+ return; |
+ |
+ // If there is an existing route associated with the same sink, its |
+ // sinkToRouteMap entry will be overwritten with that of the new route, |
+ // which results in the correct sink to route mapping. |
+ this.routeList.push(route); |
+ }, |
+ |
+ /** |
+ * Returns the sink corresponding to sinkId. |
+ * |
+ * @param {string} sinkId The id of the media_router.Sink. |
+ * @return {!media_router.Sink} |
+ */ |
+ getSink: function(sinkId) { |
+ return this.sinkMap[sinkId]; |
+ }, |
+ |
+ /** |
+ * Fires a sink-click event. This is called when a media-router-sink |
+ * is clicked. |
+ * |
+ * @param {!Event} event The event object. |
+ * @param {Object} detail The details of the event. |
+ * @param {!Element} sender Reference to clicked node. |
+ */ |
+ onClickSink: function(event, detail, sender) { |
+ // TODO(imcheng): Indicate route request is in progress. |
+ // TODO(imcheng): Only allow one request route at a time. |
+ this.fire('sink-click', { |
+ sink: sender.sink, |
+ route: sender.route |
+ }); |
+ }, |
+}); |