| 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/frame/browser_view.h" | 5 #include "chrome/browser/ui/views/frame/browser_view.h" |
| 6 | 6 |
| 7 #if defined(OS_LINUX) | 7 #if defined(OS_LINUX) |
| 8 #include <gtk/gtk.h> | 8 #include <gtk/gtk.h> |
| 9 #endif | 9 #endif |
| 10 | 10 |
| (...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 #endif | 465 #endif |
| 466 | 466 |
| 467 // We destroy the download shelf before |browser_| to remove its child | 467 // We destroy the download shelf before |browser_| to remove its child |
| 468 // download views from the set of download observers (since the observed | 468 // download views from the set of download observers (since the observed |
| 469 // downloads can be destroyed along with |browser_| and the observer | 469 // downloads can be destroyed along with |browser_| and the observer |
| 470 // notifications will call back into deleted objects). | 470 // notifications will call back into deleted objects). |
| 471 download_shelf_.reset(); | 471 download_shelf_.reset(); |
| 472 | 472 |
| 473 // The TabStrip attaches a listener to the model. Make sure we shut down the | 473 // The TabStrip attaches a listener to the model. Make sure we shut down the |
| 474 // TabStrip first so that it can cleanly remove the listener. | 474 // TabStrip first so that it can cleanly remove the listener. |
| 475 tabstrip_->parent()->RemoveChildView(tabstrip_); | 475 if (tabstrip_) { |
| 476 delete tabstrip_; | 476 tabstrip_->parent()->RemoveChildView(tabstrip_); |
| 477 tabstrip_ = NULL; | 477 delete tabstrip_; |
| 478 | 478 tabstrip_ = NULL; |
| 479 } |
| 479 // Child views maintain PrefMember attributes that point to | 480 // Child views maintain PrefMember attributes that point to |
| 480 // OffTheRecordProfile's PrefService which gets deleted by ~Browser. | 481 // OffTheRecordProfile's PrefService which gets deleted by ~Browser. |
| 481 RemoveAllChildViews(true); | 482 RemoveAllChildViews(true); |
| 482 // Explicitly set browser_ to NULL. | 483 // Explicitly set browser_ to NULL. |
| 483 browser_.reset(); | 484 browser_.reset(); |
| 484 } | 485 } |
| 485 | 486 |
| 486 // static | 487 // static |
| 487 BrowserView* BrowserView::GetBrowserViewForNativeWindow( | 488 BrowserView* BrowserView::GetBrowserViewForNativeWindow( |
| 488 gfx::NativeWindow window) { | 489 gfx::NativeWindow window) { |
| (...skipping 1155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1644 // Comment out for one cycle to see if this fixes dist tests. | 1645 // Comment out for one cycle to see if this fixes dist tests. |
| 1645 // tabstrip_->DestroyDragController(); | 1646 // tabstrip_->DestroyDragController(); |
| 1646 | 1647 |
| 1647 status_bubble_->Reposition(); | 1648 status_bubble_->Reposition(); |
| 1648 | 1649 |
| 1649 BrowserBubbleHost::WindowMoved(); | 1650 BrowserBubbleHost::WindowMoved(); |
| 1650 | 1651 |
| 1651 browser::HideBookmarkBubbleView(); | 1652 browser::HideBookmarkBubbleView(); |
| 1652 | 1653 |
| 1653 // Close the omnibox popup, if any. | 1654 // Close the omnibox popup, if any. |
| 1654 if (toolbar_->location_bar()) | 1655 if (toolbar_ && toolbar_->location_bar()) |
| 1655 toolbar_->location_bar()->location_entry()->ClosePopup(); | 1656 toolbar_->location_bar()->location_entry()->ClosePopup(); |
| 1656 } | 1657 } |
| 1657 | 1658 |
| 1658 /////////////////////////////////////////////////////////////////////////////// | 1659 /////////////////////////////////////////////////////////////////////////////// |
| 1659 // BrowserView, views::ClientView overrides: | 1660 // BrowserView, views::ClientView overrides: |
| 1660 | 1661 |
| 1661 bool BrowserView::CanClose() { | 1662 bool BrowserView::CanClose() { |
| 1662 // You cannot close a frame for which there is an active originating drag | 1663 // You cannot close a frame for which there is an active originating drag |
| 1663 // session. | 1664 // session. |
| 1664 if (!tabstrip_->IsTabStripCloseable()) | 1665 if (tabstrip_ && !tabstrip_->IsTabStripCloseable()) |
| 1665 return false; | 1666 return false; |
| 1666 | 1667 |
| 1667 // Give beforeunload handlers the chance to cancel the close before we hide | 1668 // Give beforeunload handlers the chance to cancel the close before we hide |
| 1668 // the window below. | 1669 // the window below. |
| 1669 if (!browser_->ShouldCloseWindow()) | 1670 if (!browser_->ShouldCloseWindow()) |
| 1670 return false; | 1671 return false; |
| 1671 | 1672 |
| 1672 if (!browser_->tabstrip_model()->empty()) { | 1673 if (!browser_->tabstrip_model()->empty()) { |
| 1673 // Tab strip isn't empty. Hide the frame (so it appears to have closed | 1674 // Tab strip isn't empty. Hide the frame (so it appears to have closed |
| 1674 // immediately) and close all the tabs, allowing the renderers to shut | 1675 // immediately) and close all the tabs, allowing the renderers to shut |
| 1675 // down. When the tab strip is empty we'll be called back again. | 1676 // down. When the tab strip is empty we'll be called back again. |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1813 void BrowserView::InitTabStrip(TabStripModel* model) { | 1814 void BrowserView::InitTabStrip(TabStripModel* model) { |
| 1814 // Throw away the existing tabstrip if we're switching display modes. | 1815 // Throw away the existing tabstrip if we're switching display modes. |
| 1815 scoped_ptr<AbstractTabStripView> old_strip(tabstrip_); | 1816 scoped_ptr<AbstractTabStripView> old_strip(tabstrip_); |
| 1816 if (tabstrip_) | 1817 if (tabstrip_) |
| 1817 tabstrip_->parent()->RemoveChildView(tabstrip_); | 1818 tabstrip_->parent()->RemoveChildView(tabstrip_); |
| 1818 | 1819 |
| 1819 tabstrip_ = CreateTabStrip(browser_.get(), model, UseVerticalTabs()); | 1820 tabstrip_ = CreateTabStrip(browser_.get(), model, UseVerticalTabs()); |
| 1820 AddChildView(tabstrip_); | 1821 AddChildView(tabstrip_); |
| 1821 } | 1822 } |
| 1822 | 1823 |
| 1823 /////////////////////////////////////////////////////////////////////////////// | 1824 ToolbarView* BrowserView::CreateToolbar() const { |
| 1824 // BrowserView, private: | 1825 return new ToolbarView(browser_.get()); |
| 1826 } |
| 1825 | 1827 |
| 1826 void BrowserView::Init() { | 1828 void BrowserView::Init() { |
| 1827 SetLayoutManager(CreateLayoutManager()); | 1829 SetLayoutManager(CreateLayoutManager()); |
| 1828 // Stow a pointer to this object onto the window handle so that we can get at | 1830 // Stow a pointer to this object onto the window handle so that we can get at |
| 1829 // it later when all we have is a native view. | 1831 // it later when all we have is a native view. |
| 1830 GetWidget()->native_widget()->SetNativeWindowProperty(kBrowserViewKey, this); | 1832 GetWidget()->native_widget()->SetNativeWindowProperty(kBrowserViewKey, this); |
| 1831 | 1833 |
| 1832 // Stow a pointer to the browser's profile onto the window handle so that we | 1834 // Stow a pointer to the browser's profile onto the window handle so that we |
| 1833 // can get it later when all we have is a native view. | 1835 // can get it later when all we have is a native view. |
| 1834 GetWidget()->native_widget()->SetNativeWindowProperty(Profile::kProfileKey, | 1836 GetWidget()->native_widget()->SetNativeWindowProperty(Profile::kProfileKey, |
| 1835 browser_->profile()); | 1837 browser_->profile()); |
| 1836 | 1838 |
| 1837 // Start a hung plugin window detector for this browser object (as long as | 1839 // Start a hung plugin window detector for this browser object (as long as |
| 1838 // hang detection is not disabled). | 1840 // hang detection is not disabled). |
| 1839 if (!CommandLine::ForCurrentProcess()->HasSwitch( | 1841 if (!CommandLine::ForCurrentProcess()->HasSwitch( |
| 1840 switches::kDisableHangMonitor)) { | 1842 switches::kDisableHangMonitor)) { |
| 1841 InitHangMonitor(); | 1843 InitHangMonitor(); |
| 1842 } | 1844 } |
| 1843 | 1845 |
| 1844 LoadAccelerators(); | 1846 LoadAccelerators(); |
| 1845 | 1847 |
| 1846 InitTabStrip(browser_->tabstrip_model()); | 1848 InitTabStrip(browser_->tabstrip_model()); |
| 1847 | 1849 |
| 1848 toolbar_ = new ToolbarView(browser_.get()); | 1850 SetToolbar(CreateToolbar()); |
| 1849 AddChildView(toolbar_); | |
| 1850 toolbar_->Init(browser_->profile()); | |
| 1851 | 1851 |
| 1852 infobar_container_ = new InfoBarContainer(this); | 1852 infobar_container_ = new InfoBarContainer(this); |
| 1853 AddChildView(infobar_container_); | 1853 AddChildView(infobar_container_); |
| 1854 | 1854 |
| 1855 contents_container_ = new TabContentsContainer; | 1855 contents_container_ = new TabContentsContainer; |
| 1856 contents_ = new ContentsContainer(contents_container_); | 1856 contents_ = new ContentsContainer(contents_container_); |
| 1857 | 1857 |
| 1858 SkColor bg_color = GetWidget()->GetThemeProvider()-> | 1858 SkColor bg_color = GetWidget()->GetThemeProvider()-> |
| 1859 GetColor(BrowserThemeProvider::COLOR_TOOLBAR); | 1859 GetColor(BrowserThemeProvider::COLOR_TOOLBAR); |
| 1860 | 1860 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1913 aeropeek_manager_.reset(new AeroPeekManager( | 1913 aeropeek_manager_.reset(new AeroPeekManager( |
| 1914 frame_->GetWindow()->GetNativeWindow())); | 1914 frame_->GetWindow()->GetNativeWindow())); |
| 1915 browser_->tabstrip_model()->AddObserver(aeropeek_manager_.get()); | 1915 browser_->tabstrip_model()->AddObserver(aeropeek_manager_.get()); |
| 1916 } | 1916 } |
| 1917 #endif | 1917 #endif |
| 1918 | 1918 |
| 1919 // We're now initialized and ready to process Layout requests. | 1919 // We're now initialized and ready to process Layout requests. |
| 1920 ignore_layout_ = false; | 1920 ignore_layout_ = false; |
| 1921 } | 1921 } |
| 1922 | 1922 |
| 1923 void BrowserView::LoadingAnimationCallback() { |
| 1924 base::TimeTicks now = base::TimeTicks::Now(); |
| 1925 if (!last_animation_time_.is_null()) { |
| 1926 UMA_HISTOGRAM_TIMES( |
| 1927 "Tabs.LoadingAnimationTime", |
| 1928 now - last_animation_time_); |
| 1929 } |
| 1930 last_animation_time_ = now; |
| 1931 if (browser_->type() == Browser::TYPE_NORMAL) { |
| 1932 // Loading animations are shown in the tab for tabbed windows. We check the |
| 1933 // browser type instead of calling IsTabStripVisible() because the latter |
| 1934 // will return false for fullscreen windows, but we still need to update |
| 1935 // their animations (so that when they come out of fullscreen mode they'll |
| 1936 // be correct). |
| 1937 tabstrip_->UpdateLoadingAnimations(); |
| 1938 } else if (ShouldShowWindowIcon()) { |
| 1939 // ... or in the window icon area for popups and app windows. |
| 1940 TabContents* tab_contents = browser_->GetSelectedTabContents(); |
| 1941 // GetSelectedTabContents can return NULL for example under Purify when |
| 1942 // the animations are running slowly and this function is called on a timer |
| 1943 // through LoadingAnimationCallback. |
| 1944 frame_->UpdateThrobber(tab_contents && tab_contents->is_loading()); |
| 1945 } |
| 1946 } |
| 1947 |
| 1948 // BrowserView, private -------------------------------------------------------- |
| 1949 |
| 1923 #if defined(OS_WIN) | 1950 #if defined(OS_WIN) |
| 1924 void BrowserView::InitSystemMenu() { | 1951 void BrowserView::InitSystemMenu() { |
| 1925 system_menu_contents_.reset(new views::SystemMenuModel(this)); | 1952 system_menu_contents_.reset(new views::SystemMenuModel(this)); |
| 1926 // We add the menu items in reverse order so that insertion_index never needs | 1953 // We add the menu items in reverse order so that insertion_index never needs |
| 1927 // to change. | 1954 // to change. |
| 1928 if (IsBrowserTypeNormal()) | 1955 if (IsBrowserTypeNormal()) |
| 1929 BuildSystemMenuForBrowserWindow(); | 1956 BuildSystemMenuForBrowserWindow(); |
| 1930 else | 1957 else |
| 1931 BuildSystemMenuForAppOrPopupWindow(browser_->type() == Browser::TYPE_APP); | 1958 BuildSystemMenuForAppOrPopupWindow(browser_->type() == Browser::TYPE_APP); |
| 1932 system_menu_.reset( | 1959 system_menu_.reset( |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2364 case APPCOMMAND_REDO: | 2391 case APPCOMMAND_REDO: |
| 2365 case APPCOMMAND_SPELL_CHECK: | 2392 case APPCOMMAND_SPELL_CHECK: |
| 2366 default: return -1; | 2393 default: return -1; |
| 2367 } | 2394 } |
| 2368 #else | 2395 #else |
| 2369 // App commands are Windows-specific so there's nothing to do here. | 2396 // App commands are Windows-specific so there's nothing to do here. |
| 2370 return -1; | 2397 return -1; |
| 2371 #endif | 2398 #endif |
| 2372 } | 2399 } |
| 2373 | 2400 |
| 2374 void BrowserView::LoadingAnimationCallback() { | |
| 2375 base::TimeTicks now = base::TimeTicks::Now(); | |
| 2376 if (!last_animation_time_.is_null()) { | |
| 2377 UMA_HISTOGRAM_TIMES( | |
| 2378 "Tabs.LoadingAnimationTime", | |
| 2379 now - last_animation_time_); | |
| 2380 } | |
| 2381 last_animation_time_ = now; | |
| 2382 if (browser_->type() == Browser::TYPE_NORMAL) { | |
| 2383 // Loading animations are shown in the tab for tabbed windows. We check the | |
| 2384 // browser type instead of calling IsTabStripVisible() because the latter | |
| 2385 // will return false for fullscreen windows, but we still need to update | |
| 2386 // their animations (so that when they come out of fullscreen mode they'll | |
| 2387 // be correct). | |
| 2388 tabstrip_->UpdateLoadingAnimations(); | |
| 2389 } else if (ShouldShowWindowIcon()) { | |
| 2390 // ... or in the window icon area for popups and app windows. | |
| 2391 TabContents* tab_contents = browser_->GetSelectedTabContents(); | |
| 2392 // GetSelectedTabContents can return NULL for example under Purify when | |
| 2393 // the animations are running slowly and this function is called on a timer | |
| 2394 // through LoadingAnimationCallback. | |
| 2395 frame_->UpdateThrobber(tab_contents && tab_contents->is_loading()); | |
| 2396 } | |
| 2397 } | |
| 2398 | |
| 2399 void BrowserView::InitHangMonitor() { | 2401 void BrowserView::InitHangMonitor() { |
| 2400 #if defined(OS_WIN) | 2402 #if defined(OS_WIN) |
| 2401 PrefService* pref_service = g_browser_process->local_state(); | 2403 PrefService* pref_service = g_browser_process->local_state(); |
| 2402 if (!pref_service) | 2404 if (!pref_service) |
| 2403 return; | 2405 return; |
| 2404 | 2406 |
| 2405 int plugin_message_response_timeout = | 2407 int plugin_message_response_timeout = |
| 2406 pref_service->GetInteger(prefs::kPluginMessageResponseTimeout); | 2408 pref_service->GetInteger(prefs::kPluginMessageResponseTimeout); |
| 2407 int hung_plugin_detect_freq = | 2409 int hung_plugin_detect_freq = |
| 2408 pref_service->GetInteger(prefs::kHungPluginDetectFrequency); | 2410 pref_service->GetInteger(prefs::kHungPluginDetectFrequency); |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2514 // Update all the UI bits. | 2516 // Update all the UI bits. |
| 2515 UpdateTitleBar(); | 2517 UpdateTitleBar(); |
| 2516 // No need to update Toolbar because it's already updated in | 2518 // No need to update Toolbar because it's already updated in |
| 2517 // browser.cc. | 2519 // browser.cc. |
| 2518 } | 2520 } |
| 2519 | 2521 |
| 2520 gfx::Size BrowserView::GetResizeCornerSize() const { | 2522 gfx::Size BrowserView::GetResizeCornerSize() const { |
| 2521 return ResizeCorner::GetSize(); | 2523 return ResizeCorner::GetSize(); |
| 2522 } | 2524 } |
| 2523 | 2525 |
| 2526 void BrowserView::SetToolbar(ToolbarView* toolbar) { |
| 2527 if (toolbar_) { |
| 2528 RemoveChildView(toolbar_); |
| 2529 delete toolbar_; |
| 2530 } |
| 2531 toolbar_ = toolbar; |
| 2532 if (toolbar) { |
| 2533 AddChildView(toolbar_); |
| 2534 toolbar_->Init(browser_->profile()); |
| 2535 } |
| 2536 } |
| 2537 |
| 2524 #if !defined(OS_CHROMEOS) | 2538 #if !defined(OS_CHROMEOS) |
| 2525 // static | 2539 // static |
| 2526 BrowserWindow* BrowserWindow::CreateBrowserWindow(Browser* browser) { | 2540 BrowserWindow* BrowserWindow::CreateBrowserWindow(Browser* browser) { |
| 2527 // Create the view and the frame. The frame will attach itself via the view | 2541 // Create the view and the frame. The frame will attach itself via the view |
| 2528 // so we don't need to do anything with the pointer. | 2542 // so we don't need to do anything with the pointer. |
| 2529 BrowserView* view = new BrowserView(browser); | 2543 BrowserView* view = new BrowserView(browser); |
| 2530 BrowserFrame::Create(view, browser->profile()); | 2544 BrowserFrame::Create(view, browser->profile()); |
| 2531 | 2545 |
| 2532 view->GetWindow()->non_client_view()->SetAccessibleName( | 2546 view->GetWindow()->non_client_view()->SetAccessibleName( |
| 2533 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); | 2547 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); |
| 2534 | 2548 |
| 2535 return view; | 2549 return view; |
| 2536 } | 2550 } |
| 2537 #endif | 2551 #endif |
| 2538 | 2552 |
| 2539 // static | 2553 // static |
| 2540 FindBar* BrowserWindow::CreateFindBar(Browser* browser) { | 2554 FindBar* BrowserWindow::CreateFindBar(Browser* browser) { |
| 2541 return browser::CreateFindBar(static_cast<BrowserView*>(browser->window())); | 2555 return browser::CreateFindBar(static_cast<BrowserView*>(browser->window())); |
| 2542 } | 2556 } |
| OLD | NEW |