| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/renderer_host/media/web_contents_video_capture_device.
h" | 5 #include "content/browser/renderer_host/media/web_contents_video_capture_device.
h" |
| 6 | 6 |
| 7 #include "base/bind_helpers.h" | 7 #include "base/bind_helpers.h" |
| 8 #include "base/debug/debugger.h" | 8 #include "base/debug/debugger.h" |
| 9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
| 10 #include "base/test/test_timeouts.h" | 10 #include "base/test/test_timeouts.h" |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 new PoolBuffer(buffer_pool_, buffer_id, data, size)); | 332 new PoolBuffer(buffer_pool_, buffer_id, data, size)); |
| 333 } | 333 } |
| 334 | 334 |
| 335 virtual void OnIncomingCapturedFrame( | 335 virtual void OnIncomingCapturedFrame( |
| 336 const uint8* data, | 336 const uint8* data, |
| 337 int length, | 337 int length, |
| 338 base::Time timestamp, | 338 base::Time timestamp, |
| 339 int rotation, | 339 int rotation, |
| 340 bool flip_vert, | 340 bool flip_vert, |
| 341 bool flip_horiz, | 341 bool flip_horiz, |
| 342 const media::VideoCaptureCapability& frame_info) OVERRIDE { | 342 const media::VideoCaptureFormat& frame_format) OVERRIDE { |
| 343 FAIL(); | 343 FAIL(); |
| 344 } | 344 } |
| 345 | 345 |
| 346 virtual void OnIncomingCapturedBuffer(const scoped_refptr<Buffer>& buffer, | 346 virtual void OnIncomingCapturedBuffer(const scoped_refptr<Buffer>& buffer, |
| 347 media::VideoFrame::Format format, | 347 media::VideoFrame::Format format, |
| 348 const gfx::Size& dimensions, | 348 const gfx::Size& dimensions, |
| 349 base::Time timestamp, | 349 base::Time timestamp, |
| 350 int frame_rate) OVERRIDE { | 350 int frame_rate) OVERRIDE { |
| 351 EXPECT_EQ(gfx::Size(kTestWidth, kTestHeight), dimensions); | 351 EXPECT_EQ(gfx::Size(kTestWidth, kTestHeight), dimensions); |
| 352 EXPECT_EQ(media::VideoFrame::I420, format); | 352 EXPECT_EQ(media::VideoFrame::I420, format); |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 | 587 |
| 588 TestBrowserThreadBundle thread_bundle_; | 588 TestBrowserThreadBundle thread_bundle_; |
| 589 }; | 589 }; |
| 590 | 590 |
| 591 TEST_F(WebContentsVideoCaptureDeviceTest, InvalidInitialWebContentsError) { | 591 TEST_F(WebContentsVideoCaptureDeviceTest, InvalidInitialWebContentsError) { |
| 592 // Before the installs itself on the UI thread up to start capturing, we'll | 592 // Before the installs itself on the UI thread up to start capturing, we'll |
| 593 // delete the web contents. This should trigger an error which can happen in | 593 // delete the web contents. This should trigger an error which can happen in |
| 594 // practice; we should be able to recover gracefully. | 594 // practice; we should be able to recover gracefully. |
| 595 ResetWebContents(); | 595 ResetWebContents(); |
| 596 | 596 |
| 597 media::VideoCaptureCapability capture_format( | 597 media::VideoCaptureParams capture_params; |
| 598 kTestWidth, | 598 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight); |
| 599 kTestHeight, | 599 capture_params.requested_format.frame_rate = kTestFramesPerSecond; |
| 600 kTestFramesPerSecond, | 600 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| 601 media::PIXEL_FORMAT_I420, | 601 capture_params.allow_resolution_change = false; |
| 602 media::ConstantResolutionVideoCaptureDevice); | 602 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); |
| 603 device()->AllocateAndStart( | |
| 604 capture_format, client_observer()->PassClient()); | |
| 605 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForError()); | 603 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForError()); |
| 606 device()->StopAndDeAllocate(); | 604 device()->StopAndDeAllocate(); |
| 607 } | 605 } |
| 608 | 606 |
| 609 TEST_F(WebContentsVideoCaptureDeviceTest, WebContentsDestroyed) { | 607 TEST_F(WebContentsVideoCaptureDeviceTest, WebContentsDestroyed) { |
| 610 // We'll simulate the tab being closed after the capture pipeline is up and | 608 // We'll simulate the tab being closed after the capture pipeline is up and |
| 611 // running. | 609 // running. |
| 612 media::VideoCaptureCapability capture_format( | 610 media::VideoCaptureParams capture_params; |
| 613 kTestWidth, | 611 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight); |
| 614 kTestHeight, | 612 capture_params.requested_format.frame_rate = kTestFramesPerSecond; |
| 615 kTestFramesPerSecond, | 613 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| 616 media::PIXEL_FORMAT_I420, | 614 capture_params.allow_resolution_change = false; |
| 617 media::ConstantResolutionVideoCaptureDevice); | 615 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); |
| 618 device()->AllocateAndStart( | |
| 619 capture_format, client_observer()->PassClient()); | |
| 620 // Do one capture to prove | 616 // Do one capture to prove |
| 621 source()->SetSolidColor(SK_ColorRED); | 617 source()->SetSolidColor(SK_ColorRED); |
| 622 SimulateDrawEvent(); | 618 SimulateDrawEvent(); |
| 623 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); | 619 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); |
| 624 | 620 |
| 625 base::RunLoop().RunUntilIdle(); | 621 base::RunLoop().RunUntilIdle(); |
| 626 | 622 |
| 627 // Post a task to close the tab. We should see an error reported to the | 623 // Post a task to close the tab. We should see an error reported to the |
| 628 // consumer. | 624 // consumer. |
| 629 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 625 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 630 base::Bind(&WebContentsVideoCaptureDeviceTest::ResetWebContents, | 626 base::Bind(&WebContentsVideoCaptureDeviceTest::ResetWebContents, |
| 631 base::Unretained(this))); | 627 base::Unretained(this))); |
| 632 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForError()); | 628 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForError()); |
| 633 device()->StopAndDeAllocate(); | 629 device()->StopAndDeAllocate(); |
| 634 } | 630 } |
| 635 | 631 |
| 636 TEST_F(WebContentsVideoCaptureDeviceTest, | 632 TEST_F(WebContentsVideoCaptureDeviceTest, |
| 637 StopDeviceBeforeCaptureMachineCreation) { | 633 StopDeviceBeforeCaptureMachineCreation) { |
| 638 media::VideoCaptureCapability capture_format( | 634 media::VideoCaptureParams capture_params; |
| 639 kTestWidth, | 635 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight); |
| 640 kTestHeight, | 636 capture_params.requested_format.frame_rate = kTestFramesPerSecond; |
| 641 kTestFramesPerSecond, | 637 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| 642 media::PIXEL_FORMAT_I420, | 638 capture_params.allow_resolution_change = false; |
| 643 media::ConstantResolutionVideoCaptureDevice); | 639 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); |
| 644 device()->AllocateAndStart( | |
| 645 capture_format, client_observer()->PassClient()); | |
| 646 | 640 |
| 647 // Make a point of not running the UI messageloop here. | 641 // Make a point of not running the UI messageloop here. |
| 648 device()->StopAndDeAllocate(); | 642 device()->StopAndDeAllocate(); |
| 649 DestroyVideoCaptureDevice(); | 643 DestroyVideoCaptureDevice(); |
| 650 | 644 |
| 651 // Currently, there should be CreateCaptureMachineOnUIThread() and | 645 // Currently, there should be CreateCaptureMachineOnUIThread() and |
| 652 // DestroyCaptureMachineOnUIThread() tasks pending on the current (UI) message | 646 // DestroyCaptureMachineOnUIThread() tasks pending on the current (UI) message |
| 653 // loop. These should both succeed without crashing, and the machine should | 647 // loop. These should both succeed without crashing, and the machine should |
| 654 // wind up in the idle state. | 648 // wind up in the idle state. |
| 655 base::RunLoop().RunUntilIdle(); | 649 base::RunLoop().RunUntilIdle(); |
| 656 } | 650 } |
| 657 | 651 |
| 658 TEST_F(WebContentsVideoCaptureDeviceTest, StopWithRendererWorkToDo) { | 652 TEST_F(WebContentsVideoCaptureDeviceTest, StopWithRendererWorkToDo) { |
| 659 // Set up the test to use RGB copies and an normal | 653 // Set up the test to use RGB copies and an normal |
| 660 source()->SetCanCopyToVideoFrame(false); | 654 source()->SetCanCopyToVideoFrame(false); |
| 661 source()->SetUseFrameSubscriber(false); | 655 source()->SetUseFrameSubscriber(false); |
| 662 media::VideoCaptureCapability capture_format( | 656 media::VideoCaptureParams capture_params; |
| 663 kTestWidth, | 657 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight); |
| 664 kTestHeight, | 658 capture_params.requested_format.frame_rate = kTestFramesPerSecond; |
| 665 kTestFramesPerSecond, | 659 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| 666 media::PIXEL_FORMAT_I420, | 660 capture_params.allow_resolution_change = false; |
| 667 media::ConstantResolutionVideoCaptureDevice); | 661 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); |
| 668 device()->AllocateAndStart( | |
| 669 capture_format, client_observer()->PassClient()); | |
| 670 | 662 |
| 671 base::RunLoop().RunUntilIdle(); | 663 base::RunLoop().RunUntilIdle(); |
| 672 | 664 |
| 673 for (int i = 0; i < 10; ++i) | 665 for (int i = 0; i < 10; ++i) |
| 674 SimulateDrawEvent(); | 666 SimulateDrawEvent(); |
| 675 | 667 |
| 676 ASSERT_FALSE(client_observer()->HasError()); | 668 ASSERT_FALSE(client_observer()->HasError()); |
| 677 device()->StopAndDeAllocate(); | 669 device()->StopAndDeAllocate(); |
| 678 ASSERT_FALSE(client_observer()->HasError()); | 670 ASSERT_FALSE(client_observer()->HasError()); |
| 679 base::RunLoop().RunUntilIdle(); | 671 base::RunLoop().RunUntilIdle(); |
| 680 ASSERT_FALSE(client_observer()->HasError()); | 672 ASSERT_FALSE(client_observer()->HasError()); |
| 681 } | 673 } |
| 682 | 674 |
| 683 TEST_F(WebContentsVideoCaptureDeviceTest, DeviceRestart) { | 675 TEST_F(WebContentsVideoCaptureDeviceTest, DeviceRestart) { |
| 684 media::VideoCaptureCapability capture_format( | 676 media::VideoCaptureParams capture_params; |
| 685 kTestWidth, | 677 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight); |
| 686 kTestHeight, | 678 capture_params.requested_format.frame_rate = kTestFramesPerSecond; |
| 687 kTestFramesPerSecond, | 679 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| 688 media::PIXEL_FORMAT_I420, | 680 capture_params.allow_resolution_change = false; |
| 689 media::ConstantResolutionVideoCaptureDevice); | 681 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); |
| 690 device()->AllocateAndStart( | |
| 691 capture_format, client_observer()->PassClient()); | |
| 692 base::RunLoop().RunUntilIdle(); | 682 base::RunLoop().RunUntilIdle(); |
| 693 source()->SetSolidColor(SK_ColorRED); | 683 source()->SetSolidColor(SK_ColorRED); |
| 694 SimulateDrawEvent(); | 684 SimulateDrawEvent(); |
| 695 SimulateDrawEvent(); | 685 SimulateDrawEvent(); |
| 696 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); | 686 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); |
| 697 SimulateDrawEvent(); | 687 SimulateDrawEvent(); |
| 698 SimulateDrawEvent(); | 688 SimulateDrawEvent(); |
| 699 source()->SetSolidColor(SK_ColorGREEN); | 689 source()->SetSolidColor(SK_ColorGREEN); |
| 700 SimulateDrawEvent(); | 690 SimulateDrawEvent(); |
| 701 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorGREEN)); | 691 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorGREEN)); |
| 702 device()->StopAndDeAllocate(); | 692 device()->StopAndDeAllocate(); |
| 703 | 693 |
| 704 // Device is stopped, but content can still be animating. | 694 // Device is stopped, but content can still be animating. |
| 705 SimulateDrawEvent(); | 695 SimulateDrawEvent(); |
| 706 SimulateDrawEvent(); | 696 SimulateDrawEvent(); |
| 707 base::RunLoop().RunUntilIdle(); | 697 base::RunLoop().RunUntilIdle(); |
| 708 | 698 |
| 709 StubClientObserver observer2; | 699 StubClientObserver observer2; |
| 710 device()->AllocateAndStart(capture_format, observer2.PassClient()); | 700 device()->AllocateAndStart(capture_params, observer2.PassClient()); |
| 711 source()->SetSolidColor(SK_ColorBLUE); | 701 source()->SetSolidColor(SK_ColorBLUE); |
| 712 SimulateDrawEvent(); | 702 SimulateDrawEvent(); |
| 713 ASSERT_NO_FATAL_FAILURE(observer2.WaitForNextColor(SK_ColorBLUE)); | 703 ASSERT_NO_FATAL_FAILURE(observer2.WaitForNextColor(SK_ColorBLUE)); |
| 714 source()->SetSolidColor(SK_ColorYELLOW); | 704 source()->SetSolidColor(SK_ColorYELLOW); |
| 715 SimulateDrawEvent(); | 705 SimulateDrawEvent(); |
| 716 ASSERT_NO_FATAL_FAILURE(observer2.WaitForNextColor(SK_ColorYELLOW)); | 706 ASSERT_NO_FATAL_FAILURE(observer2.WaitForNextColor(SK_ColorYELLOW)); |
| 717 device()->StopAndDeAllocate(); | 707 device()->StopAndDeAllocate(); |
| 718 } | 708 } |
| 719 | 709 |
| 720 // The "happy case" test. No scaling is needed, so we should be able to change | 710 // The "happy case" test. No scaling is needed, so we should be able to change |
| 721 // the picture emitted from the source and expect to see each delivered to the | 711 // the picture emitted from the source and expect to see each delivered to the |
| 722 // consumer. The test will alternate between the three capture paths, simulating | 712 // consumer. The test will alternate between the three capture paths, simulating |
| 723 // falling in and out of accelerated compositing. | 713 // falling in and out of accelerated compositing. |
| 724 TEST_F(WebContentsVideoCaptureDeviceTest, GoesThroughAllTheMotions) { | 714 TEST_F(WebContentsVideoCaptureDeviceTest, GoesThroughAllTheMotions) { |
| 725 media::VideoCaptureCapability capture_format( | 715 media::VideoCaptureParams capture_params; |
| 726 kTestWidth, | 716 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight); |
| 727 kTestHeight, | 717 capture_params.requested_format.frame_rate = kTestFramesPerSecond; |
| 728 kTestFramesPerSecond, | 718 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| 729 media::PIXEL_FORMAT_I420, | 719 capture_params.allow_resolution_change = false; |
| 730 media::ConstantResolutionVideoCaptureDevice); | 720 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); |
| 731 device()->AllocateAndStart( | |
| 732 capture_format, client_observer()->PassClient()); | |
| 733 | 721 |
| 734 for (int i = 0; i < 6; i++) { | 722 for (int i = 0; i < 6; i++) { |
| 735 const char* name = NULL; | 723 const char* name = NULL; |
| 736 switch (i % 3) { | 724 switch (i % 3) { |
| 737 case 0: | 725 case 0: |
| 738 source()->SetCanCopyToVideoFrame(true); | 726 source()->SetCanCopyToVideoFrame(true); |
| 739 source()->SetUseFrameSubscriber(false); | 727 source()->SetUseFrameSubscriber(false); |
| 740 name = "VideoFrame"; | 728 name = "VideoFrame"; |
| 741 break; | 729 break; |
| 742 case 1: | 730 case 1: |
| (...skipping 25 matching lines...) Expand all Loading... |
| 768 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorBLUE)); | 756 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorBLUE)); |
| 769 | 757 |
| 770 source()->SetSolidColor(SK_ColorBLACK); | 758 source()->SetSolidColor(SK_ColorBLACK); |
| 771 SimulateDrawEvent(); | 759 SimulateDrawEvent(); |
| 772 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorBLACK)); | 760 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorBLACK)); |
| 773 } | 761 } |
| 774 device()->StopAndDeAllocate(); | 762 device()->StopAndDeAllocate(); |
| 775 } | 763 } |
| 776 | 764 |
| 777 TEST_F(WebContentsVideoCaptureDeviceTest, RejectsInvalidAllocateParams) { | 765 TEST_F(WebContentsVideoCaptureDeviceTest, RejectsInvalidAllocateParams) { |
| 778 media::VideoCaptureCapability capture_format( | 766 media::VideoCaptureParams capture_params; |
| 779 1280, | 767 capture_params.requested_format.frame_size.SetSize(1280, 720); |
| 780 720, | 768 capture_params.requested_format.frame_rate = -2; |
| 781 -2, | 769 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| 782 media::PIXEL_FORMAT_I420, | 770 capture_params.allow_resolution_change = false; |
| 783 media::ConstantResolutionVideoCaptureDevice); | |
| 784 BrowserThread::PostTask( | 771 BrowserThread::PostTask( |
| 785 BrowserThread::UI, | 772 BrowserThread::UI, |
| 786 FROM_HERE, | 773 FROM_HERE, |
| 787 base::Bind(&media::VideoCaptureDevice::AllocateAndStart, | 774 base::Bind(&media::VideoCaptureDevice::AllocateAndStart, |
| 788 base::Unretained(device()), | 775 base::Unretained(device()), |
| 789 capture_format, | 776 capture_params, |
| 790 base::Passed(client_observer()->PassClient()))); | 777 base::Passed(client_observer()->PassClient()))); |
| 791 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForError()); | 778 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForError()); |
| 792 BrowserThread::PostTask( | 779 BrowserThread::PostTask( |
| 793 BrowserThread::UI, | 780 BrowserThread::UI, |
| 794 FROM_HERE, | 781 FROM_HERE, |
| 795 base::Bind(&media::VideoCaptureDevice::StopAndDeAllocate, | 782 base::Bind(&media::VideoCaptureDevice::StopAndDeAllocate, |
| 796 base::Unretained(device()))); | 783 base::Unretained(device()))); |
| 797 base::RunLoop().RunUntilIdle(); | 784 base::RunLoop().RunUntilIdle(); |
| 798 } | 785 } |
| 799 | 786 |
| 800 TEST_F(WebContentsVideoCaptureDeviceTest, BadFramesGoodFrames) { | 787 TEST_F(WebContentsVideoCaptureDeviceTest, BadFramesGoodFrames) { |
| 801 media::VideoCaptureCapability capture_format( | 788 media::VideoCaptureParams capture_params; |
| 802 kTestWidth, | 789 capture_params.requested_format.frame_size.SetSize(kTestWidth, kTestHeight); |
| 803 kTestHeight, | 790 capture_params.requested_format.frame_rate = kTestFramesPerSecond; |
| 804 kTestFramesPerSecond, | 791 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| 805 media::PIXEL_FORMAT_I420, | 792 capture_params.allow_resolution_change = false; |
| 806 media::ConstantResolutionVideoCaptureDevice); | |
| 807 // 1x1 is too small to process; we intend for this to result in an error. | 793 // 1x1 is too small to process; we intend for this to result in an error. |
| 808 source()->SetCopyResultSize(1, 1); | 794 source()->SetCopyResultSize(1, 1); |
| 809 source()->SetSolidColor(SK_ColorRED); | 795 source()->SetSolidColor(SK_ColorRED); |
| 810 device()->AllocateAndStart( | 796 device()->AllocateAndStart(capture_params, client_observer()->PassClient()); |
| 811 capture_format, client_observer()->PassClient()); | |
| 812 | 797 |
| 813 // These frames ought to be dropped during the Render stage. Let | 798 // These frames ought to be dropped during the Render stage. Let |
| 814 // several captures to happen. | 799 // several captures to happen. |
| 815 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy()); | 800 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy()); |
| 816 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy()); | 801 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy()); |
| 817 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy()); | 802 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy()); |
| 818 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy()); | 803 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy()); |
| 819 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy()); | 804 ASSERT_NO_FATAL_FAILURE(source()->WaitForNextCopy()); |
| 820 | 805 |
| 821 // Now push some good frames through; they should be processed normally. | 806 // Now push some good frames through; they should be processed normally. |
| 822 source()->SetCopyResultSize(kTestWidth, kTestHeight); | 807 source()->SetCopyResultSize(kTestWidth, kTestHeight); |
| 823 source()->SetSolidColor(SK_ColorGREEN); | 808 source()->SetSolidColor(SK_ColorGREEN); |
| 824 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorGREEN)); | 809 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorGREEN)); |
| 825 source()->SetSolidColor(SK_ColorRED); | 810 source()->SetSolidColor(SK_ColorRED); |
| 826 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); | 811 ASSERT_NO_FATAL_FAILURE(client_observer()->WaitForNextColor(SK_ColorRED)); |
| 827 | 812 |
| 828 device()->StopAndDeAllocate(); | 813 device()->StopAndDeAllocate(); |
| 829 } | 814 } |
| 830 | 815 |
| 831 } // namespace | 816 } // namespace |
| 832 } // namespace content | 817 } // namespace content |
| OLD | NEW |