Index: chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js |
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js |
index ff9296814a7eeddcf8752044bf520113b037fe76..48a1d0ee376b4a48679079f60808fde666859460 100644 |
--- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js |
+++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js |
@@ -530,6 +530,11 @@ Polymer({ |
if (!this.castModeList.length) |
return; |
+ // If there is a forced mode make sure it is shown. |
+ if (this.findForcedCastMode_()) { |
+ this.rebuildSinksToShow_(); |
+ } |
+ |
// If we are currently showing auto mode, then nothing needs to be done. |
// Otherwise, if the cast mode currently shown no longer exists (regardless |
// of whether it was selected by user), then switch back to auto cast mode. |
@@ -611,13 +616,18 @@ Polymer({ |
}, |
/** |
- * If |allSinks| supports only a single cast mode, returns that cast mode. |
- * Otherwise, returns AUTO_MODE. Only called if |userHasSelectedCastMode_| is |
- * |false|. |
+ * If there is a forced cast mode, returns that cast mode. If |allSinks| |
+ * supports only a single cast mode, returns that cast mode. Otherwise, |
+ * returns AUTO_MODE. Only called if |userHasSelectedCastMode_| is |false|. |
+ * |
* @return {!media_router.CastMode} The single cast mode supported by |
* |allSinks|, or AUTO_MODE. |
*/ |
computeCastMode_: function() { |
+ /** @const */ var forcedMode = this.findForcedCastMode_(); |
+ if (forcedMode) |
+ return forcedMode; |
+ |
var allCastModes = this.allSinks.reduce(function(castModesSoFar, sink) { |
return castModesSoFar | sink.castModes; |
}, 0); |
@@ -1149,6 +1159,17 @@ Polymer({ |
}, |
/** |
+ * Helper function to return a forced CastMode, if any. |
+ * |
+ * @return {media_router.CastMode|undefined} CastMode object with |
+ * isForced = true, or undefined if not found. |
+ */ |
+ findForcedCastMode_: function() { |
+ return this.castModeList && |
+ this.castModeList.find(element => element.isForced); |
+ }, |
+ |
+ /** |
* @param {?Element} element Element to compute padding for. |
* @return {!Array<number>} Array containing the element's bottom padding |
* value and the element's top padding value, in that order. |
@@ -1978,20 +1999,21 @@ Polymer({ |
updatedSinkList.unshift(pendingPseudoSink); |
} |
} |
- if (this.userHasSelectedCastMode_) { |
- // If user explicitly selected a cast mode, then we show only sinks that |
- // are compatible with current cast mode or sinks that are active. |
+ // If user did not select a cast mode, then: |
+ // - If there is a forced cast mode, it is shown. |
+ // - If all sinks support only a single cast mode, then the cast mode is |
+ // switched to that mode. |
+ // - Otherwise, the cast mode becomes AUTO mode. |
+ if (!this.userHasSelectedCastMode_) |
+ this.setShownCastMode_(this.computeCastMode_()); |
+ |
+ // Non-AUTO modes may show a subset of sinks based on compatibility with the |
+ // shown value. |
+ if (this.shownCastModeValue_ != media_router.CastModeType.AUTO) { |
updatedSinkList = updatedSinkList.filter(function(element) { |
return (element.castModes & this.shownCastModeValue_) || |
- this.sinkToRouteMap_[element.id]; |
+ this.sinkToRouteMap_[element.id]; |
}, this); |
- } else { |
- // If user did not select a cast mode, then: |
- // - If all sinks support only a single cast mode, then the cast mode is |
- // switched to that mode. |
- // - Otherwise, the cast mode becomes auto mode. |
- // Either way, all sinks will be shown. |
- this.setShownCastMode_(this.computeCastMode_()); |
} |
// When there's an updated list of sinks, append any new sinks to the end |