From e1d6dfca80e4627a0c7fe46e38f904179c3edab3 Mon Sep 17 00:00:00 2001 From: Jonathan Dixon Date: Mon, 17 Dec 2012 13:39:17 -0800 Subject: De-classicify Browser Removes the hard run-time dependency on WebViewClassic. (Still needs visisbility of it to build though) This is needed to enable chromium webview testing. Change-Id: I290b6b23b2eac525537ebc3ef8007d681a67a169 --- src/com/android/browser/BaseUi.java | 4 +- src/com/android/browser/BrowserSettings.java | 59 +++++++++++++--------- src/com/android/browser/BrowserWebView.java | 32 ++++++++++++ src/com/android/browser/ComboViewActivity.java | 12 +++-- src/com/android/browser/Controller.java | 21 +++++--- src/com/android/browser/IntentHandler.java | 2 +- src/com/android/browser/NetworkStateHandler.java | 2 +- src/com/android/browser/PageDialogsHandler.java | 5 +- src/com/android/browser/Tab.java | 7 ++- src/com/android/browser/TitleBar.java | 1 + src/com/android/browser/XLargeUi.java | 2 +- .../preferences/InvertedContrastPreview.java | 3 +- 12 files changed, 104 insertions(+), 46 deletions(-) (limited to 'src') diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java index b766fb95..3ba3182c 100644 --- a/src/com/android/browser/BaseUi.java +++ b/src/com/android/browser/BaseUi.java @@ -423,9 +423,9 @@ public abstract class BaseUi implements UI { .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 4555c18b..95afa71c 100644 --- a/src/com/android/browser/BrowserSettings.java +++ b/src/com/android/browser/BrowserSettings.java @@ -155,13 +155,14 @@ public class BrowserSettings implements OnSharedPreferenceChangeListener, } 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(settings)); } } @@ -251,22 +252,17 @@ public class BrowserSettings implements OnSharedPreferenceChangeListener, /** * 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 @@ public class BrowserSettings implements OnSharedPreferenceChangeListener, settings.setSavePassword(rememberPasswords()); settings.setSaveFormData(saveFormdata()); settings.setUseWideViewPort(isWideViewport()); - settings.setAutoFillProfile(getAutoFillProfile()); String ua = mCustomUserAgents.get(settings); if (ua != null) { @@ -283,30 +278,39 @@ public class BrowserSettings implements OnSharedPreferenceChangeListener, 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 @@ public class BrowserSettings implements OnSharedPreferenceChangeListener, // 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 @@ public class BrowserSettings implements OnSharedPreferenceChangeListener, 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 @@ public class BrowserSettings implements OnSharedPreferenceChangeListener, // 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 @@ public class BrowserSettings implements OnSharedPreferenceChangeListener, Iterator> iter = mManagedSettings.iterator(); while (iter.hasNext()) { WeakReference 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 12d511f7..99e05875 100644 --- a/src/com/android/browser/BrowserWebView.java +++ b/src/com/android/browser/BrowserWebView.java @@ -20,8 +20,12 @@ import android.content.Context; 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 @@ public class BrowserWebView extends WebView implements WebViewClassic.TitleBarDe private boolean mBackgroundRemoved = false; private TitleBar mTitleBar; private OnScrollChangedListener mOnScrollChangedListener; + private WebChromeClient mWebChromeClient; + private WebViewClient mWebViewClient; /** * @param context @@ -74,6 +80,31 @@ public class BrowserWebView extends WebView implements WebViewClassic.TitleBarDe 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 @@ public class BrowserWebView extends WebView implements WebViewClassic.TitleBarDe // 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 2d382cb3..91d574e1 100644 --- a/src/com/android/browser/ComboViewActivity.java +++ b/src/com/android/browser/ComboViewActivity.java @@ -71,10 +71,14 @@ public class ComboViewActivity extends Activity implements CombinedBookmarksCall 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 caea83e7..7b7fcd48 100644 --- a/src/com/android/browser/Controller.java +++ b/src/com/android/browser/Controller.java @@ -260,7 +260,7 @@ public class Controller @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 @@ public class Controller } // 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 @@ public class Controller 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 class Controller } public SelectText(WebView webView) { - mWebView = WebViewClassic.fromWebView(webView); + if (BrowserWebView.isClassic()) { + mWebView = WebViewClassic.fromWebView(webView); + } } } @@ -2545,7 +2552,7 @@ public class Controller // 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 @@ public class Controller } 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 f0998a44..45520d65 100644 --- a/src/com/android/browser/IntentHandler.java +++ b/src/com/android/browser/IntentHandler.java @@ -172,7 +172,7 @@ public class IntentHandler { } } } 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 4480664f..9201f0f2 100644 --- a/src/com/android/browser/NetworkStateHandler.java +++ b/src/com/android/browser/NetworkStateHandler.java @@ -114,7 +114,7 @@ public class NetworkStateHandler { 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 3ed1004d..dba52893 100644 --- a/src/com/android/browser/PageDialogsHandler.java +++ b/src/com/android/browser/PageDialogsHandler.java @@ -27,7 +27,6 @@ import android.view.View; 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 @@ public class PageDialogsHandler { mSSLCertificateOnErrorHandler = null; mSSLCertificateOnErrorError = null; - WebViewClassic.fromWebView(view).getWebViewClient(). + ((BrowserWebView) view).getWebViewClient(). onReceivedSslError(view, handler, error); } }) @@ -326,7 +325,7 @@ public class PageDialogsHandler { 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 b5000c2c..e3a03337 100644 --- a/src/com/android/browser/Tab.java +++ b/src/com/android/browser/Tab.java @@ -1293,7 +1293,9 @@ class Tab implements PictureListener { // 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 @@ class Tab implements PictureListener { * @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 874296a4..a0cc857d 100644 --- a/src/com/android/browser/TitleBar.java +++ b/src/com/android/browser/TitleBar.java @@ -122,6 +122,7 @@ public class TitleBar extends RelativeLayout { 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 3b8245a2..df7a586e 100644 --- a/src/com/android/browser/XLargeUi.java +++ b/src/com/android/browser/XLargeUi.java @@ -117,7 +117,7 @@ public class XLargeUi extends BaseUi { 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 ed6eadf3..2b8ad473 100644 --- a/src/com/android/browser/preferences/InvertedContrastPreview.java +++ b/src/com/android/browser/preferences/InvertedContrastPreview.java @@ -23,6 +23,7 @@ import android.webkit.WebSettingsClassic; 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 @@ public class InvertedContrastPreview extends WebViewPreview { @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(); -- cgit v1.2.3