OLD | NEW |
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 1262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1273 selected_contents->GetURL().GetOrigin() == | 1273 selected_contents->GetURL().GetOrigin() == |
1274 GURL(chrome::kChromeUINewTabURL).GetOrigin()) { | 1274 GURL(chrome::kChromeUINewTabURL).GetOrigin()) { |
1275 // If the |url| is within an app's web extent and it was typed into the | 1275 // If the |url| is within an app's web extent and it was typed into the |
1276 // omnibox of an NTP page, interpret as an app launch and close the NTP | 1276 // omnibox of an NTP page, interpret as an app launch and close the NTP |
1277 // tab. | 1277 // tab. |
1278 Browser::OpenApplication(profile(), extension, | 1278 Browser::OpenApplication(profile(), extension, |
1279 extension->launch_container()); | 1279 extension->launch_container()); |
1280 CloseTabContents(selected_contents); | 1280 CloseTabContents(selected_contents); |
1281 return; | 1281 return; |
1282 } | 1282 } |
1283 | |
1284 if (selected_contents) { | |
1285 // For the purposes of changing the window open disposition, the referrer | |
1286 // is the current tab's URL. | |
1287 open_disposition = AdjustWindowOpenDispositionForTab( | |
1288 IsPinned(selected_contents), | |
1289 url, | |
1290 selected_contents->GetURL(), | |
1291 location_bar->GetPageTransition(), | |
1292 open_disposition); | |
1293 } | |
1294 } | 1283 } |
1295 | 1284 |
1296 // Use ADD_INHERIT_OPENER so that all pages opened by the omnibox at least | 1285 // Use ADD_INHERIT_OPENER so that all pages opened by the omnibox at least |
1297 // inherit the opener. In some cases the tabstrip will determine the group | 1286 // inherit the opener. In some cases the tabstrip will determine the group |
1298 // should be inherited, in which case the group is inherited instead of the | 1287 // should be inherited, in which case the group is inherited instead of the |
1299 // opener. | 1288 // opener. |
1300 OpenURLAtIndex(NULL, url, GURL(), open_disposition, | 1289 OpenURLAtIndex(NULL, url, GURL(), open_disposition, |
1301 location_bar->GetPageTransition(), -1, | 1290 location_bar->GetPageTransition(), -1, |
1302 TabStripModel::ADD_FORCE_INDEX | | 1291 TabStripModel::ADD_FORCE_INDEX | |
1303 TabStripModel::ADD_INHERIT_OPENER); | 1292 TabStripModel::ADD_INHERIT_OPENER); |
(...skipping 2468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3772 | 3761 |
3773 // static | 3762 // static |
3774 Browser* Browser::GetOrCreateTabbedBrowser(Profile* profile) { | 3763 Browser* Browser::GetOrCreateTabbedBrowser(Profile* profile) { |
3775 Browser* browser = BrowserList::FindBrowserWithType(profile, TYPE_NORMAL, | 3764 Browser* browser = BrowserList::FindBrowserWithType(profile, TYPE_NORMAL, |
3776 false); | 3765 false); |
3777 if (!browser) | 3766 if (!browser) |
3778 browser = Browser::Create(profile); | 3767 browser = Browser::Create(profile); |
3779 return browser; | 3768 return browser; |
3780 } | 3769 } |
3781 | 3770 |
3782 // static | |
3783 WindowOpenDisposition Browser::AdjustWindowOpenDispositionForTab( | |
3784 bool is_pinned, | |
3785 const GURL& url, | |
3786 const GURL& referrer, | |
3787 PageTransition::Type transition, | |
3788 WindowOpenDisposition original_disposition) { | |
3789 if (!is_pinned || | |
3790 original_disposition != CURRENT_TAB || | |
3791 (transition != PageTransition::AUTO_BOOKMARK && | |
3792 transition != PageTransition::LINK && | |
3793 transition != PageTransition::TYPED)) { | |
3794 return original_disposition; | |
3795 } | |
3796 | |
3797 bool url_is_http_or_https = | |
3798 url.SchemeIs(chrome::kHttpScheme) || | |
3799 url.SchemeIs(chrome::kHttpsScheme); | |
3800 bool referrer_is_http_or_https = | |
3801 referrer.SchemeIs(chrome::kHttpScheme) || | |
3802 referrer.SchemeIs(chrome::kHttpsScheme); | |
3803 bool scheme_matches = | |
3804 (url.scheme() == referrer.scheme()) || | |
3805 (url_is_http_or_https && referrer_is_http_or_https); | |
3806 | |
3807 // If the host and scheme are the same, then we allow the link to open in | |
3808 // the current tab, to make the page feel more web-appy. | |
3809 if (url.host() == referrer.host() && scheme_matches) | |
3810 return original_disposition; | |
3811 | |
3812 return NEW_FOREGROUND_TAB; | |
3813 } | |
3814 | |
3815 void Browser::OpenURLAtIndex(TabContents* source, | 3771 void Browser::OpenURLAtIndex(TabContents* source, |
3816 const GURL& url, | 3772 const GURL& url, |
3817 const GURL& referrer, | 3773 const GURL& referrer, |
3818 WindowOpenDisposition disposition, | 3774 WindowOpenDisposition disposition, |
3819 PageTransition::Type transition, | 3775 PageTransition::Type transition, |
3820 int index, | 3776 int index, |
3821 int add_types) { | 3777 int add_types) { |
3822 // TODO(beng): Move all this code into a separate helper that has unit tests. | 3778 // TODO(beng): Move all this code into a separate helper that has unit tests. |
3823 | 3779 |
3824 // No code for these yet | 3780 // No code for these yet |
3825 DCHECK((disposition != NEW_POPUP) && (disposition != SAVE_TO_DISK)); | 3781 DCHECK((disposition != NEW_POPUP) && (disposition != SAVE_TO_DISK)); |
3826 | 3782 |
3827 TabContents* current_tab = source ? source : GetSelectedTabContents(); | 3783 TabContents* current_tab = source ? source : GetSelectedTabContents(); |
3828 bool source_tab_was_frontmost = (current_tab == GetSelectedTabContents()); | 3784 bool source_tab_was_frontmost = (current_tab == GetSelectedTabContents()); |
3829 TabContents* new_contents = NULL; | 3785 TabContents* new_contents = NULL; |
3830 | 3786 |
3831 // Opening a bookmark counts as a user gesture, so we don't need to avoid | 3787 // Opening a bookmark counts as a user gesture, so we don't need to avoid |
3832 // carpet-bombing here. | 3788 // carpet-bombing here. |
3833 PageTransition::Type baseTransitionType = | 3789 PageTransition::Type baseTransitionType = |
3834 PageTransition::StripQualifier(transition); | 3790 PageTransition::StripQualifier(transition); |
3835 if ((baseTransitionType == PageTransition::TYPED || | 3791 if ((baseTransitionType == PageTransition::TYPED || |
3836 baseTransitionType == PageTransition::AUTO_BOOKMARK) && | 3792 baseTransitionType == PageTransition::AUTO_BOOKMARK) && |
3837 current_tab != NULL) { | 3793 current_tab != NULL) { |
3838 RenderViewHostDelegate::BrowserIntegration* delegate = current_tab; | 3794 RenderViewHostDelegate::BrowserIntegration* delegate = current_tab; |
3839 delegate->OnUserGesture(); | 3795 delegate->OnUserGesture(); |
3840 } | 3796 } |
3841 | 3797 |
3842 disposition = AdjustWindowOpenDispositionForTab( | |
3843 current_tab && IsPinned(current_tab), | |
3844 url, | |
3845 referrer, | |
3846 transition, | |
3847 disposition); | |
3848 | |
3849 // If the URL is part of the same web site, then load it in the same | 3798 // If the URL is part of the same web site, then load it in the same |
3850 // SiteInstance (and thus the same process). This is an optimization to | 3799 // SiteInstance (and thus the same process). This is an optimization to |
3851 // reduce process overhead; it is not necessary for compatibility. (That is, | 3800 // reduce process overhead; it is not necessary for compatibility. (That is, |
3852 // the new tab will not have script connections to the previous tab, so it | 3801 // the new tab will not have script connections to the previous tab, so it |
3853 // does not need to be part of the same SiteInstance or BrowsingInstance.) | 3802 // does not need to be part of the same SiteInstance or BrowsingInstance.) |
3854 // Default to loading in a new SiteInstance and BrowsingInstance. | 3803 // Default to loading in a new SiteInstance and BrowsingInstance. |
3855 // TODO(creis): should this apply to applications? | 3804 // TODO(creis): should this apply to applications? |
3856 SiteInstance* instance = NULL; | 3805 SiteInstance* instance = NULL; |
3857 // Don't use this logic when "--process-per-tab" is specified. | 3806 // Don't use this logic when "--process-per-tab" is specified. |
3858 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kProcessPerTab)) { | 3807 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kProcessPerTab)) { |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4082 } | 4031 } |
4083 | 4032 |
4084 void Browser::TabRestoreServiceDestroyed(TabRestoreService* service) { | 4033 void Browser::TabRestoreServiceDestroyed(TabRestoreService* service) { |
4085 if (!tab_restore_service_) | 4034 if (!tab_restore_service_) |
4086 return; | 4035 return; |
4087 | 4036 |
4088 DCHECK_EQ(tab_restore_service_, service); | 4037 DCHECK_EQ(tab_restore_service_, service); |
4089 tab_restore_service_->RemoveObserver(this); | 4038 tab_restore_service_->RemoveObserver(this); |
4090 tab_restore_service_ = NULL; | 4039 tab_restore_service_ = NULL; |
4091 } | 4040 } |
4092 | |
4093 bool Browser::IsPinned(TabContents* source) { | |
4094 int index = tabstrip_model_.GetIndexOfTabContents(source); | |
4095 if (index == TabStripModel::kNoTab) { | |
4096 NOTREACHED() << "IsPinned called for tab not in our strip"; | |
4097 return false; | |
4098 } | |
4099 return tabstrip_model_.IsTabPinned(index); | |
4100 } | |
OLD | NEW |