• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/ui/views/tab_contents/tab_contents_container.h"
6 
7 #include "chrome/browser/ui/view_ids.h"
8 #include "chrome/browser/ui/views/tab_contents/native_tab_contents_container.h"
9 #include "content/browser/renderer_host/render_view_host.h"
10 #include "content/browser/renderer_host/render_widget_host_view.h"
11 #include "content/browser/tab_contents/interstitial_page.h"
12 #include "content/browser/tab_contents/tab_contents.h"
13 #include "content/common/notification_details.h"
14 #include "content/common/notification_source.h"
15 #include "ui/base/accessibility/accessible_view_state.h"
16 
17 
18 ////////////////////////////////////////////////////////////////////////////////
19 // TabContentsContainer, public:
20 
~TabContentsContainer()21 TabContentsContainer::~TabContentsContainer() {
22   if (tab_contents_)
23     RemoveObservers();
24 }
25 
26 ////////////////////////////////////////////////////////////////////////////////
27 // TabContentsContainer, NotificationObserver implementation:
28 
Observe(NotificationType type,const NotificationSource & source,const NotificationDetails & details)29 void TabContentsContainer::Observe(NotificationType type,
30                                    const NotificationSource& source,
31                                    const NotificationDetails& details) {
32   if (type == NotificationType::RENDER_VIEW_HOST_CHANGED) {
33     RenderViewHostSwitchedDetails* switched_details =
34         Details<RenderViewHostSwitchedDetails>(details).ptr();
35     RenderViewHostChanged(switched_details->old_host,
36                           switched_details->new_host);
37   } else if (type == NotificationType::TAB_CONTENTS_DESTROYED) {
38     TabContentsDestroyed(Source<TabContents>(source).ptr());
39   } else {
40     NOTREACHED();
41   }
42 }
43 
44 ////////////////////////////////////////////////////////////////////////////////
45 // TabContentsContainer, View overrides:
46 
GetAccessibleState(ui::AccessibleViewState * state)47 void TabContentsContainer::GetAccessibleState(ui::AccessibleViewState* state) {
48   state->role = ui::AccessibilityTypes::ROLE_WINDOW;
49 }
50 
51 ////////////////////////////////////////////////////////////////////////////////
52 // TabContentsContainer, private:
53 
AddObservers()54 void TabContentsContainer::AddObservers() {
55   // TabContents can change their RenderViewHost and hence the HWND that is
56   // shown and getting focused.  We need to keep track of that so we install
57   // the focus subclass on the shown HWND so we intercept focus change events.
58   registrar_.Add(this,
59                  NotificationType::RENDER_VIEW_HOST_CHANGED,
60                  Source<NavigationController>(&tab_contents_->controller()));
61 
62   registrar_.Add(this,
63                  NotificationType::TAB_CONTENTS_DESTROYED,
64                  Source<TabContents>(tab_contents_));
65 }
66 
RemoveObservers()67 void TabContentsContainer::RemoveObservers() {
68   registrar_.RemoveAll();
69 }
70 
TabContentsDestroyed(TabContents * contents)71 void TabContentsContainer::TabContentsDestroyed(TabContents* contents) {
72   // Sometimes, a TabContents is destroyed before we know about it. This allows
73   // us to clean up our state in case this happens.
74   DCHECK(contents == tab_contents_);
75   ChangeTabContents(NULL);
76 }
77 
RenderWidgetHostViewChanged(RenderWidgetHostView * new_view)78 void TabContentsContainer::RenderWidgetHostViewChanged(
79     RenderWidgetHostView* new_view) {
80   if (new_view)
81     new_view->set_reserved_contents_rect(cached_reserved_rect_);
82 }
83