package biz.bokhorst.xprivacy;
import java.util.ArrayList;
import java.util.List;
import android.os.Binder;
import android.webkit.WebView;
public class XWebView extends XHook {
private Methods mMethod;
private XWebView(Methods method, String restrictionName) {
super(restrictionName, (method == Methods.WebView ? null : method.name()), (method == Methods.WebView ? method
.name() : null));
mMethod = method;
}
public String getClassName() {
return "android.webkit.WebView";
}
// @formatter:off
// public WebView(Context context)
// public WebView(Context context, AttributeSet attrs)
// public WebView(Context context, AttributeSet attrs, int defStyle)
// public WebView(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing)
// public WebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
// protected WebView(Context context, AttributeSet attrs, int defStyle, Map<String, Object> javaScriptInterfaces, boolean privateBrowsing)
// public WebSettings getSettings()
// public void loadUrl(String url)
// public void loadUrl(String url, Map<String, String> additionalHttpHeaders)
// public postUrl(String url, byte[] postData)
// http://developer.android.com/reference/android/webkit/WebView.html
// http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.2_r1/android/webkit/WebView.java/
// @formatter:on
private enum Methods {
WebView, loadUrl, postUrl, getSettings
};
public static List<XHook> getInstances() {
List<XHook> listHook = new ArrayList<XHook>();
listHook.add(new XWebView(Methods.WebView, null));
listHook.add(new XWebView(Methods.loadUrl, PrivacyManager.cView));
listHook.add(new XWebView(Methods.postUrl, PrivacyManager.cView));
listHook.add(new XWebView(Methods.getSettings, null));
return listHook;
}
@Override
protected void before(XParam param) throws Throwable {
switch (mMethod) {
case WebView:
case getSettings:
// Do nothing
break;
case loadUrl:
case postUrl:
if (param.args.length > 0 && param.thisObject instanceof WebView) {
String extra = (param.args[0] instanceof String ? (String) param.args[0] : null);
if (isRestrictedExtra(param, extra))
param.setResult(null);
}
break;
}
}
@Override
protected void after(XParam param) throws Throwable {
switch (mMethod) {
case WebView:
if (param.args.length > 0 && param.thisObject instanceof WebView) {
if (isRestricted(param, PrivacyManager.cView, "initUserAgentString")) {
String ua = (String) PrivacyManager.getDefacedProp(Binder.getCallingUid(), "UA");
WebView webView = (WebView) param.thisObject;
if (webView.getSettings() != null)
webView.getSettings().setUserAgentString(ua);
}
}
break;
case loadUrl:
case postUrl:
// Do nothing
break;
case getSettings:
if (param.getResult() != null) {
Class<?> clazz = param.getResult().getClass();
if (PrivacyManager.getTransient(clazz.getName(), null) == null) {
PrivacyManager.setTransient(clazz.getName(), Boolean.toString(true));
XPrivacy.hookAll(XWebSettings.getInstances(param.getResult()), clazz.getClassLoader(), getSecret(),
true);
}
}
break;
}
}
}