| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 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 "chrome/browser/ui/views/tab_contents/tab_contents_view_views.h" | 5 #include "chrome/browser/ui/views/tab_contents/tab_contents_view_views.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/time.h" | 9 #include "base/time.h" |
| 10 #include "chrome/browser/browser_shutdown.h" | |
| 11 #include "chrome/browser/ui/constrained_window.h" | 10 #include "chrome/browser/ui/constrained_window.h" |
| 12 #include "chrome/browser/ui/constrained_window_tab_helper.h" | 11 #include "chrome/browser/ui/constrained_window_tab_helper.h" |
| 13 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 12 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| 14 #include "chrome/browser/ui/views/sad_tab_view.h" | |
| 15 #include "chrome/browser/ui/views/tab_contents/native_tab_contents_view.h" | 13 #include "chrome/browser/ui/views/tab_contents/native_tab_contents_view.h" |
| 16 #include "chrome/browser/ui/views/tab_contents/render_view_context_menu_views.h" | 14 #include "chrome/browser/ui/views/tab_contents/render_view_context_menu_views.h" |
| 17 #include "content/browser/renderer_host/render_process_host.h" | 15 #include "content/browser/renderer_host/render_process_host.h" |
| 18 #include "content/browser/renderer_host/render_view_host.h" | 16 #include "content/browser/renderer_host/render_view_host.h" |
| 19 #include "content/browser/renderer_host/render_view_host_factory.h" | 17 #include "content/browser/renderer_host/render_view_host_factory.h" |
| 20 #include "content/browser/renderer_host/render_widget_host_view.h" | 18 #include "content/browser/renderer_host/render_widget_host_view.h" |
| 21 #include "content/browser/tab_contents/interstitial_page.h" | 19 #include "content/browser/tab_contents/interstitial_page.h" |
| 22 #include "content/browser/tab_contents/tab_contents.h" | 20 #include "content/browser/tab_contents/tab_contents.h" |
| 23 #include "content/browser/tab_contents/tab_contents_delegate.h" | 21 #include "content/browser/tab_contents/tab_contents_delegate.h" |
| 24 #include "ui/gfx/screen.h" | 22 #include "ui/gfx/screen.h" |
| 25 #include "views/focus/focus_manager.h" | 23 #include "views/focus/focus_manager.h" |
| 26 #include "views/focus/view_storage.h" | 24 #include "views/focus/view_storage.h" |
| 27 #include "views/widget/native_widget.h" | 25 #include "views/widget/native_widget.h" |
| 28 #include "views/widget/widget.h" | 26 #include "views/widget/widget.h" |
| 29 | 27 |
| 30 #if defined(OS_WIN) | 28 #if defined(OS_WIN) |
| 31 #include <windows.h> | 29 #include <windows.h> |
| 32 #endif | 30 #endif |
| 33 | 31 |
| 34 using WebKit::WebDragOperation; | 32 using WebKit::WebDragOperation; |
| 35 using WebKit::WebDragOperationNone; | 33 using WebKit::WebDragOperationNone; |
| 36 using WebKit::WebDragOperationsMask; | 34 using WebKit::WebDragOperationsMask; |
| 37 using WebKit::WebInputEvent; | 35 using WebKit::WebInputEvent; |
| 38 | 36 |
| 39 TabContentsViewViews::TabContentsViewViews(TabContents* tab_contents) | 37 TabContentsViewViews::TabContentsViewViews(TabContents* tab_contents) |
| 40 : tab_contents_(tab_contents), | 38 : tab_contents_(tab_contents), |
| 41 native_tab_contents_view_(NULL), | 39 native_tab_contents_view_(NULL), |
| 42 sad_tab_widget_(NULL), | |
| 43 close_tab_after_drag_ends_(false), | 40 close_tab_after_drag_ends_(false), |
| 44 focus_manager_(NULL) { | 41 focus_manager_(NULL), |
| 42 overlaid_view_(NULL) { |
| 45 last_focused_view_storage_id_ = | 43 last_focused_view_storage_id_ = |
| 46 views::ViewStorage::GetInstance()->CreateStorageID(); | 44 views::ViewStorage::GetInstance()->CreateStorageID(); |
| 47 } | 45 } |
| 48 | 46 |
| 49 TabContentsViewViews::~TabContentsViewViews() { | 47 TabContentsViewViews::~TabContentsViewViews() { |
| 50 // Makes sure to remove any stored view we may still have in the ViewStorage. | 48 // Makes sure to remove any stored view we may still have in the ViewStorage. |
| 51 // | 49 // |
| 52 // It is possible the view went away before us, so we only do this if the | 50 // It is possible the view went away before us, so we only do this if the |
| 53 // view is registered. | 51 // view is registered. |
| 54 views::ViewStorage* view_storage = views::ViewStorage::GetInstance(); | 52 views::ViewStorage* view_storage = views::ViewStorage::GetInstance(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 82 if (render_widget_host->view()) { | 80 if (render_widget_host->view()) { |
| 83 // During testing, the view will already be set up in most cases to the | 81 // During testing, the view will already be set up in most cases to the |
| 84 // test view, so we don't want to clobber it with a real one. To verify that | 82 // test view, so we don't want to clobber it with a real one. To verify that |
| 85 // this actually is happening (and somebody isn't accidentally creating the | 83 // this actually is happening (and somebody isn't accidentally creating the |
| 86 // view twice), we check for the RVH Factory, which will be set when we're | 84 // view twice), we check for the RVH Factory, which will be set when we're |
| 87 // making special ones (which go along with the special views). | 85 // making special ones (which go along with the special views). |
| 88 DCHECK(RenderViewHostFactory::has_factory()); | 86 DCHECK(RenderViewHostFactory::has_factory()); |
| 89 return render_widget_host->view(); | 87 return render_widget_host->view(); |
| 90 } | 88 } |
| 91 | 89 |
| 92 // If we were showing sad tab, remove it now. | |
| 93 if (sad_tab_widget_) { | |
| 94 sad_tab_widget_->Close(); | |
| 95 sad_tab_widget_ = NULL; | |
| 96 } | |
| 97 | |
| 98 return native_tab_contents_view_->CreateRenderWidgetHostView( | 90 return native_tab_contents_view_->CreateRenderWidgetHostView( |
| 99 render_widget_host); | 91 render_widget_host); |
| 100 } | 92 } |
| 101 | 93 |
| 102 gfx::NativeView TabContentsViewViews::GetNativeView() const { | 94 gfx::NativeView TabContentsViewViews::GetNativeView() const { |
| 103 return Widget::GetNativeView(); | 95 return Widget::GetNativeView(); |
| 104 } | 96 } |
| 105 | 97 |
| 106 gfx::NativeView TabContentsViewViews::GetContentNativeView() const { | 98 gfx::NativeView TabContentsViewViews::GetContentNativeView() const { |
| 107 RenderWidgetHostView* rwhv = tab_contents_->GetRenderWidgetHostView(); | 99 RenderWidgetHostView* rwhv = tab_contents_->GetRenderWidgetHostView(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 123 const gfx::Point& image_offset) { | 115 const gfx::Point& image_offset) { |
| 124 native_tab_contents_view_->StartDragging(drop_data, ops, image, image_offset); | 116 native_tab_contents_view_->StartDragging(drop_data, ops, image, image_offset); |
| 125 } | 117 } |
| 126 | 118 |
| 127 void TabContentsViewViews::SetPageTitle(const string16& title) { | 119 void TabContentsViewViews::SetPageTitle(const string16& title) { |
| 128 native_tab_contents_view_->SetPageTitle(title); | 120 native_tab_contents_view_->SetPageTitle(title); |
| 129 } | 121 } |
| 130 | 122 |
| 131 void TabContentsViewViews::OnTabCrashed(base::TerminationStatus status, | 123 void TabContentsViewViews::OnTabCrashed(base::TerminationStatus status, |
| 132 int /* error_code */) { | 124 int /* error_code */) { |
| 133 // Only show the sad tab if we're not in browser shutdown, so that TabContents | |
| 134 // objects that are not in a browser (e.g., HTML dialogs) and thus are | |
| 135 // visible do not flash a sad tab page. | |
| 136 if (browser_shutdown::GetShutdownType() != browser_shutdown::NOT_VALID) | |
| 137 return; | |
| 138 | |
| 139 // Note that it's possible to get this message after the window was destroyed. | |
| 140 if (GetNativeView()) { | |
| 141 SadTabView::Kind kind = | |
| 142 status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED ? | |
| 143 SadTabView::KILLED : SadTabView::CRASHED; | |
| 144 views::Widget::InitParams sad_tab_widget_params( | |
| 145 views::Widget::InitParams::TYPE_CONTROL); | |
| 146 sad_tab_widget_params.parent_widget = this; | |
| 147 sad_tab_widget_params.bounds = | |
| 148 gfx::Rect(GetClientAreaScreenBounds().size()); | |
| 149 sad_tab_widget_ = new views::Widget; | |
| 150 sad_tab_widget_->Init(sad_tab_widget_params); | |
| 151 sad_tab_widget_->SetContentsView(new SadTabView(tab_contents_, kind)); | |
| 152 } | |
| 153 } | 125 } |
| 154 | 126 |
| 155 void TabContentsViewViews::SizeContents(const gfx::Size& size) { | 127 void TabContentsViewViews::SizeContents(const gfx::Size& size) { |
| 156 gfx::Rect bounds; | 128 gfx::Rect bounds; |
| 157 GetContainerBounds(&bounds); | 129 GetContainerBounds(&bounds); |
| 158 if (bounds.size() != size) { | 130 if (bounds.size() != size) { |
| 159 SetSize(size); | 131 SetSize(size); |
| 160 } else { | 132 } else { |
| 161 // Our size matches what we want but the renderers size may not match. | 133 // Our size matches what we want but the renderers size may not match. |
| 162 // Pretend we were resized so that the renderers size is updated too. | 134 // Pretend we were resized so that the renderers size is updated too. |
| 163 OnNativeTabContentsViewSized(size); | 135 OnNativeTabContentsViewSized(size); |
| 164 } | 136 } |
| 165 } | 137 } |
| 166 | 138 |
| 167 void TabContentsViewViews::RenderViewCreated(RenderViewHost* host) { | 139 void TabContentsViewViews::RenderViewCreated(RenderViewHost* host) { |
| 168 } | 140 } |
| 169 | 141 |
| 170 void TabContentsViewViews::Focus() { | 142 void TabContentsViewViews::Focus() { |
| 171 if (tab_contents_->interstitial_page()) { | 143 if (tab_contents_->interstitial_page()) { |
| 172 tab_contents_->interstitial_page()->Focus(); | 144 tab_contents_->interstitial_page()->Focus(); |
| 173 return; | 145 return; |
| 174 } | 146 } |
| 175 | 147 |
| 176 if (tab_contents_->is_crashed() && sad_tab_widget_ != NULL) { | 148 if (overlaid_view_) { |
| 177 sad_tab_widget_->GetContentsView()->RequestFocus(); | 149 overlaid_view_->GetContentsView()->RequestFocus(); |
| 178 return; | 150 return; |
| 179 } | 151 } |
| 180 | 152 |
| 181 TabContentsWrapper* wrapper = | 153 TabContentsWrapper* wrapper = |
| 182 TabContentsWrapper::GetCurrentWrapperForContents(tab_contents_); | 154 TabContentsWrapper::GetCurrentWrapperForContents(tab_contents_); |
| 183 if (wrapper) { | 155 if (wrapper) { |
| 184 // TODO(erg): TabContents used to own constrained windows, which is why | 156 // TODO(erg): TabContents used to own constrained windows, which is why |
| 185 // this is here. Eventually this should be ported to a containing view | 157 // this is here. Eventually this should be ported to a containing view |
| 186 // specializing in constrained window management. | 158 // specializing in constrained window management. |
| 187 ConstrainedWindowTabHelper* helper = | 159 ConstrainedWindowTabHelper* helper = |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 return false; | 250 return false; |
| 279 } | 251 } |
| 280 | 252 |
| 281 void TabContentsViewViews::CloseTabAfterEventTracking() { | 253 void TabContentsViewViews::CloseTabAfterEventTracking() { |
| 282 } | 254 } |
| 283 | 255 |
| 284 void TabContentsViewViews::GetViewBounds(gfx::Rect* out) const { | 256 void TabContentsViewViews::GetViewBounds(gfx::Rect* out) const { |
| 285 *out = GetWindowScreenBounds(); | 257 *out = GetWindowScreenBounds(); |
| 286 } | 258 } |
| 287 | 259 |
| 260 void TabContentsViewViews::InstallOverlayView(gfx::NativeView view) { |
| 261 DCHECK(!overlaid_view_); |
| 262 views::Widget::ReparentNativeView(view, GetNativeView()); |
| 263 overlaid_view_ = views::Widget::GetWidgetForNativeView(view); |
| 264 overlaid_view_->SetBounds(gfx::Rect(GetClientAreaScreenBounds().size())); |
| 265 } |
| 266 |
| 267 void TabContentsViewViews::RemoveOverlayView() { |
| 268 DCHECK(overlaid_view_); |
| 269 overlaid_view_->Close(); |
| 270 overlaid_view_ = NULL; |
| 271 } |
| 272 |
| 288 void TabContentsViewViews::UpdateDragCursor(WebDragOperation operation) { | 273 void TabContentsViewViews::UpdateDragCursor(WebDragOperation operation) { |
| 289 native_tab_contents_view_->SetDragCursor(operation); | 274 native_tab_contents_view_->SetDragCursor(operation); |
| 290 } | 275 } |
| 291 | 276 |
| 292 void TabContentsViewViews::GotFocus() { | 277 void TabContentsViewViews::GotFocus() { |
| 293 if (tab_contents_->delegate()) | 278 if (tab_contents_->delegate()) |
| 294 tab_contents_->delegate()->TabContentsFocused(tab_contents_); | 279 tab_contents_->delegate()->TabContentsFocused(tab_contents_); |
| 295 } | 280 } |
| 296 | 281 |
| 297 void TabContentsViewViews::TakeFocus(bool reverse) { | 282 void TabContentsViewViews::TakeFocus(bool reverse) { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 } | 363 } |
| 379 | 364 |
| 380 //////////////////////////////////////////////////////////////////////////////// | 365 //////////////////////////////////////////////////////////////////////////////// |
| 381 // TabContentsViewViews, internal::NativeTabContentsViewDelegate implementation: | 366 // TabContentsViewViews, internal::NativeTabContentsViewDelegate implementation: |
| 382 | 367 |
| 383 TabContents* TabContentsViewViews::GetTabContents() { | 368 TabContents* TabContentsViewViews::GetTabContents() { |
| 384 return tab_contents_; | 369 return tab_contents_; |
| 385 } | 370 } |
| 386 | 371 |
| 387 bool TabContentsViewViews::IsShowingSadTab() const { | 372 bool TabContentsViewViews::IsShowingSadTab() const { |
| 388 return tab_contents_->is_crashed() && sad_tab_widget_; | 373 return tab_contents_->is_crashed() && overlaid_view_; |
| 389 } | 374 } |
| 390 | 375 |
| 391 void TabContentsViewViews::OnNativeTabContentsViewShown() { | 376 void TabContentsViewViews::OnNativeTabContentsViewShown() { |
| 392 tab_contents_->ShowContents(); | 377 tab_contents_->ShowContents(); |
| 393 } | 378 } |
| 394 | 379 |
| 395 void TabContentsViewViews::OnNativeTabContentsViewHidden() { | 380 void TabContentsViewViews::OnNativeTabContentsViewHidden() { |
| 396 tab_contents_->HideContents(); | 381 tab_contents_->HideContents(); |
| 397 } | 382 } |
| 398 | 383 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 views::Widget::OnNativeWidgetVisibilityChanged(visible); | 450 views::Widget::OnNativeWidgetVisibilityChanged(visible); |
| 466 if (visible) { | 451 if (visible) { |
| 467 tab_contents_->ShowContents(); | 452 tab_contents_->ShowContents(); |
| 468 } else { | 453 } else { |
| 469 tab_contents_->HideContents(); | 454 tab_contents_->HideContents(); |
| 470 } | 455 } |
| 471 } | 456 } |
| 472 | 457 |
| 473 void TabContentsViewViews::OnNativeWidgetSizeChanged( | 458 void TabContentsViewViews::OnNativeWidgetSizeChanged( |
| 474 const gfx::Size& new_size) { | 459 const gfx::Size& new_size) { |
| 475 if (sad_tab_widget_) | 460 if (overlaid_view_) |
| 476 sad_tab_widget_->SetBounds(gfx::Rect(new_size)); | 461 overlaid_view_->SetBounds(gfx::Rect(new_size)); |
| 477 views::Widget::OnNativeWidgetSizeChanged(new_size); | 462 views::Widget::OnNativeWidgetSizeChanged(new_size); |
| 478 } | 463 } |
| OLD | NEW |