| 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 |