Android 4.0.1 rompe el almacenamiento local de WebView HTML 5?
html5 jquery-mobile (2)
A través de una conversación con un ingeniero de Google, parece que han tomado la decisión de que el esquema file: // es inseguro.
Una solución para esto es hacer lo siguiente
browser.loadDataWithBaseURL("http://www.example.com",
htmlContent,
"text/html",
"utf-8",
null);
Tengo una página de prueba html5 simple que utiliza LocalStorage para mostrar / guardar / volver a mostrar una parte de los datos.
Este código funciona perfectamente en Android 2.3.x pero registra una excepción en 4.0.1 en la línea 18 del html que es la llamada localStorage.getItem()
y en este punto se detiene el JS.
Excepción: Uncaught Error: SECURITY_ERR: DOM Exception 18 at /data/data/my.app.name/app_htmlData:18
También intenté establecer la ruta de la base de datos a getCacheDir()
con el mismo resultado.
String htmlContent = "HTML content listed below";
File sharedDir = getActivity().getDir("htmlData", Context.MODE_PRIVATE);
WebView browser = (WebView)v.findViewById(R.id.wvBrowser);
browser.setWebChromeClient(new WebChromeClient(){
public void onExceededDatabaseQuota(String url, String databaseIdentifier, long currentQuota, long estimatedSize, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) {
quotaUpdater.updateQuota(estimatedSize * 2);
}
});
browser.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url){
view.loadUrl("javascript:doTest()");
});
browser.getSettings().setDatabaseEnabled(true);
browser.getSettings().setDatabasePath(sharedDir.getPath());
browser.getSettings().setDomStorageEnabled(true);
browser.loadDataWithBaseURL(mSharedDir.getPath(),
htmlContent,
"text/html",
"utf-8",
null);
El HTML que está representando la página es el siguiente:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Simple localStorage test</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">
function doTest() {
$(''#stuff'').append(''<p>reading</p>'');
var item = read();
$(''#stuff'').append(''<p>writing</p>'');
localStorage[''bar''] = new Date().toUTCString();
$(''#stuff'').append(''<p> </p><p>reading again</p>'');
read();
}
function read() {
var item = localStorage.getItem(''bar'');
if (item == null || (item == undefined)) {
item = '''';
}
$(''#stuff'').append(''<p> item: '' + item + ''</p>'');
return item;
}
</script>
</head>
<body>
<p>-Simple localStorage test-</p>
<div id="stuff"></div>
</body>
</html>
Fuente disponible aquí
Para versiones de Android menores que 4.4, cargando datos en una vista web con un esquema de archivo como directorio:
browser.loadDataWithBaseUrl("file:///android_asset/", html, "text/html", "UTF-8", null);
no funcionará con localStorage. Si agrego un nombre de archivo, funciona en versiones anteriores del sistema operativo
browser.loadDataWithBaseUrl("file:///android_asset/test.html", html, "text/html", "UTF-8", null);