Redone http://codereview.chromium.org/42571

Issue 6477: Support modifier clicks on UI elements Mouse event flags transformed to WindoOpenDisposition so that browser commands can all inteterpert event modifiers. Implemented home, forward and backwards middle-click andshift middle click. Previously working on issue 358 which was market a duplicate and concerned with the home and tabstrip subset of this behavior: Can't open a new tab by middle-clicking home button. No functionality has been lost or altered, only the use ofmodifiers give access to increased functionality. 

BUG=6477
TBR=maruel

Review URL: http://codereview.chromium.org/53020

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@12403 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/browser.cc b/chrome/browser/browser.cc
index eecdd1a5..5e1b4ca 100644
--- a/chrome/browser/browser.cc
+++ b/chrome/browser/browser.cc
@@ -551,7 +551,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 // Browser, Assorted browser commands:
 
-void Browser::GoBack() {
+void Browser::GoBack(WindowOpenDisposition disposition) {
   UserMetrics::RecordAction(L"Back", profile_);
 
   // If we are showing an interstitial, just hide it.
@@ -565,14 +565,37 @@
     web_contents->interstitial_page()->DontProceed();
     return;
   }
-  if (current_tab->controller()->CanGoBack())
-    current_tab->controller()->GoBack();
+
+  if (current_tab->controller()->CanGoBack()) {
+    NavigationController* controller = 0;
+    if (disposition == NEW_FOREGROUND_TAB || disposition == NEW_BACKGROUND_TAB){
+      controller = GetSelectedTabContents()->controller()->Clone();
+      tabstrip_model_.AddTabContents(
+          controller->active_contents(), -1,
+          PageTransition::LINK, disposition == NEW_FOREGROUND_TAB);
+    } else {
+      // Default disposition is CURRENT_TAB.
+      controller = current_tab->controller();
+    }
+    controller->GoBack();
+  }
 }
 
-void Browser::GoForward() {
+void Browser::GoForward(WindowOpenDisposition disp) {
   UserMetrics::RecordAction(L"Forward", profile_);
-  if (GetSelectedTabContents()->controller()->CanGoForward())
-    GetSelectedTabContents()->controller()->GoForward();
+  if (GetSelectedTabContents()->controller()->CanGoForward()) {
+    NavigationController* controller = 0;
+    if (disp == NEW_FOREGROUND_TAB || disp == NEW_BACKGROUND_TAB) {
+      controller = GetSelectedTabContents()->controller()->Clone();
+      tabstrip_model_.AddTabContents(
+          controller->active_contents(), -1,
+          PageTransition::LINK, disp == NEW_FOREGROUND_TAB);
+    } else {
+      // Default disposition is CURRENT_TAB.
+      controller = GetSelectedTabContents()->controller();
+    }
+    controller->GoForward();
+  }
 }
 
 void Browser::Reload() {
@@ -597,11 +620,9 @@
   }
 }
 
-void Browser::Home() {
+void Browser::Home(WindowOpenDisposition disposition) {
   UserMetrics::RecordAction(L"Home", profile_);
-  GURL homepage_url = GetHomePage();
-  GetSelectedTabContents()->controller()->LoadURL(
-      homepage_url, GURL(), PageTransition::AUTO_BOOKMARK);
+  OpenURL(GetHomePage(), GURL(), disposition, PageTransition::AUTO_BOOKMARK);
 }
 
 void Browser::OpenCurrentURL() {
@@ -612,9 +633,9 @@
                location_bar->GetPageTransition());
 }
 
-void Browser::Go() {
+void Browser::Go(WindowOpenDisposition disposition) {
   UserMetrics::RecordAction(L"Go", profile_);
-  window_->GetLocationBar()->AcceptInput();
+  window_->GetLocationBar()->AcceptInputWithDisposition(disposition);
 }
 
 void Browser::Stop() {
@@ -1095,10 +1116,8 @@
   return NULL;
 }
 
-///////////////////////////////////////////////////////////////////////////////
-// Browser, CommandUpdater::CommandUpdaterDelegate implementation:
-
-void Browser::ExecuteCommand(int id) {
+void Browser::ExecuteCommandWithDisposition(
+  int id, WindowOpenDisposition disposition) {
   // No commands are enabled if there is not yet any selected tab.
   // TODO(pkasting): It seems like we should not need this, because either
   // most/all commands should not have been enabled yet anyway or the ones that
@@ -1115,12 +1134,12 @@
   // declaration order in browser.h!
   switch (id) {
     // Navigation commands
-    case IDC_BACK:                  GoBack();                      break;
-    case IDC_FORWARD:               GoForward();                   break;
+    case IDC_BACK:                  GoBack(disposition);           break;
+    case IDC_FORWARD:               GoForward(disposition);        break;
     case IDC_RELOAD:                Reload();                      break;
-    case IDC_HOME:                  Home();                        break;
+    case IDC_HOME:                  Home(disposition);             break;
     case IDC_OPEN_CURRENT_URL:      OpenCurrentURL();              break;
-    case IDC_GO:                    Go();                          break;
+    case IDC_GO:                    Go(disposition);               break;
     case IDC_STOP:                  Stop();                        break;
 
      // Window management commands
@@ -1275,6 +1294,13 @@
 }
 
 ///////////////////////////////////////////////////////////////////////////////
+// Browser, CommandUpdater::CommandUpdaterDelegate implementation:
+
+void Browser::ExecuteCommand(int id) {
+  ExecuteCommandWithDisposition(id, CURRENT_TAB);
+}
+
+///////////////////////////////////////////////////////////////////////////////
 // Browser, TabStripModelDelegate implementation:
 
 GURL Browser::GetBlankTabURL() const {