Chromium Code Reviews| 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/render_widget_host_view_aura.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_aura.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <tuple> | 10 #include <tuple> |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 222 private: | 222 private: |
| 223 // Window that we're observing, or NULL if it's been destroyed. | 223 // Window that we're observing, or NULL if it's been destroyed. |
| 224 aura::Window* window_; | 224 aura::Window* window_; |
| 225 | 225 |
| 226 // Was |window_| destroyed? | 226 // Was |window_| destroyed? |
| 227 bool destroyed_; | 227 bool destroyed_; |
| 228 | 228 |
| 229 DISALLOW_COPY_AND_ASSIGN(TestWindowObserver); | 229 DISALLOW_COPY_AND_ASSIGN(TestWindowObserver); |
| 230 }; | 230 }; |
| 231 | 231 |
| 232 class FakeSurfaceDamageObserver : public cc::SurfaceDamageObserver { | |
| 233 public: | |
| 234 void OnSurfaceDamaged(const cc::SurfaceId& id, bool* changed) override { | |
| 235 *changed = true; | |
| 236 } | |
| 237 }; | |
| 238 | |
| 232 class FakeFrameSubscriber : public RenderWidgetHostViewFrameSubscriber { | 239 class FakeFrameSubscriber : public RenderWidgetHostViewFrameSubscriber { |
| 233 public: | 240 public: |
| 234 FakeFrameSubscriber(gfx::Size size, base::Callback<void(bool)> callback) | 241 FakeFrameSubscriber(gfx::Size size, base::Callback<void(bool)> callback) |
| 235 : size_(size), callback_(callback), should_capture_(true) {} | 242 : size_(size), callback_(callback), should_capture_(true) {} |
| 236 | 243 |
| 237 bool ShouldCaptureFrame(const gfx::Rect& damage_rect, | 244 bool ShouldCaptureFrame(const gfx::Rect& damage_rect, |
| 238 base::TimeTicks present_time, | 245 base::TimeTicks present_time, |
| 239 scoped_refptr<media::VideoFrame>* storage, | 246 scoped_refptr<media::VideoFrame>* storage, |
| 240 DeliverFrameCallback* callback) override { | 247 DeliverFrameCallback* callback) override { |
| 241 if (!should_capture_) | 248 if (!should_capture_) |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 341 } | 348 } |
| 342 | 349 |
| 343 bool HasFrameData() const { | 350 bool HasFrameData() const { |
| 344 return !surface_id().is_null(); | 351 return !surface_id().is_null(); |
| 345 } | 352 } |
| 346 | 353 |
| 347 bool released_front_lock_active() const { | 354 bool released_front_lock_active() const { |
| 348 return GetDelegatedFrameHost()->ReleasedFrontLockActiveForTesting(); | 355 return GetDelegatedFrameHost()->ReleasedFrontLockActiveForTesting(); |
| 349 } | 356 } |
| 350 | 357 |
| 358 void ReturnResources(const cc::ReturnedResourceArray& resources) { | |
| 359 GetDelegatedFrameHost()->ReturnResources(resources); | |
| 360 } | |
| 361 | |
| 362 void ResetCompositor() { GetDelegatedFrameHost()->ResetCompositor(); } | |
| 363 | |
| 351 // A lock that doesn't actually do anything to the compositor, and does not | 364 // A lock that doesn't actually do anything to the compositor, and does not |
| 352 // time out. | 365 // time out. |
| 353 class FakeResizeLock : public ResizeLock { | 366 class FakeResizeLock : public ResizeLock { |
| 354 public: | 367 public: |
| 355 FakeResizeLock(const gfx::Size new_size, bool defer_compositor_lock) | 368 FakeResizeLock(const gfx::Size new_size, bool defer_compositor_lock) |
| 356 : ResizeLock(new_size, defer_compositor_lock) {} | 369 : ResizeLock(new_size, defer_compositor_lock) {} |
| 357 }; | 370 }; |
| 358 | 371 |
| 359 const ui::MotionEventAura& pointer_state_for_test() { | 372 const ui::MotionEventAura& pointer_state_for_test() { |
| 360 return pointer_state(); | 373 return pointer_state(); |
| (...skipping 1231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1592 gfx::Size size, | 1605 gfx::Size size, |
| 1593 gfx::Rect damage) { | 1606 gfx::Rect damage) { |
| 1594 cc::CompositorFrame frame; | 1607 cc::CompositorFrame frame; |
| 1595 frame.metadata.device_scale_factor = scale_factor; | 1608 frame.metadata.device_scale_factor = scale_factor; |
| 1596 frame.delegated_frame_data.reset(new cc::DelegatedFrameData); | 1609 frame.delegated_frame_data.reset(new cc::DelegatedFrameData); |
| 1597 | 1610 |
| 1598 std::unique_ptr<cc::RenderPass> pass = cc::RenderPass::Create(); | 1611 std::unique_ptr<cc::RenderPass> pass = cc::RenderPass::Create(); |
| 1599 pass->SetNew( | 1612 pass->SetNew( |
| 1600 cc::RenderPassId(1, 1), gfx::Rect(size), damage, gfx::Transform()); | 1613 cc::RenderPassId(1, 1), gfx::Rect(size), damage, gfx::Transform()); |
| 1601 frame.delegated_frame_data->render_pass_list.push_back(std::move(pass)); | 1614 frame.delegated_frame_data->render_pass_list.push_back(std::move(pass)); |
| 1615 cc::TransferableResource resource; | |
| 1616 resource.id = 1; | |
| 1617 frame.delegated_frame_data->resource_list.push_back(std::move(resource)); | |
| 1602 return frame; | 1618 return frame; |
| 1603 } | 1619 } |
| 1604 | 1620 |
| 1621 // If the ui::Compositor has been reset then resources are returned back to the | |
| 1622 // client in response to the swap. This test verifies that the returned | |
| 1623 // resources are indeed reported as being in response to a swap. | |
| 1624 TEST_F(RenderWidgetHostViewAuraTest, ResettingCompositorReturnsResources) { | |
| 1625 FakeSurfaceDamageObserver damage_observer; | |
| 1626 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | |
| 1627 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | |
| 1628 manager->AddObserver(&damage_observer); | |
| 1629 | |
| 1630 gfx::Size view_size(100, 100); | |
| 1631 gfx::Rect view_rect(view_size); | |
| 1632 | |
| 1633 view_->InitAsChild(NULL); | |
|
danakj
2016/07/14 19:55:44
nullptr
Fady Samuel
2016/07/14 23:17:04
Done. I just did a s/NULL/nullptr
| |
| 1634 aura::client::ParentWindowWithContext( | |
| 1635 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), | |
| 1636 gfx::Rect()); | |
| 1637 view_->SetSize(view_size); | |
| 1638 view_->Show(); | |
| 1639 sink_->ClearMessages(); | |
| 1640 | |
| 1641 view_->ResetCompositor(); | |
| 1642 | |
| 1643 // Swappinga frame should trigger a swap ACK IPC because we have reset the | |
|
danakj
2016/07/14 19:55:44
Swapping a frame
Fady Samuel
2016/07/14 23:17:04
Done.
| |
| 1644 // compositor. | |
| 1645 view_->OnSwapCompositorFrame(0, | |
| 1646 MakeDelegatedFrame(1.f, view_size, view_rect)); | |
| 1647 EXPECT_EQ(1u, sink_->message_count()); | |
| 1648 { | |
| 1649 const IPC::Message* msg = sink_->GetMessageAt(0); | |
| 1650 EXPECT_EQ(ViewMsg_ReclaimCompositorResources::ID, msg->type()); | |
| 1651 ViewMsg_ReclaimCompositorResources::Param params; | |
| 1652 ViewMsg_ReclaimCompositorResources::Read(msg, ¶ms); | |
| 1653 EXPECT_EQ(0u, std::get<0>(params)); // output_surface_id | |
| 1654 EXPECT_EQ(true, std::get<1>(params)); // is_swap_ack | |
|
danakj
2016/07/14 19:55:44
EXPECT_TRUE (i've seen EQ(true/false) fail to comp
Fady Samuel
2016/07/14 23:17:04
Done.
| |
| 1655 } | |
| 1656 manager->RemoveObserver(&damage_observer); | |
| 1657 } | |
| 1658 | |
| 1659 // This test verifies that returned resources do not require a pending ack. | |
| 1660 TEST_F(RenderWidgetHostViewAuraTest, ReturnedResources) { | |
| 1661 gfx::Size view_size(100, 100); | |
| 1662 gfx::Rect view_rect(view_size); | |
| 1663 | |
| 1664 view_->InitAsChild(NULL); | |
| 1665 aura::client::ParentWindowWithContext( | |
| 1666 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), | |
| 1667 gfx::Rect()); | |
| 1668 view_->SetSize(view_size); | |
| 1669 view_->Show(); | |
| 1670 sink_->ClearMessages(); | |
| 1671 | |
| 1672 // Accumulate some returned resources. This should not trigger an IPC. | |
| 1673 cc::ReturnedResourceArray resources; | |
| 1674 cc::ReturnedResource resource; | |
| 1675 resource.id = 1; | |
| 1676 resources.push_back(resource); | |
| 1677 view_->ReturnResources(resources); | |
| 1678 EXPECT_EQ(1u, sink_->message_count()); | |
| 1679 { | |
| 1680 const IPC::Message* msg = sink_->GetMessageAt(0); | |
| 1681 EXPECT_EQ(ViewMsg_ReclaimCompositorResources::ID, msg->type()); | |
| 1682 ViewMsg_ReclaimCompositorResources::Param params; | |
| 1683 ViewMsg_ReclaimCompositorResources::Read(msg, ¶ms); | |
| 1684 EXPECT_EQ(0u, std::get<0>(params)); // output_surface_id | |
| 1685 EXPECT_EQ(false, std::get<1>(params)); // is_swap_ack | |
|
danakj
2016/07/14 19:55:44
EXPECT_FALSE
Fady Samuel
2016/07/14 23:17:04
Done.
| |
| 1686 } | |
| 1687 } | |
| 1688 | |
| 1689 // This test verifies that when the output_surface_id changes, then | |
| 1690 // DelegateFrameHost | |
|
danakj
2016/07/14 19:55:44
weird line wrapping
Fady Samuel
2016/07/14 23:17:04
Done.
| |
| 1691 // returns compositor resources without a swap ack. | |
| 1692 TEST_F(RenderWidgetHostViewAuraTest, TwoOutputSurfaces) { | |
| 1693 FakeSurfaceDamageObserver damage_observer; | |
| 1694 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | |
| 1695 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | |
| 1696 manager->AddObserver(&damage_observer); | |
| 1697 | |
| 1698 gfx::Size view_size(100, 100); | |
| 1699 gfx::Rect view_rect(view_size); | |
| 1700 | |
| 1701 view_->InitAsChild(NULL); | |
| 1702 aura::client::ParentWindowWithContext( | |
| 1703 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), | |
| 1704 gfx::Rect()); | |
| 1705 view_->SetSize(view_size); | |
| 1706 view_->Show(); | |
| 1707 sink_->ClearMessages(); | |
| 1708 | |
| 1709 view_->OnSwapCompositorFrame(0, | |
| 1710 MakeDelegatedFrame(1.f, view_size, view_rect)); | |
| 1711 | |
| 1712 // Accumulate some returned resources. This should not trigger an IPC. | |
| 1713 cc::ReturnedResourceArray resources; | |
| 1714 cc::ReturnedResource resource; | |
| 1715 resource.id = 1; | |
| 1716 resources.push_back(resource); | |
| 1717 view_->ReturnResources(resources); | |
| 1718 EXPECT_EQ(0u, sink_->message_count()); | |
| 1719 | |
| 1720 // Swap another CompositorFrame but this time from another output_surface_id. | |
| 1721 // This should trigger a non-ACK ReclaimCompositorResources IPC. | |
| 1722 view_->OnSwapCompositorFrame(1, | |
| 1723 MakeDelegatedFrame(1.f, view_size, view_rect)); | |
| 1724 EXPECT_EQ(1u, sink_->message_count()); | |
| 1725 { | |
| 1726 const IPC::Message* msg = sink_->GetMessageAt(0); | |
| 1727 EXPECT_EQ(ViewMsg_ReclaimCompositorResources::ID, msg->type()); | |
| 1728 ViewMsg_ReclaimCompositorResources::Param params; | |
| 1729 ViewMsg_ReclaimCompositorResources::Read(msg, ¶ms); | |
| 1730 EXPECT_EQ(0u, std::get<0>(params)); // output_surface_id | |
| 1731 EXPECT_EQ(false, std::get<1>(params)); // is_swap_ack | |
| 1732 } | |
| 1733 sink_->ClearMessages(); | |
| 1734 | |
| 1735 // Report that the surface is drawn to trigger an ACK. | |
| 1736 cc::Surface* surface = manager->GetSurfaceForId(view_->surface_id()); | |
| 1737 EXPECT_TRUE(surface); | |
| 1738 surface->RunDrawCallbacks(cc::SurfaceDrawStatus::DRAWN); | |
| 1739 EXPECT_EQ(1u, sink_->message_count()); | |
| 1740 { | |
| 1741 const IPC::Message* msg = sink_->GetMessageAt(0); | |
| 1742 EXPECT_EQ(ViewMsg_ReclaimCompositorResources::ID, msg->type()); | |
| 1743 ViewMsg_ReclaimCompositorResources::Param params; | |
| 1744 ViewMsg_ReclaimCompositorResources::Read(msg, ¶ms); | |
| 1745 EXPECT_EQ(1u, std::get<0>(params)); // output_surface_id | |
| 1746 EXPECT_EQ(true, std::get<1>(params)); // is_swap_ack | |
| 1747 } | |
| 1748 | |
| 1749 manager->RemoveObserver(&damage_observer); | |
| 1750 } | |
| 1751 | |
| 1605 // Resizing in fullscreen mode should send the up-to-date screen info. | 1752 // Resizing in fullscreen mode should send the up-to-date screen info. |
| 1606 // http://crbug.com/324350 | 1753 // http://crbug.com/324350 |
| 1607 TEST_F(RenderWidgetHostViewAuraTest, DISABLED_FullscreenResize) { | 1754 TEST_F(RenderWidgetHostViewAuraTest, DISABLED_FullscreenResize) { |
| 1608 aura::Window* root_window = aura_test_helper_->root_window(); | 1755 aura::Window* root_window = aura_test_helper_->root_window(); |
| 1609 root_window->SetLayoutManager(new FullscreenLayoutManager(root_window)); | 1756 root_window->SetLayoutManager(new FullscreenLayoutManager(root_window)); |
| 1610 view_->InitAsFullscreen(parent_view_); | 1757 view_->InitAsFullscreen(parent_view_); |
| 1611 view_->Show(); | 1758 view_->Show(); |
| 1612 widget_host_->ResetSizeAndRepaintPendingFlags(); | 1759 widget_host_->ResetSizeAndRepaintPendingFlags(); |
| 1613 sink_->ClearMessages(); | 1760 sink_->ClearMessages(); |
| 1614 | 1761 |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1815 view_->SetSize(size3); | 1962 view_->SetSize(size3); |
| 1816 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); | 1963 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); |
| 1817 EXPECT_EQ(0u, sink_->message_count()); | 1964 EXPECT_EQ(0u, sink_->message_count()); |
| 1818 | 1965 |
| 1819 // Receive a frame of the new size, should be skipped and not produce a Resize | 1966 // Receive a frame of the new size, should be skipped and not produce a Resize |
| 1820 // message. | 1967 // message. |
| 1821 view_->OnSwapCompositorFrame( | 1968 view_->OnSwapCompositorFrame( |
| 1822 0, MakeDelegatedFrame(1.f, size3, gfx::Rect(size3))); | 1969 0, MakeDelegatedFrame(1.f, size3, gfx::Rect(size3))); |
| 1823 // Expect the frame ack; | 1970 // Expect the frame ack; |
| 1824 EXPECT_EQ(1u, sink_->message_count()); | 1971 EXPECT_EQ(1u, sink_->message_count()); |
| 1825 EXPECT_EQ(ViewMsg_SwapCompositorFrameAck::ID, sink_->GetMessageAt(0)->type()); | 1972 EXPECT_EQ(ViewMsg_ReclaimCompositorResources::ID, |
| 1973 sink_->GetMessageAt(0)->type()); | |
| 1826 sink_->ClearMessages(); | 1974 sink_->ClearMessages(); |
| 1827 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); | 1975 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); |
| 1828 | 1976 |
| 1829 // Receive a frame of the correct size, should not be skipped and, and should | 1977 // Receive a frame of the correct size, should not be skipped and, and should |
| 1830 // produce a Resize message after the commit. | 1978 // produce a Resize message after the commit. |
| 1831 view_->OnSwapCompositorFrame( | 1979 view_->OnSwapCompositorFrame( |
| 1832 0, MakeDelegatedFrame(1.f, size2, gfx::Rect(size2))); | 1980 0, MakeDelegatedFrame(1.f, size2, gfx::Rect(size2))); |
| 1833 cc::SurfaceId surface_id = view_->surface_id(); | 1981 cc::SurfaceId surface_id = view_->surface_id(); |
| 1834 if (surface_id.is_null()) { | 1982 if (surface_id.is_null()) { |
| 1835 // No frame ack yet. | 1983 // No frame ack yet. |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 1854 // call | 2002 // call |
| 1855 // ui::WindowEventDispatcher::SynthesizeMouseMoveAfterChangeToWindow, | 2003 // ui::WindowEventDispatcher::SynthesizeMouseMoveAfterChangeToWindow, |
| 1856 // which the above WaitForCommit may cause to be picked up. Be robust | 2004 // which the above WaitForCommit may cause to be picked up. Be robust |
| 1857 // to this extra IPC coming in. | 2005 // to this extra IPC coming in. |
| 1858 InputMsg_HandleInputEvent::Param params; | 2006 InputMsg_HandleInputEvent::Param params; |
| 1859 InputMsg_HandleInputEvent::Read(msg, ¶ms); | 2007 InputMsg_HandleInputEvent::Read(msg, ¶ms); |
| 1860 const blink::WebInputEvent* event = std::get<0>(params); | 2008 const blink::WebInputEvent* event = std::get<0>(params); |
| 1861 EXPECT_EQ(blink::WebInputEvent::MouseMove, event->type); | 2009 EXPECT_EQ(blink::WebInputEvent::MouseMove, event->type); |
| 1862 break; | 2010 break; |
| 1863 } | 2011 } |
| 1864 case ViewMsg_SwapCompositorFrameAck::ID: | 2012 case ViewMsg_ReclaimCompositorResources::ID: |
| 1865 break; | 2013 break; |
| 1866 case ViewMsg_Resize::ID: { | 2014 case ViewMsg_Resize::ID: { |
| 1867 EXPECT_FALSE(has_resize); | 2015 EXPECT_FALSE(has_resize); |
| 1868 ViewMsg_Resize::Param params; | 2016 ViewMsg_Resize::Param params; |
| 1869 ViewMsg_Resize::Read(msg, ¶ms); | 2017 ViewMsg_Resize::Read(msg, ¶ms); |
| 1870 EXPECT_EQ(size3.ToString(), std::get<0>(params).new_size.ToString()); | 2018 EXPECT_EQ(size3.ToString(), std::get<0>(params).new_size.ToString()); |
| 1871 has_resize = true; | 2019 has_resize = true; |
| 1872 break; | 2020 break; |
| 1873 } | 2021 } |
| 1874 default: | 2022 default: |
| (...skipping 2441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4316 // No bounds at index 1. | 4464 // No bounds at index 1. |
| 4317 EXPECT_FALSE(text_input_client()->GetCompositionCharacterBounds(1, &bound)); | 4465 EXPECT_FALSE(text_input_client()->GetCompositionCharacterBounds(1, &bound)); |
| 4318 | 4466 |
| 4319 // Valid bound at index 0. | 4467 // Valid bound at index 0. |
| 4320 EXPECT_TRUE(text_input_client()->GetCompositionCharacterBounds(0, &bound)); | 4468 EXPECT_TRUE(text_input_client()->GetCompositionCharacterBounds(0, &bound)); |
| 4321 EXPECT_EQ(4 + (int)index, bound.height()); | 4469 EXPECT_EQ(4 + (int)index, bound.height()); |
| 4322 } | 4470 } |
| 4323 } | 4471 } |
| 4324 | 4472 |
| 4325 } // namespace content | 4473 } // namespace content |
| OLD | NEW |