1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file. 472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/tab_contents/tab_contents_container.h" 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/view_ids.h" 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/tab_contents/native_tab_contents_container.h" 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h" 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_widget_host_view.h" 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/interstitial_page.h" 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h" 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Some of this class is implemented in tab_contents_container.cc, where 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// the implementation doesn't vary between a pure views approach and a 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// native view host approach. See the header file for details. 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TabContentsContainer, public: 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTabContentsContainer::TabContentsContainer() 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : native_container_(NULL), 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_(NULL) { 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetID(VIEW_ID_TAB_CONTAINER); 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TabContentsContainer::SetReservedContentsRect( 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const gfx::Rect& reserved_rect) { 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cached_reserved_rect_ = reserved_rect; 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (tab_contents_ && tab_contents_->GetRenderWidgetHostView()) { 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_->GetRenderWidgetHostView()->set_reserved_contents_rect( 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen reserved_rect); 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TabContentsContainer::ChangeTabContents(TabContents* contents) { 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (tab_contents_) { 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_container_->DetachContents(tab_contents_); 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_->WasHidden(); 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RemoveObservers(); 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_ = contents; 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // When detaching the last tab of the browser ChangeTabContents is invoked 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // with NULL. Don't attempt to do anything in that case. 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (tab_contents_) { 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RenderWidgetHostViewChanged(tab_contents_->GetRenderWidgetHostView()); 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_container_->AttachContents(tab_contents_); 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AddObservers(); 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TabContentsContainer::TabContentsFocused(TabContents* tab_contents) { 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_container_->TabContentsFocused(tab_contents); 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TabContentsContainer::SetFastResize(bool fast_resize) { 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_container_->SetFastResize(fast_resize); 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TabContentsContainer, View overrides: 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TabContentsContainer::Layout() { 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (native_container_) { 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_container_->GetView()->SetBounds(0, 0, width(), height()); 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_container_->GetView()->Layout(); 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TabContentsContainer::ViewHierarchyChanged(bool is_add, 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen views::View* parent, 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen views::View* child) { 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (is_add && child == this) { 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_container_ = NativeTabContentsContainer::CreateNativeContainer(this); 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AddChildView(native_container_->GetView()); 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TabContentsContainer, private: 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TabContentsContainer::RenderViewHostChanged(RenderViewHost* old_host, 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RenderViewHost* new_host) { 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (new_host) 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RenderWidgetHostViewChanged(new_host->view()); 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_container_->RenderViewHostChanged(old_host, new_host); 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 90