Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/frame_host/render_widget_host_view_child_frame.h" | 5 #include "content/browser/frame_host/render_widget_host_view_child_frame.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 62 begin_frame_source_(nullptr), | 62 begin_frame_source_(nullptr), |
| 63 weak_factory_(this) { | 63 weak_factory_(this) { |
| 64 id_allocator_.reset(new cc::SurfaceIdAllocator()); | 64 id_allocator_.reset(new cc::SurfaceIdAllocator()); |
| 65 auto* manager = GetSurfaceManager(); | 65 auto* manager = GetSurfaceManager(); |
| 66 manager->RegisterFrameSinkId(frame_sink_id_); | 66 manager->RegisterFrameSinkId(frame_sink_id_); |
| 67 surface_factory_ = | 67 surface_factory_ = |
| 68 base::MakeUnique<cc::SurfaceFactory>(frame_sink_id_, manager, this); | 68 base::MakeUnique<cc::SurfaceFactory>(frame_sink_id_, manager, this); |
| 69 } | 69 } |
| 70 | 70 |
| 71 RenderWidgetHostViewChildFrame::~RenderWidgetHostViewChildFrame() { | 71 RenderWidgetHostViewChildFrame::~RenderWidgetHostViewChildFrame() { |
| 72 if (local_frame_id_.is_valid()) | 72 surface_factory_.reset(); |
| 73 surface_factory_->Destroy(local_frame_id_); | |
| 74 | |
| 75 if (GetSurfaceManager()) | 73 if (GetSurfaceManager()) |
| 76 GetSurfaceManager()->InvalidateFrameSinkId(frame_sink_id_); | 74 GetSurfaceManager()->InvalidateFrameSinkId(frame_sink_id_); |
| 77 } | 75 } |
| 78 | 76 |
| 79 void RenderWidgetHostViewChildFrame::Init() { | 77 void RenderWidgetHostViewChildFrame::Init() { |
| 80 RegisterFrameSinkId(); | 78 RegisterFrameSinkId(); |
| 81 host_->SetView(this); | 79 host_->SetView(this); |
| 82 GetTextInputManager(); | 80 GetTextInputManager(); |
| 83 } | 81 } |
| 84 | 82 |
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 393 ClearCompositorSurfaceIfNecessary(); | 391 ClearCompositorSurfaceIfNecessary(); |
| 394 // If the renderer changed its frame sink, reset the surface factory to | 392 // If the renderer changed its frame sink, reset the surface factory to |
| 395 // avoid returning stale resources. | 393 // avoid returning stale resources. |
| 396 if (compositor_frame_sink_id != last_compositor_frame_sink_id_) | 394 if (compositor_frame_sink_id != last_compositor_frame_sink_id_) |
| 397 surface_factory_->Reset(); | 395 surface_factory_->Reset(); |
| 398 last_compositor_frame_sink_id_ = compositor_frame_sink_id; | 396 last_compositor_frame_sink_id_ = compositor_frame_sink_id; |
| 399 current_surface_size_ = frame_size; | 397 current_surface_size_ = frame_size; |
| 400 current_surface_scale_factor_ = scale_factor; | 398 current_surface_scale_factor_ = scale_factor; |
| 401 } | 399 } |
| 402 | 400 |
| 401 bool allocated_new_local_frame_id = false; | |
| 403 if (!local_frame_id_.is_valid()) { | 402 if (!local_frame_id_.is_valid()) { |
| 404 local_frame_id_ = id_allocator_->GenerateId(); | 403 local_frame_id_ = id_allocator_->GenerateId(); |
| 405 surface_factory_->Create(local_frame_id_); | 404 allocated_new_local_frame_id = true; |
| 405 } | |
| 406 | 406 |
| 407 cc::SurfaceFactory::DrawCallback ack_callback = | |
| 408 base::Bind(&RenderWidgetHostViewChildFrame::SurfaceDrawn, AsWeakPtr(), | |
| 409 compositor_frame_sink_id); | |
| 410 ack_pending_count_++; | |
| 411 // If this value grows very large, something is going wrong. | |
| 412 DCHECK_LT(ack_pending_count_, 1000U); | |
| 413 surface_factory_->SubmitCompositorFrame(local_frame_id_, std::move(frame), | |
| 414 ack_callback); | |
| 415 | |
| 416 if (allocated_new_local_frame_id) { | |
| 407 cc::SurfaceSequence sequence = | 417 cc::SurfaceSequence sequence = |
| 408 cc::SurfaceSequence(frame_sink_id_, next_surface_sequence_++); | 418 cc::SurfaceSequence(frame_sink_id_, next_surface_sequence_++); |
| 409 // The renderer process will satisfy this dependency when it creates a | 419 // The renderer process will satisfy this dependency when it creates a |
| 410 // SurfaceLayer. | 420 // SurfaceLayer. |
| 411 cc::SurfaceManager* manager = GetSurfaceManager(); | 421 cc::SurfaceManager* manager = GetSurfaceManager(); |
| 412 manager->GetSurfaceForId(cc::SurfaceId(frame_sink_id_, local_frame_id_)) | 422 manager->GetSurfaceForId(cc::SurfaceId(frame_sink_id_, local_frame_id_)) |
| 413 ->AddDestructionDependency(sequence); | 423 ->AddDestructionDependency(sequence); |
| 414 frame_connector_->SetChildFrameSurface( | 424 frame_connector_->SetChildFrameSurface( |
| 415 cc::SurfaceId(frame_sink_id_, local_frame_id_), frame_size, | 425 cc::SurfaceId(frame_sink_id_, local_frame_id_), frame_size, |
| 416 scale_factor, sequence); | 426 scale_factor, sequence); |
| 417 } | 427 } |
| 418 | |
| 419 cc::SurfaceFactory::DrawCallback ack_callback = | |
| 420 base::Bind(&RenderWidgetHostViewChildFrame::SurfaceDrawn, AsWeakPtr(), | |
| 421 compositor_frame_sink_id); | |
| 422 ack_pending_count_++; | |
| 423 // If this value grows very large, something is going wrong. | |
| 424 DCHECK_LT(ack_pending_count_, 1000U); | |
| 425 surface_factory_->SubmitCompositorFrame(local_frame_id_, std::move(frame), | |
| 426 ack_callback); | |
| 427 | |
| 428 ProcessFrameSwappedCallbacks(); | 428 ProcessFrameSwappedCallbacks(); |
| 429 } | 429 } |
| 430 | 430 |
| 431 void RenderWidgetHostViewChildFrame::ProcessFrameSwappedCallbacks() { | 431 void RenderWidgetHostViewChildFrame::ProcessFrameSwappedCallbacks() { |
| 432 // We only use callbacks once, therefore we make a new list for registration | 432 // We only use callbacks once, therefore we make a new list for registration |
| 433 // before we start, and discard the old list entries when we are done. | 433 // before we start, and discard the old list entries when we are done. |
| 434 FrameSwappedCallbackList process_callbacks; | 434 FrameSwappedCallbackList process_callbacks; |
| 435 process_callbacks.swap(frame_swapped_callbacks_); | 435 process_callbacks.swap(frame_swapped_callbacks_); |
| 436 for (std::unique_ptr<base::Closure>& callback : process_callbacks) | 436 for (std::unique_ptr<base::Closure>& callback : process_callbacks) |
| 437 callback->Run(); | 437 callback->Run(); |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 718 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; | 718 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; |
| 719 } | 719 } |
| 720 | 720 |
| 721 BrowserAccessibilityManager* | 721 BrowserAccessibilityManager* |
| 722 RenderWidgetHostViewChildFrame::CreateBrowserAccessibilityManager( | 722 RenderWidgetHostViewChildFrame::CreateBrowserAccessibilityManager( |
| 723 BrowserAccessibilityDelegate* delegate, bool for_root_frame) { | 723 BrowserAccessibilityDelegate* delegate, bool for_root_frame) { |
| 724 return BrowserAccessibilityManager::Create( | 724 return BrowserAccessibilityManager::Create( |
| 725 BrowserAccessibilityManager::GetEmptyDocument(), delegate); | 725 BrowserAccessibilityManager::GetEmptyDocument(), delegate); |
| 726 } | 726 } |
| 727 | 727 |
| 728 void RenderWidgetHostViewChildFrame::ClearCompositorSurfaceIfNecessary() { | 728 void RenderWidgetHostViewChildFrame::ClearCompositorSurfaceIfNecessary() { |
|
jbauman
2016/11/11 18:16:47
Same problem here (in the case where the guest is
Saman Sami
2016/11/11 22:28:09
Added EvictFrame
| |
| 729 if (local_frame_id_.is_valid()) | |
| 730 surface_factory_->Destroy(local_frame_id_); | |
| 731 local_frame_id_ = cc::LocalFrameId(); | 729 local_frame_id_ = cc::LocalFrameId(); |
| 732 } | 730 } |
| 733 | 731 |
| 734 bool RenderWidgetHostViewChildFrame::IsChildFrameForTesting() const { | 732 bool RenderWidgetHostViewChildFrame::IsChildFrameForTesting() const { |
| 735 return true; | 733 return true; |
| 736 } | 734 } |
| 737 | 735 |
| 738 cc::SurfaceId RenderWidgetHostViewChildFrame::SurfaceIdForTesting() const { | 736 cc::SurfaceId RenderWidgetHostViewChildFrame::SurfaceIdForTesting() const { |
| 739 return cc::SurfaceId(frame_sink_id_, local_frame_id_); | 737 return cc::SurfaceId(frame_sink_id_, local_frame_id_); |
| 740 }; | 738 }; |
| 741 | 739 |
| 742 } // namespace content | 740 } // namespace content |
| OLD | NEW |