| OLD | NEW |
| 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 #include "modules/media_controls/MediaControlsImpl.h" | 5 #include "modules/media_controls/MediaControlsImpl.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include "core/HTMLNames.h" | 9 #include "core/HTMLNames.h" |
| 10 #include "core/css/StylePropertySet.h" | 10 #include "core/css/StylePropertySet.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 #include "platform/testing/HistogramTester.h" | 32 #include "platform/testing/HistogramTester.h" |
| 33 #include "platform/testing/TestingPlatformSupport.h" | 33 #include "platform/testing/TestingPlatformSupport.h" |
| 34 #include "platform/testing/UnitTestHelpers.h" | 34 #include "platform/testing/UnitTestHelpers.h" |
| 35 #include "public/platform/WebMouseEvent.h" | 35 #include "public/platform/WebMouseEvent.h" |
| 36 #include "public/platform/WebScreenInfo.h" | 36 #include "public/platform/WebScreenInfo.h" |
| 37 #include "public/platform/WebSize.h" | 37 #include "public/platform/WebSize.h" |
| 38 #include "public/platform/modules/remoteplayback/WebRemotePlaybackAvailability.h
" | 38 #include "public/platform/modules/remoteplayback/WebRemotePlaybackAvailability.h
" |
| 39 #include "public/platform/modules/remoteplayback/WebRemotePlaybackClient.h" | 39 #include "public/platform/modules/remoteplayback/WebRemotePlaybackClient.h" |
| 40 #include "testing/gtest/include/gtest/gtest.h" | 40 #include "testing/gtest/include/gtest/gtest.h" |
| 41 | 41 |
| 42 // The MediaTimelineWidths histogram suffix expected to be encountered in these |
| 43 // tests. Depends on the OS, since Android sizes its timeline differently. |
| 44 #if OS(ANDROID) |
| 45 #define TIMELINE_W "80_127" |
| 46 #else |
| 47 #define TIMELINE_W "128_255" |
| 48 #endif |
| 49 |
| 42 namespace blink { | 50 namespace blink { |
| 43 | 51 |
| 44 namespace { | 52 namespace { |
| 45 | 53 |
| 46 class MockChromeClient : public EmptyChromeClient { | 54 class MockChromeClient : public EmptyChromeClient { |
| 47 public: | 55 public: |
| 48 // EmptyChromeClient overrides: | 56 // EmptyChromeClient overrides: |
| 49 WebScreenInfo GetScreenInfo() const override { | 57 WebScreenInfo GetScreenInfo() const override { |
| 50 WebScreenInfo screen_info; | 58 WebScreenInfo screen_info; |
| 51 screen_info.orientation_type = kWebScreenOrientationLandscapePrimary; | 59 screen_info.orientation_type = kWebScreenOrientationLandscapePrimary; |
| (...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 611 "Media.Timeline.Width.InlineLandscape", | 619 "Media.Timeline.Width.InlineLandscape", |
| 612 timeline->getBoundingClientRect()->width(), 1); | 620 timeline->getBoundingClientRect()->width(), 1); |
| 613 GetHistogramTester().ExpectTotalCount("Media.Timeline.Width.InlinePortrait", | 621 GetHistogramTester().ExpectTotalCount("Media.Timeline.Width.InlinePortrait", |
| 614 0); | 622 0); |
| 615 GetHistogramTester().ExpectTotalCount( | 623 GetHistogramTester().ExpectTotalCount( |
| 616 "Media.Timeline.Width.FullscreenLandscape", 0); | 624 "Media.Timeline.Width.FullscreenLandscape", 0); |
| 617 GetHistogramTester().ExpectTotalCount( | 625 GetHistogramTester().ExpectTotalCount( |
| 618 "Media.Timeline.Width.FullscreenPortrait", 0); | 626 "Media.Timeline.Width.FullscreenPortrait", 0); |
| 619 } | 627 } |
| 620 | 628 |
| 621 // TODO(johnme): Fix and re-enable this on Android. | 629 TEST_F(MediaControlsImplTest, TimelineMetricsClick) { |
| 622 #if OS(ANDROID) | |
| 623 #define MAYBE_TimelineMetricsClick DISABLED_TimelineMetricsClick | |
| 624 #else | |
| 625 #define MAYBE_TimelineMetricsClick TimelineMetricsClick | |
| 626 #endif | |
| 627 TEST_F(MediaControlsImplTest, MAYBE_TimelineMetricsClick) { | |
| 628 double duration = 540; // 9 minutes | 630 double duration = 540; // 9 minutes |
| 629 LoadMediaWithDuration(duration); | 631 LoadMediaWithDuration(duration); |
| 630 EnsureSizing(); | 632 EnsureSizing(); |
| 631 testing::RunPendingTasks(); | 633 testing::RunPendingTasks(); |
| 632 | 634 |
| 633 ASSERT_TRUE(IsElementVisible(*TimelineElement())); | 635 ASSERT_TRUE(IsElementVisible(*TimelineElement())); |
| 634 ClientRect* timelineRect = TimelineElement()->getBoundingClientRect(); | 636 ClientRect* timelineRect = TimelineElement()->getBoundingClientRect(); |
| 635 ASSERT_LT(0, timelineRect->width()); | 637 ASSERT_LT(0, timelineRect->width()); |
| 636 | 638 |
| 637 EXPECT_EQ(0, MediaControls().MediaElement().currentTime()); | 639 EXPECT_EQ(0, MediaControls().MediaElement().currentTime()); |
| 638 | 640 |
| 639 WebFloatPoint trackCenter(timelineRect->left() + timelineRect->width() / 2, | 641 WebFloatPoint trackCenter(timelineRect->left() + timelineRect->width() / 2, |
| 640 timelineRect->top() + timelineRect->height() / 2); | 642 timelineRect->top() + timelineRect->height() / 2); |
| 641 MouseDownAt(trackCenter); | 643 MouseDownAt(trackCenter); |
| 642 MouseUpAt(trackCenter); | 644 MouseUpAt(trackCenter); |
| 643 testing::RunPendingTasks(); | 645 testing::RunPendingTasks(); |
| 644 | 646 |
| 645 EXPECT_LE(0.49 * duration, MediaControls().MediaElement().currentTime()); | 647 EXPECT_LE(0.49 * duration, MediaControls().MediaElement().currentTime()); |
| 646 EXPECT_GE(0.51 * duration, MediaControls().MediaElement().currentTime()); | 648 EXPECT_GE(0.51 * duration, MediaControls().MediaElement().currentTime()); |
| 647 | 649 |
| 648 GetHistogramTester().ExpectUniqueSample("Media.Timeline.SeekType.128_255", | 650 GetHistogramTester().ExpectUniqueSample("Media.Timeline.SeekType." TIMELINE_W, |
| 649 0 /* SeekType::kClick */, 1); | 651 0 /* SeekType::kClick */, 1); |
| 650 GetHistogramTester().ExpectTotalCount( | 652 GetHistogramTester().ExpectTotalCount( |
| 651 "Media.Timeline.DragGestureDuration.128_255", 0); | 653 "Media.Timeline.DragGestureDuration." TIMELINE_W, 0); |
| 652 GetHistogramTester().ExpectTotalCount("Media.Timeline.DragPercent.128_255", | |
| 653 0); | |
| 654 GetHistogramTester().ExpectTotalCount( | 654 GetHistogramTester().ExpectTotalCount( |
| 655 "Media.Timeline.DragSumAbsTimeDelta.128_255", 0); | 655 "Media.Timeline.DragPercent." TIMELINE_W, 0); |
| 656 GetHistogramTester().ExpectTotalCount("Media.Timeline.DragTimeDelta.128_255", | 656 GetHistogramTester().ExpectTotalCount( |
| 657 0); | 657 "Media.Timeline.DragSumAbsTimeDelta." TIMELINE_W, 0); |
| 658 GetHistogramTester().ExpectTotalCount( |
| 659 "Media.Timeline.DragTimeDelta." TIMELINE_W, 0); |
| 658 } | 660 } |
| 659 | 661 |
| 660 // TODO(johnme): Fix and re-enable this on Android. | 662 TEST_F(MediaControlsImplTest, TimelineMetricsDragFromCurrentPosition) { |
| 661 #if OS(ANDROID) | |
| 662 #define MAYBE_TimelineMetricsDragFromCurrentPosition \ | |
| 663 DISABLED_TimelineMetricsDragFromCurrentPosition | |
| 664 #else | |
| 665 #define MAYBE_TimelineMetricsDragFromCurrentPosition \ | |
| 666 TimelineMetricsDragFromCurrentPosition | |
| 667 #endif | |
| 668 TEST_F(MediaControlsImplTest, MAYBE_TimelineMetricsDragFromCurrentPosition) { | |
| 669 double duration = 540; // 9 minutes | 663 double duration = 540; // 9 minutes |
| 670 LoadMediaWithDuration(duration); | 664 LoadMediaWithDuration(duration); |
| 671 EnsureSizing(); | 665 EnsureSizing(); |
| 672 testing::RunPendingTasks(); | 666 testing::RunPendingTasks(); |
| 673 | 667 |
| 674 ASSERT_TRUE(IsElementVisible(*TimelineElement())); | 668 ASSERT_TRUE(IsElementVisible(*TimelineElement())); |
| 675 ClientRect* timeline_rect = TimelineElement()->getBoundingClientRect(); | 669 ClientRect* timeline_rect = TimelineElement()->getBoundingClientRect(); |
| 676 ASSERT_LT(0, timeline_rect->width()); | 670 ASSERT_LT(0, timeline_rect->width()); |
| 677 | 671 |
| 678 EXPECT_EQ(0, MediaControls().MediaElement().currentTime()); | 672 EXPECT_EQ(0, MediaControls().MediaElement().currentTime()); |
| 679 | 673 |
| 680 float y = timeline_rect->top() + timeline_rect->height() / 2; | 674 float y = timeline_rect->top() + timeline_rect->height() / 2; |
| 681 WebFloatPoint thumb(timeline_rect->left(), y); | 675 WebFloatPoint thumb(timeline_rect->left(), y); |
| 682 WebFloatPoint track_two_thirds( | 676 WebFloatPoint track_two_thirds( |
| 683 timeline_rect->left() + timeline_rect->width() * 2 / 3, y); | 677 timeline_rect->left() + timeline_rect->width() * 2 / 3, y); |
| 684 MouseDownAt(thumb); | 678 MouseDownAt(thumb); |
| 685 MouseMoveTo(track_two_thirds); | 679 MouseMoveTo(track_two_thirds); |
| 686 MouseUpAt(track_two_thirds); | 680 MouseUpAt(track_two_thirds); |
| 687 | 681 |
| 688 EXPECT_LE(0.66 * duration, MediaControls().MediaElement().currentTime()); | 682 EXPECT_LE(0.66 * duration, MediaControls().MediaElement().currentTime()); |
| 689 EXPECT_GE(0.68 * duration, MediaControls().MediaElement().currentTime()); | 683 EXPECT_GE(0.68 * duration, MediaControls().MediaElement().currentTime()); |
| 690 | 684 |
| 691 GetHistogramTester().ExpectUniqueSample( | 685 GetHistogramTester().ExpectUniqueSample( |
| 692 "Media.Timeline.SeekType.128_255", | 686 "Media.Timeline.SeekType." TIMELINE_W, |
| 693 1 /* SeekType::kDragFromCurrentPosition */, 1); | 687 1 /* SeekType::kDragFromCurrentPosition */, 1); |
| 694 GetHistogramTester().ExpectTotalCount( | 688 GetHistogramTester().ExpectTotalCount( |
| 695 "Media.Timeline.DragGestureDuration.128_255", 1); | 689 "Media.Timeline.DragGestureDuration." TIMELINE_W, 1); |
| 696 GetHistogramTester().ExpectUniqueSample("Media.Timeline.DragPercent.128_255", | |
| 697 47 /* [60.0%, 70.0%) */, 1); | |
| 698 GetHistogramTester().ExpectUniqueSample( | 690 GetHistogramTester().ExpectUniqueSample( |
| 699 "Media.Timeline.DragSumAbsTimeDelta.128_255", 16 /* [4m, 8m) */, 1); | 691 "Media.Timeline.DragPercent." TIMELINE_W, 47 /* [60.0%, 70.0%) */, 1); |
| 700 GetHistogramTester().ExpectUniqueSample( | 692 GetHistogramTester().ExpectUniqueSample( |
| 701 "Media.Timeline.DragTimeDelta.128_255", 40 /* [4m, 8m) */, 1); | 693 "Media.Timeline.DragSumAbsTimeDelta." TIMELINE_W, 16 /* [4m, 8m) */, 1); |
| 694 GetHistogramTester().ExpectUniqueSample( |
| 695 "Media.Timeline.DragTimeDelta." TIMELINE_W, 40 /* [4m, 8m) */, 1); |
| 702 } | 696 } |
| 703 | 697 |
| 704 // TODO(johnme): Fix and re-enable this on Android. | 698 TEST_F(MediaControlsImplTest, TimelineMetricsDragFromElsewhere) { |
| 705 #if OS(ANDROID) | |
| 706 #define MAYBE_TimelineMetricsDragFromElsewhere \ | |
| 707 DISABLED_TimelineMetricsDragFromElsewhere | |
| 708 #else | |
| 709 #define MAYBE_TimelineMetricsDragFromElsewhere TimelineMetricsDragFromElsewhere | |
| 710 #endif | |
| 711 TEST_F(MediaControlsImplTest, MAYBE_TimelineMetricsDragFromElsewhere) { | |
| 712 double duration = 540; // 9 minutes | 699 double duration = 540; // 9 minutes |
| 713 LoadMediaWithDuration(duration); | 700 LoadMediaWithDuration(duration); |
| 714 EnsureSizing(); | 701 EnsureSizing(); |
| 715 testing::RunPendingTasks(); | 702 testing::RunPendingTasks(); |
| 716 | 703 |
| 717 ASSERT_TRUE(IsElementVisible(*TimelineElement())); | 704 ASSERT_TRUE(IsElementVisible(*TimelineElement())); |
| 718 ClientRect* timelineRect = TimelineElement()->getBoundingClientRect(); | 705 ClientRect* timelineRect = TimelineElement()->getBoundingClientRect(); |
| 719 ASSERT_LT(0, timelineRect->width()); | 706 ASSERT_LT(0, timelineRect->width()); |
| 720 | 707 |
| 721 EXPECT_EQ(0, MediaControls().MediaElement().currentTime()); | 708 EXPECT_EQ(0, MediaControls().MediaElement().currentTime()); |
| 722 | 709 |
| 723 float y = timelineRect->top() + timelineRect->height() / 2; | 710 float y = timelineRect->top() + timelineRect->height() / 2; |
| 724 WebFloatPoint trackOneThird( | 711 WebFloatPoint trackOneThird( |
| 725 timelineRect->left() + timelineRect->width() * 1 / 3, y); | 712 timelineRect->left() + timelineRect->width() * 1 / 3, y); |
| 726 WebFloatPoint trackTwoThirds( | 713 WebFloatPoint trackTwoThirds( |
| 727 timelineRect->left() + timelineRect->width() * 2 / 3, y); | 714 timelineRect->left() + timelineRect->width() * 2 / 3, y); |
| 728 MouseDownAt(trackOneThird); | 715 MouseDownAt(trackOneThird); |
| 729 MouseMoveTo(trackTwoThirds); | 716 MouseMoveTo(trackTwoThirds); |
| 730 MouseUpAt(trackTwoThirds); | 717 MouseUpAt(trackTwoThirds); |
| 731 | 718 |
| 732 EXPECT_LE(0.66 * duration, MediaControls().MediaElement().currentTime()); | 719 EXPECT_LE(0.66 * duration, MediaControls().MediaElement().currentTime()); |
| 733 EXPECT_GE(0.68 * duration, MediaControls().MediaElement().currentTime()); | 720 EXPECT_GE(0.68 * duration, MediaControls().MediaElement().currentTime()); |
| 734 | 721 |
| 735 GetHistogramTester().ExpectUniqueSample("Media.Timeline.SeekType.128_255", | 722 GetHistogramTester().ExpectUniqueSample("Media.Timeline.SeekType." TIMELINE_W, |
| 736 2 /* SeekType::kDragFromElsewhere */, | 723 2 /* SeekType::kDragFromElsewhere */, |
| 737 1); | 724 1); |
| 738 GetHistogramTester().ExpectTotalCount( | 725 GetHistogramTester().ExpectTotalCount( |
| 739 "Media.Timeline.DragGestureDuration.128_255", 1); | 726 "Media.Timeline.DragGestureDuration." TIMELINE_W, 1); |
| 740 GetHistogramTester().ExpectUniqueSample("Media.Timeline.DragPercent.128_255", | |
| 741 42 /* [30.0%, 35.0%) */, 1); | |
| 742 GetHistogramTester().ExpectUniqueSample( | 727 GetHistogramTester().ExpectUniqueSample( |
| 743 "Media.Timeline.DragSumAbsTimeDelta.128_255", 15 /* [2m, 4m) */, 1); | 728 "Media.Timeline.DragPercent." TIMELINE_W, 42 /* [30.0%, 35.0%) */, 1); |
| 744 GetHistogramTester().ExpectUniqueSample( | 729 GetHistogramTester().ExpectUniqueSample( |
| 745 "Media.Timeline.DragTimeDelta.128_255", 39 /* [2m, 4m) */, 1); | 730 "Media.Timeline.DragSumAbsTimeDelta." TIMELINE_W, 15 /* [2m, 4m) */, 1); |
| 731 GetHistogramTester().ExpectUniqueSample( |
| 732 "Media.Timeline.DragTimeDelta." TIMELINE_W, 39 /* [2m, 4m) */, 1); |
| 746 } | 733 } |
| 747 | 734 |
| 748 // TODO(johnme): Fix and re-enable this on Android. | 735 TEST_F(MediaControlsImplTest, TimelineMetricsDragBackAndForth) { |
| 749 #if OS(ANDROID) | |
| 750 #define MAYBE_TimelineMetricsDragBackAndForth \ | |
| 751 DISABLED_TimelineMetricsDragBackAndForth | |
| 752 #else | |
| 753 #define MAYBE_TimelineMetricsDragBackAndForth TimelineMetricsDragBackAndForth | |
| 754 #endif | |
| 755 TEST_F(MediaControlsImplTest, MAYBE_TimelineMetricsDragBackAndForth) { | |
| 756 double duration = 540; // 9 minutes | 736 double duration = 540; // 9 minutes |
| 757 LoadMediaWithDuration(duration); | 737 LoadMediaWithDuration(duration); |
| 758 EnsureSizing(); | 738 EnsureSizing(); |
| 759 testing::RunPendingTasks(); | 739 testing::RunPendingTasks(); |
| 760 | 740 |
| 761 ASSERT_TRUE(IsElementVisible(*TimelineElement())); | 741 ASSERT_TRUE(IsElementVisible(*TimelineElement())); |
| 762 ClientRect* timelineRect = TimelineElement()->getBoundingClientRect(); | 742 ClientRect* timelineRect = TimelineElement()->getBoundingClientRect(); |
| 763 ASSERT_LT(0, timelineRect->width()); | 743 ASSERT_LT(0, timelineRect->width()); |
| 764 | 744 |
| 765 EXPECT_EQ(0, MediaControls().MediaElement().currentTime()); | 745 EXPECT_EQ(0, MediaControls().MediaElement().currentTime()); |
| 766 | 746 |
| 767 float y = timelineRect->top() + timelineRect->height() / 2; | 747 float y = timelineRect->top() + timelineRect->height() / 2; |
| 768 WebFloatPoint trackTwoThirds( | 748 WebFloatPoint trackTwoThirds( |
| 769 timelineRect->left() + timelineRect->width() * 2 / 3, y); | 749 timelineRect->left() + timelineRect->width() * 2 / 3, y); |
| 770 WebFloatPoint trackEnd(timelineRect->left() + timelineRect->width(), y); | 750 WebFloatPoint trackEnd(timelineRect->left() + timelineRect->width(), y); |
| 771 WebFloatPoint trackOneThird( | 751 WebFloatPoint trackOneThird( |
| 772 timelineRect->left() + timelineRect->width() * 1 / 3, y); | 752 timelineRect->left() + timelineRect->width() * 1 / 3, y); |
| 773 MouseDownAt(trackTwoThirds); | 753 MouseDownAt(trackTwoThirds); |
| 774 MouseMoveTo(trackEnd); | 754 MouseMoveTo(trackEnd); |
| 775 MouseMoveTo(trackOneThird); | 755 MouseMoveTo(trackOneThird); |
| 776 MouseUpAt(trackOneThird); | 756 MouseUpAt(trackOneThird); |
| 777 | 757 |
| 778 EXPECT_LE(0.32 * duration, MediaControls().MediaElement().currentTime()); | 758 EXPECT_LE(0.32 * duration, MediaControls().MediaElement().currentTime()); |
| 779 EXPECT_GE(0.34 * duration, MediaControls().MediaElement().currentTime()); | 759 EXPECT_GE(0.34 * duration, MediaControls().MediaElement().currentTime()); |
| 780 | 760 |
| 781 GetHistogramTester().ExpectUniqueSample("Media.Timeline.SeekType.128_255", | 761 GetHistogramTester().ExpectUniqueSample("Media.Timeline.SeekType." TIMELINE_W, |
| 782 2 /* SeekType::kDragFromElsewhere */, | 762 2 /* SeekType::kDragFromElsewhere */, |
| 783 1); | 763 1); |
| 784 GetHistogramTester().ExpectTotalCount( | 764 GetHistogramTester().ExpectTotalCount( |
| 785 "Media.Timeline.DragGestureDuration.128_255", 1); | 765 "Media.Timeline.DragGestureDuration." TIMELINE_W, 1); |
| 786 GetHistogramTester().ExpectUniqueSample("Media.Timeline.DragPercent.128_255", | |
| 787 8 /* (-35.0%, -30.0%] */, 1); | |
| 788 GetHistogramTester().ExpectUniqueSample( | 766 GetHistogramTester().ExpectUniqueSample( |
| 789 "Media.Timeline.DragSumAbsTimeDelta.128_255", 17 /* [8m, 15m) */, 1); | 767 "Media.Timeline.DragPercent." TIMELINE_W, 8 /* (-35.0%, -30.0%] */, 1); |
| 790 GetHistogramTester().ExpectUniqueSample( | 768 GetHistogramTester().ExpectUniqueSample( |
| 791 "Media.Timeline.DragTimeDelta.128_255", 9 /* (-4m, -2m] */, 1); | 769 "Media.Timeline.DragSumAbsTimeDelta." TIMELINE_W, 17 /* [8m, 15m) */, 1); |
| 770 GetHistogramTester().ExpectUniqueSample( |
| 771 "Media.Timeline.DragTimeDelta." TIMELINE_W, 9 /* (-4m, -2m] */, 1); |
| 792 } | 772 } |
| 793 | 773 |
| 794 namespace { | 774 namespace { |
| 795 | 775 |
| 796 class MediaControlsImplTestWithMockScheduler : public MediaControlsImplTest { | 776 class MediaControlsImplTestWithMockScheduler : public MediaControlsImplTest { |
| 797 protected: | 777 protected: |
| 798 void SetUp() override { | 778 void SetUp() override { |
| 799 // DocumentParserTiming has DCHECKS to make sure time > 0.0. | 779 // DocumentParserTiming has DCHECKS to make sure time > 0.0. |
| 800 platform_->AdvanceClockSeconds(1); | 780 platform_->AdvanceClockSeconds(1); |
| 801 | 781 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 894 { | 874 { |
| 895 Persistent<HTMLMediaElement> video_holder = element; | 875 Persistent<HTMLMediaElement> video_holder = element; |
| 896 page_holder->GetDocument().body()->RemoveChild(element); | 876 page_holder->GetDocument().body()->RemoveChild(element); |
| 897 page_holder->GetDocument().body()->AppendChild(video_holder.Get()); | 877 page_holder->GetDocument().body()->AppendChild(video_holder.Get()); |
| 898 EXPECT_TRUE(remote_playback->HasEventListeners()); | 878 EXPECT_TRUE(remote_playback->HasEventListeners()); |
| 899 EXPECT_TRUE(HasAvailabilityCallbacks(remote_playback)); | 879 EXPECT_TRUE(HasAvailabilityCallbacks(remote_playback)); |
| 900 } | 880 } |
| 901 } | 881 } |
| 902 | 882 |
| 903 } // namespace blink | 883 } // namespace blink |
| OLD | NEW |