[Android] Rewrite old-style NTP URLs to new-style URLs.

For example, chrome://newtab#bookmarks becomes
chrome-native://bookmarks. This helps users transition smoothly to the
new NTP: any tabs open to the old NTP when the user updates will start
showing the new NTP. Also: opening a foreign session tab from other
platforms and pressing back until arriving at chrome://newtab will now
show the new NTP.

BUG=354063
NOTRY=true

Review URL: https://codereview.chromium.org/205983005

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@260218 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/android/new_tab_page_url_handler.cc b/chrome/browser/android/new_tab_page_url_handler.cc
new file mode 100644
index 0000000..7ea7593
--- /dev/null
+++ b/chrome/browser/android/new_tab_page_url_handler.cc
@@ -0,0 +1,48 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/android/new_tab_page_url_handler.h"
+
+#include <string>
+
+#include "base/strings/string_util.h"
+#include "chrome/common/url_constants.h"
+#include "content/public/common/url_constants.h"
+#include "url/gurl.h"
+
+namespace {
+const char kLegacyBookmarksFragment[] = "bookmarks";
+const char kLegacyOpenTabsFragment[] = "open_tabs";
+const char kLegacyRecentTabsHost[] = "recent_tabs";
+}
+
+namespace chrome {
+namespace android {
+
+bool HandleAndroidNewTabURL(GURL* url,
+                            content::BrowserContext* browser_context) {
+  if (url->SchemeIs(content::kChromeUIScheme) &&
+      url->host() == chrome::kChromeUINewTabHost) {
+    std::string ref = url->ref();
+    if (StartsWithASCII(ref, kLegacyBookmarksFragment, true)) {
+      *url = GURL(chrome::kChromeUINativeBookmarksURL);
+    } else if (ref == kLegacyOpenTabsFragment) {
+      *url = GURL(chrome::kChromeUINativeRecentTabsURL);
+    } else {
+      *url = GURL(chrome::kChromeUINativeNewTabURL);
+    }
+    return true;
+  }
+
+  if (url->SchemeIs(chrome::kChromeNativeScheme) &&
+      url->host() == kLegacyRecentTabsHost) {
+    *url = GURL(chrome::kChromeUINativeRecentTabsURL);
+    return true;
+  }
+
+  return false;
+}
+
+}  // namespace android
+}  // namespace chrome
diff --git a/chrome/browser/android/new_tab_page_url_handler.h b/chrome/browser/android/new_tab_page_url_handler.h
new file mode 100644
index 0000000..90c968a
--- /dev/null
+++ b/chrome/browser/android/new_tab_page_url_handler.h
@@ -0,0 +1,34 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ANDROID_NEW_TAB_PAGE_URL_HANDLER_H_
+#define CHROME_BROWSER_ANDROID_NEW_TAB_PAGE_URL_HANDLER_H_
+
+class GURL;
+
+namespace content {
+class BrowserContext;
+}
+
+namespace chrome {
+namespace android {
+
+// Rewrites old-style Android NTP URLs to new-style NTP URLs:
+//  - chrome://newtab              -> chrome-native://newtab
+//  - chrome://newtab#most_visited -> chrome-native://newtab
+//  - chrome://newtab#incognito    -> chrome-native://newtab
+//  - chrome://newtab#bookmarks    -> chrome-native://bookmarks
+//  - chrome://newtab#bookmarks:99 -> chrome-native://bookmarks
+//  - chrome://newtab#open_tabs    -> chrome-native://recent-tabs
+//  - chrome-native://recent_tabs  -> chrome-native://recent-tabs
+//
+// TODO(newt): Once most users have upgraded past M34, simplify this down to a
+// single rule: chrome://newtab -> chrome-native://newtab
+bool HandleAndroidNewTabURL(GURL* url,
+                            content::BrowserContext* browser_context);
+
+}  // namespace android
+}  // namespace chrome
+
+#endif  // CHROME_BROWSER_ANDROID_NEW_TAB_PAGE_URL_HANDLER_H_
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 3ddfd02..35d70816 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -173,6 +173,7 @@
 #elif defined(OS_LINUX)
 #include "chrome/browser/chrome_browser_main_linux.h"
 #elif defined(OS_ANDROID)
+#include "chrome/browser/android/new_tab_page_url_handler.h"
 #include "chrome/browser/android/webapps/single_tab_mode_tab_helper.h"
 #include "chrome/browser/chrome_browser_main_android.h"
 #include "chrome/browser/media/encrypted_media_message_filter_android.h"
@@ -2397,9 +2398,15 @@
   handler->AddHandlerPair(&WillHandleBrowserAboutURL,
                           BrowserURLHandler::null_handler());
 
+#if defined(OS_ANDROID)
+  // Handler to rewrite chrome://newtab on Android.
+  handler->AddHandlerPair(&chrome::android::HandleAndroidNewTabURL,
+                          BrowserURLHandler::null_handler());
+#else
   // Handler to rewrite chrome://newtab for InstantExtended.
   handler->AddHandlerPair(&chrome::HandleNewTabURLRewrite,
                           &chrome::HandleNewTabURLReverseRewrite);
+#endif
 
   // chrome: & friends.
   handler->AddHandlerPair(&HandleWebUI, &HandleWebUIReverse);
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 4a52b67..d419ae7 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -147,6 +147,8 @@
         'browser/android/meta_tag_observer.h',
         'browser/android/new_tab_page_prefs.cc',
         'browser/android/new_tab_page_prefs.h',
+        'browser/android/new_tab_page_url_handler.cc',
+        'browser/android/new_tab_page_url_handler.h',
         'browser/android/google_location_settings_helper.h',
         'browser/android/intent_helper.cc',
         'browser/android/intent_helper.h',
diff --git a/chrome/common/chrome_content_client.cc b/chrome/common/chrome_content_client.cc
index 9a43d15e..e245a0ef 100644
--- a/chrome/common/chrome_content_client.cc
+++ b/chrome/common/chrome_content_client.cc
@@ -479,6 +479,7 @@
     std::vector<std::string>* savable_schemes) {
   standard_schemes->push_back(extensions::kExtensionScheme);
   savable_schemes->push_back(extensions::kExtensionScheme);
+  standard_schemes->push_back(chrome::kChromeNativeScheme);
   standard_schemes->push_back(extensions::kExtensionResourceScheme);
   savable_schemes->push_back(extensions::kExtensionResourceScheme);
   standard_schemes->push_back(chrome::kChromeSearchScheme);
diff --git a/chrome/common/url_constants.cc b/chrome/common/url_constants.cc
index 2d253b7e..6f8a339 100644
--- a/chrome/common/url_constants.cc
+++ b/chrome/common/url_constants.cc
@@ -93,6 +93,8 @@
 
 #if defined(OS_ANDROID)
 const char kChromeUINativeNewTabURL[] = "chrome-native://newtab/";
+const char kChromeUINativeBookmarksURL[] = "chrome-native://bookmarks/";
+const char kChromeUINativeRecentTabsURL[] = "chrome-native://recent-tabs/";
 const char kChromeUIWelcomeURL[] = "chrome://welcome/";
 #endif
 
diff --git a/chrome/common/url_constants.h b/chrome/common/url_constants.h
index 72943970..f12ea11f 100644
--- a/chrome/common/url_constants.h
+++ b/chrome/common/url_constants.h
@@ -88,6 +88,8 @@
 
 #if defined(OS_ANDROID)
 extern const char kChromeUINativeNewTabURL[];
+extern const char kChromeUINativeBookmarksURL[];
+extern const char kChromeUINativeRecentTabsURL[];
 extern const char kChromeUIWelcomeURL[];
 #endif