Merge "De-classicify Browser"
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index b766fb9..3ba3182 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -423,9 +423,9 @@
                 .findViewById(R.id.subwindow_close);
         final WebView cancelSubView = subView;
         cancel.setOnClickListener(new OnClickListener() {
+            @Override
             public void onClick(View v) {
-                WebViewClassic.fromWebView(cancelSubView).getWebChromeClient().onCloseWindow(
-                        cancelSubView);
+                ((BrowserWebView) cancelSubView).getWebChromeClient().onCloseWindow(cancelSubView);
             }
         });
         tab.setSubWebView(subView);
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 4555c18..95afa71 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -155,13 +155,14 @@
     }
 
     public void startManagingSettings(WebSettings settings) {
-        WebSettingsClassic settingsClassic = (WebSettingsClassic) settings;
+
         if (mNeedsSharedSync) {
             syncSharedSettings();
         }
+
         synchronized (mManagedSettings) {
-            syncStaticSettings(settingsClassic);
-            syncSetting(settingsClassic);
+            syncStaticSettings(settings);
+            syncSetting(settings);
             mManagedSettings.add(new WeakReference<WebSettings>(settings));
         }
     }
@@ -251,22 +252,17 @@
     /**
      * Syncs all the settings that have a Preference UI
      */
-    private void syncSetting(WebSettingsClassic settings) {
+    private void syncSetting(WebSettings settings) {
         settings.setGeolocationEnabled(enableGeolocation());
         settings.setJavaScriptEnabled(enableJavascript());
         settings.setLightTouchEnabled(enableLightTouch());
         settings.setNavDump(enableNavDump());
-        settings.setHardwareAccelSkiaEnabled(isSkiaHardwareAccelerated());
-        settings.setShowVisualIndicator(enableVisualIndicator());
         settings.setDefaultTextEncodingName(getDefaultTextEncoding());
         settings.setDefaultZoom(getDefaultZoom());
         settings.setMinimumFontSize(getMinimumFontSize());
         settings.setMinimumLogicalFontSize(getMinimumFontSize());
-        settings.setForceUserScalable(forceEnableUserScalable());
         settings.setPluginState(getPluginState());
         settings.setTextZoom(getTextZoom());
-        settings.setDoubleTapZoom(getDoubleTapZoom());
-        settings.setAutoFillEnabled(isAutofillEnabled());
         settings.setLayoutAlgorithm(getLayoutAlgorithm());
         settings.setJavaScriptCanOpenWindowsAutomatically(!blockPopupWindows());
         settings.setLoadsImagesAutomatically(loadImages());
@@ -274,7 +270,6 @@
         settings.setSavePassword(rememberPasswords());
         settings.setSaveFormData(saveFormdata());
         settings.setUseWideViewPort(isWideViewport());
-        settings.setAutoFillProfile(getAutoFillProfile());
 
         String ua = mCustomUserAgents.get(settings);
         if (ua != null) {
@@ -283,30 +278,39 @@
             settings.setUserAgentString(USER_AGENTS[getUserAgent()]);
         }
 
+        if (!(settings instanceof WebSettingsClassic)) return;
+
+        WebSettingsClassic settingsClassic = (WebSettingsClassic) settings;
+        settingsClassic.setHardwareAccelSkiaEnabled(isSkiaHardwareAccelerated());
+        settingsClassic.setShowVisualIndicator(enableVisualIndicator());
+        settingsClassic.setForceUserScalable(forceEnableUserScalable());
+        settingsClassic.setDoubleTapZoom(getDoubleTapZoom());
+        settingsClassic.setAutoFillEnabled(isAutofillEnabled());
+        settingsClassic.setAutoFillProfile(getAutoFillProfile());
+
         boolean useInverted = useInvertedRendering();
-        settings.setProperty(WebViewProperties.gfxInvertedScreen,
+        settingsClassic.setProperty(WebViewProperties.gfxInvertedScreen,
                 useInverted ? "true" : "false");
         if (useInverted) {
-            settings.setProperty(WebViewProperties.gfxInvertedScreenContrast,
+          settingsClassic.setProperty(WebViewProperties.gfxInvertedScreenContrast,
                     Float.toString(getInvertedContrast()));
         }
 
         if (isDebugEnabled()) {
-            settings.setProperty(WebViewProperties.gfxEnableCpuUploadPath,
+          settingsClassic.setProperty(WebViewProperties.gfxEnableCpuUploadPath,
                     enableCpuUploadPath() ? "true" : "false");
         }
 
-        settings.setLinkPrefetchEnabled(mLinkPrefetchAllowed);
+        settingsClassic.setLinkPrefetchEnabled(mLinkPrefetchAllowed);
     }
 
     /**
      * Syncs all the settings that have no UI
      * These cannot change, so we only need to set them once per WebSettings
      */
-    private void syncStaticSettings(WebSettingsClassic settings) {
+    private void syncStaticSettings(WebSettings settings) {
         settings.setDefaultFontSize(16);
         settings.setDefaultFixedFontSize(13);
-        settings.setPageCacheCapacity(getPageCacheCapacity());
 
         // WebView inside Browser doesn't want initial focus to be set.
         settings.setNeedInitialFocus(false);
@@ -315,13 +319,6 @@
         // enable smooth transition for better performance during panning or
         // zooming
         settings.setEnableSmoothTransition(true);
-        // WebView should be preserving the memory as much as possible.
-        // However, apps like browser wish to turn on the performance mode which
-        // would require more memory.
-        // TODO: We need to dynamically allocate/deallocate temporary memory for
-        // apps which are trying to use minimal memory. Currently, double
-        // buffering is always turned on, which is unnecessary.
-        settings.setProperty(WebViewProperties.gfxUseMinimalMemory, "false");
         // disable content url access
         settings.setAllowContentAccess(false);
 
@@ -329,7 +326,6 @@
         settings.setAppCacheEnabled(true);
         settings.setDatabaseEnabled(true);
         settings.setDomStorageEnabled(true);
-        settings.setWorkersEnabled(true);  // This only affects V8.
 
         // HTML5 configuration parametersettings.
         settings.setAppCacheMaxSize(getWebStorageSizeManager().getAppCacheMaxSize());
@@ -339,6 +335,19 @@
         // origin policy for file access
         settings.setAllowUniversalAccessFromFileURLs(false);
         settings.setAllowFileAccessFromFileURLs(false);
+
+        if (!(settings instanceof WebSettingsClassic)) return;
+
+        WebSettingsClassic settingsClassic = (WebSettingsClassic) settings;
+        settingsClassic.setPageCacheCapacity(getPageCacheCapacity());
+        // WebView should be preserving the memory as much as possible.
+        // However, apps like browser wish to turn on the performance mode which
+        // would require more memory.
+        // TODO: We need to dynamically allocate/deallocate temporary memory for
+        // apps which are trying to use minimal memory. Currently, double
+        // buffering is always turned on, which is unnecessary.
+        settingsClassic.setProperty(WebViewProperties.gfxUseMinimalMemory, "false");
+        settingsClassic.setWorkersEnabled(true);  // This only affects V8.
     }
 
     private void syncSharedSettings() {
@@ -355,7 +364,7 @@
             Iterator<WeakReference<WebSettings>> iter = mManagedSettings.iterator();
             while (iter.hasNext()) {
                 WeakReference<WebSettings> ref = iter.next();
-                WebSettingsClassic settings = (WebSettingsClassic)ref.get();
+                WebSettings settings = 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 12d511f..99e0587 100644
--- a/src/com/android/browser/BrowserWebView.java
+++ b/src/com/android/browser/BrowserWebView.java
@@ -20,8 +20,12 @@
 import android.graphics.Canvas;
 import android.util.AttributeSet;
 import android.view.View;
+import android.webkit.WebChromeClient;
+import android.webkit.WebStorage;
+import android.webkit.WebStorageClassic;
 import android.webkit.WebView;
 import android.webkit.WebViewClassic;
+import android.webkit.WebViewClient;
 
 import java.util.Map;
 
@@ -37,6 +41,8 @@
     private boolean mBackgroundRemoved = false;
     private TitleBar mTitleBar;
     private OnScrollChangedListener mOnScrollChangedListener;
+    private WebChromeClient mWebChromeClient;
+    private WebViewClient mWebViewClient;
 
     /**
      * @param context
@@ -74,6 +80,31 @@
         super(context);
     }
 
+    public static boolean isClassic() {
+        // Using WebStorage for convenience of access in a static method.
+        return WebStorage.getInstance() instanceof WebStorageClassic;
+    }
+
+    @Override
+    public void setWebChromeClient(WebChromeClient client) {
+        mWebChromeClient = client;
+        super.setWebChromeClient(client);
+    }
+
+    public WebChromeClient getWebChromeClient() {
+      return mWebChromeClient;
+    }
+
+    @Override
+    public void setWebViewClient(WebViewClient client) {
+        mWebViewClient = client;
+        super.setWebViewClient(client);
+    }
+
+    public WebViewClient getWebViewClient() {
+      return mWebViewClient;
+    }
+
     public void setTitleBar(TitleBar title) {
         mTitleBar = title;
     }
@@ -87,6 +118,7 @@
     // From TitleBarDelegate
     @Override
     public void onSetEmbeddedTitleBar(final View title) {
+        // TODO: Remove this method; it is never invoked.
     }
 
     public boolean hasTitleBar() {
diff --git a/src/com/android/browser/ComboViewActivity.java b/src/com/android/browser/ComboViewActivity.java
index 2d382cb..91d574e 100644
--- a/src/com/android/browser/ComboViewActivity.java
+++ b/src/com/android/browser/ComboViewActivity.java
@@ -71,10 +71,14 @@
         mTabsAdapter = new TabsAdapter(this, mViewPager);
         mTabsAdapter.addTab(bar.newTab().setText(R.string.tab_bookmarks),
                 BrowserBookmarksPage.class, args);
-        mTabsAdapter.addTab(bar.newTab().setText(R.string.tab_history),
-                BrowserHistoryPage.class, args);
-        mTabsAdapter.addTab(bar.newTab().setText(R.string.tab_snapshots),
-                BrowserSnapshotPage.class, args);
+        if (BrowserWebView.isClassic()) {
+            // TODO: history page should be able to work in Classic mode, but there's some
+            // provider name conflict. (Snapshot would never work in that mode though).
+            mTabsAdapter.addTab(bar.newTab().setText(R.string.tab_history),
+                    BrowserHistoryPage.class, args);
+            mTabsAdapter.addTab(bar.newTab().setText(R.string.tab_snapshots),
+                    BrowserSnapshotPage.class, args);
+        }
 
         if (savedInstanceState != null) {
             bar.setSelectedNavigationItem(
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index caea83e..7b7fcd4 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -260,7 +260,7 @@
 
     @Override
     public void start(final Intent intent) {
-        WebViewClassic.setShouldMonitorWebCoreThread();
+        if (BrowserWebView.isClassic()) WebViewClassic.setShouldMonitorWebCoreThread();
         // mCrashRecoverHandler has any previously saved state.
         mCrashRecoveryHandler.startRecovery(intent);
     }
@@ -356,7 +356,7 @@
         }
         // Read JavaScript flags if it exists.
         String jsFlags = getSettings().getJsEngineFlags();
-        if (jsFlags.trim().length() != 0) {
+        if (jsFlags.trim().length() != 0 && BrowserWebView.isClassic()) {
             WebViewClassic.fromWebView(getCurrentWebView()).setJsFlags(jsFlags);
         }
         if (intent != null
@@ -1196,7 +1196,12 @@
                     long id = intent.getLongExtra(
                             ComboViewActivity.EXTRA_OPEN_SNAPSHOT, -1);
                     if (id >= 0) {
-                        createNewSnapshotTab(id, true);
+                        if (BrowserWebView.isClassic()) {
+                            createNewSnapshotTab(id, true);
+                        } else {
+                            Toast.makeText(mActivity, "Snapshot Tab requires WebViewClassic",
+                                Toast.LENGTH_LONG).show();
+                        }
                     }
                 }
                 break;
@@ -2257,7 +2262,9 @@
         }
 
         public SelectText(WebView webView) {
-            mWebView = WebViewClassic.fromWebView(webView);
+          if (BrowserWebView.isClassic()) {
+              mWebView = WebViewClassic.fromWebView(webView);
+          }
         }
 
     }
@@ -2545,7 +2552,7 @@
         // In case the user enters nothing.
         if (url != null && url.length() != 0 && tab != null && view != null) {
             url = UrlUtils.smartUrlFilter(url);
-            if (!WebViewClassic.fromWebView(view).getWebViewClient().
+            if (!((BrowserWebView) view).getWebViewClient().
                     shouldOverrideUrlLoading(view, url)) {
                 loadUrl(tab, url);
             }
@@ -2738,14 +2745,14 @@
                 }
                 break;
             case KeyEvent.KEYCODE_A:
-                if (ctrl) {
+                if (ctrl && BrowserWebView.isClassic()) {
                     WebViewClassic.fromWebView(webView).selectAll();
                     return true;
                 }
                 break;
 //          case KeyEvent.KEYCODE_B:    // menu
             case KeyEvent.KEYCODE_C:
-                if (ctrl) {
+                if (ctrl && BrowserWebView.isClassic()) {
                     WebViewClassic.fromWebView(webView).copySelection();
                     return true;
                 }
diff --git a/src/com/android/browser/IntentHandler.java b/src/com/android/browser/IntentHandler.java
index f0998a4..45520d6 100644
--- a/src/com/android/browser/IntentHandler.java
+++ b/src/com/android/browser/IntentHandler.java
@@ -172,7 +172,7 @@
                     }
                 }
             } else {
-                if (!urlData.isEmpty()
+                if (BrowserWebView.isClassic() && !urlData.isEmpty()
                         && urlData.mUrl.startsWith("about:debug")) {
                     if ("about:debug.dom".equals(urlData.mUrl)) {
                         current.getWebViewClassic().dumpDomTree(false);
diff --git a/src/com/android/browser/NetworkStateHandler.java b/src/com/android/browser/NetworkStateHandler.java
index 4480664..9201f0f 100644
--- a/src/com/android/browser/NetworkStateHandler.java
+++ b/src/com/android/browser/NetworkStateHandler.java
@@ -114,7 +114,7 @@
 
     private void sendNetworkType(String type, String subtype) {
         WebView w = mController.getCurrentWebView();
-        if (w != null) {
+        if (w != null && BrowserWebView.isClassic()) {
             WebViewClassic.fromWebView(w).setNetworkType(type, subtype);
         }
     }
diff --git a/src/com/android/browser/PageDialogsHandler.java b/src/com/android/browser/PageDialogsHandler.java
index 3ed1004..dba5289 100644
--- a/src/com/android/browser/PageDialogsHandler.java
+++ b/src/com/android/browser/PageDialogsHandler.java
@@ -27,7 +27,6 @@
 import android.webkit.HttpAuthHandler;
 import android.webkit.SslErrorHandler;
 import android.webkit.WebView;
-import android.webkit.WebViewClassic;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
@@ -298,7 +297,7 @@
                                 mSSLCertificateOnErrorHandler = null;
                                 mSSLCertificateOnErrorError = null;
 
-                                WebViewClassic.fromWebView(view).getWebViewClient().
+                                ((BrowserWebView) view).getWebViewClient().
                                         onReceivedSslError(view, handler, error);
                             }
                         })
@@ -326,7 +325,7 @@
                                 mSSLCertificateOnErrorHandler = null;
                                 mSSLCertificateOnErrorError = null;
 
-                                WebViewClassic.fromWebView(view).getWebViewClient().
+                                ((BrowserWebView) view).getWebViewClient().
                                         onReceivedSslError(view, handler, error);
                             }
                         })
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index b5000c2..e3a0333 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -1293,7 +1293,9 @@
             // 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);
-            getWebViewClassic().setWebBackForwardListClient(mWebBackForwardListClient);
+            if (BrowserWebView.isClassic()) {
+                getWebViewClassic().setWebBackForwardListClient(mWebBackForwardListClient);
+            }
             TabControl tc = mWebViewController.getTabControl();
             if (tc != null && tc.getOnThumbnailUpdatedListener() != null) {
                 mMainView.setPictureListener(this);
@@ -1535,6 +1537,9 @@
      * @return The main WebView of this tab.
      */
     WebViewClassic getWebViewClassic() {
+        if (!BrowserWebView.isClassic()) {
+            return null;
+        }
         return WebViewClassic.fromWebView(mMainView);
     }
 
diff --git a/src/com/android/browser/TitleBar.java b/src/com/android/browser/TitleBar.java
index 874296a..a0cc857 100644
--- a/src/com/android/browser/TitleBar.java
+++ b/src/com/android/browser/TitleBar.java
@@ -122,6 +122,7 @@
         boolean isFixed = !mUseQuickControls
                 && !mContext.getResources().getBoolean(R.bool.hide_title);
         isFixed |= mAccessibilityManager.isEnabled();
+        isFixed |= !BrowserWebView.isClassic();
         // If getParent() returns null, we are initializing
         ViewGroup parent = (ViewGroup)getParent();
         if (mIsFixedTitleBar == isFixed && parent != null) return;
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 3b8245a..df7a586 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -117,7 +117,7 @@
 
     void stopWebViewScrolling() {
         BrowserWebView web = (BrowserWebView) mUiController.getCurrentWebView();
-        if (web != null) {
+        if (web != null && BrowserWebView.isClassic()) {
             WebViewClassic.fromWebView(web).stopScroll();
         }
     }
diff --git a/src/com/android/browser/preferences/InvertedContrastPreview.java b/src/com/android/browser/preferences/InvertedContrastPreview.java
index ed6eadf..2b8ad47 100644
--- a/src/com/android/browser/preferences/InvertedContrastPreview.java
+++ b/src/com/android/browser/preferences/InvertedContrastPreview.java
@@ -23,6 +23,7 @@
 import android.webkit.WebViewClassic;
 
 import com.android.browser.BrowserSettings;
+import com.android.browser.BrowserWebView;
 import com.android.browser.WebViewProperties;
 
 public class InvertedContrastPreview extends WebViewPreview {
@@ -75,7 +76,7 @@
 
     @Override
     protected void updatePreview(boolean forceReload) {
-        if (mWebView == null) return;
+        if (mWebView == null || !BrowserWebView.isClassic()) return;
 
         WebSettingsClassic ws = WebViewClassic.fromWebView(mWebView).getSettings();
         BrowserSettings bs = BrowserSettings.getInstance();