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