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

Side by Side Diff: extensions/renderer/resources/media_router_bindings.js

Issue 2422773004: [Media Router] Adds a pre-invocation hook to Media Router bindings. (Closed)
Patch Set: Fix typo Created 4 years, 1 month 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 var mediaRouter; 5 var mediaRouter;
6 6
7 define('media_router_bindings', [ 7 define('media_router_bindings', [
8 'mojo/public/js/bindings', 8 'mojo/public/js/bindings',
9 'mojo/public/js/core', 9 'mojo/public/js/core',
10 'content/public/renderer/frame_interfaces', 10 'content/public/renderer/frame_interfaces',
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 } 538 }
539 MediaRouteProvider.prototype = Object.create( 539 MediaRouteProvider.prototype = Object.create(
540 mediaRouterMojom.MediaRouteProvider.stubClass.prototype); 540 mediaRouterMojom.MediaRouteProvider.stubClass.prototype);
541 541
542 /* 542 /*
543 * Sets the callback handler used to invoke methods in the provider manager. 543 * Sets the callback handler used to invoke methods in the provider manager.
544 * 544 *
545 * @param {!MediaRouterHandlers} handlers 545 * @param {!MediaRouterHandlers} handlers
546 */ 546 */
547 MediaRouteProvider.prototype.setHandlers = function(handlers) { 547 MediaRouteProvider.prototype.setHandlers = function(handlers) {
548 // TODO(mfoltz): Remove when component that supports this method is
549 // available in canary.
550 if (!handlers['onBeforeInvokeHandler'])
551 handlers['onBeforeInvokeHandler'] = () => {};
548 this.handlers_ = handlers; 552 this.handlers_ = handlers;
549 var requiredHandlers = [ 553 var requiredHandlers = [
550 'stopObservingMediaRoutes', 554 'stopObservingMediaRoutes',
551 'startObservingMediaRoutes', 555 'startObservingMediaRoutes',
552 'sendRouteMessage', 556 'sendRouteMessage',
553 'sendRouteBinaryMessage', 557 'sendRouteBinaryMessage',
554 'startListeningForRouteMessages', 558 'startListeningForRouteMessages',
555 'stopListeningForRouteMessages', 559 'stopListeningForRouteMessages',
556 'detachRoute', 560 'detachRoute',
557 'terminateRoute', 561 'terminateRoute',
558 'joinRoute', 562 'joinRoute',
559 'createRoute', 563 'createRoute',
560 'stopObservingMediaSinks', 564 'stopObservingMediaSinks',
561 'startObservingMediaRoutes', 565 'startObservingMediaRoutes',
562 'connectRouteByRouteId', 566 'connectRouteByRouteId',
563 'enableMdnsDiscovery', 567 'enableMdnsDiscovery',
564 'updateMediaSinks', 568 'updateMediaSinks',
565 'searchSinks', 569 'searchSinks',
570 'onBeforeInvokeHandler'
566 ]; 571 ];
567 requiredHandlers.forEach(function(nextHandler) { 572 requiredHandlers.forEach(function(nextHandler) {
568 if (handlers[nextHandler] === undefined) { 573 if (handlers[nextHandler] === undefined) {
569 console.error(nextHandler + ' handler not registered.'); 574 console.error(nextHandler + ' handler not registered.');
570 } 575 }
571 }); 576 });
572 } 577 }
573 578
574 /** 579 /**
575 * Starts querying for sinks capable of displaying the media source 580 * Starts querying for sinks capable of displaying the media source
576 * designated by |sourceUrn|. Results are returned by calling 581 * designated by |sourceUrn|. Results are returned by calling
577 * OnSinksReceived. 582 * OnSinksReceived.
578 * @param {!string} sourceUrn 583 * @param {!string} sourceUrn
579 */ 584 */
580 MediaRouteProvider.prototype.startObservingMediaSinks = 585 MediaRouteProvider.prototype.startObservingMediaSinks =
581 function(sourceUrn) { 586 function(sourceUrn) {
587 this.handlers_.onBeforeInvokeHandler();
582 this.handlers_.startObservingMediaSinks(sourceUrn); 588 this.handlers_.startObservingMediaSinks(sourceUrn);
583 }; 589 };
584 590
585 /** 591 /**
586 * Stops querying for sinks capable of displaying |sourceUrn|. 592 * Stops querying for sinks capable of displaying |sourceUrn|.
587 * @param {!string} sourceUrn 593 * @param {!string} sourceUrn
588 */ 594 */
589 MediaRouteProvider.prototype.stopObservingMediaSinks = 595 MediaRouteProvider.prototype.stopObservingMediaSinks =
590 function(sourceUrn) { 596 function(sourceUrn) {
597 this.handlers_.onBeforeInvokeHandler();
591 this.handlers_.stopObservingMediaSinks(sourceUrn); 598 this.handlers_.stopObservingMediaSinks(sourceUrn);
592 }; 599 };
593 600
594 /** 601 /**
595 * Requests that |sinkId| render the media referenced by |sourceUrn|. If the 602 * Requests that |sinkId| render the media referenced by |sourceUrn|. If the
596 * request is from the Presentation API, then origin and tabId will 603 * request is from the Presentation API, then origin and tabId will
597 * be populated. 604 * be populated.
598 * @param {!string} sourceUrn Media source to render. 605 * @param {!string} sourceUrn Media source to render.
599 * @param {!string} sinkId Media sink ID. 606 * @param {!string} sinkId Media sink ID.
600 * @param {!string} presentationId Presentation ID from the site 607 * @param {!string} presentationId Presentation ID from the site
601 * requesting presentation. TODO(mfoltz): Remove. 608 * requesting presentation. TODO(mfoltz): Remove.
602 * @param {!string} origin Origin of site requesting presentation. 609 * @param {!string} origin Origin of site requesting presentation.
603 * @param {!number} tabId ID of tab requesting presentation. 610 * @param {!number} tabId ID of tab requesting presentation.
604 * @param {!TimeDelta} timeout If positive, the timeout duration for the 611 * @param {!TimeDelta} timeout If positive, the timeout duration for the
605 * request. Otherwise, the default duration will be used. 612 * request. Otherwise, the default duration will be used.
606 * @param {!boolean} incognito If true, the route is being requested by 613 * @param {!boolean} incognito If true, the route is being requested by
607 * an incognito profile. 614 * an incognito profile.
608 * @return {!Promise.<!Object>} A Promise resolving to an object describing 615 * @return {!Promise.<!Object>} A Promise resolving to an object describing
609 * the newly created media route, or rejecting with an error message on 616 * the newly created media route, or rejecting with an error message on
610 * failure. 617 * failure.
611 */ 618 */
612 MediaRouteProvider.prototype.createRoute = 619 MediaRouteProvider.prototype.createRoute =
613 function(sourceUrn, sinkId, presentationId, origin, tabId, 620 function(sourceUrn, sinkId, presentationId, origin, tabId,
614 timeout, incognito) { 621 timeout, incognito) {
622 this.handlers_.onBeforeInvokeHandler();
615 return this.handlers_.createRoute( 623 return this.handlers_.createRoute(
616 sourceUrn, sinkId, presentationId, origin, tabId, 624 sourceUrn, sinkId, presentationId, origin, tabId,
617 Math.floor(timeout.microseconds / 1000), incognito) 625 Math.floor(timeout.microseconds / 1000), incognito)
618 .then(function(route) { 626 .then(function(route) {
619 return toSuccessRouteResponse_(route); 627 return toSuccessRouteResponse_(route);
620 }, 628 },
621 function(err) { 629 function(err) {
622 return toErrorRouteResponse_(err); 630 return toErrorRouteResponse_(err);
623 }); 631 });
624 }; 632 };
(...skipping 10 matching lines...) Expand all
635 * request. Otherwise, the default duration will be used. 643 * request. Otherwise, the default duration will be used.
636 * @param {!boolean} incognito If true, the route is being requested by 644 * @param {!boolean} incognito If true, the route is being requested by
637 * an incognito profile. 645 * an incognito profile.
638 * @return {!Promise.<!Object>} A Promise resolving to an object describing 646 * @return {!Promise.<!Object>} A Promise resolving to an object describing
639 * the newly created media route, or rejecting with an error message on 647 * the newly created media route, or rejecting with an error message on
640 * failure. 648 * failure.
641 */ 649 */
642 MediaRouteProvider.prototype.joinRoute = 650 MediaRouteProvider.prototype.joinRoute =
643 function(sourceUrn, presentationId, origin, tabId, timeout, 651 function(sourceUrn, presentationId, origin, tabId, timeout,
644 incognito) { 652 incognito) {
653 this.handlers_.onBeforeInvokeHandler();
645 return this.handlers_.joinRoute( 654 return this.handlers_.joinRoute(
646 sourceUrn, presentationId, origin, tabId, 655 sourceUrn, presentationId, origin, tabId,
647 Math.floor(timeout.microseconds / 1000), incognito) 656 Math.floor(timeout.microseconds / 1000), incognito)
648 .then(function(route) { 657 .then(function(route) {
649 return toSuccessRouteResponse_(route); 658 return toSuccessRouteResponse_(route);
650 }, 659 },
651 function(err) { 660 function(err) {
652 return toErrorRouteResponse_(err); 661 return toErrorRouteResponse_(err);
653 }); 662 });
654 }; 663 };
(...skipping 11 matching lines...) Expand all
666 * request. Otherwise, the default duration will be used. 675 * request. Otherwise, the default duration will be used.
667 * @param {!boolean} incognito If true, the route is being requested by 676 * @param {!boolean} incognito If true, the route is being requested by
668 * an incognito profile. 677 * an incognito profile.
669 * @return {!Promise.<!Object>} A Promise resolving to an object describing 678 * @return {!Promise.<!Object>} A Promise resolving to an object describing
670 * the newly created media route, or rejecting with an error message on 679 * the newly created media route, or rejecting with an error message on
671 * failure. 680 * failure.
672 */ 681 */
673 MediaRouteProvider.prototype.connectRouteByRouteId = 682 MediaRouteProvider.prototype.connectRouteByRouteId =
674 function(sourceUrn, routeId, presentationId, origin, tabId, 683 function(sourceUrn, routeId, presentationId, origin, tabId,
675 timeout, incognito) { 684 timeout, incognito) {
685 this.handlers_.onBeforeInvokeHandler();
676 return this.handlers_.connectRouteByRouteId( 686 return this.handlers_.connectRouteByRouteId(
677 sourceUrn, routeId, presentationId, origin, tabId, 687 sourceUrn, routeId, presentationId, origin, tabId,
678 Math.floor(timeout.microseconds / 1000), incognito) 688 Math.floor(timeout.microseconds / 1000), incognito)
679 .then(function(route) { 689 .then(function(route) {
680 return toSuccessRouteResponse_(route); 690 return toSuccessRouteResponse_(route);
681 }, 691 },
682 function(err) { 692 function(err) {
683 return toErrorRouteResponse_(err); 693 return toErrorRouteResponse_(err);
684 }); 694 });
685 }; 695 };
686 696
687 /** 697 /**
688 * Terminates the route specified by |routeId|. 698 * Terminates the route specified by |routeId|.
689 * @param {!string} routeId 699 * @param {!string} routeId
690 * @return {!Promise<!Object>} A Promise resolving to an object describing 700 * @return {!Promise<!Object>} A Promise resolving to an object describing
691 * the result of the terminate operation, or rejecting with an error 701 * the result of the terminate operation, or rejecting with an error
692 * message and code if the operation failed. 702 * message and code if the operation failed.
693 */ 703 */
694 MediaRouteProvider.prototype.terminateRoute = function(routeId) { 704 MediaRouteProvider.prototype.terminateRoute = function(routeId) {
705 this.handlers_.onBeforeInvokeHandler();
695 // TODO(crbug.com/627967): Remove code path that doesn't expect a Promise 706 // TODO(crbug.com/627967): Remove code path that doesn't expect a Promise
696 // in M56. 707 // in M56.
697 var maybePromise = this.handlers_.terminateRoute(routeId); 708 var maybePromise = this.handlers_.terminateRoute(routeId);
698 var successResult = { 709 var successResult = {
699 result_code: mediaRouterMojom.RouteRequestResultCode.OK 710 result_code: mediaRouterMojom.RouteRequestResultCode.OK
700 }; 711 };
701 if (maybePromise) { 712 if (maybePromise) {
702 return maybePromise.then( 713 return maybePromise.then(
703 function() { return successResult; }, 714 function() { return successResult; },
704 function(err) { return toErrorRouteResponse_(err); } 715 function(err) { return toErrorRouteResponse_(err); }
705 ); 716 );
706 } else { 717 } else {
707 return Promise.resolve(successResult); 718 return Promise.resolve(successResult);
708 } 719 }
709 }; 720 };
710 721
711 /** 722 /**
712 * Posts a message to the route designated by |routeId|. 723 * Posts a message to the route designated by |routeId|.
713 * @param {!string} routeId 724 * @param {!string} routeId
714 * @param {!string} message 725 * @param {!string} message
715 * @return {!Promise.<boolean>} Resolved with true if the message was sent, 726 * @return {!Promise.<boolean>} Resolved with true if the message was sent,
716 * or false on failure. 727 * or false on failure.
717 */ 728 */
718 MediaRouteProvider.prototype.sendRouteMessage = function( 729 MediaRouteProvider.prototype.sendRouteMessage = function(
719 routeId, message) { 730 routeId, message) {
731 this.handlers_.onBeforeInvokeHandler();
720 return this.handlers_.sendRouteMessage(routeId, message) 732 return this.handlers_.sendRouteMessage(routeId, message)
721 .then(function() { 733 .then(function() {
722 return {'sent': true}; 734 return {'sent': true};
723 }, function() { 735 }, function() {
724 return {'sent': false}; 736 return {'sent': false};
725 }); 737 });
726 }; 738 };
727 739
728 /** 740 /**
729 * Sends a binary message to the route designated by |routeId|. 741 * Sends a binary message to the route designated by |routeId|.
730 * @param {!string} routeId 742 * @param {!string} routeId
731 * @param {!Uint8Array} data 743 * @param {!Uint8Array} data
732 * @return {!Promise.<boolean>} Resolved with true if the data was sent, 744 * @return {!Promise.<boolean>} Resolved with true if the data was sent,
733 * or false on failure. 745 * or false on failure.
734 */ 746 */
735 MediaRouteProvider.prototype.sendRouteBinaryMessage = function( 747 MediaRouteProvider.prototype.sendRouteBinaryMessage = function(
736 routeId, data) { 748 routeId, data) {
749 this.handlers_.onBeforeInvokeHandler();
737 return this.handlers_.sendRouteBinaryMessage(routeId, data) 750 return this.handlers_.sendRouteBinaryMessage(routeId, data)
738 .then(function() { 751 .then(function() {
739 return {'sent': true}; 752 return {'sent': true};
740 }, function() { 753 }, function() {
741 return {'sent': false}; 754 return {'sent': false};
742 }); 755 });
743 }; 756 };
744 757
745 /** 758 /**
746 * Listen for messages from a route. 759 * Listen for messages from a route.
747 * @param {!string} routeId 760 * @param {!string} routeId
748 */ 761 */
749 MediaRouteProvider.prototype.startListeningForRouteMessages = function( 762 MediaRouteProvider.prototype.startListeningForRouteMessages = function(
750 routeId) { 763 routeId) {
764 this.handlers_.onBeforeInvokeHandler();
751 if (this.handlers_.startListeningForRouteMessages) { 765 if (this.handlers_.startListeningForRouteMessages) {
752 this.handlers_.startListeningForRouteMessages(routeId); 766 this.handlers_.startListeningForRouteMessages(routeId);
753 } else { 767 } else {
754 // Old API. 768 // Old API.
755 this.listenForRouteMessagesOld(routeId); 769 this.listenForRouteMessagesOld(routeId);
756 } 770 }
757 }; 771 };
758 772
759 773
760 /** 774 /**
761 * A hack to adapt new MR messaging API to old extension messaging API. 775 * A hack to adapt new MR messaging API to old extension messaging API.
762 * TODO(imcheng): Remove in M55 (crbug.com/626395). 776 * TODO(imcheng): Remove in M55 (crbug.com/626395).
763 * @param {!string} routeId 777 * @param {!string} routeId
764 */ 778 */
765 MediaRouteProvider.prototype.listenForRouteMessagesOld = function(routeId) { 779 MediaRouteProvider.prototype.listenForRouteMessagesOld = function(routeId) {
780 this.handlers_.onBeforeInvokeHandler();
766 this.handlers_.listenForRouteMessages(routeId) 781 this.handlers_.listenForRouteMessages(routeId)
767 .then(function(messages) { 782 .then(function(messages) {
768 // If messages is empty, then stopListeningForRouteMessages has been 783 // If messages is empty, then stopListeningForRouteMessages has been
769 // called. We don't need to send it back to MR. 784 // called. We don't need to send it back to MR.
770 if (messages.length > 0) { 785 if (messages.length > 0) {
771 // Send the messages back to MR, and listen for next batch of 786 // Send the messages back to MR, and listen for next batch of
772 // messages. 787 // messages.
773 this.mediaRouter_.onRouteMessagesReceived(routeId, messages); 788 this.mediaRouter_.onRouteMessagesReceived(routeId, messages);
774 this.listenForRouteMessagesOld(routeId); 789 this.listenForRouteMessagesOld(routeId);
775 } 790 }
776 }.bind(this), function() { 791 }.bind(this), function() {
777 // Ignore rejections. 792 // Ignore rejections.
778 }.bind(this)); 793 }.bind(this));
779 }; 794 };
780 795
781 /** 796 /**
782 * @param {!string} routeId 797 * @param {!string} routeId
783 */ 798 */
784 MediaRouteProvider.prototype.stopListeningForRouteMessages = function( 799 MediaRouteProvider.prototype.stopListeningForRouteMessages = function(
785 routeId) { 800 routeId) {
801 this.handlers_.onBeforeInvokeHandler();
786 this.handlers_.stopListeningForRouteMessages(routeId); 802 this.handlers_.stopListeningForRouteMessages(routeId);
787 }; 803 };
788 804
789 /** 805 /**
790 * Indicates that the presentation connection that was connected to |routeId| 806 * Indicates that the presentation connection that was connected to |routeId|
791 * is no longer connected to it. 807 * is no longer connected to it.
792 * @param {!string} routeId 808 * @param {!string} routeId
793 */ 809 */
794 MediaRouteProvider.prototype.detachRoute = function( 810 MediaRouteProvider.prototype.detachRoute = function(
795 routeId) { 811 routeId) {
796 this.handlers_.detachRoute(routeId); 812 this.handlers_.detachRoute(routeId);
797 }; 813 };
798 814
799 /** 815 /**
800 * Requests that the provider manager start sending information about active 816 * Requests that the provider manager start sending information about active
801 * media routes to the Media Router. 817 * media routes to the Media Router.
802 * @param {!string} sourceUrn 818 * @param {!string} sourceUrn
803 */ 819 */
804 MediaRouteProvider.prototype.startObservingMediaRoutes = function(sourceUrn) { 820 MediaRouteProvider.prototype.startObservingMediaRoutes = function(sourceUrn) {
821 this.handlers_.onBeforeInvokeHandler();
805 this.handlers_.startObservingMediaRoutes(sourceUrn); 822 this.handlers_.startObservingMediaRoutes(sourceUrn);
806 }; 823 };
807 824
808 /** 825 /**
809 * Requests that the provider manager stop sending information about active 826 * Requests that the provider manager stop sending information about active
810 * media routes to the Media Router. 827 * media routes to the Media Router.
811 * @param {!string} sourceUrn 828 * @param {!string} sourceUrn
812 */ 829 */
813 MediaRouteProvider.prototype.stopObservingMediaRoutes = function(sourceUrn) { 830 MediaRouteProvider.prototype.stopObservingMediaRoutes = function(sourceUrn) {
831 this.handlers_.onBeforeInvokeHandler();
814 this.handlers_.stopObservingMediaRoutes(sourceUrn); 832 this.handlers_.stopObservingMediaRoutes(sourceUrn);
815 }; 833 };
816 834
817 /** 835 /**
818 * Enables mDNS device discovery. 836 * Enables mDNS device discovery.
819 */ 837 */
820 MediaRouteProvider.prototype.enableMdnsDiscovery = function() { 838 MediaRouteProvider.prototype.enableMdnsDiscovery = function() {
839 this.handlers_.onBeforeInvokeHandler();
821 this.handlers_.enableMdnsDiscovery(); 840 this.handlers_.enableMdnsDiscovery();
822 }; 841 };
823 842
824 /** 843 /**
825 * Requests that the provider manager update media sinks. 844 * Requests that the provider manager update media sinks.
826 * @param {!string} sourceUrn 845 * @param {!string} sourceUrn
827 */ 846 */
828 MediaRouteProvider.prototype.updateMediaSinks = function(sourceUrn) { 847 MediaRouteProvider.prototype.updateMediaSinks = function(sourceUrn) {
848 this.handlers_.onBeforeInvokeHandler();
829 this.handlers_.updateMediaSinks(sourceUrn); 849 this.handlers_.updateMediaSinks(sourceUrn);
830 }; 850 };
831 851
832 /** 852 /**
833 * Requests that the provider manager search its providers for a sink matching 853 * Requests that the provider manager search its providers for a sink matching
834 * |searchCriteria| that is compatible with |sourceUrn|. If a sink is found 854 * |searchCriteria| that is compatible with |sourceUrn|. If a sink is found
835 * that can be used immediately for route creation, its ID is returned. 855 * that can be used immediately for route creation, its ID is returned.
836 * Otherwise the empty string is returned. 856 * Otherwise the empty string is returned.
837 * 857 *
838 * @param {string} sinkId Sink ID of the pseudo sink generating the request. 858 * @param {string} sinkId Sink ID of the pseudo sink generating the request.
839 * @param {string} sourceUrn Media source to be used with the sink. 859 * @param {string} sourceUrn Media source to be used with the sink.
840 * @param {!SinkSearchCriteria} searchCriteria Search criteria for the route 860 * @param {!SinkSearchCriteria} searchCriteria Search criteria for the route
841 * providers. 861 * providers.
842 * @return {!Promise.<!{sink_id: !string}>} A Promise resolving to either the 862 * @return {!Promise.<!{sink_id: !string}>} A Promise resolving to either the
843 * sink ID of the sink found by the search that can be used for route 863 * sink ID of the sink found by the search that can be used for route
844 * creation, or the empty string if no route can be immediately created. 864 * creation, or the empty string if no route can be immediately created.
845 */ 865 */
846 MediaRouteProvider.prototype.searchSinks = function( 866 MediaRouteProvider.prototype.searchSinks = function(
847 sinkId, sourceUrn, searchCriteria) { 867 sinkId, sourceUrn, searchCriteria) {
imcheng 2016/10/20 17:56:35 nit: revert this line?
mark a. foltz 2016/10/24 17:32:03 Done.
848 // TODO(btolsch): Remove this check when we no longer expect old extensions 868 // TODO(btolsch): Remove this check when we no longer expect old extensions
849 // to be missing this API. 869 // to be missing this API.
850 if (!this.handlers_.searchSinks) { 870 if (!this.handlers_.searchSinks) {
851 return Promise.resolve({'sink_id': ''}); 871 return Promise.resolve({'sink_id': ''});
852 } 872 }
873 this.handlers_.onBeforeInvokeHandler();
853 return Promise.resolve({ 874 return Promise.resolve({
854 'sink_id': this.handlers_.searchSinks(sinkId, sourceUrn, searchCriteria) 875 'sink_id': this.handlers_.searchSinks(sinkId, sourceUrn, searchCriteria)
855 }); 876 });
856 }; 877 };
857 878
858 mediaRouter = new MediaRouter(connector.bindHandleToProxy( 879 mediaRouter = new MediaRouter(connector.bindHandleToProxy(
859 frameInterfaces.getInterface(mediaRouterMojom.MediaRouter.name), 880 frameInterfaces.getInterface(mediaRouterMojom.MediaRouter.name),
860 mediaRouterMojom.MediaRouter)); 881 mediaRouterMojom.MediaRouter));
861 882
862 return mediaRouter; 883 return mediaRouter;
863 }); 884 });
864
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698