diff options
author | bauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-17 20:50:29 +0000 |
---|---|---|
committer | bauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-17 20:50:29 +0000 |
commit | 3698f173be9c6bf67816ad7e1ec194dd83438cba (patch) | |
tree | dd95954931d37a7183881dda2778d0f14d9d7e7e /chrome/browser/browser.cc | |
parent | 4462559524df6726acc2400113508f3dc22b3648 (diff) | |
download | chromium_src-3698f173be9c6bf67816ad7e1ec194dd83438cba.zip chromium_src-3698f173be9c6bf67816ad7e1ec194dd83438cba.tar.gz chromium_src-3698f173be9c6bf67816ad7e1ec194dd83438cba.tar.bz2 |
[Mac] Honor modifier keys in back/forward menu.
Add a method ActivatedAtWithDisposition to BackForwardMenuModel that navigates to a history item with a certain window disposition (current tab, new background/foreground tab).
Change BackForwardMenuController to call ActivatedAtWithDisposition with the disposition created from the current NSEvent.
Also, factor out some common code in Browser::GoBack and GoForward.
BUG=37984
TEST=Navigate to a history item in the back/forward menu while holding down the command key. The item should open in a new tab. Likewise, holding down cmd-shift should open it in a new foreground tab.
Review URL: http://codereview.chromium.org/910001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@41875 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/browser.cc')
-rw-r--r-- | chrome/browser/browser.cc | 71 |
1 files changed, 39 insertions, 32 deletions
diff --git a/chrome/browser/browser.cc b/chrome/browser/browser.cc index bc3972a..af98839 100644 --- a/chrome/browser/browser.cc +++ b/chrome/browser/browser.cc @@ -788,6 +788,19 @@ bool Browser::CanRestoreTab() { return service && !service->entries().empty(); } +bool Browser::NavigateToIndexWithDisposition(int index, + WindowOpenDisposition disp) { + NavigationController& controller = + GetOrCloneNavigationControllerForDisposition(disp); + + if (index >= 0 && index < controller.entry_count()) { + controller.GoToIndex(index); + return true; + } else { + return false; + } +} + void Browser::ShowSingletonTab(const GURL& url) { // See if we already have a tab with the given URL and select it if so. for (int i = 0; i < tabstrip_model_.count(); i++) { @@ -842,49 +855,43 @@ void Browser::UpdateCommandsForFullscreenMode(bool is_fullscreen) { /////////////////////////////////////////////////////////////////////////////// // Browser, Assorted browser commands: +NavigationController& Browser::GetOrCloneNavigationControllerForDisposition( + WindowOpenDisposition disposition) { + TabContents* current_tab = GetSelectedTabContents(); + if (disposition == NEW_FOREGROUND_TAB || + disposition == NEW_BACKGROUND_TAB) { + TabContents* cloned = current_tab->Clone(); + tabstrip_model_.AddTabContents(cloned, -1, false, + PageTransition::LINK, + disposition == NEW_FOREGROUND_TAB); + return cloned->controller(); + } else { + // Default disposition is CURRENT_TAB. + return current_tab->controller(); + } +} + void Browser::GoBack(WindowOpenDisposition disposition) { UserMetrics::RecordAction("Back", profile_); TabContents* current_tab = GetSelectedTabContents(); if (current_tab->controller().CanGoBack()) { - NavigationController* controller = NULL; - if (disposition == NEW_FOREGROUND_TAB || - disposition == NEW_BACKGROUND_TAB) { - TabContents* cloned = GetSelectedTabContents()->Clone(); - tabstrip_model_.AddTabContents(cloned, -1, false, - PageTransition::LINK, - disposition == NEW_FOREGROUND_TAB); - if (current_tab->interstitial_page()) { - // The interstitial won't be copied to the new tab, so we don't need to - // go back. - return; - } - controller = &cloned->controller(); - } else { - // Default disposition is CURRENT_TAB. - controller = ¤t_tab->controller(); + NavigationController& controller = + GetOrCloneNavigationControllerForDisposition(disposition); + // The interstitial won't be copied to the new tab, so we don't need to + // go back. + if (!current_tab->interstitial_page()) { + controller.GoBack(); } - controller->GoBack(); } } -void Browser::GoForward(WindowOpenDisposition disp) { - // TODO(brettw) this is mostly duplicated from GoBack, these should have a - // common backend or something. +void Browser::GoForward(WindowOpenDisposition disposition) { UserMetrics::RecordAction("Forward", profile_); if (GetSelectedTabContents()->controller().CanGoForward()) { - NavigationController* controller = 0; - if (disp == NEW_FOREGROUND_TAB || disp == NEW_BACKGROUND_TAB) { - TabContents* cloned = GetSelectedTabContents()->Clone(); - tabstrip_model_.AddTabContents(cloned, -1, false, - PageTransition::LINK, - disp == NEW_FOREGROUND_TAB); - controller = &cloned->controller(); - } else { - // Default disposition is CURRENT_TAB. - controller = &GetSelectedTabContents()->controller(); - } - controller->GoForward(); + NavigationController& controller = + GetOrCloneNavigationControllerForDisposition(disposition); + controller.GoForward(); } } |