Prevent webview reuse

 Bug: 4742007
 Bug: 4770356
 Also pipe all loadUrl's through Tab so that it can immediately
 update its internal state. This is necessary as javascript:
 uris do not cause onPageStarted/finished callbacks to happen,
 thus the url and title of the Tab do not update.

Change-Id: I6d17e8627db505eaa9158339fdfc7afd2c6672a2
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index e3ca09a..9a015b2 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -38,7 +38,6 @@
 import android.graphics.Picture;
 import android.net.Uri;
 import android.net.http.SslError;
-import android.nfc.NfcAdapter;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Environment;
@@ -84,14 +83,13 @@
 import com.android.browser.search.SearchEngine;
 import com.android.common.Search;
 
-import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
-import java.io.IOException;
 import java.net.URLEncoder;
 import java.util.Calendar;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Controller for browser
@@ -481,10 +479,10 @@
                         }
                         switch (msg.arg1) {
                             case R.id.open_context_menu_id:
-                                loadUrlFromContext(getCurrentTopWebView(), url);
+                                loadUrlFromContext(url);
                                 break;
                             case R.id.view_image_context_menu_id:
-                                loadUrlFromContext(getCurrentTopWebView(), src);
+                                loadUrlFromContext(src);
                                 break;
                             case R.id.open_newtab_context_menu_id:
                                 final Tab parent = mTabControl.getCurrentTab();
@@ -505,7 +503,7 @@
                     }
 
                     case LOAD_URL:
-                        loadUrlFromContext(getCurrentTopWebView(), (String) msg.obj);
+                        loadUrlFromContext((String) msg.obj);
                         break;
 
                     case STOP_LOAD:
@@ -1204,8 +1202,7 @@
                         true);
             } else {
                 final Tab currentTab = mTabControl.getCurrentTab();
-                dismissSubWindow(currentTab);
-                loadUrl(getCurrentTopWebView(), url);
+                loadUrl(currentTab, url);
             }
         }
     }
@@ -1604,10 +1601,7 @@
 
             case R.id.homepage_menu_id:
                 Tab current = mTabControl.getCurrentTab();
-                if (current != null) {
-                    dismissSubWindow(current);
-                    loadUrl(current.getWebView(), mSettings.getHomePage());
-                }
+                loadUrl(current, mSettings.getHomePage());
                 break;
 
             case R.id.preferences_menu_id:
@@ -2204,7 +2198,7 @@
         }
     }
 
-    protected void reuseTab(Tab appTab, String appId, UrlData urlData) {
+    protected void reuseTab(Tab appTab, UrlData urlData) {
         // Dismiss the subwindow if applicable.
         dismissSubWindow(appTab);
         // Since we might kill the WebView, remove it from the
@@ -2289,9 +2283,8 @@
             if (parent != null && parent != tab) {
                 parent.addChildTab(tab);
             }
-            WebView w = tab.getWebView();
             if (url != null) {
-                loadUrl(w, url);
+                loadUrl(tab, url);
             }
         }
         return tab;
@@ -2313,8 +2306,7 @@
         } else {
             if (useCurrent) {
                 tab = mTabControl.getCurrentTab();
-                // Get rid of the subwindow if it exists
-                dismissSubWindow(tab);
+                reuseTab(tab, null);
             } else {
                 mUi.showMaxTabsWarning();
             }
@@ -2383,15 +2375,15 @@
         removeTab(tab);
     }
 
-    /**************** TODO: Url loading clean up *******************************/
-
     // Called when loading from context menu or LOAD_URL message
-    protected void loadUrlFromContext(WebView view, String url) {
+    protected void loadUrlFromContext(String url) {
+        Tab tab = getCurrentTab();
+        WebView view = tab != null ? tab.getWebView() : null;
         // In case the user enters nothing.
-        if (url != null && url.length() != 0 && view != null) {
+        if (url != null && url.length() != 0 && tab != null && view != null) {
             url = UrlUtils.smartUrlFilter(url);
             if (!view.getWebViewClient().shouldOverrideUrlLoading(view, url)) {
-                loadUrl(view, url);
+                loadUrl(tab, url);
             }
         }
     }
@@ -2403,8 +2395,15 @@
      * @param view The WebView used to load url.
      * @param url The URL to load.
      */
-    protected void loadUrl(WebView view, String url) {
-        view.loadUrl(url);
+    protected void loadUrl(Tab tab, String url) {
+        loadUrl(tab, url, null);
+    }
+
+    protected void loadUrl(Tab tab, String url, Map<String, String> headers) {
+        if (tab != null) {
+            dismissSubWindow(tab);
+            tab.loadUrl(url, headers);
+        }
     }
 
     /**
@@ -2414,7 +2413,13 @@
      * @param data The UrlData being loaded.
      */
     protected void loadUrlDataIn(Tab t, UrlData data) {
-        data.loadIn(t);
+        if (data != null) {
+            if (data.mVoiceIntent != null) {
+                t.activateVoiceSearchMode(data.mVoiceIntent);
+            } else {
+                loadUrl(t, data.mUrl, data.mHeaders);
+            }
+        }
     }
 
     @Override