From 631de99ef99dddde939aa5132e89625e35e77046 Mon Sep 17 00:00:00 2001 From: Gustav Sennton Date: Thu, 7 Apr 2016 16:37:58 +0100 Subject: [PATCH] Add more checks for invalid states when reading webview packages config. There should be at least one available-by-default package (otherwise the user would have to explicitly choose webview implementation before using webview). Furthermore a fallback package should always be available by default (otherwise it would have to be chosen by the user to be used after being enabled). Bug: 28014401 Change-Id: I90c300898a5be4219317d65f15878e1d421193d7 --- .../com/android/server/webkit/SystemImpl.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/webkit/SystemImpl.java b/services/core/java/com/android/server/webkit/SystemImpl.java index ed935ced0037f..a5d68dabbdeb8 100644 --- a/services/core/java/com/android/server/webkit/SystemImpl.java +++ b/services/core/java/com/android/server/webkit/SystemImpl.java @@ -34,7 +34,6 @@ import android.provider.Settings.Global; import android.provider.Settings; import android.util.AndroidRuntimeException; import android.util.Log; -import android.webkit.WebViewFactory.MissingWebViewPackageException; import android.webkit.WebViewFactory; import android.webkit.WebViewProviderInfo; @@ -68,6 +67,7 @@ public class SystemImpl implements SystemInterface { @Override public WebViewProviderInfo[] getWebViewPackages() { int numFallbackPackages = 0; + int numAvailableByDefaultPackages = 0; XmlResourceParser parser = null; List webViewProviders = new ArrayList(); try { @@ -83,12 +83,12 @@ public class SystemImpl implements SystemInterface { if (element.equals(TAG_WEBVIEW_PROVIDER)) { String packageName = parser.getAttributeValue(null, TAG_PACKAGE_NAME); if (packageName == null) { - throw new MissingWebViewPackageException( + throw new AndroidRuntimeException( "WebView provider in framework resources missing package name"); } String description = parser.getAttributeValue(null, TAG_DESCRIPTION); if (description == null) { - throw new MissingWebViewPackageException( + throw new AndroidRuntimeException( "WebView provider in framework resources missing description"); } boolean availableByDefault = "true".equals( @@ -100,22 +100,33 @@ public class SystemImpl implements SystemInterface { readSignatures(parser)); if (currentProvider.isFallback) { numFallbackPackages++; + if (!currentProvider.availableByDefault) { + throw new AndroidRuntimeException( + "Each WebView fallback package must be available by default."); + } if (numFallbackPackages > 1) { throw new AndroidRuntimeException( - "There can be at most one webview fallback package."); + "There can be at most one WebView fallback package."); } } + if (currentProvider.availableByDefault) { + numAvailableByDefaultPackages++; + } webViewProviders.add(currentProvider); } else { - Log.e(TAG, "Found an element that is not a webview provider"); + Log.e(TAG, "Found an element that is not a WebView provider"); } } } catch (XmlPullParserException | IOException e) { - throw new MissingWebViewPackageException("Error when parsing WebView meta data " + e); + throw new AndroidRuntimeException("Error when parsing WebView config " + e); } finally { if (parser != null) parser.close(); } + if (numAvailableByDefaultPackages == 0) { + throw new AndroidRuntimeException("There must be at least one WebView package " + + "that is available by default"); + } return webViewProviders.toArray(new WebViewProviderInfo[webViewProviders.size()]); }