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
This commit is contained in:
@@ -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<WebViewProviderInfo> webViewProviders = new ArrayList<WebViewProviderInfo>();
|
||||
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()]);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user