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 3292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3303 public: | 3303 public: |
3304 void OnAddObserver(cc::BeginFrameObserver* obs) override { | 3304 void OnAddObserver(cc::BeginFrameObserver* obs) override { |
3305 last_observer_ = obs; | 3305 last_observer_ = obs; |
3306 } | 3306 } |
3307 void OnRemoveObserver(cc::BeginFrameObserver* obs) override {} | 3307 void OnRemoveObserver(cc::BeginFrameObserver* obs) override {} |
3308 | 3308 |
3309 cc::BeginFrameObserver* last_observer_ = nullptr; | 3309 cc::BeginFrameObserver* last_observer_ = nullptr; |
3310 }; | 3310 }; |
3311 } // namespace | 3311 } // namespace |
3312 | 3312 |
3313 // Tests that BeginFrameAcks are forwarded correctly from the | 3313 // TODO(eseckler): Add back tests for BeginFrameAck forwarding through |
3314 // SwapCompositorFrame and OnDidNotProduceFrame IPCs through DelegatedFrameHost | 3314 // RenderWidgetHostViewAura and CompositorFrameSinkSupport when we add plumbing |
3315 // and its CompositorFrameSinkSupport. | 3315 // of BeginFrameAcks through SurfaceObservers. |
3316 TEST_F(RenderWidgetHostViewAuraTest, ForwardsBeginFrameAcks) { | |
3317 gfx::Rect view_rect(100, 100); | |
3318 gfx::Size frame_size = view_rect.size(); | |
3319 cc::LocalSurfaceId local_surface_id = kArbitraryLocalSurfaceId; | |
3320 | |
3321 view_->InitAsChild(nullptr); | |
3322 aura::client::ParentWindowWithContext( | |
3323 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), | |
3324 gfx::Rect()); | |
3325 view_->SetSize(view_rect.size()); | |
3326 | |
3327 // Replace BeginFrameSource so that we can observe acknowledgments. Since the | |
3328 // DelegatedFrameHost doesn't directly observe our BeginFrameSource, | |
3329 // |observer_tracker| grabs a pointer to the observer (the | |
3330 // DelegatedFrameHost's CompositorFrameSinkSupport). | |
3331 LastObserverTracker observer_tracker; | |
3332 cc::FakeExternalBeginFrameSource source(0.f, false); | |
3333 uint32_t source_id = source.source_id(); | |
3334 source.SetClient(&observer_tracker); | |
3335 cc::FrameSinkId frame_sink_id = | |
3336 view_->GetDelegatedFrameHost()->GetFrameSinkId(); | |
3337 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | |
3338 cc::SurfaceManager* surface_manager = | |
3339 factory->GetContextFactoryPrivate()->GetSurfaceManager(); | |
3340 surface_manager->RegisterBeginFrameSource(&source, frame_sink_id); | |
3341 view_->SetNeedsBeginFrames(true); | |
3342 EXPECT_TRUE(observer_tracker.last_observer_); | |
3343 | |
3344 { | |
3345 cc::BeginFrameArgs args = | |
3346 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 5u); | |
3347 source.TestOnBeginFrame(args); | |
3348 | |
3349 // Ack from CompositorFrame is forwarded. | |
3350 cc::BeginFrameAck ack(source_id, 5, 4, true); | |
3351 cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect); | |
3352 frame.metadata.begin_frame_ack = ack; | |
3353 view_->SubmitCompositorFrame(local_surface_id, std::move(frame)); | |
3354 view_->RunOnCompositingDidCommit(); | |
3355 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | |
3356 } | |
3357 | |
3358 { | |
3359 cc::BeginFrameArgs args = | |
3360 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 6u); | |
3361 source.TestOnBeginFrame(args); | |
3362 | |
3363 // Explicit ack through OnDidNotProduceFrame is forwarded. | |
3364 cc::BeginFrameAck ack(source_id, 6, 4, false); | |
3365 view_->OnDidNotProduceFrame(ack); | |
3366 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | |
3367 } | |
3368 | |
3369 // Lock the compositor. Now we should drop frames and, thus, | |
3370 // latest_confirmed_sequence_number should not change. | |
3371 view_rect = gfx::Rect(150, 150); | |
3372 view_->SetSize(view_rect.size()); | |
3373 | |
3374 { | |
3375 cc::BeginFrameArgs args = | |
3376 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 7u); | |
3377 source.TestOnBeginFrame(args); | |
3378 | |
3379 // Ack from CompositorFrame is forwarded with old | |
3380 // latest_confirmed_sequence_number and without damage. | |
3381 cc::BeginFrameAck ack(source_id, 7, 7, true); | |
3382 gfx::Rect dropped_damage_rect(10, 20, 30, 40); | |
3383 cc::CompositorFrame frame = | |
3384 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect); | |
3385 frame.metadata.begin_frame_ack = ack; | |
3386 view_->SubmitCompositorFrame(local_surface_id, std::move(frame)); | |
3387 view_->RunOnCompositingDidCommit(); | |
3388 ack.latest_confirmed_sequence_number = 4; | |
3389 ack.has_damage = false; | |
3390 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | |
3391 } | |
3392 | |
3393 // Change source_id known to the view. This should reset the | |
3394 // latest_confirmed_sequence_number tracked by the view. | |
3395 source_id = cc::BeginFrameArgs::kManualSourceId; | |
3396 | |
3397 { | |
3398 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( | |
3399 BEGINFRAME_FROM_HERE, source_id, 10u); | |
3400 source.TestOnBeginFrame(args); | |
3401 | |
3402 // Ack from CompositorFrame is forwarded with invalid | |
3403 // latest_confirmed_sequence_number and without damage. | |
3404 cc::BeginFrameAck ack(source_id, 10, 10, true); | |
3405 gfx::Rect dropped_damage_rect(10, 20, 30, 40); | |
3406 cc::CompositorFrame frame = | |
3407 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect); | |
3408 frame.metadata.begin_frame_ack = ack; | |
3409 view_->SubmitCompositorFrame(local_surface_id, std::move(frame)); | |
3410 view_->RunOnCompositingDidCommit(); | |
3411 ack.latest_confirmed_sequence_number = | |
3412 cc::BeginFrameArgs::kInvalidFrameNumber; | |
3413 ack.has_damage = false; | |
3414 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | |
3415 } | |
3416 | |
3417 { | |
3418 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( | |
3419 BEGINFRAME_FROM_HERE, source_id, 11u); | |
3420 source.TestOnBeginFrame(args); | |
3421 | |
3422 // Explicit ack through OnDidNotProduceFrame is forwarded with invalid | |
3423 // latest_confirmed_sequence_number. | |
3424 cc::BeginFrameAck ack(source_id, 11, 11, false); | |
3425 view_->OnDidNotProduceFrame(ack); | |
3426 ack.latest_confirmed_sequence_number = | |
3427 cc::BeginFrameArgs::kInvalidFrameNumber; | |
3428 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | |
3429 } | |
3430 | |
3431 // Unlock the compositor again with a new CompositorFrame of correct size. | |
3432 frame_size = view_rect.size(); | |
3433 local_surface_id = local_surface_id_allocator_.GenerateId(); | |
3434 | |
3435 { | |
3436 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( | |
3437 BEGINFRAME_FROM_HERE, source_id, 12u); | |
3438 source.TestOnBeginFrame(args); | |
3439 | |
3440 // Ack from CompositorFrame is forwarded. | |
3441 cc::BeginFrameAck ack(source_id, 12, 12, true); | |
3442 cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect); | |
3443 frame.metadata.begin_frame_ack = ack; | |
3444 view_->SubmitCompositorFrame(local_surface_id, std::move(frame)); | |
3445 view_->RunOnCompositingDidCommit(); | |
3446 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | |
3447 } | |
3448 | |
3449 { | |
3450 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( | |
3451 BEGINFRAME_FROM_HERE, source_id, 13u); | |
3452 source.TestOnBeginFrame(args); | |
3453 | |
3454 // Explicit ack through OnDidNotProduceFrame is forwarded. | |
3455 cc::BeginFrameAck ack(source_id, 13, 13, false); | |
3456 view_->OnDidNotProduceFrame(ack); | |
3457 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | |
3458 } | |
3459 | |
3460 surface_manager->UnregisterBeginFrameSource(&source); | |
3461 } | |
3462 | 3316 |
3463 class RenderWidgetHostViewAuraCopyRequestTest | 3317 class RenderWidgetHostViewAuraCopyRequestTest |
3464 : public RenderWidgetHostViewAuraShutdownTest { | 3318 : public RenderWidgetHostViewAuraShutdownTest { |
3465 public: | 3319 public: |
3466 RenderWidgetHostViewAuraCopyRequestTest() | 3320 RenderWidgetHostViewAuraCopyRequestTest() |
3467 : callback_count_(0), | 3321 : callback_count_(0), |
3468 result_(false), | 3322 result_(false), |
3469 frame_subscriber_(nullptr), | 3323 frame_subscriber_(nullptr), |
3470 tick_clock_(nullptr), | 3324 tick_clock_(nullptr), |
3471 view_rect_(100, 100) {} | 3325 view_rect_(100, 100) {} |
(...skipping 2420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5892 // There is no composition in the beginning. | 5746 // There is no composition in the beginning. |
5893 EXPECT_FALSE(has_composition_text()); | 5747 EXPECT_FALSE(has_composition_text()); |
5894 SetHasCompositionTextToTrue(); | 5748 SetHasCompositionTextToTrue(); |
5895 view->ImeCancelComposition(); | 5749 view->ImeCancelComposition(); |
5896 // The composition must have been canceled. | 5750 // The composition must have been canceled. |
5897 EXPECT_FALSE(has_composition_text()); | 5751 EXPECT_FALSE(has_composition_text()); |
5898 } | 5752 } |
5899 } | 5753 } |
5900 | 5754 |
5901 } // namespace content | 5755 } // namespace content |
OLD | NEW |