Fixup browser to use WebView proxy

Has to escape out to WebViewClassic whenever it needs a hidden API.

Interdepends on https://android-git.corp.google.com/g/165608

Change-Id: Ic61dd7f57f75381864075605d5901f2688648cbd
diff --git a/src/com/android/browser/AutoFillProfileDatabase.java b/src/com/android/browser/AutoFillProfileDatabase.java
index 3345e92..9666926 100644
--- a/src/com/android/browser/AutoFillProfileDatabase.java
+++ b/src/com/android/browser/AutoFillProfileDatabase.java
@@ -22,7 +22,7 @@
 import android.database.sqlite.SQLiteOpenHelper;
 import android.provider.BaseColumns;
 import android.util.Log;
-import android.webkit.WebSettings.AutoFillProfile;
+import android.webkit.WebSettingsClassic.AutoFillProfile;
 
 public class AutoFillProfileDatabase {
 
diff --git a/src/com/android/browser/AutoFillSettingsFragment.java b/src/com/android/browser/AutoFillSettingsFragment.java
index 7be657d..68b325e 100644
--- a/src/com/android/browser/AutoFillSettingsFragment.java
+++ b/src/com/android/browser/AutoFillSettingsFragment.java
@@ -32,7 +32,7 @@
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.inputmethod.InputMethodManager;
-import android.webkit.WebSettings.AutoFillProfile;
+import android.webkit.WebSettingsClassic.AutoFillProfile;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.Toast;
diff --git a/src/com/android/browser/AutofillHandler.java b/src/com/android/browser/AutofillHandler.java
index be4fa9c..99ee6a0 100644
--- a/src/com/android/browser/AutofillHandler.java
+++ b/src/com/android/browser/AutofillHandler.java
@@ -26,7 +26,7 @@
 import android.os.Message;
 import android.preference.PreferenceManager;
 import android.provider.ContactsContract;
-import android.webkit.WebSettings.AutoFillProfile;
+import android.webkit.WebSettingsClassic.AutoFillProfile;
 
 import java.util.concurrent.CountDownLatch;
 
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index e1d7047..ffb2928 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -47,6 +47,7 @@
 import android.view.inputmethod.InputMethodManager;
 import android.webkit.WebChromeClient;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 import android.widget.FrameLayout;
 import android.widget.ImageButton;
 import android.widget.LinearLayout;
@@ -344,7 +345,7 @@
         // Remove the container from the content and then remove the
         // WebView from the container. This will trigger a focus change
         // needed by WebView.
-        mainView.setEmbeddedTitleBar(null);
+        WebViewClassic.fromWebView(mainView).setEmbeddedTitleBar(null);
         FrameLayout wrapper =
                 (FrameLayout) container.findViewById(R.id.webview_wrapper);
         wrapper.removeView(mainView);
@@ -395,7 +396,8 @@
         final WebView cancelSubView = subView;
         cancel.setOnClickListener(new OnClickListener() {
             public void onClick(View v) {
-                cancelSubView.getWebChromeClient().onCloseWindow(cancelSubView);
+                WebViewClassic.fromWebView(cancelSubView).getWebChromeClient().onCloseWindow(
+                        cancelSubView);
             }
         });
         tab.setSubWebView(subView);
@@ -476,7 +478,7 @@
     protected void setTitleGravity(int gravity) {
         WebView web = getWebView();
         if (web != null) {
-            web.setTitleBarGravity(gravity);
+            WebViewClassic.fromWebView(web).setTitleBarGravity(gravity);
         }
     }
 
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index dd7bb56..4f4bb13 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -32,11 +32,12 @@
 import android.webkit.GeolocationPermissions;
 import android.webkit.WebIconDatabase;
 import android.webkit.WebSettings;
-import android.webkit.WebSettings.AutoFillProfile;
 import android.webkit.WebSettings.LayoutAlgorithm;
 import android.webkit.WebSettings.PluginState;
 import android.webkit.WebSettings.TextSize;
 import android.webkit.WebSettings.ZoomDensity;
+import android.webkit.WebSettingsClassic;
+import android.webkit.WebSettingsClassic.AutoFillProfile;
 import android.webkit.WebStorage;
 import android.webkit.WebView;
 import android.webkit.WebViewDatabase;
@@ -149,12 +150,13 @@
     }
 
     public void startManagingSettings(WebSettings settings) {
+        WebSettingsClassic settingsClassic = (WebSettingsClassic) settings;
         if (mNeedsSharedSync) {
             syncSharedSettings();
         }
         synchronized (mManagedSettings) {
-            syncStaticSettings(settings);
-            syncSetting(settings);
+            syncStaticSettings(settingsClassic);
+            syncSetting(settingsClassic);
             mManagedSettings.add(new WeakReference<WebSettings>(settings));
         }
     }
