diff --git a/chrome/app/media_router_strings.grdp b/chrome/app/media_router_strings.grdp index ffeff974214090..97bc13caea74f4 100644 --- a/chrome/app/media_router_strings.grdp +++ b/chrome/app/media_router_strings.grdp @@ -136,6 +136,24 @@ Stop + + Play + + + Pause + + + Mute + + + Unmute + + + Seek + + + Volume + diff --git a/chrome/browser/media_router_resources.grdp b/chrome/browser/media_router_resources.grdp index 76b9e00eacfd35..01200e3345f19d 100644 --- a/chrome/browser/media_router_resources.grdp +++ b/chrome/browser/media_router_resources.grdp @@ -27,6 +27,12 @@ + + + + + + diff --git a/chrome/browser/resources/media_router/compiled_resources2.gyp b/chrome/browser/resources/media_router/compiled_resources2.gyp index b6af24babffbe1..076bcae75cd860 100644 --- a/chrome/browser/resources/media_router/compiled_resources2.gyp +++ b/chrome/browser/resources/media_router/compiled_resources2.gyp @@ -17,6 +17,14 @@ ], 'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'], }, + { + 'target_name': 'media_router_browser_api', + 'dependencies': [ + 'media_router_data', + '<(EXTERNS_GYP):chrome_send', + ], + 'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'], + }, { 'target_name': 'media_router_data', 'dependencies': [ @@ -28,9 +36,10 @@ { 'target_name': 'media_router_ui_interface', 'dependencies': [ - '<(EXTERNS_GYP):chrome_send', + 'media_router_browser_api', 'elements/media_router_header/compiled_resources2.gyp:media_router_header', - 'elements/media_router_container/compiled_resources2.gyp:media_router_container', + 'elements/media_router_container/compiled_resources2.gyp:media_router_container_interface', + 'elements/route_controls/compiled_resources2.gyp:route_controls_interface', ], 'includes': ['../../../../third_party/closure_compiler/compile_js2.gypi'], }, diff --git a/chrome/browser/resources/media_router/elements/media_router_container/compiled_resources2.gyp b/chrome/browser/resources/media_router/elements/media_router_container/compiled_resources2.gyp index 967e3bb4865ab2..d1681804ffbfac 100644 --- a/chrome/browser/resources/media_router/elements/media_router_container/compiled_resources2.gyp +++ b/chrome/browser/resources/media_router/elements/media_router_container/compiled_resources2.gyp @@ -8,6 +8,7 @@ 'dependencies': [ 'pseudo_sink_search_state', '../../compiled_resources2.gyp:externs', + '../../compiled_resources2.gyp:media_router_browser_api', '../../compiled_resources2.gyp:media_router_data', '../../elements/issue_banner/compiled_resources2.gyp:issue_banner', '../../elements/media_router_header/compiled_resources2.gyp:media_router_header', @@ -16,6 +17,13 @@ ], 'includes': ['../../../../../../third_party/closure_compiler/compile_js2.gypi'], }, + { + 'target_name': 'media_router_container_interface', + 'dependencies': [ + '../../compiled_resources2.gyp:media_router_data', + ], + 'includes': ['../../../../../../third_party/closure_compiler/compile_js2.gypi'], + }, { 'target_name': 'pseudo_sink_search_state', 'dependencies': [ diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html index c3d6c60c441f1a..b6af91a32657fe 100644 --- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html +++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html @@ -91,7 +91,8 @@ is-any-sink-currently-launching= "[[computeIsLaunching_(currentLaunchingSinkId_)]]" on-change-route-source-click="onChangeRouteSourceClick_" - on-close-route="onCloseRoute_"> + on-close-route="onCloseRoute_" + use-web-ui-route-controls="[[useWebUiRouteControls]]">
} + */ +MediaRouterContainerInterface.prototype.allSinks; + +/** + * The list of CastModes to show. + * @type {!Array|undefined} + */ +MediaRouterContainerInterface.prototype.castModeList; + +/** + * The URL to open when the device missing link is clicked. + * @type {string|undefined} + */ +MediaRouterContainerInterface.prototype.deviceMissingUrl; + +/** + * The URL to open when the cloud services pref learn more link is clicked. + * @type {string|undefined} + */ +MediaRouterContainerInterface.prototype.firstRunFlowCloudPrefLearnMoreUrl; + +/** + * The URL to open when the first run flow learn more link is clicked. + * @type {string|undefined} + */ +MediaRouterContainerInterface.prototype.firstRunFlowLearnMoreUrl; + +/** + * The header text for the sink list. + * @type {string|undefined} + */ +MediaRouterContainerInterface.prototype.headerText; + +/** + * The header text tooltip. This would be descriptive of the + * source origin, whether a host name, tab URL, etc. + * @type {string|undefined} + */ +MediaRouterContainerInterface.prototype.headerTextTooltip; + +/** + * The issue to show. + * @type {?media_router.Issue} + */ +MediaRouterContainerInterface.prototype.issue; + +/** + * The list of current routes. + * @type {!Array|undefined} + */ +MediaRouterContainerInterface.prototype.routeList; + +/** + * Whether the search input should be padded as if it were at the bottom of + * the dialog. + * @type {boolean} + */ +MediaRouterContainerInterface.prototype.searchUseBottomPadding; + +/** + * Whether to show the user domain of sinks associated with identity. + * @type {boolean|undefined} + */ +MediaRouterContainerInterface.prototype.showDomain; + +/** + * Whether to show the first run flow. + * @type {boolean|undefined} + */ +MediaRouterContainerInterface.prototype.showFirstRunFlow; + +/** + * Whether to show the cloud preference setting in the first run flow. + * @type {boolean|undefined} + */ +MediaRouterContainerInterface.prototype.showFirstRunFlowCloudPref; + +/** + * Whether the WebUI route controls should be shown instead of the + * extensionview in the route details view. + * @type {boolean} + */ +MediaRouterContainerInterface.prototype.useWebUiRouteControls; + +/** + * Fires a 'report-initial-action' event when the user takes their first + * action after the dialog opens. Also fires a 'report-initial-action-close' + * event if that initial action is to close the dialog. + * @param {!media_router.MediaRouterUserAction} initialAction + */ +MediaRouterContainerInterface.prototype.maybeReportUserFirstAction = function( + initialAction) {}; + +/** + * Updates |currentView_| if the dialog had just opened and there's + * only one local route. + */ +MediaRouterContainerInterface.prototype.maybeShowRouteDetailsOnOpen = + function() {}; + +/** + * Handles response of previous create route attempt. + * @param {string} sinkId The ID of the sink to which the Media Route was + * creating a route. + * @param {?media_router.Route} route The newly created route that + * corresponds to the sink if route creation succeeded; null otherwise. + * @param {boolean} isForDisplay Whether or not |route| is for display. + */ +MediaRouterContainerInterface.prototype.onCreateRouteResponseReceived = + function(sinkId, route, isForDisplay) {}; + +/** + * Called when a search has completed up to route creation. |sinkId| + * identifies the sink that should be in |allSinks|, if a sink was found. + * @param {string} sinkId The ID of the sink that is the result of the + * currently pending search. + */ +MediaRouterContainerInterface.prototype.onReceiveSearchResult = function( + sinkId) {}; + +/** + * Called when the connection to the route controller is invalidated. Switches + * from route details view to the sink list view. + */ +MediaRouterContainerInterface.prototype.onRouteControllerInvalidated = + function() {}; + +/** + * Sets the selected cast mode to the one associated with |castModeType|, + * and rebuilds sinks to reflect the change. + * @param {number} castModeType The type of the selected cast mode. + */ +MediaRouterContainerInterface.prototype.selectCastMode = function( + castModeType) {}; + +/** + * Update the max dialog height and update the positioning of the elements. + * @param {number} height The max height of the Media Router dialog. + */ +MediaRouterContainerInterface.prototype.updateMaxDialogHeight = function( + height) {}; diff --git a/chrome/browser/resources/media_router/elements/route_controls/compiled_resources2.gyp b/chrome/browser/resources/media_router/elements/route_controls/compiled_resources2.gyp new file mode 100644 index 00000000000000..cb312aec6609c3 --- /dev/null +++ b/chrome/browser/resources/media_router/elements/route_controls/compiled_resources2.gyp @@ -0,0 +1,25 @@ +# Copyright 2017 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. +{ + 'targets': [ + { + 'target_name': 'route_controls', + 'dependencies': [ + '../../compiled_resources2.gyp:media_router_browser_api', + '../../compiled_resources2.gyp:media_router_data', + '../../compiled_resources2.gyp:media_router_ui_interface', + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:i18n_behavior', + '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data', + ], + 'includes': ['../../../../../../third_party/closure_compiler/compile_js2.gypi'], + }, + { + 'target_name': 'route_controls_interface', + 'dependencies': [ + '../../compiled_resources2.gyp:media_router_data', + ], + 'includes': ['../../../../../../third_party/closure_compiler/compile_js2.gypi'], + }, + ], +} diff --git a/chrome/browser/resources/media_router/elements/route_controls/route_controls.css b/chrome/browser/resources/media_router/elements/route_controls/route_controls.css new file mode 100644 index 00000000000000..be9d9edebc2faa --- /dev/null +++ b/chrome/browser/resources/media_router/elements/route_controls/route_controls.css @@ -0,0 +1,76 @@ +/* Copyright 2017 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. */ + +#button-holder { + float: left; +} + +#current-time { + left: 20px; + position: absolute; +} + +#duration { + position: absolute; + right: 20px; +} + +.ellipsis { + padding: 0 1%; + text-overflow: ellipsis; + white-space: nowrap; + width: 90%; +} + +#media-controls { + font-size: 1.25em; + margin: 0 8px; +} + +#play-pause-volume-controls { + display: block; + margin-top: 13px; + overflow: hidden; +} + +#route-description { + margin: 15px 8px 3px 8px; + overflow: hidden; +} + +#route-time-controls { + display: block; + margin-top: 3px; + overflow: hidden; +} + +#route-time-slider { + --paper-slider-knob-color: rgb(16, 16, 16); + --paper-slider-active-color: rgb(16, 16, 16); + --paper-slider-pin-color: rgb(16, 16, 16); + width: 100%; +} + +#route-title { + color: rgb(125, 125, 125); + margin: 3px 8px; + overflow: hidden; +} + +#route-volume-slider { + --paper-slider-knob-color: rgb(16, 16, 16); + --paper-slider-active-color: rgb(33, 150, 243); + --paper-slider-pin-color: rgb(16, 16, 16); + width: 100%; +} + +#timeline { + font-size: 0.75em; +} + +#volume-holder { + display: block; + overflow: hidden; + padding: 0.3em 0; +} diff --git a/chrome/browser/resources/media_router/elements/route_controls/route_controls.html b/chrome/browser/resources/media_router/elements/route_controls/route_controls.html new file mode 100644 index 00000000000000..b6ca6c4ae017c9 --- /dev/null +++ b/chrome/browser/resources/media_router/elements/route_controls/route_controls.html @@ -0,0 +1,68 @@ + + + + + + + + + + diff --git a/chrome/browser/resources/media_router/elements/route_controls/route_controls.js b/chrome/browser/resources/media_router/elements/route_controls/route_controls.js new file mode 100644 index 00000000000000..4d3a65bc61b8b8 --- /dev/null +++ b/chrome/browser/resources/media_router/elements/route_controls/route_controls.js @@ -0,0 +1,261 @@ +// Copyright 2017 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. + +/** + * This Polymer element shows media controls for a route that is currently cast + * to a device. + * @implements {RouteControlsInterface} + */ +Polymer({ + is: 'route-controls', + + properties: { + /** + * The current time displayed in seconds, before formatting. + * @private {number} + */ + displayedCurrentTime_: { + type: Number, + value: 0, + }, + + /** + * The media description to display. Uses route description if none is + * provided by the route status object. + * @private {string} + */ + displayedDescription_: { + type: String, + value: '', + }, + + /** + * The volume shown in the volume control, between 0 and 1. + * @private {number} + */ + displayedVolume_: { + type: Number, + value: 0, + }, + + /** + * Set to true when the user is dragging the seek bar. Updates for the + * current time from the browser will be ignored when set to true. + * @private {boolean} + */ + isSeeking_: { + type: Boolean, + value: false, + }, + + /** + * Set to true when the user is dragging the volume bar. Volume updates from + * the browser will be ignored when set to true. + * @private {boolean} + */ + isVolumeChanging_: { + type: Boolean, + value: false, + }, + + /** + * The status of the media route shown. + * @type {!media_router.RouteStatus} + */ + routeStatus: { + type: Object, + observer: 'onRouteStatusChange_', + value: new media_router.RouteStatus( + '', '', false, false, false, false, false, false, 0, 0, 0), + }, + }, + + behaviors: [ + I18nBehavior, + ], + + /** + * Called by Polymer when the element loads. Registers the element to be + * notified of route status updates. + */ + ready: function() { + media_router.ui.setRouteControls( + /** @type {RouteControlsInterface} */ (this)); + }, + + /** + * Converts a number representing an interval of seconds to a string with + * HH:MM:SS format. + * @param {number} timeInSec Must be non-negative. Intervals longer than 100 + * hours get truncated silently. + * @return {string} + * + * @private + */ + getFormattedTime_: function(timeInSec) { + if (timeInSec < 0) { + return ''; + } + var hours = Math.floor(timeInSec / 3600); + var minutes = Math.floor(timeInSec / 60) % 60; + var seconds = Math.floor(timeInSec) % 60; + return ('0' + hours).substr(-2) + ':' + ('0' + minutes).substr(-2) + ':' + + ('0' + seconds).substr(-2); + }, + + /** + * @param {!media_router.RouteStatus} routeStatus + * @return {string} The value for the icon attribute of the mute/unmute + * button. + * + * @private + */ + getMuteUnmuteIcon_: function(routeStatus) { + return routeStatus.isMuted ? 'av:volume-off' : 'av:volume-up'; + }, + + /** + * @param {!media_router.RouteStatus} routeStatus + * @return {string} Localized title for the mute/unmute button. + * + * @private + */ + getMuteUnmuteTitle_: function(routeStatus) { + return routeStatus.isMuted ? this.i18n('unmuteTitle') : + this.i18n('muteTitle'); + }, + + /** + * @param {!media_router.RouteStatus} routeStatus + * @return {string}The value for the icon attribute of the play/pause button. + * + * @private + */ + getPlayPauseIcon_: function(routeStatus) { + return routeStatus.isPaused ? 'av:play-arrow' : 'av:pause'; + }, + + /** + * @param {!media_router.RouteStatus} routeStatus + * @return {string} Localized title for the play/pause button. + * + * @private + */ + getPlayPauseTitle_: function(routeStatus) { + return routeStatus.isPaused ? this.i18n('playTitle') : + this.i18n('pauseTitle'); + }, + + /** + * Called when the user toggles the mute status of the media. Sends a mute or + * unmute command to the browser. + * + * @private + */ + onMuteUnmute_: function() { + media_router.browserApi.setCurrentMediaMute(!this.routeStatus.isMuted); + }, + + /** + * Called when the user toggles between playing and pausing the media. Sends a + * play or pause command to the browser. + * + * @private + */ + onPlayPause_: function() { + if (this.routeStatus.isPaused) { + media_router.browserApi.playCurrentMedia(); + } else { + media_router.browserApi.pauseCurrentMedia(); + } + }, + + /** + * Resets the route controls. Called when the route details view is closed. + */ + reset: function() { + this.routeStatus = new media_router.RouteStatus( + '', '', false, false, false, false, false, false, 0, 0, 0); + media_router.ui.setRouteControls(null); + }, + + /** + * Updates seek and volume bars if the user is not currently dragging on + * them. + * @param {!media_router.RouteStatus} newRouteStatus + * + * @private + */ + onRouteStatusChange_: function(newRouteStatus) { + if (!this.isSeeking_) { + this.displayedCurrentTime_ = newRouteStatus.currentTime; + } + if (!this.isVolumeChanging_) { + this.displayedVolume_ = newRouteStatus.volume; + } + if (newRouteStatus.description !== '') { + this.displayedDescription_ = newRouteStatus.description; + } + }, + + /** + * Called when the route is updated. Updates the description shown if it has + * not been provided by status updates. + * @param {!media_router.Route} route + */ + onRouteUpdated: function(route) { + if (this.routeStatus.description === '') { + this.displayedDescription_ = + loadTimeData.getStringF('castingActivityStatus', route.description); + } + }, + + /** + * Called when the user clicks on or stops dragging the seek bar. + * @param {!Event} e + * + * @private + */ + onSeekComplete_: function(e) { + this.isSeeking_ = false; + this.displayedCurrentTime_ = e.target.value; + media_router.browserApi.seekCurrentMedia(this.displayedCurrentTime_); + }, + + /** + * Called when the user starts dragging the seek bar. + * @param {!Event} e + * + * @private + */ + onSeekStart_: function(e) { + this.isSeeking_ = true; + var target = /** @type {{immediateValue: number}} */ (e.target); + this.displayedCurrentTime_ = target.immediateValue; + }, + + /** + * Called when the user clicks on or stops dragging the volume bar. + * @param {!Event} e + * + * @private + */ + onVolumeChangeComplete_: function(e) { + this.isVolumeChanging_ = false; + this.volumeSliderValue_ = e.target.value; + media_router.browserApi.setCurrentMediaVolume(this.volumeSliderValue_); + }, + + /** + * Called when the user starts dragging the volume bar. + * @param {!Event} e + * + * @private + */ + onVolumeChangeStart_: function(e) { + this.isVolumeChanging_ = true; + var target = /** @type {{immediateValue: number}} */ (e.target); + this.volumeSliderValue_ = target.immediateValue; + }, +}); diff --git a/chrome/browser/resources/media_router/elements/route_controls/route_controls_interface.js b/chrome/browser/resources/media_router/elements/route_controls/route_controls_interface.js new file mode 100644 index 00000000000000..93aefe5db756bc --- /dev/null +++ b/chrome/browser/resources/media_router/elements/route_controls/route_controls_interface.js @@ -0,0 +1,27 @@ +// Copyright 2017 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. + +/** + * Interface for the Polymer element that shows media controls for a route that + * is currently cast to a device. + * @record + */ +function RouteControlsInterface() {} + +/** + * @type {!media_router.RouteStatus} + */ +RouteControlsInterface.prototype.routeStatus; + +/** + * Resets the route controls. Called when the route details view is closed. + */ +RouteControlsInterface.prototype.reset = function() {}; + +/** + * Called when the route is updated. Updates the description shown if it has + * not been provided by status updates. + * @param {!media_router.Route} route + */ +RouteControlsInterface.prototype.onRouteUpdated = function(route) {}; diff --git a/chrome/browser/resources/media_router/elements/route_details/compiled_resources2.gyp b/chrome/browser/resources/media_router/elements/route_details/compiled_resources2.gyp index 92f14fd00ccb72..ea2470c0b281fa 100644 --- a/chrome/browser/resources/media_router/elements/route_details/compiled_resources2.gyp +++ b/chrome/browser/resources/media_router/elements/route_details/compiled_resources2.gyp @@ -6,7 +6,10 @@ { 'target_name': 'route_details', 'dependencies': [ + 'extension_view_wrapper/compiled_resources2.gyp:extension_view_wrapper', '../../compiled_resources2.gyp:media_router_data', + '../../compiled_resources2.gyp:media_router_ui_interface', + '../route_controls/compiled_resources2.gyp:route_controls', '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:i18n_behavior', '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data', ], diff --git a/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/compiled_resources2.gyp b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/compiled_resources2.gyp new file mode 100644 index 00000000000000..b7d8fe1d144892 --- /dev/null +++ b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/compiled_resources2.gyp @@ -0,0 +1,14 @@ +# Copyright 2017 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. +{ + 'targets': [ + { + 'target_name': 'extension_view_wrapper', + 'dependencies': [ + '../../../compiled_resources2.gyp:media_router_data', + ], + 'includes': ['../../../../../../../third_party/closure_compiler/compile_js2.gypi'], + }, + ], +} diff --git a/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.css b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.css new file mode 100644 index 00000000000000..bd41df11035f08 --- /dev/null +++ b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.css @@ -0,0 +1,9 @@ +/* Copyright 2017 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. */ + +#custom-controller { + display: inline-block; + height: 142px; + width: 100%; +} diff --git a/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.html b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.html new file mode 100644 index 00000000000000..9b33d90aedd3be --- /dev/null +++ b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.html @@ -0,0 +1,9 @@ + + + + + + diff --git a/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.js b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.js new file mode 100644 index 00000000000000..997e7e081efd4c --- /dev/null +++ b/chrome/browser/resources/media_router/elements/route_details/extension_view_wrapper/extension_view_wrapper.js @@ -0,0 +1,64 @@ +// Copyright 2017 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. + +// This Polymer element shows the custom controller for a route using +// extensionview. +Polymer({ + is: 'extension-view-wrapper', + + properties: { + /** + * The route to show the custom controller for. + * @type {?media_router.Route|undefined} + */ + route: { + type: Object, + observer: 'maybeLoadExtensionView_', + }, + + /** + * Whether the extension view is ready to be shown. + * @type {boolean} + */ + isExtensionViewReady: { + type: Boolean, + value: false, + notify: true, + }, + }, + + /** + * Called by Polymer when this module has loaded. + */ + ready: function() { + this.maybeLoadExtensionView_(); + }, + + /** + * Loads the custom controller if the controller path for the current route is + * valid. + */ + maybeLoadExtensionView_: function() { + var extensionview = this.$['custom-controller']; + + // Do nothing if the controller path doesn't exist or is already shown in + // the extension view. + if (!this.route || !this.route.customControllerPath || + this.route.customControllerPath == extensionview.src) { + return; + } + + var that = this; + extensionview.load(this.route.customControllerPath) + .then( + function() { + // Load was successful; show the custom controller. + that.isExtensionViewReady = true; + }, + function() { + // Load was unsuccessful; fall back to default view. + that.isExtensionViewReady = false; + }); + }, +}); diff --git a/chrome/browser/resources/media_router/elements/route_details/route_details.css b/chrome/browser/resources/media_router/elements/route_details/route_details.css index 9f1f1dbf6ddf3c..742647da622fd9 100644 --- a/chrome/browser/resources/media_router/elements/route_details/route_details.css +++ b/chrome/browser/resources/media_router/elements/route_details/route_details.css @@ -2,12 +2,6 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ -#custom-controller { - display: inline-block; - height: 142px; - width: 100%; -} - #route-action-buttons { @apply(--layout-horizontal); @apply(--layout-end-justified); diff --git a/chrome/browser/resources/media_router/elements/route_details/route_details.html b/chrome/browser/resources/media_router/elements/route_details/route_details.html index 61043b440754fe..1313fb20762219 100644 --- a/chrome/browser/resources/media_router/elements/route_details/route_details.html +++ b/chrome/browser/resources/media_router/elements/route_details/route_details.html @@ -1,16 +1,25 @@ + +