| OLD | NEW | 
|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "chrome/browser/ui/views/frame/browser_view.h" | 5 #include "chrome/browser/ui/views/frame/browser_view.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 | 8 | 
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" | 
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" | 
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 61 #include "chrome/browser/ui/views/accessibility/invert_bubble_view.h" | 61 #include "chrome/browser/ui/views/accessibility/invert_bubble_view.h" | 
| 62 #include "chrome/browser/ui/views/avatar_menu_bubble_view.h" | 62 #include "chrome/browser/ui/views/avatar_menu_bubble_view.h" | 
| 63 #include "chrome/browser/ui/views/avatar_menu_button.h" | 63 #include "chrome/browser/ui/views/avatar_menu_button.h" | 
| 64 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" | 64 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" | 
| 65 #include "chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h" | 65 #include "chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h" | 
| 66 #include "chrome/browser/ui/views/browser_dialogs.h" | 66 #include "chrome/browser/ui/views/browser_dialogs.h" | 
| 67 #include "chrome/browser/ui/views/download/download_in_progress_dialog_view.h" | 67 #include "chrome/browser/ui/views/download/download_in_progress_dialog_view.h" | 
| 68 #include "chrome/browser/ui/views/download/download_shelf_view.h" | 68 #include "chrome/browser/ui/views/download/download_shelf_view.h" | 
| 69 #include "chrome/browser/ui/views/frame/browser_view_layout.h" | 69 #include "chrome/browser/ui/views/frame/browser_view_layout.h" | 
| 70 #include "chrome/browser/ui/views/frame/browser_view_layout_delegate.h" | 70 #include "chrome/browser/ui/views/frame/browser_view_layout_delegate.h" | 
| 71 #include "chrome/browser/ui/views/frame/contents_container.h" | 71 #include "chrome/browser/ui/views/frame/contents_layout_manager.h" | 
| 72 #include "chrome/browser/ui/views/frame/immersive_mode_controller.h" | 72 #include "chrome/browser/ui/views/frame/immersive_mode_controller.h" | 
| 73 #include "chrome/browser/ui/views/frame/native_browser_frame_factory.h" | 73 #include "chrome/browser/ui/views/frame/native_browser_frame_factory.h" | 
| 74 #include "chrome/browser/ui/views/frame/top_container_view.h" | 74 #include "chrome/browser/ui/views/frame/top_container_view.h" | 
| 75 #include "chrome/browser/ui/views/fullscreen_exit_bubble_views.h" | 75 #include "chrome/browser/ui/views/fullscreen_exit_bubble_views.h" | 
| 76 #include "chrome/browser/ui/views/infobars/infobar_container_view.h" | 76 #include "chrome/browser/ui/views/infobars/infobar_container_view.h" | 
| 77 #include "chrome/browser/ui/views/location_bar/location_bar_view.h" | 77 #include "chrome/browser/ui/views/location_bar/location_bar_view.h" | 
| 78 #include "chrome/browser/ui/views/location_bar/location_icon_view.h" | 78 #include "chrome/browser/ui/views/location_bar/location_icon_view.h" | 
| 79 #include "chrome/browser/ui/views/omnibox/omnibox_view_views.h" | 79 #include "chrome/browser/ui/views/omnibox/omnibox_view_views.h" | 
| 80 #include "chrome/browser/ui/views/password_generation_bubble_view.h" | 80 #include "chrome/browser/ui/views/password_generation_bubble_view.h" | 
| 81 #include "chrome/browser/ui/views/profile_chooser_view.h" | 81 #include "chrome/browser/ui/views/profile_chooser_view.h" | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 114 #include "ui/base/hit_test.h" | 114 #include "ui/base/hit_test.h" | 
| 115 #include "ui/base/l10n/l10n_util.h" | 115 #include "ui/base/l10n/l10n_util.h" | 
| 116 #include "ui/base/resource/resource_bundle.h" | 116 #include "ui/base/resource/resource_bundle.h" | 
| 117 #include "ui/base/theme_provider.h" | 117 #include "ui/base/theme_provider.h" | 
| 118 #include "ui/events/event_utils.h" | 118 #include "ui/events/event_utils.h" | 
| 119 #include "ui/gfx/canvas.h" | 119 #include "ui/gfx/canvas.h" | 
| 120 #include "ui/gfx/color_utils.h" | 120 #include "ui/gfx/color_utils.h" | 
| 121 #include "ui/gfx/rect_conversions.h" | 121 #include "ui/gfx/rect_conversions.h" | 
| 122 #include "ui/gfx/sys_color_change_listener.h" | 122 #include "ui/gfx/sys_color_change_listener.h" | 
| 123 #include "ui/views/controls/button/menu_button.h" | 123 #include "ui/views/controls/button/menu_button.h" | 
| 124 #include "ui/views/controls/single_split_view.h" |  | 
| 125 #include "ui/views/controls/textfield/textfield.h" | 124 #include "ui/views/controls/textfield/textfield.h" | 
| 126 #include "ui/views/controls/webview/webview.h" | 125 #include "ui/views/controls/webview/webview.h" | 
| 127 #include "ui/views/focus/external_focus_tracker.h" | 126 #include "ui/views/focus/external_focus_tracker.h" | 
| 128 #include "ui/views/focus/view_storage.h" | 127 #include "ui/views/focus/view_storage.h" | 
| 129 #include "ui/views/layout/grid_layout.h" | 128 #include "ui/views/layout/grid_layout.h" | 
| 130 #include "ui/views/widget/native_widget.h" | 129 #include "ui/views/widget/native_widget.h" | 
| 131 #include "ui/views/widget/root_view.h" | 130 #include "ui/views/widget/root_view.h" | 
| 132 #include "ui/views/widget/widget.h" | 131 #include "ui/views/widget/widget.h" | 
| 133 #include "ui/views/window/dialog_delegate.h" | 132 #include "ui/views/window/dialog_delegate.h" | 
| 134 | 133 | 
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 409       last_focused_view_storage_id_( | 408       last_focused_view_storage_id_( | 
| 410           views::ViewStorage::GetInstance()->CreateStorageID()), | 409           views::ViewStorage::GetInstance()->CreateStorageID()), | 
| 411       frame_(NULL), | 410       frame_(NULL), | 
| 412       top_container_(NULL), | 411       top_container_(NULL), | 
| 413       tabstrip_(NULL), | 412       tabstrip_(NULL), | 
| 414       toolbar_(NULL), | 413       toolbar_(NULL), | 
| 415       window_switcher_button_(NULL), | 414       window_switcher_button_(NULL), | 
| 416       find_bar_host_view_(NULL), | 415       find_bar_host_view_(NULL), | 
| 417       infobar_container_(NULL), | 416       infobar_container_(NULL), | 
| 418       contents_web_view_(NULL), | 417       contents_web_view_(NULL), | 
| 419       devtools_container_(NULL), |  | 
| 420       contents_container_(NULL), | 418       contents_container_(NULL), | 
| 421       contents_split_(NULL), |  | 
| 422       devtools_dock_side_(DEVTOOLS_DOCK_SIDE_BOTTOM), |  | 
| 423       devtools_window_(NULL), | 419       devtools_window_(NULL), | 
| 424       initialized_(false), | 420       initialized_(false), | 
| 425       in_process_fullscreen_(false), | 421       in_process_fullscreen_(false), | 
| 426 #if defined(OS_WIN) && !defined(USE_AURA) | 422 #if defined(OS_WIN) && !defined(USE_AURA) | 
| 427       hung_window_detector_(&hung_plugin_action_), | 423       hung_window_detector_(&hung_plugin_action_), | 
| 428       ticker_(0), | 424       ticker_(0), | 
| 429 #endif | 425 #endif | 
| 430       force_location_bar_focus_(false), | 426       force_location_bar_focus_(false), | 
| 431       immersive_mode_controller_(chrome::CreateImmersiveModeController()), | 427       immersive_mode_controller_(chrome::CreateImmersiveModeController()), | 
| 432 #if defined(OS_CHROMEOS) | 428 #if defined(OS_CHROMEOS) | 
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 504       reinterpret_cast<BrowserView*>(widget->GetNativeWindowProperty( | 500       reinterpret_cast<BrowserView*>(widget->GetNativeWindowProperty( | 
| 505           kBrowserViewKey)) : NULL; | 501           kBrowserViewKey)) : NULL; | 
| 506 } | 502 } | 
| 507 | 503 | 
| 508 // static | 504 // static | 
| 509 BrowserView* BrowserView::GetBrowserViewForBrowser(const Browser* browser) { | 505 BrowserView* BrowserView::GetBrowserViewForBrowser(const Browser* browser) { | 
| 510   return static_cast<BrowserView*>(browser->window()); | 506   return static_cast<BrowserView*>(browser->window()); | 
| 511 } | 507 } | 
| 512 | 508 | 
| 513 void BrowserView::InitStatusBubble() { | 509 void BrowserView::InitStatusBubble() { | 
| 514   status_bubble_.reset(new StatusBubbleViews(contents_container_)); | 510   status_bubble_.reset(new StatusBubbleViews(contents_web_view_)); | 
| 515 } | 511 } | 
| 516 | 512 | 
| 517 gfx::Rect BrowserView::GetToolbarBounds() const { | 513 gfx::Rect BrowserView::GetToolbarBounds() const { | 
| 518   gfx::Rect toolbar_bounds(toolbar_->bounds()); | 514   gfx::Rect toolbar_bounds(toolbar_->bounds()); | 
| 519   if (toolbar_bounds.IsEmpty()) | 515   if (toolbar_bounds.IsEmpty()) | 
| 520     return toolbar_bounds; | 516     return toolbar_bounds; | 
| 521   // The apparent toolbar edges are outside the "real" toolbar edges. | 517   // The apparent toolbar edges are outside the "real" toolbar edges. | 
| 522   toolbar_bounds.Inset(-views::NonClientFrameView::kClientEdgeThickness, 0); | 518   toolbar_bounds.Inset(-views::NonClientFrameView::kClientEdgeThickness, 0); | 
| 523   return toolbar_bounds; | 519   return toolbar_bounds; | 
| 524 } | 520 } | 
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 781     if (detached_changed && immersive_mode_controller_->IsEnabled()) | 777     if (detached_changed && immersive_mode_controller_->IsEnabled()) | 
| 782       change_type = BookmarkBar::DONT_ANIMATE_STATE_CHANGE; | 778       change_type = BookmarkBar::DONT_ANIMATE_STATE_CHANGE; | 
| 783 | 779 | 
| 784     bookmark_bar_view_->SetBookmarkBarState(new_state, change_type); | 780     bookmark_bar_view_->SetBookmarkBarState(new_state, change_type); | 
| 785   } | 781   } | 
| 786   if (MaybeShowBookmarkBar(GetActiveWebContents())) | 782   if (MaybeShowBookmarkBar(GetActiveWebContents())) | 
| 787     Layout(); | 783     Layout(); | 
| 788 } | 784 } | 
| 789 | 785 | 
| 790 void BrowserView::UpdateDevTools() { | 786 void BrowserView::UpdateDevTools() { | 
| 791   UpdateDevToolsForContents(GetActiveWebContents()); | 787   UpdateDevToolsForContents(GetActiveWebContents(), true); | 
| 792   Layout(); | 788   Layout(); | 
| 793 } | 789 } | 
| 794 | 790 | 
| 795 void BrowserView::UpdateLoadingAnimations(bool should_animate) { | 791 void BrowserView::UpdateLoadingAnimations(bool should_animate) { | 
| 796   if (should_animate) { | 792   if (should_animate) { | 
| 797     if (!loading_animation_timer_.IsRunning()) { | 793     if (!loading_animation_timer_.IsRunning()) { | 
| 798       // Loads are happening, and the timer isn't running, so start it. | 794       // Loads are happening, and the timer isn't running, so start it. | 
| 799       last_animation_time_ = base::TimeTicks::Now(); | 795       last_animation_time_ = base::TimeTicks::Now(); | 
| 800       loading_animation_timer_.Start(FROM_HERE, | 796       loading_animation_timer_.Start(FROM_HERE, | 
| 801           TimeDelta::FromMilliseconds(kLoadingAnimationFrameTimeMs), this, | 797           TimeDelta::FromMilliseconds(kLoadingAnimationFrameTimeMs), this, | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
| 831   // the WebContents window. | 827   // the WebContents window. | 
| 832   bool change_tab_contents = | 828   bool change_tab_contents = | 
| 833       contents_web_view_->web_contents() != new_contents; | 829       contents_web_view_->web_contents() != new_contents; | 
| 834 | 830 | 
| 835   // Update various elements that are interested in knowing the current | 831   // Update various elements that are interested in knowing the current | 
| 836   // WebContents. | 832   // WebContents. | 
| 837 | 833 | 
| 838   // When we toggle the NTP floating bookmarks bar and/or the info bar, | 834   // When we toggle the NTP floating bookmarks bar and/or the info bar, | 
| 839   // we don't want any WebContents to be attached, so that we | 835   // we don't want any WebContents to be attached, so that we | 
| 840   // avoid an unnecessary resize and re-layout of a WebContents. | 836   // avoid an unnecessary resize and re-layout of a WebContents. | 
| 841   if (change_tab_contents) | 837   if (change_tab_contents) { | 
| 842     contents_web_view_->SetWebContents(NULL); | 838     contents_web_view_->SetWebContents(NULL); | 
|  | 839     devtools_web_view_->SetWebContents(NULL); | 
|  | 840   } | 
| 843   infobar_container_->ChangeInfoBarService( | 841   infobar_container_->ChangeInfoBarService( | 
| 844       InfoBarService::FromWebContents(new_contents)); | 842       InfoBarService::FromWebContents(new_contents)); | 
| 845   if (bookmark_bar_view_.get()) { | 843   if (bookmark_bar_view_.get()) { | 
| 846     bookmark_bar_view_->SetBookmarkBarState( | 844     bookmark_bar_view_->SetBookmarkBarState( | 
| 847         browser_->bookmark_bar_state(), | 845         browser_->bookmark_bar_state(), | 
| 848         BookmarkBar::DONT_ANIMATE_STATE_CHANGE); | 846         BookmarkBar::DONT_ANIMATE_STATE_CHANGE); | 
| 849   } | 847   } | 
| 850   UpdateUIForContents(new_contents); | 848   UpdateUIForContents(new_contents); | 
| 851 | 849 | 
| 852   // Layout for DevTools _before_ setting the main WebContents to avoid | 850   // Layout for DevTools _before_ setting the both main and devtools WebContents | 
| 853   // toggling the size of the main WebContents. | 851   // to avoid toggling the size of any of them. | 
| 854   UpdateDevToolsForContents(new_contents); | 852   UpdateDevToolsForContents(new_contents, !change_tab_contents); | 
| 855 | 853 | 
| 856   if (change_tab_contents) | 854   if (change_tab_contents) { | 
| 857     contents_web_view_->SetWebContents(new_contents); | 855     contents_web_view_->SetWebContents(new_contents); | 
|  | 856     // The second layout update should be no-op. It will just set the | 
|  | 857     // DevTools WebContents. | 
|  | 858     UpdateDevToolsForContents(new_contents, true); | 
|  | 859   } | 
| 858 | 860 | 
| 859   if (!browser_->tab_strip_model()->closing_all() && GetWidget()->IsActive() && | 861   if (!browser_->tab_strip_model()->closing_all() && GetWidget()->IsActive() && | 
| 860       GetWidget()->IsVisible()) { | 862       GetWidget()->IsVisible()) { | 
| 861     // We only restore focus if our window is visible, to avoid invoking blur | 863     // We only restore focus if our window is visible, to avoid invoking blur | 
| 862     // handlers when we are eventually shown. | 864     // handlers when we are eventually shown. | 
| 863     new_contents->GetView()->RestoreFocus(); | 865     new_contents->GetView()->RestoreFocus(); | 
| 864   } | 866   } | 
| 865 | 867 | 
| 866   // Update all the UI bits. | 868   // Update all the UI bits. | 
| 867   UpdateTitleBar(); | 869   UpdateTitleBar(); | 
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1015   } | 1017   } | 
| 1016 | 1018 | 
| 1017   // When transitioning from animating to not animating we need to make sure the | 1019   // When transitioning from animating to not animating we need to make sure the | 
| 1018   // contents_container_ gets layed out. If we don't do this and the bounds | 1020   // contents_container_ gets layed out. If we don't do this and the bounds | 
| 1019   // haven't changed contents_container_ won't get a Layout out and we'll end up | 1021   // haven't changed contents_container_ won't get a Layout out and we'll end up | 
| 1020   // with a gray rect because the clip wasn't updated.  Note that a reentrant | 1022   // with a gray rect because the clip wasn't updated.  Note that a reentrant | 
| 1021   // call never needs to do this, because after it returns, the normal call | 1023   // call never needs to do this, because after it returns, the normal call | 
| 1022   // wrapping it will do it. | 1024   // wrapping it will do it. | 
| 1023   if ((call_state == NORMAL) && !is_animating) { | 1025   if ((call_state == NORMAL) && !is_animating) { | 
| 1024     contents_web_view_->InvalidateLayout(); | 1026     contents_web_view_->InvalidateLayout(); | 
| 1025     contents_split_->Layout(); | 1027     contents_container_->Layout(); | 
| 1026   } | 1028   } | 
| 1027 } | 1029 } | 
| 1028 | 1030 | 
| 1029 LocationBar* BrowserView::GetLocationBar() const { | 1031 LocationBar* BrowserView::GetLocationBar() const { | 
| 1030   return GetLocationBarView(); | 1032   return GetLocationBarView(); | 
| 1031 } | 1033 } | 
| 1032 | 1034 | 
| 1033 void BrowserView::SetFocusToLocationBar(bool select_all) { | 1035 void BrowserView::SetFocusToLocationBar(bool select_all) { | 
| 1034   // On Windows, changing focus to the location bar causes the browser | 1036   // On Windows, changing focus to the location bar causes the browser | 
| 1035   // window to become active. This can steal focus if the user has | 1037   // window to become active. This can steal focus if the user has | 
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1285 | 1287 | 
| 1286 int BrowserView::GetExtraRenderViewHeight() const { | 1288 int BrowserView::GetExtraRenderViewHeight() const { | 
| 1287   // Currently this is only used on linux. | 1289   // Currently this is only used on linux. | 
| 1288   return 0; | 1290   return 0; | 
| 1289 } | 1291 } | 
| 1290 | 1292 | 
| 1291 void BrowserView::WebContentsFocused(WebContents* contents) { | 1293 void BrowserView::WebContentsFocused(WebContents* contents) { | 
| 1292   if (contents_web_view_->GetWebContents() == contents) | 1294   if (contents_web_view_->GetWebContents() == contents) | 
| 1293     contents_web_view_->OnWebContentsFocused(contents); | 1295     contents_web_view_->OnWebContentsFocused(contents); | 
| 1294   else | 1296   else | 
| 1295     devtools_container_->OnWebContentsFocused(contents); | 1297     devtools_web_view_->OnWebContentsFocused(contents); | 
| 1296 } | 1298 } | 
| 1297 | 1299 | 
| 1298 void BrowserView::ShowWebsiteSettings(Profile* profile, | 1300 void BrowserView::ShowWebsiteSettings(Profile* profile, | 
| 1299                                       content::WebContents* web_contents, | 1301                                       content::WebContents* web_contents, | 
| 1300                                       const GURL& url, | 1302                                       const GURL& url, | 
| 1301                                       const content::SSLStatus& ssl) { | 1303                                       const content::SSLStatus& ssl) { | 
| 1302   WebsiteSettingsPopupView::ShowPopup( | 1304   WebsiteSettingsPopupView::ShowPopup( | 
| 1303       GetLocationBarView()->GetLocationIconView(), profile, | 1305       GetLocationBarView()->GetLocationIconView(), profile, | 
| 1304       web_contents, url, ssl, browser_.get()); | 1306       web_contents, url, ssl, browser_.get()); | 
| 1305 } | 1307 } | 
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1470 void BrowserView::TabDetachedAt(WebContents* contents, int index) { | 1472 void BrowserView::TabDetachedAt(WebContents* contents, int index) { | 
| 1471   // We use index here rather than comparing |contents| because by this time | 1473   // We use index here rather than comparing |contents| because by this time | 
| 1472   // the model has already removed |contents| from its list, so | 1474   // the model has already removed |contents| from its list, so | 
| 1473   // browser_->GetActiveWebContents() will return NULL or something else. | 1475   // browser_->GetActiveWebContents() will return NULL or something else. | 
| 1474   if (index == browser_->tab_strip_model()->active_index()) { | 1476   if (index == browser_->tab_strip_model()->active_index()) { | 
| 1475     // We need to reset the current tab contents to NULL before it gets | 1477     // We need to reset the current tab contents to NULL before it gets | 
| 1476     // freed. This is because the focus manager performs some operations | 1478     // freed. This is because the focus manager performs some operations | 
| 1477     // on the selected WebContents when it is removed. | 1479     // on the selected WebContents when it is removed. | 
| 1478     contents_web_view_->SetWebContents(NULL); | 1480     contents_web_view_->SetWebContents(NULL); | 
| 1479     infobar_container_->ChangeInfoBarService(NULL); | 1481     infobar_container_->ChangeInfoBarService(NULL); | 
| 1480     UpdateDevToolsForContents(NULL); | 1482     UpdateDevToolsForContents(NULL, true); | 
| 1481   } | 1483   } | 
| 1482 } | 1484 } | 
| 1483 | 1485 | 
| 1484 void BrowserView::TabDeactivated(WebContents* contents) { | 1486 void BrowserView::TabDeactivated(WebContents* contents) { | 
| 1485   // We do not store the focus when closing the tab to work-around bug 4633. | 1487   // We do not store the focus when closing the tab to work-around bug 4633. | 
| 1486   // Some reports seem to show that the focus manager and/or focused view can | 1488   // Some reports seem to show that the focus manager and/or focused view can | 
| 1487   // be garbage at that point, it is not clear why. | 1489   // be garbage at that point, it is not clear why. | 
| 1488   if (!contents->IsBeingDestroyed()) | 1490   if (!contents->IsBeingDestroyed()) | 
| 1489     contents->GetView()->StoreFocus(); | 1491     contents->GetView()->StoreFocus(); | 
| 1490 } | 1492 } | 
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1747   // invisible or has no focusable children, it will be automatically | 1749   // invisible or has no focusable children, it will be automatically | 
| 1748   // skipped. | 1750   // skipped. | 
| 1749   panes->push_back(toolbar_); | 1751   panes->push_back(toolbar_); | 
| 1750   if (bookmark_bar_view_.get()) | 1752   if (bookmark_bar_view_.get()) | 
| 1751     panes->push_back(bookmark_bar_view_.get()); | 1753     panes->push_back(bookmark_bar_view_.get()); | 
| 1752   if (infobar_container_) | 1754   if (infobar_container_) | 
| 1753     panes->push_back(infobar_container_); | 1755     panes->push_back(infobar_container_); | 
| 1754   if (download_shelf_.get()) | 1756   if (download_shelf_.get()) | 
| 1755     panes->push_back(download_shelf_.get()); | 1757     panes->push_back(download_shelf_.get()); | 
| 1756   panes->push_back(GetTabContentsContainerView()); | 1758   panes->push_back(GetTabContentsContainerView()); | 
| 1757   if (devtools_container_->visible()) | 1759   if (devtools_web_view_->visible()) | 
| 1758     panes->push_back(devtools_container_); | 1760     panes->push_back(devtools_web_view_); | 
| 1759 } | 1761 } | 
| 1760 | 1762 | 
| 1761 /////////////////////////////////////////////////////////////////////////////// | 1763 /////////////////////////////////////////////////////////////////////////////// | 
| 1762 // BrowserView, views::ClientView overrides: | 1764 // BrowserView, views::ClientView overrides: | 
| 1763 | 1765 | 
| 1764 bool BrowserView::CanClose() { | 1766 bool BrowserView::CanClose() { | 
| 1765   // You cannot close a frame for which there is an active originating drag | 1767   // You cannot close a frame for which there is an active originating drag | 
| 1766   // session. | 1768   // session. | 
| 1767   if (tabstrip_ && !tabstrip_->IsTabStripCloseable()) | 1769   if (tabstrip_ && !tabstrip_->IsTabStripCloseable()) | 
| 1768     return false; | 1770     return false; | 
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1907 | 1909 | 
| 1908 bool BrowserView::DrawInfoBarArrows(int* x) const { | 1910 bool BrowserView::DrawInfoBarArrows(int* x) const { | 
| 1909   if (x) { | 1911   if (x) { | 
| 1910     gfx::Point anchor(toolbar_->location_bar()->GetLocationBarAnchorPoint()); | 1912     gfx::Point anchor(toolbar_->location_bar()->GetLocationBarAnchorPoint()); | 
| 1911     ConvertPointToTarget(toolbar_->location_bar(), this, &anchor); | 1913     ConvertPointToTarget(toolbar_->location_bar(), this, &anchor); | 
| 1912     *x = anchor.x(); | 1914     *x = anchor.x(); | 
| 1913   } | 1915   } | 
| 1914   return true; | 1916   return true; | 
| 1915 } | 1917 } | 
| 1916 | 1918 | 
| 1917 bool BrowserView::SplitHandleMoved(views::SingleSplitView* sender) { |  | 
| 1918   for (int i = 0; i < sender->child_count(); ++i) |  | 
| 1919     sender->child_at(i)->InvalidateLayout(); |  | 
| 1920   SchedulePaint(); |  | 
| 1921   Layout(); |  | 
| 1922   return false; |  | 
| 1923 } |  | 
| 1924 |  | 
| 1925 void BrowserView::OnSysColorChange() { | 1919 void BrowserView::OnSysColorChange() { | 
| 1926   chrome::MaybeShowInvertBubbleView(browser_.get(), contents_container_); | 1920   chrome::MaybeShowInvertBubbleView(browser_.get(), contents_container_); | 
| 1927 } | 1921 } | 
| 1928 | 1922 | 
| 1929 void BrowserView::InitViews() { | 1923 void BrowserView::InitViews() { | 
| 1930   GetWidget()->AddObserver(this); | 1924   GetWidget()->AddObserver(this); | 
| 1931 | 1925 | 
| 1932   // Stow a pointer to this object onto the window handle so that we can get at | 1926   // Stow a pointer to this object onto the window handle so that we can get at | 
| 1933   // it later when all we have is a native view. | 1927   // it later when all we have is a native view. | 
| 1934   GetWidget()->SetNativeWindowProperty(kBrowserViewKey, this); | 1928   GetWidget()->SetNativeWindowProperty(kBrowserViewKey, this); | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 1948   LoadAccelerators(); | 1942   LoadAccelerators(); | 
| 1949 | 1943 | 
| 1950   infobar_container_ = new InfoBarContainerView(this); | 1944   infobar_container_ = new InfoBarContainerView(this); | 
| 1951   AddChildView(infobar_container_); | 1945   AddChildView(infobar_container_); | 
| 1952 | 1946 | 
| 1953   contents_web_view_ = new views::WebView(browser_->profile()); | 1947   contents_web_view_ = new views::WebView(browser_->profile()); | 
| 1954   contents_web_view_->set_id(VIEW_ID_TAB_CONTAINER); | 1948   contents_web_view_->set_id(VIEW_ID_TAB_CONTAINER); | 
| 1955   contents_web_view_->SetEmbedFullscreenWidgetMode( | 1949   contents_web_view_->SetEmbedFullscreenWidgetMode( | 
| 1956       implicit_cast<content::WebContentsDelegate*>(browser_.get())-> | 1950       implicit_cast<content::WebContentsDelegate*>(browser_.get())-> | 
| 1957           EmbedsFullscreenWidget()); | 1951           EmbedsFullscreenWidget()); | 
| 1958   contents_container_ = new ContentsContainer(contents_web_view_); |  | 
| 1959 | 1952 | 
| 1960   SkColor bg_color = GetWidget()->GetThemeProvider()-> | 1953   devtools_web_view_ = new views::WebView(browser_->profile()); | 
| 1961       GetColor(ThemeProperties::COLOR_TOOLBAR); | 1954   devtools_web_view_->set_id(VIEW_ID_DEV_TOOLS_DOCKED); | 
|  | 1955   devtools_web_view_->SetVisible(false); | 
| 1962 | 1956 | 
| 1963   devtools_container_ = new views::WebView(browser_->profile()); | 1957   contents_container_ = new views::View(); | 
| 1964   devtools_container_->set_id(VIEW_ID_DEV_TOOLS_DOCKED); | 1958   contents_container_->set_background(views::Background::CreateSolidBackground( | 
| 1965   devtools_container_->SetVisible(false); | 1959       ThemeProperties::GetDefaultColor( | 
| 1966 | 1960           ThemeProperties::COLOR_CONTROL_BACKGROUND))); | 
| 1967   views::View* contents_container_view = contents_container_; | 1961   contents_container_->AddChildView(devtools_web_view_); | 
| 1968 | 1962   contents_container_->AddChildView(contents_web_view_); | 
| 1969   contents_split_ = new views::SingleSplitView( | 1963   contents_container_->SetLayoutManager(new ContentsLayoutManager( | 
| 1970       contents_container_view, | 1964       devtools_web_view_, contents_web_view_)); | 
| 1971       devtools_container_, | 1965   AddChildView(contents_container_); | 
| 1972       views::SingleSplitView::VERTICAL_SPLIT, | 1966   set_contents_view(contents_container_); | 
| 1973       this); |  | 
| 1974   contents_split_->set_id(VIEW_ID_CONTENTS_SPLIT); |  | 
| 1975   contents_split_->SetAccessibleName( |  | 
| 1976       l10n_util::GetStringUTF16(IDS_ACCNAME_WEB_CONTENTS)); |  | 
| 1977   contents_split_->set_background( |  | 
| 1978       views::Background::CreateSolidBackground(bg_color)); |  | 
| 1979   AddChildView(contents_split_); |  | 
| 1980   set_contents_view(contents_split_); |  | 
| 1981 | 1967 | 
| 1982   InitStatusBubble(); | 1968   InitStatusBubble(); | 
| 1983 | 1969 | 
| 1984   // Top container holds tab strip and toolbar and lives at the front of the | 1970   // Top container holds tab strip and toolbar and lives at the front of the | 
| 1985   // view hierarchy. | 1971   // view hierarchy. | 
| 1986   top_container_ = new TopContainerView(this); | 1972   top_container_ = new TopContainerView(this); | 
| 1987   AddChildView(top_container_); | 1973   AddChildView(top_container_); | 
| 1988 | 1974 | 
| 1989   // TabStrip takes ownership of the controller. | 1975   // TabStrip takes ownership of the controller. | 
| 1990   BrowserTabStripController* tabstrip_controller = | 1976   BrowserTabStripController* tabstrip_controller = | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 2009   immersive_mode_controller_->Init(this); | 1995   immersive_mode_controller_->Init(this); | 
| 2010 | 1996 | 
| 2011   BrowserViewLayout* browser_view_layout = new BrowserViewLayout; | 1997   BrowserViewLayout* browser_view_layout = new BrowserViewLayout; | 
| 2012   browser_view_layout->Init(new BrowserViewLayoutDelegateImpl(this), | 1998   browser_view_layout->Init(new BrowserViewLayoutDelegateImpl(this), | 
| 2013                             browser(), | 1999                             browser(), | 
| 2014                             this, | 2000                             this, | 
| 2015                             top_container_, | 2001                             top_container_, | 
| 2016                             tabstrip_, | 2002                             tabstrip_, | 
| 2017                             toolbar_, | 2003                             toolbar_, | 
| 2018                             infobar_container_, | 2004                             infobar_container_, | 
| 2019                             contents_split_, |  | 
| 2020                             contents_container_, | 2005                             contents_container_, | 
|  | 2006                             GetContentsLayoutManager(), | 
| 2021                             immersive_mode_controller_.get()); | 2007                             immersive_mode_controller_.get()); | 
| 2022   SetLayoutManager(browser_view_layout); | 2008   SetLayoutManager(browser_view_layout); | 
| 2023 | 2009 | 
| 2024 #if defined(OS_WIN) && !defined(USE_AURA) | 2010 #if defined(OS_WIN) && !defined(USE_AURA) | 
| 2025   // Create a custom JumpList and add it to an observer of TabRestoreService | 2011   // Create a custom JumpList and add it to an observer of TabRestoreService | 
| 2026   // so we can update the custom JumpList when a tab is added or removed. | 2012   // so we can update the custom JumpList when a tab is added or removed. | 
| 2027   if (JumpList::Enabled()) { | 2013   if (JumpList::Enabled()) { | 
| 2028     load_complete_listener_.reset(new LoadCompleteListener(this)); | 2014     load_complete_listener_.reset(new LoadCompleteListener(this)); | 
| 2029   } | 2015   } | 
| 2030 #endif | 2016 #endif | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2063   DCHECK(!jumplist_); | 2049   DCHECK(!jumplist_); | 
| 2064   jumplist_ = new JumpList(); | 2050   jumplist_ = new JumpList(); | 
| 2065   jumplist_->AddObserver(browser_->profile()); | 2051   jumplist_->AddObserver(browser_->profile()); | 
| 2066 #endif | 2052 #endif | 
| 2067 } | 2053 } | 
| 2068 | 2054 | 
| 2069 BrowserViewLayout* BrowserView::GetBrowserViewLayout() const { | 2055 BrowserViewLayout* BrowserView::GetBrowserViewLayout() const { | 
| 2070   return static_cast<BrowserViewLayout*>(GetLayoutManager()); | 2056   return static_cast<BrowserViewLayout*>(GetLayoutManager()); | 
| 2071 } | 2057 } | 
| 2072 | 2058 | 
|  | 2059 ContentsLayoutManager* BrowserView::GetContentsLayoutManager() const { | 
|  | 2060   return static_cast<ContentsLayoutManager*>( | 
|  | 2061       contents_container_->GetLayoutManager()); | 
|  | 2062 } | 
|  | 2063 | 
| 2073 void BrowserView::LayoutStatusBubble() { | 2064 void BrowserView::LayoutStatusBubble() { | 
| 2074   // In restored mode, the client area has a client edge between it and the | 2065   // In restored mode, the client area has a client edge between it and the | 
| 2075   // frame. | 2066   // frame. | 
| 2076   int overlap = StatusBubbleViews::kShadowThickness; | 2067   int overlap = StatusBubbleViews::kShadowThickness; | 
| 2077   // The extra pixels defined by kClientEdgeThickness is only drawn in frame | 2068   // The extra pixels defined by kClientEdgeThickness is only drawn in frame | 
| 2078   // content border on windows for non-aura build. | 2069   // content border on windows for non-aura build. | 
| 2079 #if !defined(USE_ASH) | 2070 #if !defined(USE_ASH) | 
| 2080   overlap += | 2071   overlap += | 
| 2081       IsMaximized() ? 0 : views::NonClientFrameView::kClientEdgeThickness; | 2072       IsMaximized() ? 0 : views::NonClientFrameView::kClientEdgeThickness; | 
| 2082 #endif | 2073 #endif | 
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2146   } | 2137   } | 
| 2147 } | 2138 } | 
| 2148 | 2139 | 
| 2149 bool BrowserView::MaybeShowInfoBar(WebContents* contents) { | 2140 bool BrowserView::MaybeShowInfoBar(WebContents* contents) { | 
| 2150   // TODO(beng): Remove this function once the interface between | 2141   // TODO(beng): Remove this function once the interface between | 
| 2151   //             InfoBarContainer, DownloadShelfView and WebContents and this | 2142   //             InfoBarContainer, DownloadShelfView and WebContents and this | 
| 2152   //             view is sorted out. | 2143   //             view is sorted out. | 
| 2153   return true; | 2144   return true; | 
| 2154 } | 2145 } | 
| 2155 | 2146 | 
| 2156 void BrowserView::UpdateDevToolsForContents(WebContents* web_contents) { | 2147 void BrowserView::UpdateDevToolsForContents( | 
|  | 2148     WebContents* web_contents, bool update_devtools_web_contents) { | 
| 2157   DevToolsWindow* new_devtools_window = web_contents ? | 2149   DevToolsWindow* new_devtools_window = web_contents ? | 
| 2158       DevToolsWindow::GetDockedInstanceForInspectedTab(web_contents) : NULL; | 2150       DevToolsWindow::GetDockedInstanceForInspectedTab(web_contents) : NULL; | 
| 2159   // Fast return in case of the same window having same orientation. | 2151 | 
| 2160   if (devtools_window_ == new_devtools_window) { | 2152   // Replace devtools WebContents. | 
| 2161     if (!new_devtools_window || | 2153   WebContents* new_contents = new_devtools_window ? | 
| 2162         (new_devtools_window->dock_side() == devtools_dock_side_)) { | 2154       new_devtools_window->web_contents() : NULL; | 
| 2163       return; | 2155   if (devtools_web_view_->web_contents() != new_contents && | 
| 2164     } | 2156       update_devtools_web_contents) { | 
|  | 2157     devtools_web_view_->SetWebContents(new_contents); | 
| 2165   } | 2158   } | 
| 2166 | 2159 | 
| 2167   // Replace tab contents. | 2160   if (!devtools_window_ && new_devtools_window && | 
| 2168   if (devtools_window_ != new_devtools_window) { | 2161       !devtools_focus_tracker_.get()) { | 
| 2169     devtools_container_->SetWebContents( |  | 
| 2170         new_devtools_window ? new_devtools_window->web_contents() : NULL); |  | 
| 2171   } |  | 
| 2172 |  | 
| 2173   // Store last used position. |  | 
| 2174   if (devtools_window_) { |  | 
| 2175     int split_size = contents_split_->GetDividerSize(); |  | 
| 2176     if (devtools_dock_side_ == DEVTOOLS_DOCK_SIDE_RIGHT) { |  | 
| 2177       devtools_window_->SetWidth(contents_split_->width() - |  | 
| 2178           split_size - contents_split_->divider_offset()); |  | 
| 2179     } else if (devtools_dock_side_ == DEVTOOLS_DOCK_SIDE_BOTTOM) { |  | 
| 2180       devtools_window_->SetHeight(contents_split_->height() - |  | 
| 2181           split_size - contents_split_->divider_offset()); |  | 
| 2182     } |  | 
| 2183   } |  | 
| 2184 |  | 
| 2185   // Show / hide container if necessary. Changing dock orientation is |  | 
| 2186   // hide + show. |  | 
| 2187   bool should_hide = devtools_window_ && (!new_devtools_window || |  | 
| 2188       devtools_dock_side_ != new_devtools_window->dock_side()); |  | 
| 2189   bool should_show = new_devtools_window && (!devtools_window_ || should_hide); |  | 
| 2190 |  | 
| 2191   if (should_hide) |  | 
| 2192     HideDevToolsContainer(); |  | 
| 2193 |  | 
| 2194   devtools_window_ = new_devtools_window; |  | 
| 2195 |  | 
| 2196   if (should_show) { |  | 
| 2197     devtools_dock_side_ = new_devtools_window->dock_side(); |  | 
| 2198     ShowDevToolsContainer(); |  | 
| 2199   } else if (new_devtools_window) { |  | 
| 2200     UpdateDevToolsSplitPosition(); |  | 
| 2201     contents_split_->Layout(); |  | 
| 2202   } |  | 
| 2203 } |  | 
| 2204 |  | 
| 2205 void BrowserView::ShowDevToolsContainer() { |  | 
| 2206   if (!devtools_focus_tracker_.get()) { |  | 
| 2207     // Install devtools focus tracker when dev tools window is shown for the | 2162     // Install devtools focus tracker when dev tools window is shown for the | 
| 2208     // first time. | 2163     // first time. | 
| 2209     devtools_focus_tracker_.reset( | 2164     devtools_focus_tracker_.reset( | 
| 2210         new views::ExternalFocusTracker(devtools_container_, | 2165         new views::ExternalFocusTracker(devtools_web_view_, | 
| 2211                                         GetFocusManager())); | 2166                                         GetFocusManager())); | 
| 2212   } | 2167   } | 
| 2213 | 2168 | 
| 2214   gfx::Size min_devtools_size(devtools_window_->GetMinimumWidth(), | 2169   // Restore focus to the last focused view when hiding devtools window. | 
| 2215       devtools_window_->GetMinimumHeight()); | 2170   if (devtools_window_ && !new_devtools_window && | 
| 2216   devtools_container_->SetPreferredSize(min_devtools_size); | 2171       devtools_focus_tracker_.get()) { | 
|  | 2172     devtools_focus_tracker_->FocusLastFocusedExternalView(); | 
|  | 2173     devtools_focus_tracker_.reset(); | 
|  | 2174   } | 
| 2217 | 2175 | 
| 2218   devtools_container_->SetVisible(true); | 2176   devtools_window_ = new_devtools_window; | 
| 2219   devtools_dock_side_ = devtools_window_->dock_side(); | 2177   if (devtools_window_) { | 
| 2220   bool dock_to_right = devtools_dock_side_ == DEVTOOLS_DOCK_SIDE_RIGHT; | 2178     devtools_web_view_->SetPreferredSize(devtools_window_->GetMinimumSize()); | 
| 2221   contents_split_->set_orientation( | 2179     devtools_web_view_->SetVisible(true); | 
| 2222       dock_to_right ? views::SingleSplitView::HORIZONTAL_SPLIT | 2180     GetContentsLayoutManager()->SetContentsViewInsets( | 
| 2223                     : views::SingleSplitView::VERTICAL_SPLIT); | 2181         devtools_window_->GetContentsInsets()); | 
| 2224   UpdateDevToolsSplitPosition(); |  | 
| 2225   contents_split_->InvalidateLayout(); |  | 
| 2226   Layout(); |  | 
| 2227 } |  | 
| 2228 |  | 
| 2229 void BrowserView::HideDevToolsContainer() { |  | 
| 2230   // Restore focus to the last focused view when hiding devtools window. |  | 
| 2231   devtools_focus_tracker_->FocusLastFocusedExternalView(); |  | 
| 2232   devtools_container_->SetVisible(false); |  | 
| 2233   contents_split_->InvalidateLayout(); |  | 
| 2234   Layout(); |  | 
| 2235 } |  | 
| 2236 |  | 
| 2237 void BrowserView::UpdateDevToolsSplitPosition() { |  | 
| 2238   contents_split_->set_resize_disabled( |  | 
| 2239       devtools_window_->dock_side() == DEVTOOLS_DOCK_SIDE_MINIMIZED); |  | 
| 2240   int split_size = contents_split_->GetDividerSize(); |  | 
| 2241   if (devtools_window_->dock_side() == DEVTOOLS_DOCK_SIDE_RIGHT) { |  | 
| 2242     int split_offset = contents_split_->width() - split_size - |  | 
| 2243         devtools_window_->GetWidth(contents_split_->width()); |  | 
| 2244     contents_split_->set_divider_offset(split_offset); |  | 
| 2245   } else { | 2182   } else { | 
| 2246     int height = devtools_window_->dock_side() == DEVTOOLS_DOCK_SIDE_MINIMIZED ? | 2183     devtools_web_view_->SetVisible(false); | 
| 2247         devtools_window_->GetMinimizedHeight() : | 2184     GetContentsLayoutManager()->SetContentsViewInsets(gfx::Insets()); | 
| 2248         devtools_window_->GetHeight(contents_split_->height()); |  | 
| 2249     int split_offset = contents_split_->height() - split_size - height; |  | 
| 2250     contents_split_->set_divider_offset(split_offset); |  | 
| 2251   } | 2185   } | 
|  | 2186   contents_container_->Layout(); | 
| 2252 } | 2187 } | 
| 2253 | 2188 | 
| 2254 void BrowserView::UpdateUIForContents(WebContents* contents) { | 2189 void BrowserView::UpdateUIForContents(WebContents* contents) { | 
| 2255   bool needs_layout = MaybeShowBookmarkBar(contents); | 2190   bool needs_layout = MaybeShowBookmarkBar(contents); | 
| 2256   // TODO(jamescook): This function always returns true. Remove it and figure | 2191   // TODO(jamescook): This function always returns true. Remove it and figure | 
| 2257   // out when layout is actually required. | 2192   // out when layout is actually required. | 
| 2258   needs_layout |= MaybeShowInfoBar(contents); | 2193   needs_layout |= MaybeShowInfoBar(contents); | 
| 2259   if (needs_layout) | 2194   if (needs_layout) | 
| 2260     Layout(); | 2195     Layout(); | 
| 2261 } | 2196 } | 
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2672       !GetLocationBar()->GetOmniboxView()->model()->popup_model()->IsOpen()) { | 2607       !GetLocationBar()->GetOmniboxView()->model()->popup_model()->IsOpen()) { | 
| 2673     gfx::Point icon_bottom( | 2608     gfx::Point icon_bottom( | 
| 2674         toolbar_->location_bar()->GetLocationBarAnchorPoint()); | 2609         toolbar_->location_bar()->GetLocationBarAnchorPoint()); | 
| 2675     ConvertPointToTarget(toolbar_->location_bar(), this, &icon_bottom); | 2610     ConvertPointToTarget(toolbar_->location_bar(), this, &icon_bottom); | 
| 2676     gfx::Point infobar_top(0, infobar_container_->GetVerticalOverlap(NULL)); | 2611     gfx::Point infobar_top(0, infobar_container_->GetVerticalOverlap(NULL)); | 
| 2677     ConvertPointToTarget(infobar_container_, this, &infobar_top); | 2612     ConvertPointToTarget(infobar_container_, this, &infobar_top); | 
| 2678     top_arrow_height = infobar_top.y() - icon_bottom.y(); | 2613     top_arrow_height = infobar_top.y() - icon_bottom.y(); | 
| 2679   } | 2614   } | 
| 2680   return top_arrow_height; | 2615   return top_arrow_height; | 
| 2681 } | 2616 } | 
| OLD | NEW | 
|---|