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 |