diff options
author | mpearson <mpearson@chromium.org> | 2015-10-15 21:34:12 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-10-16 04:34:55 +0000 |
commit | 1b8d59763b4266783794a950eee388ddc110ada6 (patch) | |
tree | 1a8602153c7faa87fe18f3d85ac9073f9b9e33f9 | |
parent | 397b1a31c02523b6a30b52f863a8f4ecca91a1f7 (diff) | |
download | chromium_src-1b8d59763b4266783794a950eee388ddc110ada6.zip chromium_src-1b8d59763b4266783794a950eee388ddc110ada6.tar.gz chromium_src-1b8d59763b4266783794a950eee388ddc110ada6.tar.bz2 |
Revert of Add mechanism to signal DelegatedFrameHost that a surface is about to draw. (patchset #7 id:120001 of https://codereview.chromium.org/1365793002/ )
Reason for revert:
Causing memory failures on SurfaceAggregatorValidSurfaceTest.CopyRequest in cc_unittests on
http://build.chromium.org/p/chromium.memory.fyi/builders/Linux%20MSan%20Tests/builds/10514
and
http://build.chromium.org/p/chromium.memory.fyi/builders/Linux%20ChromeOS%20MSan%20Tests/builds/4653
[ RUN ] SurfaceAggregatorValidSurfaceTest.CopyRequest
==31905==WARNING: MemorySanitizer: use-of-uninitialized-value
#0 0x7fccb3920f7e in cc::Surface::RequestCopyOfOutput(scoped_ptr\u003Ccc::CopyOutputRequest, base::DefaultDeleter\u003Ccc::CopyOutputRequest> >) cc/surfaces/surface.cc:106:15
#1 0x7fccb3942ec9 in cc::SurfaceFactory::RequestCopyOfSurface(cc::SurfaceId, scoped_ptr\u003Ccc::CopyOutputRequest, base::DefaultDeleter\u003Ccc::CopyOutputRequest> >) cc/surfaces/surface_factory.cc:75:3
#2 0x7fccb31ce931 in cc::(anonymous namespace)::SurfaceAggregatorValidSurfaceTest_CopyRequest_Test::TestBody() cc/surfaces/surface_aggregator_unittest.cc:285:3
#3 0x7fccb33160d2 in HandleExceptionsInMethodIfSupported\u003Ctesting::Test, void> testing/gtest/src/gtest.cc:2458:12
#4 0x7fccb33160d2 in testing::Test::Run() testing/gtest/src/gtest.cc:2474:0
#5 0x7fccb331972c in testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:5
#6 0x7fccb331b0a2 in testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:5
#7 0x7fccb333948b in testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:11
#8 0x7fccb3338468 in HandleExceptionsInMethodIfSupported\u003Ctesting::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12
#9 0x7fccb3338468 in testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255:0
#10 0x7fccb32867da in RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:10
#11 0x7fccb32867da in base::TestSuite::Run() base/test/test_suite.cc:230:0
#12 0x7fccb327388e in Run base/callback.h:396:12
#13 0x7fccb327388e in base::(anonymous namespace)::LaunchUnitTestsInternal(base::Callback\u003Cint ()> const&, int, bool, base::Callback\u003Cvoid ()> const&) base/test/launcher/unit_test_launcher.cc:187:0
#14 0x7fccb32730de in base::LaunchUnitTests(int, char**, base::Callback\u003Cint ()> const&) base/test/launcher/unit_test_launcher.cc:426:10
#15 0x7fccb0ba0c15 in main cc/test/run_all_unittests.cc:12:10
#16 0x7fccaa41076c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226:0
#17 0x7fccb0b41ca8 in _start ??:0:0
Uninitialized value was created by a heap allocation
#0 0x7fccb0b9fd92 in operator new(unsigned long) ??:0:0
#1 0x7fccb31ce897 in CreateEmptyRequest cc/output/copy_output_request.h:26:28
#2 0x7fccb31ce897 in cc::(anonymous namespace)::SurfaceAggregatorValidSurfaceTest_CopyRequest_Test::TestBody() cc/surfaces/surface_aggregator_unittest.cc:283:0
#3 0x7fccb33160d2 in HandleExceptionsInMethodIfSupported\u003Ctesting::Test, void> testing/gtest/src/gtest.cc:2458:12
#4 0x7fccb33160d2 in testing::Test::Run() testing/gtest/src/gtest.cc:2474:0
#5 0x7fccb331972c in testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:5
#6 0x7fccb331b0a2 in testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:5
#7 0x7fccb333948b in testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:11
#8 0x7fccb3338468 in HandleExceptionsInMethodIfSupported\u003Ctesting::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12
#9 0x7fccb3338468 in testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255:0
#10 0x7fccb32867da in RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:10
#11 0x7fccb32867da in base::TestSuite::Run() base/test/test_suite.cc:230:0
#12 0x7fccb327388e in Run base/callback.h:396:12
#13 0x7fccb327388e in base::(anonymous namespace)::LaunchUnitTestsInternal(base::Callback\u003Cint ()> const&, int, bool, base::Callback\u003Cvoid ()> const&) base/test/launcher/unit_test_launcher.cc:187:0
#14 0x7fccb32730de in base::LaunchUnitTests(int, char**, base::Callback\u003Cint ()> const&) base/test/launcher/unit_test_launcher.cc:426:10
#15 0x7fccb0ba0c15 in main cc/test/run_all_unittests.cc:12:10
#16 0x7fccaa41076c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226:0
SUMMARY: MemorySanitizer: use-of-uninitialized-value (/tmp/runqXGplV/out/Release/cc_unittests+0x32e1f7e)
Exiting
Original issue's description:
> Add mechanism to signal DelegatedFrameHost that a surface is about to draw.
>
> This allows the FrameSubscriber to request a copy of the output even when the renderer it's subscribing to hasn't changed its contents, but a child renderer (oopif or webview) has.
>
> BUG=529378
> CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
>
> Committed: https://crrev.com/5ed9ab93dd9f448aac722483b6adc6b7a14cdf4b
> Cr-Commit-Position: refs/heads/master@{#354390}
TBR=miu@chromium.org,sadrul@chromium.org,jbauman@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=529378
Review URL: https://codereview.chromium.org/1407173002
Cr-Commit-Position: refs/heads/master@{#354446}
-rw-r--r-- | cc/surfaces/surface.cc | 19 | ||||
-rw-r--r-- | cc/surfaces/surface_aggregator.cc | 10 | ||||
-rw-r--r-- | cc/surfaces/surface_aggregator_unittest.cc | 11 | ||||
-rw-r--r-- | cc/surfaces/surface_factory.cc | 6 | ||||
-rw-r--r-- | cc/surfaces/surface_factory.h | 3 | ||||
-rw-r--r-- | cc/surfaces/surface_factory_client.h | 5 | ||||
-rw-r--r-- | cc/surfaces/surface_factory_unittest.cc | 58 | ||||
-rw-r--r-- | content/browser/compositor/delegated_frame_host.cc | 29 | ||||
-rw-r--r-- | content/browser/compositor/delegated_frame_host.h | 3 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_aura_unittest.cc | 17 |
10 files changed, 13 insertions, 148 deletions
diff --git a/cc/surfaces/surface.cc b/cc/surfaces/surface.cc index e3b0f5e..16987cb 100644 --- a/cc/surfaces/surface.cc +++ b/cc/surfaces/surface.cc @@ -98,22 +98,11 @@ void Surface::QueueFrame(scoped_ptr<CompositorFrame> frame, void Surface::RequestCopyOfOutput(scoped_ptr<CopyOutputRequest> copy_request) { if (current_frame_ && - !current_frame_->delegated_frame_data->render_pass_list.empty()) { - ScopedPtrVector<CopyOutputRequest>& copy_requests = - current_frame_->delegated_frame_data->render_pass_list.back() - ->copy_requests; - - if (void* source = copy_request->source()) { - // Remove existing CopyOutputRequests made on the Surface by the same - // source. - auto to_remove = copy_requests.remove_if([source]( - const CopyOutputRequest* x) { return x->source() == source; }); - copy_requests.erase(to_remove, copy_requests.end()); - } - copy_requests.push_back(copy_request.Pass()); - } else { + !current_frame_->delegated_frame_data->render_pass_list.empty()) + current_frame_->delegated_frame_data->render_pass_list.back() + ->copy_requests.push_back(copy_request.Pass()); + else copy_request->SendEmptyResult(); - } } void Surface::TakeCopyOutputRequests( diff --git a/cc/surfaces/surface_aggregator.cc b/cc/surfaces/surface_aggregator.cc index 902f836..69618ba 100644 --- a/cc/surfaces/surface_aggregator.cc +++ b/cc/surfaces/surface_aggregator.cc @@ -547,6 +547,9 @@ gfx::Rect SurfaceAggregator::PrewalkTree(SurfaceId surface_id) { if (provider_) provider_->DeclareUsedResourcesFromChild(child_id, referenced_resources); + for (const auto& render_pass : frame_data->render_pass_list) + has_copy_requests_ |= !render_pass->copy_requests.empty(); + gfx::Rect damage_rect; if (!frame_data->render_pass_list.empty()) { RenderPass* last_pass = frame_data->render_pass_list.back(); @@ -563,13 +566,6 @@ gfx::Rect SurfaceAggregator::PrewalkTree(SurfaceId surface_id) { damage_rect.Union( MathUtil::MapEnclosingClippedRect(surface_info.second, surface_damage)); } - - if (surface->factory()) - surface->factory()->WillDrawSurface(surface->surface_id(), damage_rect); - - for (const auto& render_pass : frame_data->render_pass_list) - has_copy_requests_ |= !render_pass->copy_requests.empty(); - referenced_surfaces_.erase(it); return damage_rect; } diff --git a/cc/surfaces/surface_aggregator_unittest.cc b/cc/surfaces/surface_aggregator_unittest.cc index bee479c..bfec6e6 100644 --- a/cc/surfaces/surface_aggregator_unittest.cc +++ b/cc/surfaces/surface_aggregator_unittest.cc @@ -43,13 +43,6 @@ gfx::Size SurfaceSize() { class EmptySurfaceFactoryClient : public SurfaceFactoryClient { public: void ReturnResources(const ReturnedResourceArray& resources) override {} - void WillDrawSurface(SurfaceId id, const gfx::Rect& damage_rect) override { - last_surface_id_ = id; - last_damage_rect_ = damage_rect; - } - - gfx::Rect last_damage_rect_; - SurfaceId last_surface_id_; }; class SurfaceAggregatorTest : public testing::Test { @@ -173,10 +166,6 @@ TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleFrame) { SurfaceId ids[] = {root_surface_id_}; AggregateAndVerify(passes, arraysize(passes), ids, arraysize(ids)); - - // Check that WillDrawSurface was called. - EXPECT_EQ(gfx::Rect(SurfaceSize()), empty_client_.last_damage_rect_); - EXPECT_EQ(root_surface_id_, empty_client_.last_surface_id_); } TEST_F(SurfaceAggregatorValidSurfaceTest, OpacityCopied) { diff --git a/cc/surfaces/surface_factory.cc b/cc/surfaces/surface_factory.cc index 72ebdc4..3e83c8c 100644 --- a/cc/surfaces/surface_factory.cc +++ b/cc/surfaces/surface_factory.cc @@ -8,7 +8,6 @@ #include "cc/output/compositor_frame.h" #include "cc/output/copy_output_request.h" #include "cc/surfaces/surface.h" -#include "cc/surfaces/surface_factory_client.h" #include "cc/surfaces/surface_manager.h" #include "ui/gfx/geometry/size.h" @@ -76,11 +75,6 @@ void SurfaceFactory::RequestCopyOfSurface( manager_->SurfaceModified(surface_id); } -void SurfaceFactory::WillDrawSurface(SurfaceId id, - const gfx::Rect& damage_rect) { - client_->WillDrawSurface(id, damage_rect); -} - void SurfaceFactory::ReceiveFromChild( const TransferableResourceArray& resources) { holder_.ReceiveFromChild(resources); diff --git a/cc/surfaces/surface_factory.h b/cc/surfaces/surface_factory.h index 762d5a2..5af8d2e 100644 --- a/cc/surfaces/surface_factory.h +++ b/cc/surfaces/surface_factory.h @@ -11,7 +11,6 @@ #include "base/containers/scoped_ptr_hash_map.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" -#include "base/observer_list.h" #include "cc/output/compositor_frame.h" #include "cc/surfaces/surface_id.h" #include "cc/surfaces/surface_resource_holder.h" @@ -56,8 +55,6 @@ class CC_SURFACES_EXPORT SurfaceFactory void RequestCopyOfSurface(SurfaceId surface_id, scoped_ptr<CopyOutputRequest> copy_request); - void WillDrawSurface(SurfaceId id, const gfx::Rect& damage_rect); - SurfaceFactoryClient* client() { return client_; } void ReceiveFromChild(const TransferableResourceArray& resources); diff --git a/cc/surfaces/surface_factory_client.h b/cc/surfaces/surface_factory_client.h index c2a04af..9866b27 100644 --- a/cc/surfaces/surface_factory_client.h +++ b/cc/surfaces/surface_factory_client.h @@ -6,9 +6,7 @@ #define CC_SURFACES_SURFACE_FACTORY_CLIENT_H_ #include "cc/resources/returned_resource.h" -#include "cc/surfaces/surface_id.h" #include "cc/surfaces/surfaces_export.h" -#include "ui/gfx/geometry/rect.h" namespace cc { @@ -17,9 +15,6 @@ class CC_SURFACES_EXPORT SurfaceFactoryClient { virtual ~SurfaceFactoryClient() {} virtual void ReturnResources(const ReturnedResourceArray& resources) = 0; - - virtual void WillDrawSurface(SurfaceId surface_id, - const gfx::Rect& damage_rect) {} }; } // namespace cc diff --git a/cc/surfaces/surface_factory_unittest.cc b/cc/surfaces/surface_factory_unittest.cc index 9629a4e..c7ce964 100644 --- a/cc/surfaces/surface_factory_unittest.cc +++ b/cc/surfaces/surface_factory_unittest.cc @@ -4,8 +4,6 @@ #include "base/bind.h" #include "cc/output/compositor_frame.h" -#include "cc/output/copy_output_request.h" -#include "cc/output/copy_output_result.h" #include "cc/output/delegated_frame_data.h" #include "cc/resources/resource_provider.h" #include "cc/surfaces/surface.h" @@ -521,61 +519,5 @@ TEST_F(SurfaceFactoryTest, DestroyCycle) { surface_id_ = SurfaceId(); } -void CopyRequestTestCallback(bool* called, - scoped_ptr<CopyOutputResult> result) { - *called = true; -} - -TEST_F(SurfaceFactoryTest, DuplicateCopyRequest) { - { - scoped_ptr<RenderPass> render_pass(RenderPass::Create()); - render_pass->referenced_surfaces.push_back(surface_id_); - scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); - frame_data->render_pass_list.push_back(render_pass.Pass()); - scoped_ptr<CompositorFrame> frame(new CompositorFrame); - frame->delegated_frame_data = frame_data.Pass(); - factory_.SubmitCompositorFrame(surface_id_, frame.Pass(), - SurfaceFactory::DrawCallback()); - } - void* source1 = &source1; - void* source2 = &source2; - - bool called1 = false; - scoped_ptr<CopyOutputRequest> request; - request = CopyOutputRequest::CreateRequest( - base::Bind(&CopyRequestTestCallback, &called1)); - request->set_source(source1); - - factory_.RequestCopyOfSurface(surface_id_, request.Pass()); - EXPECT_FALSE(called1); - - bool called2 = false; - request = CopyOutputRequest::CreateRequest( - base::Bind(&CopyRequestTestCallback, &called2)); - request->set_source(source2); - - factory_.RequestCopyOfSurface(surface_id_, request.Pass()); - // Callbacks have different sources so neither should be called. - EXPECT_FALSE(called1); - EXPECT_FALSE(called2); - - bool called3 = false; - request = CopyOutputRequest::CreateRequest( - base::Bind(&CopyRequestTestCallback, &called3)); - request->set_source(source1); - - factory_.RequestCopyOfSurface(surface_id_, request.Pass()); - // Two callbacks are from source1, so the first should be called. - EXPECT_TRUE(called1); - EXPECT_FALSE(called2); - EXPECT_FALSE(called3); - - factory_.Destroy(surface_id_); - surface_id_ = SurfaceId(); - EXPECT_TRUE(called1); - EXPECT_TRUE(called2); - EXPECT_TRUE(called3); -} - } // namespace } // namespace cc diff --git a/content/browser/compositor/delegated_frame_host.cc b/content/browser/compositor/delegated_frame_host.cc index ca8a0d87..abc001e 100644 --- a/content/browser/compositor/delegated_frame_host.cc +++ b/content/browser/compositor/delegated_frame_host.cc @@ -254,7 +254,7 @@ void DelegatedFrameHost::CheckResizeLock() { resize_lock_->UnlockCompositor(); } -void DelegatedFrameHost::AttemptFrameSubscriberCapture( +void DelegatedFrameHost::DidReceiveFrameFromRenderer( const gfx::Rect& damage_rect) { if (!frame_subscriber() || !CanCopyToVideoFrame()) return; @@ -298,25 +298,14 @@ void DelegatedFrameHost::AttemptFrameSubscriberCapture( // screenshots) since those copy requests do not specify |frame_subscriber()| // as a source. request->set_source(frame_subscriber()); + request->set_area(gfx::Rect(current_frame_size_in_dip_)); if (subscriber_texture.get()) { request->SetTextureMailbox( cc::TextureMailbox(subscriber_texture->mailbox(), subscriber_texture->target(), subscriber_texture->sync_point())); } - - if (surface_factory_.get()) { - // To avoid unnecessary composites, go directly to the Surface rather than - // through RequestCopyOfOutput (which goes through the browser - // compositor). - if (!request_copy_of_output_callback_for_testing_.is_null()) - request_copy_of_output_callback_for_testing_.Run(request.Pass()); - else - surface_factory_->RequestCopyOfSurface(surface_id_, request.Pass()); - } else { - request->set_area(gfx::Rect(current_frame_size_in_dip_)); - RequestCopyOfOutput(request.Pass()); - } + RequestCopyOfOutput(request.Pass()); } void DelegatedFrameHost::SwapDelegatedFrame( @@ -486,10 +475,7 @@ void DelegatedFrameHost::SwapDelegatedFrame( } else { AddOnCommitCallbackAndDisableLocks(base::Closure()); } - // With Surfaces, the notification that the surface will be drawn notifies - // the frame subscriber. - if (!use_surfaces_) - AttemptFrameSubscriberCapture(damage_rect); + DidReceiveFrameFromRenderer(damage_rect); if (frame_provider_.get() || !surface_id_.is_null()) delegated_frame_evictor_->SwappedFrame( client_->DelegatedFrameHostIsVisible()); @@ -550,13 +536,6 @@ void DelegatedFrameHost::ReturnResources( SendReturnedDelegatedResources(last_output_surface_id_); } -void DelegatedFrameHost::WillDrawSurface(cc::SurfaceId id, - const gfx::Rect& damage_rect) { - if (id != surface_id_) - return; - AttemptFrameSubscriberCapture(damage_rect); -} - void DelegatedFrameHost::EvictDelegatedFrame() { client_->DelegatedFrameHostGetLayer()->SetShowSolidColorContent(); frame_provider_ = NULL; diff --git a/content/browser/compositor/delegated_frame_host.h b/content/browser/compositor/delegated_frame_host.h index c9662cb..aa3ce5b 100644 --- a/content/browser/compositor/delegated_frame_host.h +++ b/content/browser/compositor/delegated_frame_host.h @@ -116,7 +116,6 @@ class CONTENT_EXPORT DelegatedFrameHost // cc::SurfaceFactoryClient implementation. void ReturnResources(const cc::ReturnedResourceArray& resources) override; - void WillDrawSurface(cc::SurfaceId id, const gfx::Rect& damage_rect) override; bool CanCopyToBitmap() const; @@ -247,7 +246,7 @@ class CONTENT_EXPORT DelegatedFrameHost // Called to consult the current |frame_subscriber_|, to determine and maybe // initiate a copy-into-video-frame request. - void AttemptFrameSubscriberCapture(const gfx::Rect& damage_rect); + void DidReceiveFrameFromRenderer(const gfx::Rect& damage_rect); DelegatedFrameHostClient* const client_; ui::Compositor* compositor_; diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc index 9145cc0..0b09f0f 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc @@ -21,7 +21,6 @@ #include "content/browser/compositor/resize_lock.h" #include "content/browser/compositor/test/no_transport_image_transport_factory.h" #include "content/browser/frame_host/render_widget_host_view_guest.h" -#include "content/browser/gpu/compositor_util.h" #include "content/browser/renderer_host/input/input_router.h" #include "content/browser/renderer_host/input/web_input_event_util.h" #include "content/browser/renderer_host/overscroll_controller.h" @@ -193,14 +192,12 @@ class TestWindowObserver : public aura::WindowObserver { class FakeFrameSubscriber : public RenderWidgetHostViewFrameSubscriber { public: FakeFrameSubscriber(gfx::Size size, base::Callback<void(bool)> callback) - : size_(size), callback_(callback), should_capture_(true) {} + : size_(size), callback_(callback) {} bool ShouldCaptureFrame(const gfx::Rect& damage_rect, base::TimeTicks present_time, scoped_refptr<media::VideoFrame>* storage, DeliverFrameCallback* callback) override { - if (!should_capture_) - return false; last_present_time_ = present_time; *storage = media::VideoFrame::CreateFrame(media::PIXEL_FORMAT_YV12, size_, gfx::Rect(size_), size_, @@ -211,10 +208,6 @@ class FakeFrameSubscriber : public RenderWidgetHostViewFrameSubscriber { base::TimeTicks last_present_time() const { return last_present_time_; } - void set_should_capture(bool should_capture) { - should_capture_ = should_capture; - } - static void CallbackMethod(base::Callback<void(bool)> callback, base::TimeTicks present_time, bool success) { @@ -225,7 +218,6 @@ class FakeFrameSubscriber : public RenderWidgetHostViewFrameSubscriber { gfx::Size size_; base::Callback<void(bool)> callback_; base::TimeTicks last_present_time_; - bool should_capture_; }; class FakeWindowEventDispatcher : public aura::WindowEventDispatcher { @@ -2244,10 +2236,7 @@ class RenderWidgetHostViewAuraCopyRequestTest void RunLoopUntilCallback() { base::RunLoop run_loop; quit_closure_ = run_loop.QuitClosure(); - // Temporarily ignore real draw requests. - frame_subscriber_->set_should_capture(false); run_loop.Run(); - frame_subscriber_->set_should_capture(true); } void InitializeView() { @@ -2279,10 +2268,6 @@ class RenderWidgetHostViewAuraCopyRequestTest void OnSwapCompositorFrame() { view_->OnSwapCompositorFrame( 1, MakeDelegatedFrame(1.f, view_rect_.size(), view_rect_)); - cc::SurfaceId surface_id = - view_->GetDelegatedFrameHost()->SurfaceIdForTesting(); - if (!surface_id.is_null()) - view_->GetDelegatedFrameHost()->WillDrawSurface(surface_id, view_rect_); ASSERT_TRUE(view_->last_copy_request_); } |