Index: chrome/browser/browser.cc |
=================================================================== |
--- chrome/browser/browser.cc (revision 17233) |
+++ chrome/browser/browser.cc (working copy) |
@@ -711,9 +711,9 @@ |
void Browser::OpenCurrentURL() { |
UserMetrics::RecordAction(L"LoadURL", profile_); |
LocationBar* location_bar = window_->GetLocationBar(); |
- OpenURL(GURL(WideToUTF8(location_bar->GetInputString())), GURL(), |
- location_bar->GetWindowOpenDisposition(), |
- location_bar->GetPageTransition()); |
+ OpenURLAtIndex(NULL, GURL(WideToUTF8(location_bar->GetInputString())), GURL(), |
+ location_bar->GetWindowOpenDisposition(), |
+ location_bar->GetPageTransition(), -1, true); |
} |
void Browser::Go(WindowOpenDisposition disposition) { |
@@ -1667,99 +1667,11 @@ |
// Browser, TabContentsDelegate implementation: |
void Browser::OpenURLFromTab(TabContents* source, |
- const GURL& url, const GURL& referrer, |
+ const GURL& url, |
+ const GURL& referrer, |
WindowOpenDisposition disposition, |
PageTransition::Type transition) { |
- // TODO(beng): Move all this code into a separate helper that has unit tests. |
- |
- // No code for these yet |
- DCHECK((disposition != NEW_POPUP) && (disposition != SAVE_TO_DISK)); |
- |
- TabContents* current_tab = source ? source : GetSelectedTabContents(); |
- bool source_tab_was_frontmost = (current_tab == GetSelectedTabContents()); |
- TabContents* new_contents = NULL; |
- |
- // If the URL is part of the same web site, then load it in the same |
- // SiteInstance (and thus the same process). This is an optimization to |
- // reduce process overhead; it is not necessary for compatibility. (That is, |
- // the new tab will not have script connections to the previous tab, so it |
- // does not need to be part of the same SiteInstance or BrowsingInstance.) |
- // Default to loading in a new SiteInstance and BrowsingInstance. |
- // TODO(creis): should this apply to applications? |
- SiteInstance* instance = NULL; |
- // Don't use this logic when "--process-per-tab" is specified. |
- if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kProcessPerTab)) { |
- if (current_tab) { |
- const GURL& current_url = current_tab->GetURL(); |
- if (SiteInstance::IsSameWebSite(current_url, url)) |
- instance = current_tab->GetSiteInstance(); |
- } |
- } |
- |
- // If this is not a normal window (such as a popup or an application), we can |
- // only have one tab so a new tab always goes into a tabbed browser window. |
- if (disposition != NEW_WINDOW && type_ != TYPE_NORMAL) { |
- // If the disposition is OFF_THE_RECORD we don't want to create a new |
- // browser that will itself create another OTR browser. This will result in |
- // a browser leak (and crash below because no tab is created or selected). |
- if (disposition == OFF_THE_RECORD) { |
- OpenURLOffTheRecord(profile_, url); |
- return; |
- } |
- |
- Browser* b = GetOrCreateTabbedBrowser(); |
- DCHECK(b); |
- |
- // If we have just created a new browser window, make sure we select the |
- // tab. |
- if (b->tab_count() == 0 && disposition == NEW_BACKGROUND_TAB) |
- disposition = NEW_FOREGROUND_TAB; |
- |
- b->OpenURL(url, referrer, disposition, transition); |
- b->window()->Show(); |
- return; |
- } |
- |
- if (profile_->IsOffTheRecord() && disposition == OFF_THE_RECORD) |
- disposition = NEW_FOREGROUND_TAB; |
- |
- if (disposition == SINGLETON_TAB) { |
- ShowSingleDOMUITab(url); |
- return; |
- } else if (disposition == NEW_WINDOW) { |
- Browser* browser = Browser::Create(profile_); |
- new_contents = browser->AddTabWithURL(url, referrer, transition, true, -1, |
- false, instance); |
- browser->window()->Show(); |
- } else if ((disposition == CURRENT_TAB) && current_tab) { |
- tabstrip_model_.TabNavigating(current_tab, transition); |
- |
- current_tab->controller().LoadURL(url, referrer, transition); |
- new_contents = current_tab; |
- if (GetStatusBubble()) |
- GetStatusBubble()->Hide(); |
- |
- // Update the location bar. This is synchronous. We specfically don't update |
- // the load state since the load hasn't started yet and updating it will put |
- // it out of sync with the actual state like whether we're displaying a |
- // favicon, which controls the throbber. If we updated it here, the throbber |
- // will show the default favicon for a split second when navigating away |
- // from the new tab page. |
- ScheduleUIUpdate(current_tab, TabContents::INVALIDATE_URL); |
- } else if (disposition == OFF_THE_RECORD) { |
- OpenURLOffTheRecord(profile_, url); |
- return; |
- } else if (disposition != SUPPRESS_OPEN) { |
- new_contents = AddTabWithURL(url, referrer, transition, |
- disposition != NEW_BACKGROUND_TAB, -1, false, |
- instance); |
- } |
- |
- if (disposition != NEW_BACKGROUND_TAB && source_tab_was_frontmost) { |
- // Give the focus to the newly navigated tab, if the source tab was |
- // front-most. |
- new_contents->Focus(); |
- } |
+ OpenURLAtIndex(source, url, referrer, disposition, transition, -1, false); |
} |
void Browser::NavigationStateChanged(const TabContents* source, |
@@ -2574,6 +2486,104 @@ |
return browser; |
} |
+void Browser::OpenURLAtIndex(TabContents* source, |
+ const GURL& url, |
+ const GURL& referrer, |
+ WindowOpenDisposition disposition, |
+ PageTransition::Type transition, |
+ int index, |
+ bool force_index) { |
+ // TODO(beng): Move all this code into a separate helper that has unit tests. |
+ |
+ // No code for these yet |
+ DCHECK((disposition != NEW_POPUP) && (disposition != SAVE_TO_DISK)); |
+ |
+ TabContents* current_tab = source ? source : GetSelectedTabContents(); |
+ bool source_tab_was_frontmost = (current_tab == GetSelectedTabContents()); |
+ TabContents* new_contents = NULL; |
+ |
+ // If the URL is part of the same web site, then load it in the same |
+ // SiteInstance (and thus the same process). This is an optimization to |
+ // reduce process overhead; it is not necessary for compatibility. (That is, |
+ // the new tab will not have script connections to the previous tab, so it |
+ // does not need to be part of the same SiteInstance or BrowsingInstance.) |
+ // Default to loading in a new SiteInstance and BrowsingInstance. |
+ // TODO(creis): should this apply to applications? |
+ SiteInstance* instance = NULL; |
+ // Don't use this logic when "--process-per-tab" is specified. |
+ if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kProcessPerTab)) { |
+ if (current_tab) { |
+ const GURL& current_url = current_tab->GetURL(); |
+ if (SiteInstance::IsSameWebSite(current_url, url)) |
+ instance = current_tab->GetSiteInstance(); |
+ } |
+ } |
+ |
+ // If this is not a normal window (such as a popup or an application), we can |
+ // only have one tab so a new tab always goes into a tabbed browser window. |
+ if (disposition != NEW_WINDOW && type_ != TYPE_NORMAL) { |
+ // If the disposition is OFF_THE_RECORD we don't want to create a new |
+ // browser that will itself create another OTR browser. This will result in |
+ // a browser leak (and crash below because no tab is created or selected). |
+ if (disposition == OFF_THE_RECORD) { |
+ OpenURLOffTheRecord(profile_, url); |
+ return; |
+ } |
+ |
+ Browser* b = GetOrCreateTabbedBrowser(); |
+ DCHECK(b); |
+ |
+ // If we have just created a new browser window, make sure we select the |
+ // tab. |
+ if (b->tab_count() == 0 && disposition == NEW_BACKGROUND_TAB) |
+ disposition = NEW_FOREGROUND_TAB; |
+ |
+ b->OpenURL(url, referrer, disposition, transition); |
+ b->window()->Show(); |
+ return; |
+ } |
+ |
+ if (profile_->IsOffTheRecord() && disposition == OFF_THE_RECORD) |
+ disposition = NEW_FOREGROUND_TAB; |
+ |
+ if (disposition == SINGLETON_TAB) { |
+ ShowSingleDOMUITab(url); |
+ return; |
+ } else if (disposition == NEW_WINDOW) { |
+ Browser* browser = Browser::Create(profile_); |
+ new_contents = browser->AddTabWithURL(url, referrer, transition, true, |
+ index, force_index, instance); |
+ browser->window()->Show(); |
+ } else if ((disposition == CURRENT_TAB) && current_tab) { |
+ tabstrip_model_.TabNavigating(current_tab, transition); |
+ |
+ current_tab->controller().LoadURL(url, referrer, transition); |
+ new_contents = current_tab; |
+ if (GetStatusBubble()) |
+ GetStatusBubble()->Hide(); |
+ |
+ // Update the location bar. This is synchronous. We specfically don't update |
+ // the load state since the load hasn't started yet and updating it will put |
+ // it out of sync with the actual state like whether we're displaying a |
+ // favicon, which controls the throbber. If we updated it here, the throbber |
+ // will show the default favicon for a split second when navigating away |
+ // from the new tab page. |
+ ScheduleUIUpdate(current_tab, TabContents::INVALIDATE_URL); |
+ } else if (disposition == OFF_THE_RECORD) { |
+ OpenURLOffTheRecord(profile_, url); |
+ return; |
+ } else if (disposition != SUPPRESS_OPEN) { |
+ new_contents = AddTabWithURL(url, referrer, transition, |
+ disposition != NEW_BACKGROUND_TAB, index, force_index, instance); |
+ } |
+ |
+ if (disposition != NEW_BACKGROUND_TAB && source_tab_was_frontmost) { |
+ // Give the focus to the newly navigated tab, if the source tab was |
+ // front-most. |
+ new_contents->Focus(); |
+ } |
+} |
+ |
void Browser::BuildPopupWindow(TabContents* source, |
TabContents* new_contents, |
const gfx::Rect& initial_pos) { |