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