Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Side by Side Diff: chrome/browser/browser.cc

Issue 3834002: Make all browser code use browser::Navigate to open tabs.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/browser.h ('k') | chrome/browser/browser_browsertest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/browser.h" 5 #include "chrome/browser/browser.h"
6 6
7 #if defined(OS_WIN) 7 #if defined(OS_WIN)
8 #include <shellapi.h> 8 #include <shellapi.h>
9 #include <windows.h> 9 #include <windows.h>
10 #endif // OS_WIN 10 #endif // OS_WIN
(...skipping 14 matching lines...) Expand all
25 #include "base/utf_string_conversions.h" 25 #include "base/utf_string_conversions.h"
26 #include "gfx/point.h" 26 #include "gfx/point.h"
27 #include "chrome/app/chrome_dll_resource.h" 27 #include "chrome/app/chrome_dll_resource.h"
28 #include "chrome/browser/autofill/autofill_manager.h" 28 #include "chrome/browser/autofill/autofill_manager.h"
29 #if defined(OS_WIN) 29 #if defined(OS_WIN)
30 #include "chrome/browser/autofill/autofill_ie_toolbar_import_win.h" 30 #include "chrome/browser/autofill/autofill_ie_toolbar_import_win.h"
31 #endif // defined(OS_WIN) 31 #endif // defined(OS_WIN)
32 #include "chrome/browser/bookmarks/bookmark_model.h" 32 #include "chrome/browser/bookmarks/bookmark_model.h"
33 #include "chrome/browser/bookmarks/bookmark_utils.h" 33 #include "chrome/browser/bookmarks/bookmark_utils.h"
34 #include "chrome/browser/browser_list.h" 34 #include "chrome/browser/browser_list.h"
35 #include "chrome/browser/browser_navigator.h"
35 #include "chrome/browser/browser_process.h" 36 #include "chrome/browser/browser_process.h"
36 #include "chrome/browser/browser_shutdown.h" 37 #include "chrome/browser/browser_shutdown.h"
37 #include "chrome/browser/browser_window.h" 38 #include "chrome/browser/browser_window.h"
38 #include "chrome/browser/browser_url_handler.h" 39 #include "chrome/browser/browser_url_handler.h"
39 #include "chrome/browser/character_encoding.h" 40 #include "chrome/browser/character_encoding.h"
40 #include "chrome/browser/debugger/devtools_manager.h" 41 #include "chrome/browser/debugger/devtools_manager.h"
41 #include "chrome/browser/debugger/devtools_toggle_action.h" 42 #include "chrome/browser/debugger/devtools_toggle_action.h"
42 #include "chrome/browser/debugger/devtools_window.h" 43 #include "chrome/browser/debugger/devtools_window.h"
43 #include "chrome/browser/dock_info.h" 44 #include "chrome/browser/dock_info.h"
44 #include "chrome/browser/dom_ui/filebrowse_ui.h" 45 #include "chrome/browser/dom_ui/filebrowse_ui.h"
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 604
604 ExtensionPrefs::LaunchType launch_type = 605 ExtensionPrefs::LaunchType launch_type =
605 extensions_service->extension_prefs()->GetLaunchType(extension->id()); 606 extensions_service->extension_prefs()->GetLaunchType(extension->id());
606 UMA_HISTOGRAM_ENUMERATION("Extensions.AppTabLaunchType", launch_type, 100); 607 UMA_HISTOGRAM_ENUMERATION("Extensions.AppTabLaunchType", launch_type, 100);
607 int add_type = TabStripModel::ADD_SELECTED; 608 int add_type = TabStripModel::ADD_SELECTED;
608 if (launch_type == ExtensionPrefs::LAUNCH_PINNED) 609 if (launch_type == ExtensionPrefs::LAUNCH_PINNED)
609 add_type |= TabStripModel::ADD_PINNED; 610 add_type |= TabStripModel::ADD_PINNED;
610 611
611 // TODO(erikkay): START_PAGE doesn't seem like the right transition in all 612 // TODO(erikkay): START_PAGE doesn't seem like the right transition in all
612 // cases. 613 // cases.
613 AddTabWithURLParams params(extension->GetFullLaunchURL(), 614 browser::NavigateParams params(browser, extension->GetFullLaunchURL(),
614 PageTransition::START_PAGE); 615 PageTransition::START_PAGE);
615 params.add_types = add_type; 616 params.tabstrip_add_types = add_type;
616 617
617 // Launch the application in the existing TabContents, if it was supplied. 618 // Launch the application in the existing TabContents, if it was supplied.
618 if (existing_tab) { 619 if (existing_tab) {
619 TabStripModel* model = browser->tabstrip_model(); 620 TabStripModel* model = browser->tabstrip_model();
620 int tab_index = model->GetIndexOfTabContents(existing_tab); 621 int tab_index = model->GetIndexOfTabContents(existing_tab);
621 622
622 existing_tab->OpenURL(extension->GetFullLaunchURL(), existing_tab->GetURL(), 623 existing_tab->OpenURL(extension->GetFullLaunchURL(), existing_tab->GetURL(),
623 CURRENT_TAB, PageTransition::LINK); 624 CURRENT_TAB, PageTransition::LINK);
624 if (params.add_types & TabStripModel::ADD_PINNED) 625 if (params.tabstrip_add_types & TabStripModel::ADD_PINNED)
625 model->SetTabPinned(tab_index, true); 626 model->SetTabPinned(tab_index, true);
626 if (params.add_types & TabStripModel::ADD_SELECTED) 627 if (params.tabstrip_add_types & TabStripModel::ADD_SELECTED)
627 model->SelectTabContentsAt(tab_index, true); 628 model->SelectTabContentsAt(tab_index, true);
628 629
629 contents = existing_tab; 630 contents = existing_tab;
630 } else { 631 } else {
631 contents = browser->AddTabWithURL(&params); 632 params.disposition = NEW_FOREGROUND_TAB;
633 browser::Navigate(&params);
634 contents = params.target_contents;
632 } 635 }
633 636
634 if (launch_type == ExtensionPrefs::LAUNCH_FULLSCREEN) 637 if (launch_type == ExtensionPrefs::LAUNCH_FULLSCREEN)
635 browser->window()->SetFullscreen(true); 638 browser->window()->SetFullscreen(true);
636 639
637 return contents; 640 return contents;
638 } 641 }
639 642
640 // static 643 // static
641 void Browser::OpenBookmarkManagerWindow(Profile* profile) { 644 void Browser::OpenBookmarkManagerWindow(Profile* profile) {
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
909 //////////////////////////////////////////////////////////////////////////////// 912 ////////////////////////////////////////////////////////////////////////////////
910 // Browser, Tab adding/showing functions: 913 // Browser, Tab adding/showing functions:
911 914
912 int Browser::GetIndexForInsertionDuringRestore(int relative_index) { 915 int Browser::GetIndexForInsertionDuringRestore(int relative_index) {
913 return (tab_handler_->GetTabStripModel()->insertion_policy() == 916 return (tab_handler_->GetTabStripModel()->insertion_policy() ==
914 TabStripModel::INSERT_AFTER) ? tab_count() : relative_index; 917 TabStripModel::INSERT_AFTER) ? tab_count() : relative_index;
915 } 918 }
916 919
917 TabContents* Browser::AddSelectedTabWithURL(const GURL& url, 920 TabContents* Browser::AddSelectedTabWithURL(const GURL& url,
918 PageTransition::Type transition) { 921 PageTransition::Type transition) {
919 AddTabWithURLParams params(url, transition); 922 browser::NavigateParams params(this, url, transition);
920 return AddTabWithURL(&params); 923 params.disposition = NEW_FOREGROUND_TAB;
921 } 924 browser::Navigate(&params);
922 925 return params.target_contents;
923 Browser::AddTabWithURLParams::AddTabWithURLParams(
924 const GURL& a_url,
925 PageTransition::Type a_transition)
926 : url(a_url),
927 transition(a_transition),
928 index(-1),
929 add_types(TabStripModel::ADD_SELECTED),
930 instance(NULL),
931 target(NULL) {
932 }
933
934 Browser::AddTabWithURLParams::~AddTabWithURLParams() {
935 }
936
937 TabContents* Browser::AddTabWithURL(AddTabWithURLParams* params) {
938 TabContents* contents = NULL;
939 if (CanSupportWindowFeature(FEATURE_TABSTRIP) || tabstrip_model()->empty()) {
940 GURL url_to_load = params->url;
941 if (url_to_load.is_empty())
942 url_to_load = GetHomePage();
943 contents = CreateTabContentsForURL(url_to_load, params->referrer, profile_,
944 params->transition, false,
945 params->instance);
946 contents->SetExtensionAppById(params->extension_app_id);
947 tab_handler_->GetTabStripModel()->AddTabContents(contents, params->index,
948 params->transition,
949 params->add_types);
950 // TODO(sky): figure out why this is needed. Without it we seem to get
951 // failures in startup tests.
952 // By default, content believes it is not hidden. When adding contents
953 // in the background, tell it that it's hidden.
954 if ((params->add_types & TabStripModel::ADD_SELECTED) == 0) {
955 // TabStripModel::AddTabContents invokes HideContents if not foreground.
956 contents->WasHidden();
957 }
958 params->target = this;
959 } else {
960 // We're in an app window or a popup window. Find an existing browser to
961 // open this URL in, creating one if none exists.
962 Browser* browser =
963 BrowserList::FindBrowserWithFeature(profile_, FEATURE_TABSTRIP);
964 if (!browser)
965 browser = Browser::Create(profile_);
966 contents = browser->AddTabWithURL(params);
967 DCHECK(params->target);
968 }
969 return contents;
970 } 926 }
971 927
972 TabContents* Browser::AddTab(TabContents* tab_contents, 928 TabContents* Browser::AddTab(TabContents* tab_contents,
973 PageTransition::Type type) { 929 PageTransition::Type type) {
974 tab_handler_->GetTabStripModel()->AddTabContents( 930 tab_handler_->GetTabStripModel()->AddTabContents(
975 tab_contents, -1, type, TabStripModel::ADD_SELECTED); 931 tab_contents, -1, type, TabStripModel::ADD_SELECTED);
976 return tab_contents; 932 return tab_contents;
977 } 933 }
978 934
979 void Browser::AddTabContents(TabContents* new_contents, 935 void Browser::AddTabContents(TabContents* new_contents,
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
1071 WindowOpenDisposition disp) { 1027 WindowOpenDisposition disp) {
1072 NavigationController& controller = 1028 NavigationController& controller =
1073 GetOrCloneTabForDisposition(disp)->controller(); 1029 GetOrCloneTabForDisposition(disp)->controller();
1074 if (index < 0 || index >= controller.entry_count()) 1030 if (index < 0 || index >= controller.entry_count())
1075 return false; 1031 return false;
1076 controller.GoToIndex(index); 1032 controller.GoToIndex(index);
1077 return true; 1033 return true;
1078 } 1034 }
1079 1035
1080 void Browser::ShowSingletonTab(const GURL& url) { 1036 void Browser::ShowSingletonTab(const GURL& url) {
1081 // In case the URL was rewritten by the BrowserURLHandler we need to ensure 1037 browser::NavigateParams params(this, url, PageTransition::AUTO_BOOKMARK);
1082 // that we do not open another URL that will get redirected to the rewritten 1038 params.disposition = SINGLETON_TAB;
1083 // URL. 1039 params.show_window = true;
1084 GURL rewritten_url(url); 1040 browser::Navigate(&params);
1085 bool reverse_on_redirect = false;
1086 BrowserURLHandler::RewriteURLIfNecessary(&rewritten_url, profile_,
1087 &reverse_on_redirect);
1088
1089 // See if we already have a tab with the given URL and select it if so.
1090 TabStripModel* model = tab_handler_->GetTabStripModel();
1091 for (int i = 0; i < model->count(); i++) {
1092 TabContents* tc = model->GetTabContentsAt(i);
1093 if (CompareURLsIgnoreRef(tc->GetURL(), url) ||
1094 CompareURLsIgnoreRef(tc->GetURL(), rewritten_url)) {
1095 model->SelectTabContentsAt(i, false);
1096 return;
1097 }
1098 }
1099
1100 // Otherwise, just create a new tab.
1101 AddSelectedTabWithURL(url, PageTransition::AUTO_BOOKMARK);
1102 } 1041 }
1103 1042
1104 void Browser::UpdateCommandsForFullscreenMode(bool is_fullscreen) { 1043 void Browser::UpdateCommandsForFullscreenMode(bool is_fullscreen) {
1105 #if !defined(OS_MACOSX) 1044 #if !defined(OS_MACOSX)
1106 const bool show_main_ui = (type() == TYPE_NORMAL) && !is_fullscreen; 1045 const bool show_main_ui = (type() == TYPE_NORMAL) && !is_fullscreen;
1107 #else 1046 #else
1108 const bool show_main_ui = (type() == TYPE_NORMAL); 1047 const bool show_main_ui = (type() == TYPE_NORMAL);
1109 #endif 1048 #endif
1110 1049
1111 bool main_not_fullscreen_or_popup = 1050 bool main_not_fullscreen_or_popup =
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1293 1232
1294 void Browser::OpenCurrentURL() { 1233 void Browser::OpenCurrentURL() {
1295 UserMetrics::RecordAction(UserMetricsAction("LoadURL"), profile_); 1234 UserMetrics::RecordAction(UserMetricsAction("LoadURL"), profile_);
1296 LocationBar* location_bar = window_->GetLocationBar(); 1235 LocationBar* location_bar = window_->GetLocationBar();
1297 WindowOpenDisposition open_disposition = 1236 WindowOpenDisposition open_disposition =
1298 location_bar->GetWindowOpenDisposition(); 1237 location_bar->GetWindowOpenDisposition();
1299 if (OpenInstant(open_disposition)) 1238 if (OpenInstant(open_disposition))
1300 return; 1239 return;
1301 1240
1302 GURL url(WideToUTF8(location_bar->GetInputString())); 1241 GURL url(WideToUTF8(location_bar->GetInputString()));
1303 1242 browser::NavigateParams params(this, url, location_bar->GetPageTransition());
1243 params.disposition = open_disposition;
1304 // Use ADD_INHERIT_OPENER so that all pages opened by the omnibox at least 1244 // Use ADD_INHERIT_OPENER so that all pages opened by the omnibox at least
1305 // inherit the opener. In some cases the tabstrip will determine the group 1245 // inherit the opener. In some cases the tabstrip will determine the group
1306 // should be inherited, in which case the group is inherited instead of the 1246 // should be inherited, in which case the group is inherited instead of the
1307 // opener. 1247 // opener.
1308 OpenURLAtIndex(NULL, url, GURL(), open_disposition, 1248 params.tabstrip_add_types =
1309 location_bar->GetPageTransition(), -1, 1249 TabStripModel::ADD_FORCE_INDEX | TabStripModel::ADD_INHERIT_OPENER;
1310 TabStripModel::ADD_FORCE_INDEX | 1250 browser::Navigate(&params);
1311 TabStripModel::ADD_INHERIT_OPENER);
1312 } 1251 }
1313 1252
1314 void Browser::Stop() { 1253 void Browser::Stop() {
1315 UserMetrics::RecordAction(UserMetricsAction("Stop"), profile_); 1254 UserMetrics::RecordAction(UserMetricsAction("Stop"), profile_);
1316 GetSelectedTabContents()->Stop(); 1255 GetSelectedTabContents()->Stop();
1317 } 1256 }
1318 1257
1319 void Browser::NewWindow() { 1258 void Browser::NewWindow() {
1320 if (browser_defaults::kAlwaysOpenIncognitoWindow && 1259 if (browser_defaults::kAlwaysOpenIncognitoWindow &&
1321 CommandLine::ForCurrentProcess()->HasSwitch(switches::kIncognito)) { 1260 CommandLine::ForCurrentProcess()->HasSwitch(switches::kIncognito)) {
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after
1818 TabStripModel* model = tab_handler_->GetTabStripModel(); 1757 TabStripModel* model = tab_handler_->GetTabStripModel();
1819 for (int i = 0; i < model->count(); i++) { 1758 for (int i = 0; i < model->count(); i++) {
1820 TabContents* tc = model->GetTabContentsAt(i); 1759 TabContents* tc = model->GetTabContentsAt(i);
1821 const GURL& tab_url = tc->GetURL(); 1760 const GURL& tab_url = tc->GetURL();
1822 1761
1823 if (tab_url.scheme() == url.scheme() && tab_url.host() == url.host()) { 1762 if (tab_url.scheme() == url.scheme() && tab_url.host() == url.host()) {
1824 // We found an existing options tab, load the URL in this tab. (Note: 1763 // We found an existing options tab, load the URL in this tab. (Note:
1825 // this may cause us to unnecessarily reload the same page. We can't 1764 // this may cause us to unnecessarily reload the same page. We can't
1826 // really detect that unless the options page is permitted to change the 1765 // really detect that unless the options page is permitted to change the
1827 // URL in the address bar, but security policy doesn't allow that. 1766 // URL in the address bar, but security policy doesn't allow that.
1828 OpenURLAtIndex(tc, url, GURL(), CURRENT_TAB, PageTransition::GENERATED, 1767 browser::NavigateParams params(this, url, PageTransition::GENERATED);
1829 -1, -1); 1768 params.source_contents = tc;
1769 browser::Navigate(&params);
1830 model->SelectTabContentsAt(i, false); 1770 model->SelectTabContentsAt(i, false);
1831 return; 1771 return;
1832 } 1772 }
1833 } 1773 }
1834 1774
1835 // No options tab found, so create a new one. 1775 // No options tab found, so create a new one.
1836 AddSelectedTabWithURL(url, PageTransition::AUTO_BOOKMARK); 1776 AddSelectedTabWithURL(url, PageTransition::AUTO_BOOKMARK);
1837 } 1777 }
1838 1778
1839 void Browser::OpenClearBrowsingDataDialog() { 1779 void Browser::OpenClearBrowsingDataDialog() {
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1909 UserMetrics::RecordAction(UserMetricsAction("UpdateChrome"), profile_); 1849 UserMetrics::RecordAction(UserMetricsAction("UpdateChrome"), profile_);
1910 window_->ShowUpdateChromeDialog(); 1850 window_->ShowUpdateChromeDialog();
1911 } 1851 }
1912 1852
1913 void Browser::OpenHelpTab() { 1853 void Browser::OpenHelpTab() {
1914 GURL help_url = google_util::AppendGoogleLocaleParam(GURL(kHelpContentUrl)); 1854 GURL help_url = google_util::AppendGoogleLocaleParam(GURL(kHelpContentUrl));
1915 AddSelectedTabWithURL(help_url, PageTransition::AUTO_BOOKMARK); 1855 AddSelectedTabWithURL(help_url, PageTransition::AUTO_BOOKMARK);
1916 } 1856 }
1917 1857
1918 void Browser::OpenThemeGalleryTabAndActivate() { 1858 void Browser::OpenThemeGalleryTabAndActivate() {
1919 OpenURL(GURL(l10n_util::GetStringUTF8(IDS_THEMES_GALLERY_URL)), 1859 AddSelectedTabWithURL(GURL(l10n_util::GetStringUTF8(IDS_THEMES_GALLERY_URL)),
1920 GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK); 1860 PageTransition::LINK);
1921 window_->Activate();
1922 } 1861 }
1923 1862
1924 void Browser::OpenPrivacyDashboardTabAndActivate() { 1863 void Browser::OpenPrivacyDashboardTabAndActivate() {
1925 OpenURL(GURL(l10n_util::GetStringUTF8(IDS_PRIVACY_DASHBOARD_URL)), 1864 OpenURL(GURL(l10n_util::GetStringUTF8(IDS_PRIVACY_DASHBOARD_URL)),
1926 GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK); 1865 GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK);
1927 window_->Activate(); 1866 window_->Activate();
1928 } 1867 }
1929 1868
1930 void Browser::OpenAutoFillHelpTabAndActivate() { 1869 void Browser::OpenAutoFillHelpTabAndActivate() {
1931 OpenURL(GURL(l10n_util::GetStringUTF8(IDS_AUTOFILL_HELP_URL)), 1870 AddSelectedTabWithURL(GURL(l10n_util::GetStringUTF8(IDS_AUTOFILL_HELP_URL)),
1932 GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK); 1871 PageTransition::LINK);
1933 window_->Activate();
1934 } 1872 }
1935 1873
1936 void Browser::OpenSearchEngineOptionsDialog() { 1874 void Browser::OpenSearchEngineOptionsDialog() {
1937 if (CommandLine::ForCurrentProcess()->HasSwitch( 1875 if (CommandLine::ForCurrentProcess()->HasSwitch(
1938 switches::kEnableTabbedOptions)) { 1876 switches::kEnableTabbedOptions)) {
1939 OpenKeywordEditor(); 1877 OpenKeywordEditor();
1940 } else { 1878 } else {
1941 ShowOptionsWindow(OPTIONS_PAGE_GENERAL, OPTIONS_GROUP_DEFAULT_SEARCH, 1879 ShowOptionsWindow(OPTIONS_PAGE_GENERAL, OPTIONS_GROUP_DEFAULT_SEARCH,
1942 profile_); 1880 profile_);
1943 } 1881 }
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after
2401 2339
2402 TabContents* Browser::AddBlankTab(bool foreground) { 2340 TabContents* Browser::AddBlankTab(bool foreground) {
2403 return AddBlankTabAt(-1, foreground); 2341 return AddBlankTabAt(-1, foreground);
2404 } 2342 }
2405 2343
2406 TabContents* Browser::AddBlankTabAt(int index, bool foreground) { 2344 TabContents* Browser::AddBlankTabAt(int index, bool foreground) {
2407 // Time new tab page creation time. We keep track of the timing data in 2345 // Time new tab page creation time. We keep track of the timing data in
2408 // TabContents, but we want to include the time it takes to create the 2346 // TabContents, but we want to include the time it takes to create the
2409 // TabContents object too. 2347 // TabContents object too.
2410 base::TimeTicks new_tab_start_time = base::TimeTicks::Now(); 2348 base::TimeTicks new_tab_start_time = base::TimeTicks::Now();
2411 AddTabWithURLParams params(GURL(chrome::kChromeUINewTabURL), 2349 browser::NavigateParams params(this, GURL(chrome::kChromeUINewTabURL),
2412 PageTransition::TYPED); 2350 PageTransition::TYPED);
2413 params.add_types = 2351 params.tabstrip_add_types =
2414 foreground ? TabStripModel::ADD_SELECTED : TabStripModel::ADD_NONE; 2352 foreground ? TabStripModel::ADD_SELECTED : TabStripModel::ADD_NONE;
2415 params.index = index; 2353 params.disposition = foreground ? NEW_FOREGROUND_TAB : NEW_BACKGROUND_TAB;
2416 TabContents* contents = AddTabWithURL(&params); 2354 params.tabstrip_index = index;
2417 contents->set_new_tab_start_time(new_tab_start_time); 2355 browser::Navigate(&params);
2418 return contents; 2356 params.target_contents->set_new_tab_start_time(new_tab_start_time);
2357 return params.target_contents;
2419 } 2358 }
2420 2359
2421 Browser* Browser::CreateNewStripWithContents(TabContents* detached_contents, 2360 Browser* Browser::CreateNewStripWithContents(TabContents* detached_contents,
2422 const gfx::Rect& window_bounds, 2361 const gfx::Rect& window_bounds,
2423 const DockInfo& dock_info, 2362 const DockInfo& dock_info,
2424 bool maximize) { 2363 bool maximize) {
2425 DCHECK(CanSupportWindowFeature(FEATURE_TABSTRIP)); 2364 DCHECK(CanSupportWindowFeature(FEATURE_TABSTRIP));
2426 2365
2427 gfx::Rect new_window_bounds = window_bounds; 2366 gfx::Rect new_window_bounds = window_bounds;
2428 if (dock_info.GetNewWindowBounds(&new_window_bounds, &maximize)) 2367 if (dock_info.GetNewWindowBounds(&new_window_bounds, &maximize))
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
2764 } 2703 }
2765 2704
2766 /////////////////////////////////////////////////////////////////////////////// 2705 ///////////////////////////////////////////////////////////////////////////////
2767 // Browser, TabContentsDelegate implementation: 2706 // Browser, TabContentsDelegate implementation:
2768 2707
2769 void Browser::OpenURLFromTab(TabContents* source, 2708 void Browser::OpenURLFromTab(TabContents* source,
2770 const GURL& url, 2709 const GURL& url,
2771 const GURL& referrer, 2710 const GURL& referrer,
2772 WindowOpenDisposition disposition, 2711 WindowOpenDisposition disposition,
2773 PageTransition::Type transition) { 2712 PageTransition::Type transition) {
2774 OpenURLAtIndex(source, url, referrer, disposition, transition, -1, 2713 browser::NavigateParams params(this, url, transition);
2775 TabStripModel::ADD_NONE); 2714 params.source_contents = source;
2715 params.referrer = referrer;
2716 params.disposition = disposition;
2717 params.tabstrip_add_types = TabStripModel::ADD_NONE;
2718 browser::Navigate(&params);
2776 } 2719 }
2777 2720
2778 void Browser::NavigationStateChanged(const TabContents* source, 2721 void Browser::NavigationStateChanged(const TabContents* source,
2779 unsigned changed_flags) { 2722 unsigned changed_flags) {
2780 // Only update the UI when something visible has changed. 2723 // Only update the UI when something visible has changed.
2781 if (changed_flags) 2724 if (changed_flags)
2782 ScheduleUIUpdate(source, changed_flags); 2725 ScheduleUIUpdate(source, changed_flags);
2783 2726
2784 // We don't schedule updates to commands since they will only change once per 2727 // We don't schedule updates to commands since they will only change once per
2785 // navigation, so we don't have to worry about flickering. 2728 // navigation, so we don't have to worry about flickering.
2786 if (changed_flags & TabContents::INVALIDATE_URL) 2729 if (changed_flags & TabContents::INVALIDATE_URL)
2787 UpdateCommandsForTabState(); 2730 UpdateCommandsForTabState();
2788 } 2731 }
2789 2732
2790 void Browser::AddNewContents(TabContents* source, 2733 void Browser::AddNewContents(TabContents* source,
2791 TabContents* new_contents, 2734 TabContents* new_contents,
2792 WindowOpenDisposition disposition, 2735 WindowOpenDisposition disposition,
2793 const gfx::Rect& initial_pos, 2736 const gfx::Rect& initial_pos,
2794 bool user_gesture) { 2737 bool user_gesture) {
2795 DCHECK(disposition != SAVE_TO_DISK); // No code for this yet 2738 // No code for this yet
2796 DCHECK(disposition != CURRENT_TAB); // Can't create a new contents for the 2739 DCHECK(disposition != SAVE_TO_DISK);
2797 // current tab. 2740 // Can't create a new contents for the current tab - invalid case.
2741 DCHECK(disposition != CURRENT_TAB);
2798 2742
2743 // TODO(beng): This belongs behind the platform-specific View interface.
2744 // That's why it's there.
2799 #if defined(OS_CHROMEOS) 2745 #if defined(OS_CHROMEOS)
2800 if (disposition == NEW_POPUP) { 2746 if (disposition == NEW_POPUP) {
2801 // If the popup is bigger than a given factor of the screen, then 2747 // If the popup is bigger than a given factor of the screen, then
2802 // turn it into a foreground tab (on chrome os only) 2748 // turn it into a foreground tab (on chrome os only)
2803 // Also check for width or height == 0, which would otherwise indicate 2749 // Also check for width or height == 0, which would otherwise indicate
2804 // a tab sized popup window. 2750 // a tab sized popup window.
2805 GdkScreen* screen = gdk_screen_get_default(); 2751 GdkScreen* screen = gdk_screen_get_default();
2806 int max_width = gdk_screen_get_width(screen) * kPopupMaxWidthFactor; 2752 int max_width = gdk_screen_get_width(screen) * kPopupMaxWidthFactor;
2807 int max_height = gdk_screen_get_height(screen) * kPopupMaxHeightFactor; 2753 int max_height = gdk_screen_get_height(screen) * kPopupMaxHeightFactor;
2808 if (initial_pos.width() > max_width || initial_pos.width() == 0 || 2754 if (initial_pos.width() > max_width || initial_pos.width() == 0 ||
2809 initial_pos.height() > max_height || initial_pos.height() == 0) { 2755 initial_pos.height() > max_height || initial_pos.height() == 0) {
2810 disposition = NEW_FOREGROUND_TAB; 2756 disposition = NEW_FOREGROUND_TAB;
2811 }
2812 } 2757 }
2758 }
2813 #endif 2759 #endif
2814 2760
2815 // If this is a window with no tabstrip, we can only have one tab so we need 2761 browser::NavigateParams params(this, new_contents);
2816 // to process this in tabbed browser window. 2762 params.source_contents = source;
2817 if (!CanSupportWindowFeature(FEATURE_TABSTRIP) && 2763 params.disposition = disposition;
2818 tab_handler_->GetTabStripModel()->count() > 0 && 2764 params.window_bounds = initial_pos;
2819 disposition != NEW_WINDOW && 2765 browser::Navigate(&params);
2820 disposition != NEW_POPUP) {
2821 Browser* b = GetOrCreateTabbedBrowser(profile_);
2822 DCHECK(b);
2823 PageTransition::Type transition = PageTransition::LINK;
2824 // If we were called from an "installed webapp" we want to emulate the code
2825 // that is run from browser_init.cc for links from external applications.
2826 // This means we need to open the tab with the START PAGE transition.
2827 // AddNewContents doesn't support this but the TabStripModel's
2828 // AddTabContents method does.
2829 if (type_ & TYPE_APP)
2830 transition = PageTransition::START_PAGE;
2831 b->tabstrip_model()->AddTabContents(
2832 new_contents, -1, transition, TabStripModel::ADD_SELECTED);
2833 b->window()->Show();
2834 return;
2835 }
2836
2837 if (disposition == NEW_POPUP) {
2838 Type browser_type;
2839 if ((type_ & TYPE_APP) || (source && source->is_app())) {
2840 // New app popup, or an app is creating a popup.
2841 browser_type = TYPE_APP_POPUP;
2842 } else {
2843 browser_type = TYPE_POPUP;
2844 }
2845 Browser* browser = Browser::CreateForPopup(browser_type,
2846 profile_,
2847 new_contents,
2848 initial_pos);
2849 browser->window()->Show();
2850
2851 } else if (disposition == NEW_WINDOW) {
2852 Browser* browser = Browser::Create(profile_);
2853 browser->AddNewContents(source, new_contents, NEW_FOREGROUND_TAB,
2854 initial_pos, user_gesture);
2855 browser->window()->Show();
2856 } else if (disposition != SUPPRESS_OPEN) {
2857 tab_handler_->GetTabStripModel()->AddTabContents(
2858 new_contents, -1, PageTransition::LINK,
2859 disposition == NEW_FOREGROUND_TAB ? TabStripModel::ADD_SELECTED :
2860 TabStripModel::ADD_NONE);
2861 }
2862 } 2766 }
2863 2767
2864 void Browser::ActivateContents(TabContents* contents) { 2768 void Browser::ActivateContents(TabContents* contents) {
2865 tab_handler_->GetTabStripModel()->SelectTabContentsAt( 2769 tab_handler_->GetTabStripModel()->SelectTabContentsAt(
2866 tab_handler_->GetTabStripModel()->GetIndexOfTabContents(contents), false); 2770 tab_handler_->GetTabStripModel()->GetIndexOfTabContents(contents), false);
2867 window_->Activate(); 2771 window_->Activate();
2868 } 2772 }
2869 2773
2870 void Browser::DeactivateContents(TabContents* contents) { 2774 void Browser::DeactivateContents(TabContents* contents) {
2871 window_->Deactivate(); 2775 window_->Deactivate();
(...skipping 1190 matching lines...) Expand 10 before | Expand all | Expand 10 after
4062 } 3966 }
4063 3967
4064 // static 3968 // static
4065 Browser* Browser::GetOrCreateTabbedBrowser(Profile* profile) { 3969 Browser* Browser::GetOrCreateTabbedBrowser(Profile* profile) {
4066 Browser* browser = GetTabbedBrowser(profile, false); 3970 Browser* browser = GetTabbedBrowser(profile, false);
4067 if (!browser) 3971 if (!browser)
4068 browser = Browser::Create(profile); 3972 browser = Browser::Create(profile);
4069 return browser; 3973 return browser;
4070 } 3974 }
4071 3975
4072 void Browser::OpenURLAtIndex(TabContents* source,
4073 const GURL& url,
4074 const GURL& referrer,
4075 WindowOpenDisposition disposition,
4076 PageTransition::Type transition,
4077 int index,
4078 int add_types) {
4079 // TODO(beng): Move all this code into a separate helper that has unit tests.
4080
4081 // No code for these yet
4082 DCHECK((disposition != NEW_POPUP) && (disposition != SAVE_TO_DISK));
4083
4084 TabContents* current_tab = source ? source : GetSelectedTabContents();
4085 bool source_tab_was_frontmost = (current_tab == GetSelectedTabContents());
4086 TabContents* new_contents = NULL;
4087
4088 // Opening a bookmark counts as a user gesture, so we don't need to avoid
4089 // carpet-bombing here.
4090 PageTransition::Type baseTransitionType =
4091 PageTransition::StripQualifier(transition);
4092 if ((baseTransitionType == PageTransition::TYPED ||
4093 baseTransitionType == PageTransition::AUTO_BOOKMARK) &&
4094 current_tab != NULL) {
4095 RenderViewHostDelegate::BrowserIntegration* delegate = current_tab;
4096 delegate->OnUserGesture();
4097 }
4098
4099 // If the URL is part of the same web site, then load it in the same
4100 // SiteInstance (and thus the same process). This is an optimization to
4101 // reduce process overhead; it is not necessary for compatibility. (That is,
4102 // the new tab will not have script connections to the previous tab, so it
4103 // does not need to be part of the same SiteInstance or BrowsingInstance.)
4104 // Default to loading in a new SiteInstance and BrowsingInstance.
4105 // TODO(creis): should this apply to applications?
4106 SiteInstance* instance = NULL;
4107 // Don't use this logic when "--process-per-tab" is specified.
4108 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kProcessPerTab)) {
4109 if (current_tab) {
4110 const GURL& current_url = current_tab->GetURL();
4111 if (SiteInstance::IsSameWebSite(profile_, current_url, url))
4112 instance = current_tab->GetSiteInstance();
4113 }
4114 }
4115
4116 // If this browser doeesn't support tabs, we can only have one tab so a new
4117 // tab always goes into a tabbed browser window.
4118 if (!CanSupportWindowFeature(FEATURE_TABSTRIP) &&
4119 disposition != CURRENT_TAB && disposition != NEW_WINDOW) {
4120 // If the disposition is OFF_THE_RECORD we don't want to create a new
4121 // browser that will itself create another OTR browser. This will result in
4122 // a browser leak (and crash below because no tab is created or selected).
4123 if (disposition == OFF_THE_RECORD) {
4124 OpenURLOffTheRecord(profile_, url);
4125 return;
4126 }
4127
4128 Browser* b = GetOrCreateTabbedBrowser(profile_);
4129 DCHECK(b);
4130
4131 // If we have just created a new browser window, make sure we select the
4132 // tab.
4133 if (b->tab_count() == 0 && disposition == NEW_BACKGROUND_TAB)
4134 disposition = NEW_FOREGROUND_TAB;
4135
4136 b->OpenURL(url, referrer, disposition, transition);
4137 b->window()->Show();
4138 return;
4139 }
4140
4141 if (profile_->IsOffTheRecord() && disposition == OFF_THE_RECORD)
4142 disposition = NEW_FOREGROUND_TAB;
4143
4144 if (disposition == SINGLETON_TAB) {
4145 ShowSingletonTab(url);
4146 return;
4147 } else if (disposition == NEW_WINDOW) {
4148 Browser* browser = Browser::Create(profile_);
4149 AddTabWithURLParams params(url, transition);
4150 params.referrer = referrer;
4151 params.index = index;
4152 params.add_types = TabStripModel::ADD_SELECTED | add_types;
4153 params.instance = instance;
4154 new_contents = browser->AddTabWithURL(&params);
4155 browser->window()->Show();
4156 } else if ((disposition == CURRENT_TAB) && current_tab) {
4157 tab_handler_->GetTabStripModel()->TabNavigating(current_tab, transition);
4158
4159 bool user_initiated = (PageTransition::StripQualifier(transition) ==
4160 PageTransition::AUTO_BOOKMARK);
4161
4162 if (user_initiated && source_tab_was_frontmost &&
4163 window_->GetLocationBar()) {
4164 // Forcibly reset the location bar if the url is going to change in the
4165 // current tab, since otherwise it won't discard any ongoing user edits,
4166 // since it doesn't realize this is a user-initiated action.
4167 window_->GetLocationBar()->Revert();
4168 }
4169
4170 current_tab->controller().LoadURL(url, referrer, transition);
4171 new_contents = current_tab;
4172 if (GetStatusBubble())
4173 GetStatusBubble()->Hide();
4174
4175 // Update the location bar. This is synchronous. We specifically don't
4176 // update the load state since the load hasn't started yet and updating it
4177 // will put it out of sync with the actual state like whether we're
4178 // displaying a favicon, which controls the throbber. If we updated it here,
4179 // the throbber will show the default favicon for a split second when
4180 // navigating away from the new tab page.
4181 ScheduleUIUpdate(current_tab, TabContents::INVALIDATE_URL);
4182 } else if (disposition == OFF_THE_RECORD) {
4183 OpenURLOffTheRecord(profile_, url);
4184 return;
4185 } else if (disposition != SUPPRESS_OPEN) {
4186 if (disposition != NEW_BACKGROUND_TAB)
4187 add_types |= TabStripModel::ADD_SELECTED;
4188 AddTabWithURLParams params(url, transition);
4189 params.referrer = referrer;
4190 params.index = index;
4191 params.add_types = add_types;
4192 params.instance = instance;
4193 new_contents = AddTabWithURL(&params);
4194 }
4195
4196 if (disposition != NEW_BACKGROUND_TAB && source_tab_was_frontmost &&
4197 new_contents) {
4198 // Give the focus to the newly navigated tab, if the source tab was
4199 // front-most.
4200 new_contents->Focus();
4201 }
4202 }
4203
4204 void Browser::FindInPage(bool find_next, bool forward_direction) { 3976 void Browser::FindInPage(bool find_next, bool forward_direction) {
4205 ShowFindBar(); 3977 ShowFindBar();
4206 if (find_next) { 3978 if (find_next) {
4207 string16 find_text; 3979 string16 find_text;
4208 #if defined(OS_MACOSX) 3980 #if defined(OS_MACOSX)
4209 // We always want to search for the contents of the find pasteboard on OS X. 3981 // We always want to search for the contents of the find pasteboard on OS X.
4210 find_text = GetFindPboardText(); 3982 find_text = GetFindPboardText();
4211 #endif 3983 #endif
4212 GetSelectedTabContents()->StartFinding(find_text, 3984 GetSelectedTabContents()->StartFinding(find_text,
4213 forward_direction, 3985 forward_direction,
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
4306 NOTREACHED(); 4078 NOTREACHED();
4307 return false; 4079 return false;
4308 } 4080 }
4309 4081
4310 void Browser::CreateInstantIfNecessary() { 4082 void Browser::CreateInstantIfNecessary() {
4311 if (type() == TYPE_NORMAL && InstantController::IsEnabled(profile()) && 4083 if (type() == TYPE_NORMAL && InstantController::IsEnabled(profile()) &&
4312 !profile()->IsOffTheRecord()) { 4084 !profile()->IsOffTheRecord()) {
4313 instant_.reset(new InstantController(this)); 4085 instant_.reset(new InstantController(this));
4314 } 4086 }
4315 } 4087 }
OLDNEW
« no previous file with comments | « chrome/browser/browser.h ('k') | chrome/browser/browser_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698