Clear back stack after submitted query into preloaded page.

This ensures that the blank searchbox page does not appear in the back stack.

Bug: 5252128
Change-Id: I93e2e7f7c1c69e6e0e93b38acf1c7c9dc887ec19
diff --git a/src/com/android/browser/PreloadedTabControl.java b/src/com/android/browser/PreloadedTabControl.java
index ed066f2..4ffe6b4 100644
--- a/src/com/android/browser/PreloadedTabControl.java
+++ b/src/com/android/browser/PreloadedTabControl.java
@@ -21,6 +21,7 @@
 import android.webkit.SearchBox;
 
 import java.util.Map;
+import java.util.regex.Pattern;
 
 /**
  * Class to manage the controlling of preloaded tab.
@@ -74,6 +75,7 @@
         }
         maybeSetQuery(query, sb);
         if (LOGD_ENABLED) Log.d(LOGTAG, "Submitting query " + query);
+        final String currentUrl = mTab.getUrl();
         sb.onsubmit(new SearchBox.SearchBoxListener() {
             @Override
             public void onSubmitComplete(boolean called) {
@@ -83,7 +85,21 @@
                     if (LOGD_ENABLED) Log.d(LOGTAG, "Query not submitted; falling back");
                     loadUrl(fallbackUrl, fallbackHeaders);
                     // make sure that the failed, preloaded URL is cleared from the back stack
-                    mTab.clearBackStackWhenItemAdded(fallbackUrl);
+                    mTab.clearBackStackWhenItemAdded(Pattern.compile(
+                            "^" + Pattern.quote(fallbackUrl) + "$"));
+                } else {
+                    // ignore the next fragment change, to avoid leaving a blank page in the browser
+                    // after the query has been submitted.
+                    String currentWithoutFragment = Uri.parse(currentUrl)
+                            .buildUpon()
+                            .fragment(null)
+                            .toString();
+                    mTab.clearBackStackWhenItemAdded(
+                            Pattern.compile(
+                                    "^" +
+                                    Pattern.quote(currentWithoutFragment) +
+                                    "(\\#.*)?" +
+                                    "$"));
                 }
             }});
         return true;
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 3b283cc..8c9dc02 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -84,6 +84,7 @@
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.Vector;
+import java.util.regex.Pattern;
 import java.util.zip.GZIPOutputStream;
 
 /**
@@ -175,7 +176,7 @@
     /**
      * See {@link #clearBackStackWhenItemAdded(String)}.
      */
-    private String mClearHistoryMatchUrl;
+    private Pattern mClearHistoryUrlPattern;
 
     private static synchronized Bitmap getDefaultFavicon(Context context) {
         if (sDefaultFavicon == null) {
@@ -1391,17 +1392,20 @@
                 if (isInVoiceSearchMode()) {
                     item.setCustomData(mVoiceSearchData.mVoiceSearchIntent);
                 }
-                if (mClearHistoryMatchUrl != null) {
+                if (mClearHistoryUrlPattern != null) {
+                    boolean match =
+                        mClearHistoryUrlPattern.matcher(item.getOriginalUrl()).matches();
                     if (LOGD_ENABLED) {
-                        Log.d(LOGTAG, "onNewHistoryItem:\n\t" + item.getUrl() + "\n\t"
-                                + mClearHistoryMatchUrl);
+                        Log.d(LOGTAG, "onNewHistoryItem: match=" + match + "\n\t"
+                                + item.getUrl() + "\n\t"
+                                + mClearHistoryUrlPattern);
                     }
-                    if (TextUtils.equals(item.getOriginalUrl(), mClearHistoryMatchUrl)) {
+                    if (match) {
                         if (mMainView != null) {
                             mMainView.clearHistory();
                         }
                     }
-                    mClearHistoryMatchUrl = null;
+                    mClearHistoryUrlPattern = null;
                 }
             }
             @Override
@@ -2106,8 +2110,8 @@
      * This is used to ensure that preloaded URLs that are not subsequently seen by the user do
      * not appear in the back stack.
      */
-    public void clearBackStackWhenItemAdded(String urlToMatch) {
-        mClearHistoryMatchUrl = urlToMatch;
+    public void clearBackStackWhenItemAdded(Pattern urlPattern) {
+        mClearHistoryUrlPattern = urlPattern;
     }
 
     protected void persistThumbnail() {