108 lines
4.2 KiB
Java
108 lines
4.2 KiB
Java
/*
|
|
Licensed to the Apache Software Foundation (ASF) under one
|
|
or more contributor license agreements. See the NOTICE file
|
|
distributed with this work for additional information
|
|
regarding copyright ownership. The ASF licenses this file
|
|
to you under the Apache License, Version 2.0 (the
|
|
"License"); you may not use this file except in compliance
|
|
with the License. You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing,
|
|
software distributed under the License is distributed on an
|
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
KIND, either express or implied. See the License for the
|
|
specific language governing permissions and limitations
|
|
under the License.
|
|
*/
|
|
package org.apache.cordova;
|
|
|
|
import java.io.FileNotFoundException;
|
|
import java.io.IOException;
|
|
|
|
import org.apache.cordova.CordovaInterface;
|
|
import org.apache.cordova.CordovaResourceApi.OpenForReadResult;
|
|
import org.apache.cordova.LOG;
|
|
|
|
import android.annotation.TargetApi;
|
|
import android.net.Uri;
|
|
import android.os.Build;
|
|
import android.webkit.WebResourceResponse;
|
|
import android.webkit.WebView;
|
|
|
|
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
|
public class IceCreamCordovaWebViewClient extends CordovaWebViewClient {
|
|
|
|
private static final String TAG = "IceCreamCordovaWebViewClient";
|
|
private CordovaUriHelper helper;
|
|
|
|
public IceCreamCordovaWebViewClient(CordovaInterface cordova) {
|
|
super(cordova);
|
|
}
|
|
|
|
public IceCreamCordovaWebViewClient(CordovaInterface cordova, CordovaWebView view) {
|
|
super(cordova, view);
|
|
}
|
|
|
|
@Override
|
|
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
|
|
try {
|
|
// Check the against the whitelist and lock out access to the WebView directory
|
|
// Changing this will cause problems for your application
|
|
if (isUrlHarmful(url)) {
|
|
LOG.w(TAG, "URL blocked by whitelist: " + url);
|
|
// Results in a 404.
|
|
return new WebResourceResponse("text/plain", "UTF-8", null);
|
|
}
|
|
|
|
CordovaResourceApi resourceApi = appView.getResourceApi();
|
|
Uri origUri = Uri.parse(url);
|
|
// Allow plugins to intercept WebView requests.
|
|
Uri remappedUri = resourceApi.remapUri(origUri);
|
|
|
|
if (!origUri.equals(remappedUri) || needsSpecialsInAssetUrlFix(origUri) || needsKitKatContentUrlFix(origUri)) {
|
|
OpenForReadResult result = resourceApi.openForRead(remappedUri, true);
|
|
return new WebResourceResponse(result.mimeType, "UTF-8", result.inputStream);
|
|
}
|
|
// If we don't need to special-case the request, let the browser load it.
|
|
return null;
|
|
} catch (IOException e) {
|
|
if (!(e instanceof FileNotFoundException)) {
|
|
LOG.e("IceCreamCordovaWebViewClient", "Error occurred while loading a file (returning a 404).", e);
|
|
}
|
|
// Results in a 404.
|
|
return new WebResourceResponse("text/plain", "UTF-8", null);
|
|
}
|
|
}
|
|
|
|
private boolean isUrlHarmful(String url) {
|
|
return ((url.startsWith("http:") || url.startsWith("https:")) && !appView.getWhitelist().isUrlWhiteListed(url))
|
|
|| url.contains("app_webview");
|
|
}
|
|
|
|
private static boolean needsKitKatContentUrlFix(Uri uri) {
|
|
return android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT && "content".equals(uri.getScheme());
|
|
}
|
|
|
|
private static boolean needsSpecialsInAssetUrlFix(Uri uri) {
|
|
if (CordovaResourceApi.getUriType(uri) != CordovaResourceApi.URI_TYPE_ASSET) {
|
|
return false;
|
|
}
|
|
if (uri.getQuery() != null || uri.getFragment() != null) {
|
|
return true;
|
|
}
|
|
|
|
if (!uri.toString().contains("%")) {
|
|
return false;
|
|
}
|
|
|
|
switch(android.os.Build.VERSION.SDK_INT){
|
|
case android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH:
|
|
case android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1:
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|