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" |
11 #include "base/i18n/rtl.h" | 11 #include "base/i18n/rtl.h" |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
14 #include "base/prefs/pref_service.h" | 14 #include "base/prefs/pref_service.h" |
15 #include "base/profiler/scoped_tracker.h" | 15 #include "base/profiler/scoped_tracker.h" |
16 #include "base/strings/string_number_conversions.h" | 16 #include "base/strings/string_number_conversions.h" |
17 #include "chrome/app/chrome_command_ids.h" | 17 #include "chrome/app/chrome_command_ids.h" |
18 #include "chrome/app/chrome_dll_resource.h" | 18 #include "chrome/app/chrome_dll_resource.h" |
19 #include "chrome/browser/app_mode/app_mode_utils.h" | 19 #include "chrome/browser/app_mode/app_mode_utils.h" |
20 #include "chrome/browser/bookmarks/bookmark_stats.h" | 20 #include "chrome/browser/bookmarks/bookmark_stats.h" |
21 #include "chrome/browser/browser_process.h" | 21 #include "chrome/browser/browser_process.h" |
22 #include "chrome/browser/chrome_notification_types.h" | 22 #include "chrome/browser/chrome_notification_types.h" |
23 #include "chrome/browser/extensions/extension_util.h" | 23 #include "chrome/browser/extensions/extension_util.h" |
| 24 #include "chrome/browser/extensions/sidebar_container.h" |
| 25 #include "chrome/browser/extensions/sidebar_manager.h" |
24 #include "chrome/browser/extensions/tab_helper.h" | 26 #include "chrome/browser/extensions/tab_helper.h" |
25 #include "chrome/browser/infobars/infobar_service.h" | 27 #include "chrome/browser/infobars/infobar_service.h" |
26 #include "chrome/browser/native_window_notification_source.h" | 28 #include "chrome/browser/native_window_notification_source.h" |
27 #include "chrome/browser/profiles/avatar_menu.h" | 29 #include "chrome/browser/profiles/avatar_menu.h" |
28 #include "chrome/browser/profiles/profile.h" | 30 #include "chrome/browser/profiles/profile.h" |
29 #include "chrome/browser/profiles/profile_avatar_icon_util.h" | 31 #include "chrome/browser/profiles/profile_avatar_icon_util.h" |
30 #include "chrome/browser/profiles/profile_info_cache.h" | 32 #include "chrome/browser/profiles/profile_info_cache.h" |
31 #include "chrome/browser/profiles/profile_manager.h" | 33 #include "chrome/browser/profiles/profile_manager.h" |
32 #include "chrome/browser/profiles/profile_window.h" | 34 #include "chrome/browser/profiles/profile_window.h" |
33 #include "chrome/browser/profiles/profiles_state.h" | 35 #include "chrome/browser/profiles/profiles_state.h" |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 #include "ui/base/resource/resource_bundle.h" | 126 #include "ui/base/resource/resource_bundle.h" |
125 #include "ui/base/theme_provider.h" | 127 #include "ui/base/theme_provider.h" |
126 #include "ui/content_accelerators/accelerator_util.h" | 128 #include "ui/content_accelerators/accelerator_util.h" |
127 #include "ui/events/event_utils.h" | 129 #include "ui/events/event_utils.h" |
128 #include "ui/gfx/canvas.h" | 130 #include "ui/gfx/canvas.h" |
129 #include "ui/gfx/color_utils.h" | 131 #include "ui/gfx/color_utils.h" |
130 #include "ui/gfx/geometry/rect_conversions.h" | 132 #include "ui/gfx/geometry/rect_conversions.h" |
131 #include "ui/gfx/screen.h" | 133 #include "ui/gfx/screen.h" |
132 #include "ui/strings/grit/ui_strings.h" | 134 #include "ui/strings/grit/ui_strings.h" |
133 #include "ui/views/controls/button/menu_button.h" | 135 #include "ui/views/controls/button/menu_button.h" |
| 136 #include "ui/views/controls/single_split_view.h" |
| 137 #include "ui/views/controls/single_split_view_listener.h" |
134 #include "ui/views/controls/textfield/textfield.h" | 138 #include "ui/views/controls/textfield/textfield.h" |
135 #include "ui/views/controls/webview/webview.h" | 139 #include "ui/views/controls/webview/webview.h" |
136 #include "ui/views/focus/external_focus_tracker.h" | 140 #include "ui/views/focus/external_focus_tracker.h" |
137 #include "ui/views/focus/view_storage.h" | 141 #include "ui/views/focus/view_storage.h" |
| 142 #include "ui/views/layout/box_layout.h" |
138 #include "ui/views/layout/grid_layout.h" | 143 #include "ui/views/layout/grid_layout.h" |
139 #include "ui/views/widget/native_widget.h" | 144 #include "ui/views/widget/native_widget.h" |
140 #include "ui/views/widget/root_view.h" | 145 #include "ui/views/widget/root_view.h" |
141 #include "ui/views/widget/widget.h" | 146 #include "ui/views/widget/widget.h" |
142 #include "ui/views/window/dialog_delegate.h" | 147 #include "ui/views/window/dialog_delegate.h" |
143 | 148 |
144 #if defined(USE_AURA) | 149 #if defined(USE_AURA) |
145 #include "ui/aura/client/window_tree_client.h" | 150 #include "ui/aura/client/window_tree_client.h" |
146 #include "ui/aura/window.h" | 151 #include "ui/aura/window.h" |
147 #include "ui/aura/window_tree_host.h" | 152 #include "ui/aura/window_tree_host.h" |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
512 | 517 |
513 // Explicitly set browser_ to null. | 518 // Explicitly set browser_ to null. |
514 browser_.reset(); | 519 browser_.reset(); |
515 } | 520 } |
516 | 521 |
517 void BrowserView::Init(Browser* browser) { | 522 void BrowserView::Init(Browser* browser) { |
518 browser_.reset(browser); | 523 browser_.reset(browser); |
519 browser_->tab_strip_model()->AddObserver(this); | 524 browser_->tab_strip_model()->AddObserver(this); |
520 immersive_mode_controller_.reset( | 525 immersive_mode_controller_.reset( |
521 chrome::CreateImmersiveModeController(browser_->host_desktop_type())); | 526 chrome::CreateImmersiveModeController(browser_->host_desktop_type())); |
| 527 |
| 528 extensions::SidebarManager* sidebar_manager = |
| 529 extensions::SidebarManager::GetFromContext(browser_->profile()); |
| 530 sidebar_manager->AddObserver(this); |
522 } | 531 } |
523 | 532 |
524 // static | 533 // static |
525 BrowserView* BrowserView::GetBrowserViewForNativeWindow( | 534 BrowserView* BrowserView::GetBrowserViewForNativeWindow( |
526 gfx::NativeWindow window) { | 535 gfx::NativeWindow window) { |
527 views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window); | 536 views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window); |
528 return widget ? | 537 return widget ? |
529 reinterpret_cast<BrowserView*>(widget->GetNativeWindowProperty( | 538 reinterpret_cast<BrowserView*>(widget->GetNativeWindowProperty( |
530 kBrowserViewKey)) : nullptr; | 539 kBrowserViewKey)) : nullptr; |
531 } | 540 } |
532 | 541 |
533 // static | 542 // static |
534 BrowserView* BrowserView::GetBrowserViewForBrowser(const Browser* browser) { | 543 BrowserView* BrowserView::GetBrowserViewForBrowser(const Browser* browser) { |
535 return static_cast<BrowserView*>(browser->window()); | 544 return static_cast<BrowserView*>(browser->window()); |
536 } | 545 } |
537 | 546 |
538 void BrowserView::InitStatusBubble() { | 547 void BrowserView::InitStatusBubble() { |
539 status_bubble_.reset(new StatusBubbleViews(contents_web_view_)); | 548 status_bubble_.reset(new StatusBubbleViews(contents_web_view_)); |
540 contents_web_view_->SetStatusBubble(status_bubble_.get()); | 549 contents_web_view_->SetStatusBubble(status_bubble_.get()); |
541 } | 550 } |
542 | 551 |
| 552 bool BrowserView::SplitHandleMoved(views::SingleSplitView* sender) { |
| 553 for (int i = 0; i < sender->child_count(); ++i) |
| 554 sender->child_at(i)->InvalidateLayout(); |
| 555 SchedulePaint(); |
| 556 Layout(); |
| 557 return false; |
| 558 } |
| 559 |
543 gfx::Rect BrowserView::GetToolbarBounds() const { | 560 gfx::Rect BrowserView::GetToolbarBounds() const { |
544 gfx::Rect toolbar_bounds(toolbar_->bounds()); | 561 gfx::Rect toolbar_bounds(toolbar_->bounds()); |
545 if (toolbar_bounds.IsEmpty()) | 562 if (toolbar_bounds.IsEmpty()) |
546 return toolbar_bounds; | 563 return toolbar_bounds; |
547 // The apparent toolbar edges are outside the "real" toolbar edges. | 564 // The apparent toolbar edges are outside the "real" toolbar edges. |
548 toolbar_bounds.Inset(-views::NonClientFrameView::kClientEdgeThickness, 0); | 565 toolbar_bounds.Inset(-views::NonClientFrameView::kClientEdgeThickness, 0); |
549 return toolbar_bounds; | 566 return toolbar_bounds; |
550 } | 567 } |
551 | 568 |
552 gfx::Rect BrowserView::GetFindBarBoundingBox() const { | 569 gfx::Rect BrowserView::GetFindBarBoundingBox() const { |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 } | 664 } |
648 | 665 |
649 WebContents* BrowserView::GetActiveWebContents() const { | 666 WebContents* BrowserView::GetActiveWebContents() const { |
650 return browser_->tab_strip_model()->GetActiveWebContents(); | 667 return browser_->tab_strip_model()->GetActiveWebContents(); |
651 } | 668 } |
652 | 669 |
653 gfx::ImageSkia BrowserView::GetOTRAvatarIcon() const { | 670 gfx::ImageSkia BrowserView::GetOTRAvatarIcon() const { |
654 return *GetThemeProvider()->GetImageSkiaNamed(IDR_OTR_ICON); | 671 return *GetThemeProvider()->GetImageSkiaNamed(IDR_OTR_ICON); |
655 } | 672 } |
656 | 673 |
| 674 void BrowserView::OnSidebarShown(content::WebContents* tab, |
| 675 const std::string& content_id) { |
| 676 UpdateSidebarForContents(tab); |
| 677 } |
| 678 |
| 679 void BrowserView::OnSidebarHidden(content::WebContents* tab, |
| 680 const std::string& content_id) { |
| 681 UpdateSidebarForContents(tab); |
| 682 } |
| 683 |
657 /////////////////////////////////////////////////////////////////////////////// | 684 /////////////////////////////////////////////////////////////////////////////// |
658 // BrowserView, BrowserWindow implementation: | 685 // BrowserView, BrowserWindow implementation: |
659 | 686 |
660 void BrowserView::Show() { | 687 void BrowserView::Show() { |
661 #if !defined(OS_WIN) | 688 #if !defined(OS_WIN) |
662 // The Browser associated with this browser window must become the active | 689 // The Browser associated with this browser window must become the active |
663 // browser at the time |Show()| is called. This is the natural behavior under | 690 // browser at the time |Show()| is called. This is the natural behavior under |
664 // Windows and Ash, but other platforms will not trigger | 691 // Windows and Ash, but other platforms will not trigger |
665 // OnWidgetActivationChanged() until we return to the runloop. Therefore any | 692 // OnWidgetActivationChanged() until we return to the runloop. Therefore any |
666 // calls to Browser::GetLastActive() will return the wrong result if we do not | 693 // calls to Browser::GetLastActive() will return the wrong result if we do not |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
876 PermissionBubbleManager::FromWebContents(new_contents)->SetView( | 903 PermissionBubbleManager::FromWebContents(new_contents)->SetView( |
877 permission_bubble_.get()); | 904 permission_bubble_.get()); |
878 } | 905 } |
879 | 906 |
880 UpdateUIForContents(new_contents); | 907 UpdateUIForContents(new_contents); |
881 | 908 |
882 // Layout for DevTools _before_ setting the both main and devtools WebContents | 909 // Layout for DevTools _before_ setting the both main and devtools WebContents |
883 // to avoid toggling the size of any of them. | 910 // to avoid toggling the size of any of them. |
884 UpdateDevToolsForContents(new_contents, !change_tab_contents); | 911 UpdateDevToolsForContents(new_contents, !change_tab_contents); |
885 | 912 |
| 913 UpdateSidebarForContents(new_contents); |
886 if (change_tab_contents) { | 914 if (change_tab_contents) { |
887 web_contents_close_handler_->ActiveTabChanged(); | 915 web_contents_close_handler_->ActiveTabChanged(); |
888 contents_web_view_->SetWebContents(new_contents); | 916 contents_web_view_->SetWebContents(new_contents); |
889 // The second layout update should be no-op. It will just set the | 917 // The second layout update should be no-op. It will just set the |
890 // DevTools WebContents. | 918 // DevTools WebContents. |
891 UpdateDevToolsForContents(new_contents, true); | 919 UpdateDevToolsForContents(new_contents, true); |
892 } | 920 } |
893 | 921 |
894 if (!browser_->tab_strip_model()->closing_all() && GetWidget()->IsActive() && | 922 if (!browser_->tab_strip_model()->closing_all() && GetWidget()->IsActive() && |
895 GetWidget()->IsVisible()) { | 923 GetWidget()->IsVisible()) { |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1304 anchor_view = toolbar_->app_menu(); | 1332 anchor_view = toolbar_->app_menu(); |
1305 else | 1333 else |
1306 anchor_view = toolbar_->location_bar(); | 1334 anchor_view = toolbar_->location_bar(); |
1307 | 1335 |
1308 OneClickSigninBubbleView::ShowBubble(type, email, error_message, | 1336 OneClickSigninBubbleView::ShowBubble(type, email, error_message, |
1309 delegate.Pass(), anchor_view, | 1337 delegate.Pass(), anchor_view, |
1310 start_sync_callback); | 1338 start_sync_callback); |
1311 } | 1339 } |
1312 #endif | 1340 #endif |
1313 | 1341 |
| 1342 int BrowserView::GetSidebarWidth() const { |
| 1343 if (!sidebar_container_ || !sidebar_container_->visible()) |
| 1344 return 0; |
| 1345 return sidebar_split_->divider_offset(); |
| 1346 } |
| 1347 |
1314 void BrowserView::SetDownloadShelfVisible(bool visible) { | 1348 void BrowserView::SetDownloadShelfVisible(bool visible) { |
1315 // This can be called from the superclass destructor, when it destroys our | 1349 // This can be called from the superclass destructor, when it destroys our |
1316 // child views. At that point, browser_ is already gone. | 1350 // child views. At that point, browser_ is already gone. |
1317 if (!browser_) | 1351 if (!browser_) |
1318 return; | 1352 return; |
1319 | 1353 |
1320 if (visible && IsDownloadShelfVisible() != visible) { | 1354 if (visible && IsDownloadShelfVisible() != visible) { |
1321 // Invoke GetDownloadShelf to force the shelf to be created. | 1355 // Invoke GetDownloadShelf to force the shelf to be created. |
1322 GetDownloadShelf(); | 1356 GetDownloadShelf(); |
1323 } | 1357 } |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1557 // browser_->GetActiveWebContents() will return null or something else. | 1591 // browser_->GetActiveWebContents() will return null or something else. |
1558 if (index == browser_->tab_strip_model()->active_index()) { | 1592 if (index == browser_->tab_strip_model()->active_index()) { |
1559 // We need to reset the current tab contents to null before it gets | 1593 // We need to reset the current tab contents to null before it gets |
1560 // freed. This is because the focus manager performs some operations | 1594 // freed. This is because the focus manager performs some operations |
1561 // on the selected WebContents when it is removed. | 1595 // on the selected WebContents when it is removed. |
1562 web_contents_close_handler_->ActiveTabChanged(); | 1596 web_contents_close_handler_->ActiveTabChanged(); |
1563 contents_web_view_->SetWebContents(nullptr); | 1597 contents_web_view_->SetWebContents(nullptr); |
1564 infobar_container_->ChangeInfoBarManager(nullptr); | 1598 infobar_container_->ChangeInfoBarManager(nullptr); |
1565 UpdateDevToolsForContents(nullptr, true); | 1599 UpdateDevToolsForContents(nullptr, true); |
1566 } | 1600 } |
| 1601 UpdateSidebarForContents(NULL); |
1567 } | 1602 } |
1568 | 1603 |
1569 void BrowserView::TabDeactivated(WebContents* contents) { | 1604 void BrowserView::TabDeactivated(WebContents* contents) { |
1570 if (PermissionBubbleManager::FromWebContents(contents)) | 1605 if (PermissionBubbleManager::FromWebContents(contents)) |
1571 PermissionBubbleManager::FromWebContents(contents)->SetView(nullptr); | 1606 PermissionBubbleManager::FromWebContents(contents)->SetView(nullptr); |
1572 | 1607 |
1573 // We do not store the focus when closing the tab to work-around bug 4633. | 1608 // We do not store the focus when closing the tab to work-around bug 4633. |
1574 // Some reports seem to show that the focus manager and/or focused view can | 1609 // Some reports seem to show that the focus manager and/or focused view can |
1575 // be garbage at that point, it is not clear why. | 1610 // be garbage at that point, it is not clear why. |
1576 if (!contents->IsBeingDestroyed()) | 1611 if (!contents->IsBeingDestroyed()) |
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2035 devtools_web_view_->SetVisible(false); | 2070 devtools_web_view_->SetVisible(false); |
2036 | 2071 |
2037 contents_container_ = new views::View(); | 2072 contents_container_ = new views::View(); |
2038 contents_container_->set_background(views::Background::CreateSolidBackground( | 2073 contents_container_->set_background(views::Background::CreateSolidBackground( |
2039 ThemeProperties::GetDefaultColor( | 2074 ThemeProperties::GetDefaultColor( |
2040 ThemeProperties::COLOR_CONTROL_BACKGROUND))); | 2075 ThemeProperties::COLOR_CONTROL_BACKGROUND))); |
2041 contents_container_->AddChildView(devtools_web_view_); | 2076 contents_container_->AddChildView(devtools_web_view_); |
2042 contents_container_->AddChildView(contents_web_view_); | 2077 contents_container_->AddChildView(contents_web_view_); |
2043 contents_container_->SetLayoutManager(new ContentsLayoutManager( | 2078 contents_container_->SetLayoutManager(new ContentsLayoutManager( |
2044 devtools_web_view_, contents_web_view_)); | 2079 devtools_web_view_, contents_web_view_)); |
2045 AddChildView(contents_container_); | 2080 |
2046 set_contents_view(contents_container_); | 2081 sidebar_web_view_ = new views::WebView(browser_->profile()); |
| 2082 sidebar_web_view_->set_id(VIEW_ID_SIDE_BAR_VIEW); |
| 2083 sidebar_web_view_->SetVisible(false); |
| 2084 |
| 2085 sidebar_container_ = new views::View(); |
| 2086 sidebar_container_->AddChildView(sidebar_web_view_); |
| 2087 sidebar_container_->set_id(VIEW_ID_SIDE_BAR_CONTAINER); |
| 2088 sidebar_container_->SetVisible(false); |
| 2089 |
| 2090 sidebar_split_ = new views::SingleSplitView( |
| 2091 contents_container_, sidebar_container_, |
| 2092 views::SingleSplitView::HORIZONTAL_SPLIT, this); |
| 2093 |
| 2094 sidebar_split_->set_id(VIEW_ID_SIDE_BAR_SPLIT); |
| 2095 sidebar_split_->set_background(views::Background::CreateSolidBackground( |
| 2096 GetWidget()->GetThemeProvider()->GetColor( |
| 2097 ThemeProperties::COLOR_TOOLBAR))); |
| 2098 sidebar_split_->set_resize_leading_on_bounds_change(false); |
| 2099 AddChildView(sidebar_split_); |
| 2100 set_contents_view(sidebar_split_); |
2047 | 2101 |
2048 // Top container holds tab strip and toolbar and lives at the front of the | 2102 // Top container holds tab strip and toolbar and lives at the front of the |
2049 // view hierarchy. | 2103 // view hierarchy. |
2050 top_container_ = new TopContainerView(this); | 2104 top_container_ = new TopContainerView(this); |
2051 AddChildView(top_container_); | 2105 AddChildView(top_container_); |
2052 | 2106 |
2053 // TabStrip takes ownership of the controller. | 2107 // TabStrip takes ownership of the controller. |
2054 BrowserTabStripController* tabstrip_controller = | 2108 BrowserTabStripController* tabstrip_controller = |
2055 new BrowserTabStripController(browser_.get(), | 2109 new BrowserTabStripController(browser_.get(), |
2056 browser_->tab_strip_model()); | 2110 browser_->tab_strip_model()); |
2057 tabstrip_ = new TabStrip(tabstrip_controller); | 2111 tabstrip_ = new TabStrip(tabstrip_controller); |
2058 top_container_->AddChildView(tabstrip_); | 2112 top_container_->AddChildView(tabstrip_); |
2059 tabstrip_controller->InitFromModel(tabstrip_); | 2113 tabstrip_controller->InitFromModel(tabstrip_); |
2060 | 2114 |
2061 toolbar_ = new ToolbarView(browser_.get()); | 2115 toolbar_ = new ToolbarView(browser_.get()); |
2062 top_container_->AddChildView(toolbar_); | 2116 top_container_->AddChildView(toolbar_); |
2063 toolbar_->Init(); | 2117 toolbar_->Init(); |
2064 | 2118 |
2065 InitStatusBubble(); | 2119 InitStatusBubble(); |
2066 | 2120 |
2067 // Create do-nothing view for the sake of controlling the z-order of the find | 2121 // Create do-nothing view for the sake of controlling the z-order of the find |
2068 // bar widget. | 2122 // bar widget. |
2069 find_bar_host_view_ = new View(); | 2123 find_bar_host_view_ = new View(); |
2070 AddChildView(find_bar_host_view_); | 2124 AddChildView(find_bar_host_view_); |
2071 | 2125 |
2072 immersive_mode_controller_->Init(this); | 2126 immersive_mode_controller_->Init(this); |
2073 | 2127 |
2074 BrowserViewLayout* browser_view_layout = new BrowserViewLayout; | 2128 BrowserViewLayout* browser_view_layout = new BrowserViewLayout; |
2075 browser_view_layout->Init(new BrowserViewLayoutDelegateImpl(this), | 2129 browser_view_layout->Init( |
2076 browser(), | 2130 new BrowserViewLayoutDelegateImpl(this), browser(), this, top_container_, |
2077 this, | 2131 tabstrip_, toolbar_, infobar_container_, sidebar_split_, |
2078 top_container_, | 2132 GetContentsLayoutManager(), immersive_mode_controller_.get()); |
2079 tabstrip_, | |
2080 toolbar_, | |
2081 infobar_container_, | |
2082 contents_container_, | |
2083 GetContentsLayoutManager(), | |
2084 immersive_mode_controller_.get()); | |
2085 SetLayoutManager(browser_view_layout); | 2133 SetLayoutManager(browser_view_layout); |
2086 | 2134 |
2087 #if defined(OS_WIN) | 2135 #if defined(OS_WIN) |
2088 // Create a custom JumpList and add it to an observer of TabRestoreService | 2136 // Create a custom JumpList and add it to an observer of TabRestoreService |
2089 // so we can update the custom JumpList when a tab is added or removed. | 2137 // so we can update the custom JumpList when a tab is added or removed. |
2090 if (JumpList::Enabled()) { | 2138 if (JumpList::Enabled()) { |
2091 load_complete_listener_.reset(new LoadCompleteListener(this)); | 2139 load_complete_listener_.reset(new LoadCompleteListener(this)); |
2092 } | 2140 } |
2093 #endif | 2141 #endif |
2094 | 2142 |
2095 GetLocationBar()->GetOmniboxView()->model()->popup_model()->AddObserver(this); | 2143 GetLocationBar()->GetOmniboxView()->model()->popup_model()->AddObserver(this); |
2096 } | 2144 } |
2097 | 2145 |
| 2146 void BrowserView::UpdateSidebarForContents(content::WebContents* new_contents) { |
| 2147 if (!sidebar_container_) |
| 2148 return; // Happens when sidebar is not allowed. |
| 2149 extensions::SidebarManager* sidebar_manager = |
| 2150 extensions::SidebarManager::GetFromContext(browser_->profile()); |
| 2151 if (!sidebar_manager) |
| 2152 return; // Happens only in tests.s |
| 2153 |
| 2154 WebContents* sidebar_contents = NULL; |
| 2155 if (new_contents) { |
| 2156 SidebarContainer* client_host = |
| 2157 sidebar_manager->GetActiveSidebarContainerFor(new_contents); |
| 2158 if (client_host) |
| 2159 sidebar_contents = client_host->host_contents(); |
| 2160 } |
| 2161 |
| 2162 bool visible = NULL != sidebar_contents; |
| 2163 |
| 2164 bool should_show = visible && !sidebar_container_->visible(); |
| 2165 bool should_hide = !visible && sidebar_container_->visible(); |
| 2166 |
| 2167 // Update sidebar content. |
| 2168 WebContents* old_contents = |
| 2169 static_cast<WebContents*>(sidebar_web_view_->web_contents()); |
| 2170 |
| 2171 sidebar_web_view_->SetWebContents(sidebar_contents); |
| 2172 |
| 2173 sidebar_manager->NotifyStateChanges(old_contents, sidebar_contents); |
| 2174 |
| 2175 // Update sidebar UI width. |
| 2176 if (should_show) { |
| 2177 // Restore split offset. |
| 2178 int sidebar_width = g_browser_process->local_state()->GetInteger( |
| 2179 prefs::kExtensionSidebarWidth); |
| 2180 if (sidebar_width < 0) { |
| 2181 // By default sidebar width is 1/7th of the current page content width. |
| 2182 sidebar_width = sidebar_split_->width() / 7; |
| 2183 } |
| 2184 int min_sidebar_width = sidebar_split_->GetMinimumSize().width(); |
| 2185 // Not allowed to be wider than 50% of the split-view's frame |
| 2186 sidebar_width = std::min(sidebar_split_->width() / 2 - min_sidebar_width, |
| 2187 std::max(min_sidebar_width, sidebar_width)); |
| 2188 sidebar_split_->set_divider_offset(sidebar_split_->width() - sidebar_width); |
| 2189 |
| 2190 sidebar_container_->SetVisible(true); |
| 2191 sidebar_web_view_->SetVisible(true); |
| 2192 sidebar_split_->InvalidateLayout(); |
| 2193 Layout(); |
| 2194 |
| 2195 } else if (should_hide) { |
| 2196 // Store split offset when hiding sidebar only. |
| 2197 g_browser_process->local_state()->SetInteger( |
| 2198 prefs::kExtensionSidebarWidth, |
| 2199 sidebar_split_->width() - sidebar_split_->divider_offset()); |
| 2200 |
| 2201 sidebar_container_->SetVisible(false); |
| 2202 sidebar_split_->InvalidateLayout(); |
| 2203 Layout(); |
| 2204 } |
| 2205 } |
| 2206 |
2098 void BrowserView::LoadingAnimationCallback() { | 2207 void BrowserView::LoadingAnimationCallback() { |
2099 base::TimeTicks now = base::TimeTicks::Now(); | 2208 base::TimeTicks now = base::TimeTicks::Now(); |
2100 if (!last_animation_time_.is_null()) { | 2209 if (!last_animation_time_.is_null()) { |
2101 UMA_HISTOGRAM_TIMES( | 2210 UMA_HISTOGRAM_TIMES( |
2102 "Tabs.LoadingAnimationTime", | 2211 "Tabs.LoadingAnimationTime", |
2103 now - last_animation_time_); | 2212 now - last_animation_time_); |
2104 } | 2213 } |
2105 last_animation_time_ = now; | 2214 last_animation_time_ = now; |
2106 if (browser_->is_type_tabbed()) { | 2215 if (browser_->is_type_tabbed()) { |
2107 // Loading animations are shown in the tab for tabbed windows. We check the | 2216 // Loading animations are shown in the tab for tabbed windows. We check the |
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2615 return immersive_mode_controller()->IsEnabled(); | 2724 return immersive_mode_controller()->IsEnabled(); |
2616 } | 2725 } |
2617 | 2726 |
2618 views::Widget* BrowserView::GetBubbleAssociatedWidget() { | 2727 views::Widget* BrowserView::GetBubbleAssociatedWidget() { |
2619 return GetWidget(); | 2728 return GetWidget(); |
2620 } | 2729 } |
2621 | 2730 |
2622 gfx::Rect BrowserView::GetTopContainerBoundsInScreen() { | 2731 gfx::Rect BrowserView::GetTopContainerBoundsInScreen() { |
2623 return top_container_->GetBoundsInScreen(); | 2732 return top_container_->GetBoundsInScreen(); |
2624 } | 2733 } |
OLD | NEW |