 Chromium Code Reviews
 Chromium Code Reviews Issue 6692001:
  Add in DOMBrowserView and Frame related classes  (Closed) 
  Base URL: http://git.chromium.org/git/chromium.git@trunk
    
  
    Issue 6692001:
  Add in DOMBrowserView and Frame related classes  (Closed) 
  Base URL: http://git.chromium.org/git/chromium.git@trunk| 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()); | 
| 
oshima
2011/03/16 21:10:25
Can you put this back to appropriate place in new
 
rharrison
2011/03/17 17:00:50
Done.
 
oshima
2011/03/17 18:49:31
Where it is now? I couldn't find it in new patch.
 | |
| 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 /////////////////////////////////////////////////////////////////////////////// | |
| 1949 // BrowserView, private: | |
| 1950 | |
| 1923 #if defined(OS_WIN) | 1951 #if defined(OS_WIN) | 
| 1924 void BrowserView::InitSystemMenu() { | 1952 void BrowserView::InitSystemMenu() { | 
| 1925 system_menu_contents_.reset(new views::SystemMenuModel(this)); | 1953 system_menu_contents_.reset(new views::SystemMenuModel(this)); | 
| 1926 // We add the menu items in reverse order so that insertion_index never needs | 1954 // We add the menu items in reverse order so that insertion_index never needs | 
| 1927 // to change. | 1955 // to change. | 
| 1928 if (IsBrowserTypeNormal()) | 1956 if (IsBrowserTypeNormal()) | 
| 1929 BuildSystemMenuForBrowserWindow(); | 1957 BuildSystemMenuForBrowserWindow(); | 
| 1930 else | 1958 else | 
| 1931 BuildSystemMenuForAppOrPopupWindow(browser_->type() == Browser::TYPE_APP); | 1959 BuildSystemMenuForAppOrPopupWindow(browser_->type() == Browser::TYPE_APP); | 
| 1932 system_menu_.reset( | 1960 system_menu_.reset( | 
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2364 case APPCOMMAND_REDO: | 2392 case APPCOMMAND_REDO: | 
| 2365 case APPCOMMAND_SPELL_CHECK: | 2393 case APPCOMMAND_SPELL_CHECK: | 
| 2366 default: return -1; | 2394 default: return -1; | 
| 2367 } | 2395 } | 
| 2368 #else | 2396 #else | 
| 2369 // App commands are Windows-specific so there's nothing to do here. | 2397 // App commands are Windows-specific so there's nothing to do here. | 
| 2370 return -1; | 2398 return -1; | 
| 2371 #endif | 2399 #endif | 
| 2372 } | 2400 } | 
| 2373 | 2401 | 
| 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() { | 2402 void BrowserView::InitHangMonitor() { | 
| 2400 #if defined(OS_WIN) | 2403 #if defined(OS_WIN) | 
| 2401 PrefService* pref_service = g_browser_process->local_state(); | 2404 PrefService* pref_service = g_browser_process->local_state(); | 
| 2402 if (!pref_service) | 2405 if (!pref_service) | 
| 2403 return; | 2406 return; | 
| 2404 | 2407 | 
| 2405 int plugin_message_response_timeout = | 2408 int plugin_message_response_timeout = | 
| 2406 pref_service->GetInteger(prefs::kPluginMessageResponseTimeout); | 2409 pref_service->GetInteger(prefs::kPluginMessageResponseTimeout); | 
| 2407 int hung_plugin_detect_freq = | 2410 int hung_plugin_detect_freq = | 
| 2408 pref_service->GetInteger(prefs::kHungPluginDetectFrequency); | 2411 pref_service->GetInteger(prefs::kHungPluginDetectFrequency); | 
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2514 // Update all the UI bits. | 2517 // Update all the UI bits. | 
| 2515 UpdateTitleBar(); | 2518 UpdateTitleBar(); | 
| 2516 // No need to update Toolbar because it's already updated in | 2519 // No need to update Toolbar because it's already updated in | 
| 2517 // browser.cc. | 2520 // browser.cc. | 
| 2518 } | 2521 } | 
| 2519 | 2522 | 
| 2520 gfx::Size BrowserView::GetResizeCornerSize() const { | 2523 gfx::Size BrowserView::GetResizeCornerSize() const { | 
| 2521 return ResizeCorner::GetSize(); | 2524 return ResizeCorner::GetSize(); | 
| 2522 } | 2525 } | 
| 2523 | 2526 | 
| 2527 void BrowserView::SetToolbar(ToolbarView* toolbar) { | |
| 2528 if (toolbar_) { | |
| 2529 RemoveChildView(toolbar_); | |
| 2530 delete toolbar_; | |
| 2531 } | |
| 2532 toolbar_ = toolbar; | |
| 2533 if (toolbar) { | |
| 2534 AddChildView(toolbar_); | |
| 2535 toolbar_->Init(browser_->profile()); | |
| 2536 } | |
| 2537 } | |
| 2538 | |
| 2524 #if !defined(OS_CHROMEOS) | 2539 #if !defined(OS_CHROMEOS) | 
| 2525 // static | 2540 // static | 
| 2526 BrowserWindow* BrowserWindow::CreateBrowserWindow(Browser* browser) { | 2541 BrowserWindow* BrowserWindow::CreateBrowserWindow(Browser* browser) { | 
| 2527 // Create the view and the frame. The frame will attach itself via the view | 2542 // 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. | 2543 // so we don't need to do anything with the pointer. | 
| 2529 BrowserView* view = new BrowserView(browser); | 2544 BrowserView* view = new BrowserView(browser); | 
| 2530 BrowserFrame::Create(view, browser->profile()); | 2545 BrowserFrame::Create(view, browser->profile()); | 
| 2531 | 2546 | 
| 2532 view->GetWindow()->non_client_view()->SetAccessibleName( | 2547 view->GetWindow()->non_client_view()->SetAccessibleName( | 
| 2533 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); | 2548 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); | 
| 2534 | 2549 | 
| 2535 return view; | 2550 return view; | 
| 2536 } | 2551 } | 
| 2537 #endif | 2552 #endif | 
| 2538 | 2553 | 
| 2539 // static | 2554 // static | 
| 2540 FindBar* BrowserWindow::CreateFindBar(Browser* browser) { | 2555 FindBar* BrowserWindow::CreateFindBar(Browser* browser) { | 
| 2541 return browser::CreateFindBar(static_cast<BrowserView*>(browser->window())); | 2556 return browser::CreateFindBar(static_cast<BrowserView*>(browser->window())); | 
| 2542 } | 2557 } | 
| OLD | NEW |