@@ -233,7 +235,7 @@
     /**
      * Syncs all the settings that have a Preference UI
      */
-    private void syncSetting(WebSettings settings) {
+    private void syncSetting(WebSettingsClassic settings) {
         settings.setGeolocationEnabled(enableGeolocation());
         settings.setJavaScriptEnabled(enableJavascript());
         settings.setLightTouchEnabled(enableLightTouch());
@@ -283,7 +285,7 @@
      * Syncs all the settings that have no UI
      * These cannot change, so we only need to set them once per WebSettings
      */
-    private void syncStaticSettings(WebSettings settings) {
+    private void syncStaticSettings(WebSettingsClassic settings) {
         settings.setDefaultFontSize(16);
         settings.setDefaultFixedFontSize(13);
         settings.setPageCacheCapacity(getPageCacheCapacity());
@@ -332,7 +334,7 @@
             Iterator<WeakReference<WebSettings>> iter = mManagedSettings.iterator();
             while (iter.hasNext()) {
                 WeakReference<WebSettings> ref = iter.next();
-                WebSettings settings = ref.get();
+                WebSettingsClassic settings = (WebSettingsClassic)ref.get();
                 if (settings == null) {
                     iter.remove();
                     continue;
diff --git a/src/com/android/browser/BrowserWebView.java b/src/com/android/browser/BrowserWebView.java
index b763cf1..7981d8a 100644
--- a/src/com/android/browser/BrowserWebView.java
+++ b/src/com/android/browser/BrowserWebView.java
@@ -21,13 +21,14 @@
 import android.util.AttributeSet;
 import android.view.View;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 
 import java.util.Map;
 
 /**
  * Manage WebView scroll events
  */
-public class BrowserWebView extends WebView {
+public class BrowserWebView extends WebView implements WebViewClassic.TitleBarDelegate {
 
     public interface OnScrollChangedListener {
         void onScrollChanged(int l, int t, int oldl, int oldt);
@@ -73,18 +74,15 @@
         super(context);
     }
 
+    // From TitleBarDelegate
     @Override
-    protected int getTitleHeight() {
+    public int getTitleHeight() {
         return (mTitleBar != null) ? mTitleBar.getEmbeddedHeight() : 0;
     }
 
-    void hideEmbeddedTitleBar() {
-        scrollBy(0, getVisibleTitleHeight());
-    }
-
+    // From TitleBarDelegate
     @Override
-    public void setEmbeddedTitleBar(final View title) {
-        super.setEmbeddedTitleBar(title);
+    public void onSetEmbeddedTitleBar(final View title) {
         mTitleBar = (TitleBar) title;
     }
 
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index f8811b2..923dfed 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -76,6 +76,7 @@
 import android.webkit.WebIconDatabase;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 import android.widget.Toast;
 
 import com.android.browser.IntentHandler.UrlData;
@@ -351,7 +352,7 @@
         // Read JavaScript flags if it exists.
         String jsFlags = getSettings().getJsEngineFlags();
         if (jsFlags.trim().length() != 0) {
-            getCurrentWebView().setJsFlags(jsFlags);
+            WebViewClassic.fromWebView(getCurrentWebView()).setJsFlags(jsFlags);
         }
         if (intent != null
                 && BrowserActivity.ACTION_SHOW_BOOKMARKS.equals(intent.getAction())) {
@@ -2147,7 +2148,7 @@
     }
 
     private static class SelectText implements OnMenuItemClickListener {
-        private WebView mWebView;
+        private WebViewClassic mWebView;
 
         public boolean onMenuItemClick(MenuItem item) {
             if (mWebView != null) {
@@ -2157,7 +2158,7 @@
         }
 
         public SelectText(WebView webView) {
-            mWebView = webView;
+            mWebView = WebViewClassic.fromWebView(webView);
         }
 
     }
@@ -2430,7 +2431,8 @@
         // In case the user enters nothing.
         if (url != null && url.length() != 0 && tab != null && view != null) {
             url = UrlUtils.smartUrlFilter(url);
-            if (!view.getWebViewClient().shouldOverrideUrlLoading(view, url)) {
+            if (!WebViewClassic.fromWebView(view).getWebViewClient().
+                    shouldOverrideUrlLoading(view, url)) {
                 loadUrl(tab, url);
             }
         }
@@ -2662,14 +2664,14 @@
                 break;
             case KeyEvent.KEYCODE_A:
                 if (ctrl) {
-                    webView.selectAll();
+                    WebViewClassic.fromWebView(webView).selectAll();
                     return true;
                 }
                 break;
 //          case KeyEvent.KEYCODE_B:    // menu
             case KeyEvent.KEYCODE_C:
                 if (ctrl) {
-                    webView.copySelection();
+                    WebViewClassic.fromWebView(webView).copySelection();
                     return true;
                 }
                 break;
diff --git a/src/com/android/browser/IntentHandler.java b/src/com/android/browser/IntentHandler.java
index e5ddb47..ecd4545 100644
--- a/src/com/android/browser/IntentHandler.java
+++ b/src/com/android/browser/IntentHandler.java
@@ -197,15 +197,15 @@
                 if (!urlData.isEmpty()
                         && urlData.mUrl.startsWith("about:debug")) {
                     if ("about:debug.dom".equals(urlData.mUrl)) {
-                        current.getWebView().dumpDomTree(false);
+                        current.getWebViewClassic().dumpDomTree(false);
                     } else if ("about:debug.dom.file".equals(urlData.mUrl)) {
-                        current.getWebView().dumpDomTree(true);
+                        current.getWebViewClassic().dumpDomTree(true);
                     } else if ("about:debug.render".equals(urlData.mUrl)) {
-                        current.getWebView().dumpRenderTree(false);
+                        current.getWebViewClassic().dumpRenderTree(false);
                     } else if ("about:debug.render.file".equals(urlData.mUrl)) {
-                        current.getWebView().dumpRenderTree(true);
+                        current.getWebViewClassic().dumpRenderTree(true);
                     } else if ("about:debug.display".equals(urlData.mUrl)) {
-                        current.getWebView().dumpDisplayTree();
+                        current.getWebViewClassic().dumpDisplayTree();
                     } else if ("about:debug.nav".equals(urlData.mUrl)) {
                         current.getWebView().debugDump();
                     } else {
diff --git a/src/com/android/browser/NetworkStateHandler.java b/src/com/android/browser/NetworkStateHandler.java
index 2fbd035..4ae91ba 100644
--- a/src/com/android/browser/NetworkStateHandler.java
+++ b/src/com/android/browser/NetworkStateHandler.java
@@ -24,6 +24,7 @@
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 
 /**
  * Handle network state changes
@@ -110,7 +111,7 @@
     private void sendNetworkType(String type, String subtype) {
         WebView w = mController.getCurrentWebView();
         if (w != null) {
-            w.setNetworkType(type, subtype);
+            WebViewClassic.fromWebView(w).setNetworkType(type, subtype);
         }
     }
 
diff --git a/src/com/android/browser/PageDialogsHandler.java b/src/com/android/browser/PageDialogsHandler.java
index 013eaf1..19cbfcd 100644
--- a/src/com/android/browser/PageDialogsHandler.java
+++ b/src/com/android/browser/PageDialogsHandler.java
@@ -27,6 +27,7 @@
 import android.webkit.HttpAuthHandler;
 import android.webkit.SslErrorHandler;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
@@ -296,8 +297,8 @@
                                 mSSLCertificateOnErrorHandler = null;
                                 mSSLCertificateOnErrorError = null;
 
-                                view.getWebViewClient().onReceivedSslError(
-                                                view, handler, error);
+                                WebViewClassic.fromWebView(view).getWebViewClient().
+                                        onReceivedSslError(view, handler, error);
                             }
                         })
                  .setNeutralButton(R.string.page_info_view,
@@ -324,8 +325,8 @@
                                 mSSLCertificateOnErrorHandler = null;
                                 mSSLCertificateOnErrorError = null;
 
-                                view.getWebViewClient().onReceivedSslError(
-                                                view, handler, error);
+                                WebViewClassic.fromWebView(view).getWebViewClient().
+                                        onReceivedSslError(view, handler, error);
                             }
                         })
                 .show();
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index ee5ca40..5afb9c4 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -38,6 +38,7 @@
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityEvent;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 
@@ -169,7 +170,7 @@
         } else {
             // check if title bar is already attached by animation
             if (mTitleBar.getParent() == null) {
-                view.setEmbeddedTitleBar(mTitleBar);
+                WebViewClassic.fromWebView(view).setEmbeddedTitleBar(mTitleBar);
             }
         }
         if (tab.isInVoiceSearchMode()) {
@@ -287,7 +288,7 @@
             mPieControl.attachToContainer(mContentView);
             WebView web = getWebView();
             if (web != null) {
-                web.setEmbeddedTitleBar(null);
+                WebViewClassic.fromWebView(web).setEmbeddedTitleBar(null);
             }
         } else {
             if (mPieControl != null) {
@@ -299,7 +300,7 @@
                 if ((mTitleBar != null) && (mTitleBar.getParent() != null)) {
                     ((ViewGroup) mTitleBar.getParent()).removeView(mTitleBar);
                 }
-                web.setEmbeddedTitleBar(mTitleBar);
+                WebViewClassic.fromWebView(web).setEmbeddedTitleBar(mTitleBar);
             }
             setTitleGravity(Gravity.NO_GRAVITY);
         }
diff --git a/src/com/android/browser/PreloadedTabControl.java b/src/com/android/browser/PreloadedTabControl.java
index 4ffe6b4..0b2956f 100644
--- a/src/com/android/browser/PreloadedTabControl.java
+++ b/src/com/android/browser/PreloadedTabControl.java
@@ -62,12 +62,12 @@
     }
 
     public void setQuery(String query) {
-        maybeSetQuery(query, mTab.getWebView().getSearchBox());
+        maybeSetQuery(query, mTab.getWebViewClassic().getSearchBox());
     }
 
     public boolean searchBoxSubmit(final String query,
             final String fallbackUrl, final Map<String, String> fallbackHeaders) {
-        final SearchBox sb = mTab.getWebView().getSearchBox();
+        final SearchBox sb = mTab.getWebViewClassic().getSearchBox();
         if (sb == null) {
             // no searchbox, cannot submit. Fallback to regular tab creation
             if (LOGD_ENABLED) Log.d(LOGTAG, "No searchbox, cannot submit query");
@@ -106,7 +106,7 @@
     }
 
     public void searchBoxCancel() {
-        SearchBox sb = mTab.getWebView().getSearchBox();
+        SearchBox sb = mTab.getWebViewClassic().getSearchBox();
         if (sb != null) {
             mLastQuery = null;
             sb.oncancel(new SearchBox.SearchBoxListener(){
diff --git a/src/com/android/browser/SnapshotTab.java b/src/com/android/browser/SnapshotTab.java
index d9c71f0..f58f88b 100644
--- a/src/com/android/browser/SnapshotTab.java
+++ b/src/com/android/browser/SnapshotTab.java
@@ -25,6 +25,7 @@
 import android.os.Bundle;
 import android.util.Log;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 
 import com.android.browser.provider.SnapshotProvider.Snapshots;
 
@@ -121,7 +122,7 @@
     public void loadUrl(String url, Map<String, String> headers) {
         if (!mIsLive) {
             mIsLive = true;
-            getWebView().clearViewState();
+            getWebViewClassic().clearViewState();
         }
         super.loadUrl(url, headers);
     }
@@ -185,7 +186,7 @@
                         mTab.mCurrentState.mFavicon = BitmapFactory
                                 .decodeByteArray(favicon, 0, favicon.length);
                     }
-                    WebView web = mTab.getWebView();
+                    WebViewClassic web = mTab.getWebViewClassic();
                     if (web != null) {
                         byte[] data = result.getBlob(4);
                         ByteArrayInputStream bis = new ByteArrayInputStream(data);
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index b09e423..837ca47 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -64,6 +64,7 @@
 import android.webkit.WebResourceResponse;
 import android.webkit.WebStorage;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 import android.webkit.WebView.PictureListener;
 import android.webkit.WebViewClient;
 import android.widget.CheckBox;
@@ -1541,7 +1542,7 @@
             // does a redirect after a period of time. The user could have
             // switched to another tab while waiting for the download to start.
             mMainView.setDownloadListener(mDownloadListener);
-            mMainView.setWebBackForwardListClient(mWebBackForwardListClient);
+            getWebViewClassic().setWebBackForwardListClient(mWebBackForwardListClient);
             TabControl tc = mWebViewController.getTabControl();
             if (tc != null && tc.getOnThumbnailUpdatedListener() != null) {
                 mMainView.setPictureListener(this);
@@ -1565,7 +1566,7 @@
         if (mMainView != null) {
             dismissSubWindow();
             // Make sure the embedded title bar isn't still attached
-            mMainView.setEmbeddedTitleBar(null);
+            getWebViewClassic().setEmbeddedTitleBar(null);
             // save the WebView to call destroy() after detach it from the tab
             WebView webView = mMainView;
             setWebView(null);
@@ -1778,6 +1779,15 @@
         return mMainView;
     }
 
+    /**
+     * Return the underlying WebViewClassic implementation. As with getWebView,
+     * this maybe null for background tabs.
+     * @return The main WebView of this tab.
+     */
+    WebViewClassic getWebViewClassic() {
+        return WebViewClassic.fromWebView(mMainView);
+    }
+
     void setViewContainer(View container) {
         mContainer = container;
     }
@@ -2046,7 +2056,7 @@
         SnapshotByteArrayOutputStream bos = new SnapshotByteArrayOutputStream();
         try {
             GZIPOutputStream stream = new GZIPOutputStream(bos);
-            if (!mMainView.saveViewState(stream)) {
+            if (!getWebViewClassic().saveViewState(stream)) {
                 return null;
             }
             stream.flush();
@@ -2060,7 +2070,7 @@
         values.put(Snapshots.TITLE, mCurrentState.mTitle);
         values.put(Snapshots.URL, mCurrentState.mUrl);
         values.put(Snapshots.VIEWSTATE, data);
-        values.put(Snapshots.BACKGROUND, mMainView.getPageBackgroundColor());
+        values.put(Snapshots.BACKGROUND, getWebViewClassic().getPageBackgroundColor());
         values.put(Snapshots.DATE_CREATED, System.currentTimeMillis());
         values.put(Snapshots.FAVICON, compressBitmap(getFavicon()));
         Bitmap screenshot = Controller.createScreenshot(mMainView,
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 3143025..46149aa 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -36,6 +36,7 @@
 import android.view.ViewGroup;
 import android.webkit.WebChromeClient.CustomViewCallback;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 
 import java.util.List;
 
@@ -93,7 +94,7 @@
             mPieControl.attachToContainer(mContentView);
             WebView web = getWebView();
             if (web != null) {
-                web.setEmbeddedTitleBar(null);
+                WebViewClassic.fromWebView(web).setEmbeddedTitleBar(null);
 
             }
         } else {
@@ -107,7 +108,7 @@
                     ViewGroup p = (ViewGroup) mTitleBar.getParent();
                     p.removeView(mTitleBar);
                 }
-                web.setEmbeddedTitleBar(mTitleBar);
+                WebViewClassic.fromWebView(web).setEmbeddedTitleBar(mTitleBar);
             }
             setTitleGravity(Gravity.NO_GRAVITY);
         }
@@ -144,7 +145,7 @@
     void stopWebViewScrolling() {
         BrowserWebView web = (BrowserWebView) mUiController.getCurrentWebView();
         if (web != null) {
-            web.stopScroll();
+            WebViewClassic.fromWebView(web).stopScroll();
         }
     }
 
@@ -202,7 +203,7 @@
         } else {
             // check if title bar is already attached by animation
             if (mTitleBar.getParent() == null) {
-                view.setEmbeddedTitleBar(mTitleBar);
+                WebViewClassic.fromWebView(view).setEmbeddedTitleBar(mTitleBar);
             }
         }
         mTabBar.onSetActiveTab(tab);
diff --git a/src/com/android/browser/preferences/InvertedContrastPreview.java b/src/com/android/browser/preferences/InvertedContrastPreview.java
index c290daf..ba00421 100644
--- a/src/com/android/browser/preferences/InvertedContrastPreview.java
+++ b/src/com/android/browser/preferences/InvertedContrastPreview.java
@@ -19,7 +19,8 @@
 import android.content.Context;
 import android.text.TextUtils;
 import android.util.AttributeSet;
-import android.webkit.WebSettings;
+import android.webkit.WebSettingsClassic;
+import android.webkit.WebViewClassic;
 
 import com.android.browser.BrowserSettings;
 import com.android.browser.WebViewProperties;
@@ -76,7 +77,7 @@
     protected void updatePreview() {
         if (mWebView == null) return;
 
-        WebSettings ws = mWebView.getSettings();
+        WebSettingsClassic ws = WebViewClassic.fromWebView(mWebView).getSettings();
         BrowserSettings bs = BrowserSettings.getInstance();
         ws.setProperty(WebViewProperties.gfxInvertedScreen,
                 bs.useInvertedRendering() ? "true" : "false");