replace webview hashmap with static class

Hashmaps used to pass parameters between WebView.java and
WebViewCore.java are fragile and sometimes require boxing.
Replace them with static classes that are typesafe and use
less code.
This commit is contained in:
Cary Clark
2009-06-15 10:26:08 -04:00
parent 89dfa08f44
commit ded054c9d3
2 changed files with 79 additions and 62 deletions

View File

@@ -80,7 +80,6 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
@@ -207,6 +206,11 @@ public class WebView extends AbsoluteLayout
static final String LOGTAG = "webview";
static class ScaleLimitData {
int mMinScale;
int mMaxScale;
}
private static class ExtendedZoomControls extends FrameLayout {
public ExtendedZoomControls(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -1190,9 +1194,9 @@ public class WebView extends AbsoluteLayout
public void postUrl(String url, byte[] postData) {
if (URLUtil.isNetworkUrl(url)) {
switchOutDrawHistory();
HashMap arg = new HashMap();
arg.put("url", url);
arg.put("data", postData);
WebViewCore.PostUrlData arg = new WebViewCore.PostUrlData();
arg.mUrl = url;
arg.mPostData = postData;
mWebViewCore.sendMessage(EventHub.POST_URL, arg);
clearTextEntry();
} else {
@@ -1243,12 +1247,12 @@ public class WebView extends AbsoluteLayout
return;
}
switchOutDrawHistory();
HashMap arg = new HashMap();
arg.put("baseUrl", baseUrl);
arg.put("data", data);
arg.put("mimeType", mimeType);
arg.put("encoding", encoding);
arg.put("failUrl", failUrl);
WebViewCore.BaseUrlData arg = new WebViewCore.BaseUrlData();
arg.mBaseUrl = baseUrl;
arg.mData = data;
arg.mMimeType = mimeType;
arg.mEncoding = encoding;
arg.mFailUrl = failUrl;
mWebViewCore.sendMessage(EventHub.LOAD_DATA, arg);
clearTextEntry();
}
@@ -2316,10 +2320,9 @@ public class WebView extends AbsoluteLayout
* @param interfaceName The name to used to expose the class in Javascript
*/
public void addJavascriptInterface(Object obj, String interfaceName) {
// Use Hashmap rather than Bundle as Bundles can't cope with Objects
HashMap arg = new HashMap();
arg.put("object", obj);
arg.put("interfaceName", interfaceName);
WebViewCore.JSInterfaceData arg = new WebViewCore.JSInterfaceData();
arg.mObject = obj;
arg.mInterfaceName = interfaceName;
mWebViewCore.sendMessage(EventHub.ADD_JS_INTERFACE, arg);
}
@@ -3013,10 +3016,8 @@ public class WebView extends AbsoluteLayout
String name = nativeFocusCandidateName();
if (mWebViewCore.getSettings().getSaveFormData()
&& name != null) {
HashMap data = new HashMap();
data.put("text", text);
Message update = mPrivateHandler.obtainMessage(
REQUEST_FORM_DATA, nodePointer, 0, data);
REQUEST_FORM_DATA, nodePointer);
RequestFormData updater = new RequestFormData(name,
getUrl(), update);
Thread t = new Thread(updater);
@@ -3073,7 +3074,7 @@ public class WebView extends AbsoluteLayout
if (pastEntries.size() > 0) {
AutoCompleteAdapter adapter = new
AutoCompleteAdapter(mContext, pastEntries);
((HashMap) mUpdateMessage.obj).put("adapter", adapter);
mUpdateMessage.obj = adapter;
mUpdateMessage.sendToTarget();
}
}
@@ -4516,10 +4517,10 @@ public class WebView extends AbsoluteLayout
/* package */ void replaceTextfieldText(int oldStart, int oldEnd,
String replace, int newStart, int newEnd) {
HashMap arg = new HashMap();
arg.put("replace", replace);
arg.put("start", Integer.valueOf(newStart));
arg.put("end", Integer.valueOf(newEnd));
WebViewCore.ReplaceTextData arg = new WebViewCore.ReplaceTextData();
arg.mReplace = replace;
arg.mNewStart = newStart;
arg.mNewEnd = newEnd;
mTextGeneration++;
mWebViewCore.sendMessage(EventHub.REPLACE_TEXT, oldStart, oldEnd, arg);
}
@@ -4528,9 +4529,9 @@ public class WebView extends AbsoluteLayout
if (nativeCursorWantsKeyEvents() && !nativeCursorMatchesFocus()) {
mWebViewCore.sendMessage(EventHub.CLICK);
}
HashMap arg = new HashMap();
arg.put("event", event);
arg.put("currentText", currentText);
WebViewCore.JSKeyData arg = new WebViewCore.JSKeyData();
arg.mEvent = event;
arg.mCurrentText = currentText;
// Increase our text generation number, and pass it to webcore thread
mTextGeneration++;
mWebViewCore.sendMessage(EventHub.PASS_TO_JS, mTextGeneration, 0, arg);
@@ -4699,8 +4700,8 @@ public class WebView extends AbsoluteLayout
if (mNativeClass == 0) {
break;
}
HashMap scaleLimit = (HashMap) msg.obj;
int minScale = (Integer) scaleLimit.get("minScale");
ScaleLimitData scaleLimit = (ScaleLimitData) msg.obj;
int minScale = scaleLimit.mMinScale;
if (minScale == 0) {
mMinZoomScale = DEFAULT_MIN_ZOOM_SCALE;
mMinZoomScaleFixed = false;
@@ -4708,7 +4709,7 @@ public class WebView extends AbsoluteLayout
mMinZoomScale = (float) (minScale / 100.0);
mMinZoomScaleFixed = true;
}
int maxScale = (Integer) scaleLimit.get("maxScale");
int maxScale = scaleLimit.mMaxScale;
if (maxScale == 0) {
mMaxZoomScale = DEFAULT_MAX_ZOOM_SCALE;
} else {
@@ -4767,10 +4768,8 @@ public class WebView extends AbsoluteLayout
break;
}
case REQUEST_FORM_DATA:
HashMap data = (HashMap) msg.obj;
AutoCompleteAdapter adapter = (AutoCompleteAdapter) msg.obj;
if (mWebTextView.isSameTextField(msg.arg1)) {
AutoCompleteAdapter adapter =
(AutoCompleteAdapter) data.get("adapter");
mWebTextView.setAdapterCustom(adapter);
}
break;

View File

@@ -34,7 +34,6 @@ import android.util.SparseBooleanArray;
import android.view.KeyEvent;
import java.util.ArrayList;
import java.util.HashMap;
import junit.framework.Assert;
@@ -513,6 +512,14 @@ final class WebViewCore {
}
}
static class BaseUrlData {
String mBaseUrl;
String mData;
String mMimeType;
String mEncoding;
String mFailUrl;
}
static class CursorData {
CursorData() {}
CursorData(int frame, int node, int x, int y) {
@@ -529,6 +536,27 @@ final class WebViewCore {
boolean mIgnoreNullFocus;
}
static class JSInterfaceData {
Object mObject;
String mInterfaceName;
}
static class JSKeyData {
String mCurrentText;
KeyEvent mEvent;
}
static class PostUrlData {
String mUrl;
byte[] mPostData;
}
static class ReplaceTextData {
String mReplace;
int mNewStart;
int mNewEnd;
}
static class TouchUpData {
int mMoveGeneration;
int mFrame;
@@ -717,15 +745,13 @@ final class WebViewCore {
break;
case POST_URL: {
HashMap param = (HashMap) msg.obj;
String url = (String) param.get("url");
byte[] data = (byte[]) param.get("data");
mBrowserFrame.postUrl(url, data);
PostUrlData param = (PostUrlData) msg.obj;
mBrowserFrame.postUrl(param.mUrl, param.mPostData);
break;
}
case LOAD_DATA:
HashMap loadParams = (HashMap) msg.obj;
String baseUrl = (String) loadParams.get("baseUrl");
BaseUrlData loadParams = (BaseUrlData) msg.obj;
String baseUrl = loadParams.mBaseUrl;
if (baseUrl != null) {
int i = baseUrl.indexOf(':');
if (i > 0) {
@@ -749,10 +775,10 @@ final class WebViewCore {
}
}
mBrowserFrame.loadData(baseUrl,
(String) loadParams.get("data"),
(String) loadParams.get("mimeType"),
(String) loadParams.get("encoding"),
(String) loadParams.get("failUrl"));
loadParams.mData,
loadParams.mMimeType,
loadParams.mEncoding,
loadParams.mFailUrl);
break;
case STOP_LOADING:
@@ -874,24 +900,19 @@ final class WebViewCore {
break;
case REPLACE_TEXT:
HashMap jMap = (HashMap) msg.obj;
String replace = (String) jMap.get("replace");
int newStart =
((Integer) jMap.get("start")).intValue();
int newEnd =
((Integer) jMap.get("end")).intValue();
nativeReplaceTextfieldText(msg.arg1,
msg.arg2, replace, newStart, newEnd);
ReplaceTextData rep = (ReplaceTextData) msg.obj;
nativeReplaceTextfieldText(msg.arg1, msg.arg2,
rep.mReplace, rep.mNewStart, rep.mNewEnd);
break;
case PASS_TO_JS: {
HashMap jsMap = (HashMap) msg.obj;
KeyEvent evt = (KeyEvent) jsMap.get("event");
JSKeyData jsData = (JSKeyData) msg.obj;
KeyEvent evt = jsData.mEvent;
int keyCode = evt.getKeyCode();
int keyValue = evt.getUnicodeChar();
int generation = msg.arg1;
passToJs(generation,
(String) jsMap.get("currentText"),
jsData.mCurrentText,
keyCode,
keyValue,
evt.isDown(),
@@ -934,12 +955,9 @@ final class WebViewCore {
break;
case ADD_JS_INTERFACE:
HashMap map = (HashMap) msg.obj;
Object obj = map.get("object");
String interfaceName = (String)
map.get("interfaceName");
mBrowserFrame.addJavascriptInterface(obj,
interfaceName);
JSInterfaceData jsData = (JSInterfaceData) msg.obj;
mBrowserFrame.addJavascriptInterface(jsData.mObject,
jsData.mInterfaceName);
break;
case REQUEST_EXT_REPRESENTATION:
@@ -1639,9 +1657,9 @@ final class WebViewCore {
// now notify webview
if (mWebView != null) {
HashMap scaleLimit = new HashMap();
scaleLimit.put("minScale", mViewportMinimumScale);
scaleLimit.put("maxScale", mViewportMaximumScale);
WebView.ScaleLimitData scaleLimit = new WebView.ScaleLimitData();
scaleLimit.mMinScale = mViewportMinimumScale;
scaleLimit.mMaxScale = mViewportMaximumScale;
if (mRestoredScale > 0) {
Message.obtain(mWebView.mPrivateHandler,