Porting newer changes from 1599-qrd

  Fixes NULL pointer exception on crash recovery

    Browser registers JS interface during crash recovery for each tab.
    Some of tabs are not recovered (e.g. Incognito tabs). The code
    was setting the JS interface for these tabs as well, while the
    tab pointer was NULL.

    Change-Id: Ic0255d4b98eef694d7b1b0a92595332b88cca695

  Add javascript interface for 'def_landing_page'.

    Fix CR: 731360.

    Change-Id: I15f5de350cb4dd74198c4ca64f92a2d15f52068b

  Fixes issue seen on carrier's homepage.

  - When the user navigates from a carrier's homepage to any bookmark entry
    and goes back to homepage, the buttons on the homepage was not responsive.
    The issue was related to how JavascriptInterface was added to webview
    and required a reload of the page during page navigation.
    The issue is fixed by not removing the JavascriptInterface that was
    added to a webview when the user navigates from the carrier's homepage
    and granting access to the java methods of the addJavascriptInterface
    only if the URL is the carrier's homepage.

    Change-Id: Ie328f2c8dbb41869bffdaf840c93d560171e79fb

Change-Id: I17f34c19890197714e661638d028fc74bfc38529
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index e4def81..9803ec4 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -86,6 +86,8 @@
 import org.codeaurora.swe.SslErrorHandler;
 import org.codeaurora.swe.WebSettings;
 import org.codeaurora.swe.WebView;
+import org.codeaurora.swe.WebBackForwardList;
+import org.codeaurora.swe.WebHistoryItem;
 
 import com.android.browser.AppAdapter;
 import com.android.browser.R;
@@ -176,7 +178,8 @@
 
     private Activity mActivity;
     private UI mUi;
-    private TabControl mTabControl;
+    private HomepageHandler mHomepageHandler;
+    protected TabControl mTabControl;
     private BrowserSettings mSettings;
     private WebViewFactory mFactory;
 
@@ -270,6 +273,7 @@
                 BrowserContract.Bookmarks.CONTENT_URI, true, mBookmarksObserver);
 
         mNetworkHandler = new NetworkStateHandler(mActivity, this);
+        mHomepageHandler = new HomepageHandler(browser, this);
     }
 
     @Override
@@ -341,7 +345,18 @@
                     mUi.needsRestoreAllTabs());
             List<Tab> tabs = mTabControl.getTabs();
             ArrayList<Long> restoredTabs = new ArrayList<Long>(tabs.size());
+
             for (Tab t : tabs) {
+                //handle restored pages that may require a JS interface
+                if (t.getWebView() != null) {
+                    WebBackForwardList backForwardList = t.getWebView().copyBackForwardList();
+                    if (backForwardList != null) {
+                        for (int i = 0; i <  backForwardList.getSize(); i++) {
+                            WebHistoryItem item = backForwardList.getItemAtIndex(i);
+                            mHomepageHandler.registerJsInterface( t.getWebView(), item.getUrl());
+                        }
+                    }
+                }
                 restoredTabs.add(t.getId());
                 if (t != mTabControl.getCurrentTab()) {
                     t.pause();
@@ -2989,6 +3004,7 @@
     protected void loadUrl(Tab tab, String url, Map<String, String> headers) {
         if (tab != null) {
             dismissSubWindow(tab);
+            mHomepageHandler.registerJsInterface(tab.getWebView(), url);
             tab.loadUrl(url, headers);
             if (tab.hasCrashed) {
                 tab.replaceCrashView(tab.getWebView(), tab.getViewContainer());