Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(297)

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_aura.cc

Issue 43193002: Aura/ÜC: Drop frames on background tabs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add test, properly extract RendererFrameManager Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/callback_helpers.h" 9 #include "base/callback_helpers.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 } 542 }
543 private: 543 private:
544 RenderWidgetHostViewAura* view_; 544 RenderWidgetHostViewAura* view_;
545 aura::Window* top_level_; 545 aura::Window* top_level_;
546 546
547 DISALLOW_COPY_AND_ASSIGN(TransientWindowObserver); 547 DISALLOW_COPY_AND_ASSIGN(TransientWindowObserver);
548 }; 548 };
549 549
550 #endif 550 #endif
551 551
552 RenderWidgetHostViewAura::DelegatedFrameEvictionObserver::
553 DelegatedFrameEvictionObserver(RenderWidgetHostViewAura* view)
554 : view_(view), has_frame_(false) {}
555
556 RenderWidgetHostViewAura::DelegatedFrameEvictionObserver::
557 ~DelegatedFrameEvictionObserver() {
558 DiscardedFrame();
559 }
560
561 void RenderWidgetHostViewAura::DelegatedFrameEvictionObserver::SwappedFrame(
562 bool visible) {
563 has_frame_ = true;
564 RendererFrameManager::GetInstance()->AddFrame(this, visible);
565 }
566
567 void
568 RenderWidgetHostViewAura::DelegatedFrameEvictionObserver::DiscardedFrame() {
569 RendererFrameManager::GetInstance()->RemoveFrame(this);
570 has_frame_ = false;
571 }
572
573 void RenderWidgetHostViewAura::DelegatedFrameEvictionObserver::SetVisible(
574 bool visible) {
575 if (has_frame_)
576 RendererFrameManager::GetInstance()->SetFrameVisibility(this, visible);
577 }
578
579 void
580 RenderWidgetHostViewAura::DelegatedFrameEvictionObserver::EvictCurrentFrame() {
581 view_->EvictDelegatedFrame();
582 }
583
552 //////////////////////////////////////////////////////////////////////////////// 584 ////////////////////////////////////////////////////////////////////////////////
553 // RenderWidgetHostViewAura, public: 585 // RenderWidgetHostViewAura, public:
554 586
555 RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host) 587 RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host)
556 : host_(RenderWidgetHostImpl::From(host)), 588 : host_(RenderWidgetHostImpl::From(host)),
557 window_(new aura::Window(this)), 589 window_(new aura::Window(this)),
558 in_shutdown_(false), 590 in_shutdown_(false),
559 is_fullscreen_(false), 591 is_fullscreen_(false),
560 popup_parent_host_view_(NULL), 592 popup_parent_host_view_(NULL),
561 popup_child_host_view_(NULL), 593 popup_child_host_view_(NULL),
562 is_loading_(false), 594 is_loading_(false),
563 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), 595 text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
564 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), 596 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT),
565 can_compose_inline_(true), 597 can_compose_inline_(true),
566 has_composition_text_(false), 598 has_composition_text_(false),
567 last_output_surface_id_(0), 599 last_output_surface_id_(0),
568 pending_delegated_ack_count_(0), 600 pending_delegated_ack_count_(0),
569 skipped_frames_(false), 601 skipped_frames_(false),
570 last_swapped_surface_scale_factor_(1.f), 602 last_swapped_surface_scale_factor_(1.f),
571 paint_canvas_(NULL), 603 paint_canvas_(NULL),
572 synthetic_move_sent_(false), 604 synthetic_move_sent_(false),
573 accelerated_compositing_state_changed_(false), 605 accelerated_compositing_state_changed_(false),
574 can_lock_compositor_(YES), 606 can_lock_compositor_(YES),
575 cursor_visibility_state_in_renderer_(UNKNOWN), 607 cursor_visibility_state_in_renderer_(UNKNOWN),
576 paint_observer_(NULL), 608 paint_observer_(NULL),
577 touch_editing_client_(NULL), 609 touch_editing_client_(NULL),
610 delegated_frame_eviction_observer_(this),
578 weak_ptr_factory_(this) { 611 weak_ptr_factory_(this) {
579 host_->SetView(this); 612 host_->SetView(this);
580 window_observer_.reset(new WindowObserver(this)); 613 window_observer_.reset(new WindowObserver(this));
581 aura::client::SetTooltipText(window_, &tooltip_); 614 aura::client::SetTooltipText(window_, &tooltip_);
582 aura::client::SetActivationDelegate(window_, this); 615 aura::client::SetActivationDelegate(window_, this);
583 aura::client::SetActivationChangeObserver(window_, this); 616 aura::client::SetActivationChangeObserver(window_, this);
584 aura::client::SetFocusChangeObserver(window_, this); 617 aura::client::SetFocusChangeObserver(window_, this);
585 gfx::Screen::GetScreenFor(window_)->AddObserver(this); 618 gfx::Screen::GetScreenFor(window_)->AddObserver(this);
586 #if defined(OS_WIN) 619 #if defined(OS_WIN)
587 transient_observer_.reset(new TransientWindowObserver(this)); 620 transient_observer_.reset(new TransientWindowObserver(this));
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 RenderWidgetHost* RenderWidgetHostViewAura::GetRenderWidgetHost() const { 699 RenderWidgetHost* RenderWidgetHostViewAura::GetRenderWidgetHost() const {
667 return host_; 700 return host_;
668 } 701 }
669 702
670 void RenderWidgetHostViewAura::WasShown() { 703 void RenderWidgetHostViewAura::WasShown() {
671 DCHECK(host_); 704 DCHECK(host_);
672 if (!host_->is_hidden()) 705 if (!host_->is_hidden())
673 return; 706 return;
674 host_->WasShown(); 707 host_->WasShown();
675 software_frame_manager_->SetVisibility(true); 708 software_frame_manager_->SetVisibility(true);
709 delegated_frame_eviction_observer_.SetVisible(true);
676 710
677 aura::Window* root = window_->GetRootWindow(); 711 aura::Window* root = window_->GetRootWindow();
678 if (root) { 712 if (root) {
679 aura::client::CursorClient* cursor_client = 713 aura::client::CursorClient* cursor_client =
680 aura::client::GetCursorClient(root); 714 aura::client::GetCursorClient(root);
681 if (cursor_client) 715 if (cursor_client)
682 NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible()); 716 NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible());
683 } 717 }
684 718
685 if (!current_surface_.get() && host_->is_accelerated_compositing_active() && 719 if (!current_surface_.get() && host_->is_accelerated_compositing_active() &&
686 !released_front_lock_.get()) { 720 !released_front_lock_.get()) {
687 ui::Compositor* compositor = GetCompositor(); 721 ui::Compositor* compositor = GetCompositor();
688 if (compositor) 722 if (compositor)
689 released_front_lock_ = compositor->GetCompositorLock(); 723 released_front_lock_ = compositor->GetCompositorLock();
690 } 724 }
691 725
692 #if defined(OS_WIN) 726 #if defined(OS_WIN)
693 LPARAM lparam = reinterpret_cast<LPARAM>(this); 727 LPARAM lparam = reinterpret_cast<LPARAM>(this);
694 EnumChildWindows(ui::GetHiddenWindow(), ShowWindowsCallback, lparam); 728 EnumChildWindows(ui::GetHiddenWindow(), ShowWindowsCallback, lparam);
695 transient_observer_->SendPluginCutoutRects(); 729 transient_observer_->SendPluginCutoutRects();
696 #endif 730 #endif
697 } 731 }
698 732
699 void RenderWidgetHostViewAura::WasHidden() { 733 void RenderWidgetHostViewAura::WasHidden() {
700 if (!host_ || host_->is_hidden()) 734 if (!host_ || host_->is_hidden())
701 return; 735 return;
702 host_->WasHidden(); 736 host_->WasHidden();
703 software_frame_manager_->SetVisibility(false); 737 software_frame_manager_->SetVisibility(false);
738 delegated_frame_eviction_observer_.SetVisible(false);
704 released_front_lock_ = NULL; 739 released_front_lock_ = NULL;
705 740
706 #if defined(OS_WIN) 741 #if defined(OS_WIN)
707 aura::WindowEventDispatcher* dispatcher = window_->GetDispatcher(); 742 aura::WindowEventDispatcher* dispatcher = window_->GetDispatcher();
708 if (dispatcher) { 743 if (dispatcher) {
709 HWND parent = dispatcher->GetAcceleratedWidget(); 744 HWND parent = dispatcher->GetAcceleratedWidget();
710 LPARAM lparam = reinterpret_cast<LPARAM>(this); 745 LPARAM lparam = reinterpret_cast<LPARAM>(this);
711 746
712 EnumChildWindows(parent, HideWindowsCallback, lparam); 747 EnumChildWindows(parent, HideWindowsCallback, lparam);
713 } 748 }
(...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after
1436 if (output_surface_id != last_output_surface_id_) { 1471 if (output_surface_id != last_output_surface_id_) {
1437 // Resource ids are scoped by the output surface. 1472 // Resource ids are scoped by the output surface.
1438 // If the originating output surface doesn't match the last one, it 1473 // If the originating output surface doesn't match the last one, it
1439 // indicates the renderer's output surface may have been recreated, in which 1474 // indicates the renderer's output surface may have been recreated, in which
1440 // case we should recreate the DelegatedRendererLayer, to avoid matching 1475 // case we should recreate the DelegatedRendererLayer, to avoid matching
1441 // resources from the old one with resources from the new one which would 1476 // resources from the old one with resources from the new one which would
1442 // have the same id. Changing the layer to showing painted content destroys 1477 // have the same id. Changing the layer to showing painted content destroys
1443 // the DelegatedRendererLayer. 1478 // the DelegatedRendererLayer.
1444 window_->layer()->SetShowPaintedContent(); 1479 window_->layer()->SetShowPaintedContent();
1445 frame_provider_ = NULL; 1480 frame_provider_ = NULL;
1481 delegated_frame_eviction_observer_.DiscardedFrame();
1446 1482
1447 // Drop the cc::DelegatedFrameResourceCollection so that we will not return 1483 // Drop the cc::DelegatedFrameResourceCollection so that we will not return
1448 // any resources from the old output surface with the new output surface id. 1484 // any resources from the old output surface with the new output surface id.
1449 if (resource_collection_.get()) { 1485 if (resource_collection_.get()) {
1450 resource_collection_->SetClient(NULL); 1486 resource_collection_->SetClient(NULL);
1451 1487
1452 if (resource_collection_->LoseAllResources()) 1488 if (resource_collection_->LoseAllResources())
1453 SendReturnedDelegatedResources(last_output_surface_id_); 1489 SendReturnedDelegatedResources(last_output_surface_id_);
1454 1490
1455 resource_collection_ = NULL; 1491 resource_collection_ = NULL;
1456 } 1492 }
1457 last_output_surface_id_ = output_surface_id; 1493 last_output_surface_id_ = output_surface_id;
1458 } 1494 }
1459 if (frame_size.IsEmpty()) { 1495 if (frame_size.IsEmpty()) {
1460 DCHECK_EQ(0u, frame_data->resource_list.size()); 1496 DCHECK_EQ(0u, frame_data->resource_list.size());
1461 window_->layer()->SetShowPaintedContent(); 1497 window_->layer()->SetShowPaintedContent();
danakj 2013/10/28 21:39:21 Should this just call EvictDelegatedFrame() rather
piman 2013/10/28 22:08:38 Done, and above as well.
1462 frame_provider_ = NULL; 1498 frame_provider_ = NULL;
1499 delegated_frame_eviction_observer_.DiscardedFrame();
1463 } else { 1500 } else {
1464 if (!resource_collection_) { 1501 if (!resource_collection_) {
1465 resource_collection_ = new cc::DelegatedFrameResourceCollection; 1502 resource_collection_ = new cc::DelegatedFrameResourceCollection;
1466 resource_collection_->SetClient(this); 1503 resource_collection_->SetClient(this);
1467 } 1504 }
1468 if (!frame_provider_.get() || frame_size != frame_provider_->frame_size()) { 1505 if (!frame_provider_.get() || frame_size != frame_provider_->frame_size()) {
1469 frame_provider_ = new cc::DelegatedFrameProvider( 1506 frame_provider_ = new cc::DelegatedFrameProvider(
1470 resource_collection_.get(), frame_data.Pass()); 1507 resource_collection_.get(), frame_data.Pass());
1471 window_->layer()->SetShowDelegatedContent(frame_provider_.get(), 1508 window_->layer()->SetShowDelegatedContent(frame_provider_.get(),
1472 frame_size_in_dip); 1509 frame_size_in_dip);
(...skipping 15 matching lines...) Expand all
1488 if (!compositor) { 1525 if (!compositor) {
1489 SendDelegatedFrameAck(output_surface_id); 1526 SendDelegatedFrameAck(output_surface_id);
1490 } else { 1527 } else {
1491 compositor->SetLatencyInfo(latency_info); 1528 compositor->SetLatencyInfo(latency_info);
1492 AddOnCommitCallbackAndDisableLocks( 1529 AddOnCommitCallbackAndDisableLocks(
1493 base::Bind(&RenderWidgetHostViewAura::SendDelegatedFrameAck, 1530 base::Bind(&RenderWidgetHostViewAura::SendDelegatedFrameAck,
1494 AsWeakPtr(), 1531 AsWeakPtr(),
1495 output_surface_id)); 1532 output_surface_id));
1496 } 1533 }
1497 DidReceiveFrameFromRenderer(); 1534 DidReceiveFrameFromRenderer();
1535 if (frame_provider_.get())
1536 delegated_frame_eviction_observer_.SwappedFrame(!host_->is_hidden());
1537 // Note: the frame may have been evicted immediately.
1498 } 1538 }
1499 1539
1500 void RenderWidgetHostViewAura::SendDelegatedFrameAck(uint32 output_surface_id) { 1540 void RenderWidgetHostViewAura::SendDelegatedFrameAck(uint32 output_surface_id) {
1501 cc::CompositorFrameAck ack; 1541 cc::CompositorFrameAck ack;
1502 if (resource_collection_) 1542 if (resource_collection_)
1503 resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources); 1543 resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources);
1504 RenderWidgetHostImpl::SendSwapCompositorFrameAck(host_->GetRoutingID(), 1544 RenderWidgetHostImpl::SendSwapCompositorFrameAck(host_->GetRoutingID(),
1505 output_surface_id, 1545 output_surface_id,
1506 host_->GetProcess()->GetID(), 1546 host_->GetProcess()->GetID(),
1507 ack); 1547 ack);
(...skipping 14 matching lines...) Expand all
1522 if (resource_collection_) 1562 if (resource_collection_)
1523 resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources); 1563 resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources);
1524 DCHECK(!ack.resources.empty()); 1564 DCHECK(!ack.resources.empty());
1525 RenderWidgetHostImpl::SendReclaimCompositorResources( 1565 RenderWidgetHostImpl::SendReclaimCompositorResources(
1526 host_->GetRoutingID(), 1566 host_->GetRoutingID(),
1527 output_surface_id, 1567 output_surface_id,
1528 host_->GetProcess()->GetID(), 1568 host_->GetProcess()->GetID(),
1529 ack); 1569 ack);
1530 } 1570 }
1531 1571
1572 void RenderWidgetHostViewAura::EvictDelegatedFrame() {
1573 DCHECK(frame_provider_.get());
1574 window_->layer()->SetShowPaintedContent();
1575 frame_provider_ = NULL;
1576 delegated_frame_eviction_observer_.DiscardedFrame();
1577 }
1578
1532 void RenderWidgetHostViewAura::SwapSoftwareFrame( 1579 void RenderWidgetHostViewAura::SwapSoftwareFrame(
1533 uint32 output_surface_id, 1580 uint32 output_surface_id,
1534 scoped_ptr<cc::SoftwareFrameData> frame_data, 1581 scoped_ptr<cc::SoftwareFrameData> frame_data,
1535 float frame_device_scale_factor, 1582 float frame_device_scale_factor,
1536 const ui::LatencyInfo& latency_info) { 1583 const ui::LatencyInfo& latency_info) {
1537 const gfx::Size& frame_size = frame_data->size; 1584 const gfx::Size& frame_size = frame_data->size;
1538 const gfx::Rect& damage_rect = frame_data->damage_rect; 1585 const gfx::Rect& damage_rect = frame_data->damage_rect;
1539 gfx::Size frame_size_in_dip = 1586 gfx::Size frame_size_in_dip =
1540 ConvertSizeToDIP(frame_device_scale_factor, frame_size); 1587 ConvertSizeToDIP(frame_device_scale_factor, frame_size);
1541 if (ShouldSkipFrame(frame_size_in_dip)) { 1588 if (ShouldSkipFrame(frame_size_in_dip)) {
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
1780 } 1827 }
1781 1828
1782 void RenderWidgetHostViewAura::AcceleratedSurfaceRelease() { 1829 void RenderWidgetHostViewAura::AcceleratedSurfaceRelease() {
1783 // This really tells us to release the frontbuffer. 1830 // This really tells us to release the frontbuffer.
1784 if (current_surface_.get()) { 1831 if (current_surface_.get()) {
1785 ui::Compositor* compositor = GetCompositor(); 1832 ui::Compositor* compositor = GetCompositor();
1786 if (compositor) { 1833 if (compositor) {
1787 // We need to wait for a commit to clear to guarantee that all we 1834 // We need to wait for a commit to clear to guarantee that all we
1788 // will not issue any more GL referencing the previous surface. 1835 // will not issue any more GL referencing the previous surface.
1789 AddOnCommitCallbackAndDisableLocks( 1836 AddOnCommitCallbackAndDisableLocks(
1790 base::Bind(&RenderWidgetHostViewAura:: 1837 base::Bind(&RenderWidgetHostViewAura::SetSurfaceNotInUseByCompositor,
1791 SetSurfaceNotInUseByCompositor,
1792 AsWeakPtr(), 1838 AsWeakPtr(),
1793 current_surface_)); // Hold a ref so the texture will not 1839 current_surface_)); // Hold a ref so the texture will not
1794 // get deleted until after commit. 1840 // get deleted until after commit.
1795 } 1841 }
1796 current_surface_ = NULL; 1842 current_surface_ = NULL;
1797 UpdateExternalTexture(); 1843 UpdateExternalTexture();
1798 } 1844 }
1799 } 1845 }
1800 1846
1801 bool RenderWidgetHostViewAura::HasAcceleratedSurface( 1847 bool RenderWidgetHostViewAura::HasAcceleratedSurface(
(...skipping 1602 matching lines...) Expand 10 before | Expand all | Expand 10 after
3404 RenderWidgetHost* widget) { 3450 RenderWidgetHost* widget) {
3405 return new RenderWidgetHostViewAura(widget); 3451 return new RenderWidgetHostViewAura(widget);
3406 } 3452 }
3407 3453
3408 // static 3454 // static
3409 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) { 3455 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) {
3410 GetScreenInfoForWindow(results, NULL); 3456 GetScreenInfoForWindow(results, NULL);
3411 } 3457 }
3412 3458
3413 } // namespace content 3459 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698