您的位置:首页 > 其它

修改浏览器使之支持WML格式页面

2012-05-02 19:17 218 查看
对于移动终端,有时候服务器返回的是WML格式的页面。 比如说中国移动的一些需要使用cmwap接入点的业务页面(DCD, 移动梦网…), 这就要求终端浏览器必须能够支持对WML格式页面的解析和显示。 Android原始代码里的webkit层虽然提供了WML相关的解析类,但是并没有很好地支持,所以在页面上无法正确显示。 我们需要做以下一些修改:

1. 打开对WML格式解析的通道

修改源码的\external\webkit\WebCore\dom\DOMImplementation.cpp

获取到服务器返回的数据中的content-type字段值后,会调用这个类里面的isXMLMIMEType()方法来判断是否按照XML格式来解析。我们看这个方法:

?
这里只包含了text/xml, application/xml, text/xls. 我们需要把WML相应的MiMeType类型加进去

?
修改framework/base/core/java/android/webkit/LoadListener.java, 源码如下:

?
我们可以看到, 原来是不支持wml格式的, 都当做text/plain来处理了,这样显然是不能正确显示的。 所以这一行mMimeType = "text/plain";需要注释掉,打开给外围。

2. 对WML中的超链接元素(WMLAElement和WMLAnchorElement)中href属性值里面的变量替换。

笔者发现,在一个WML的登陆页面上,填入用户名和密码后,点击登陆,附加到url后面的用户名和密码是$(username) 和$(password) ,有web开发经验的XDJM都知道,这是没有将变量替换为页面上相应值。我们看WMLAElement.cpp中处理点击事件的方法:

?
通过打印Log发现,getAttribute(HTMLNames::hrefAttr)获取的只是href后面的字符串,包含变量$(). 我们需要对其中的变量进行转化。还好WMLVariables里面已经提供了相应的方法substituteVariableReferences,不需要我们再去写一个了。修改如下

#include "WMLVariables.h"

?
别忘了,WMLAnchorElement.cpp中相应的地方也要同样改掉。

3. 在页面上长按链接时弹出选项点击失效

这是由于点击时是从webkit层去获取这个链接的地址和标题的, 而源码中只考虑了HTML格式的页面, WML页面被忽略了。 返回的href为null.

首先要在WMLAElement.cpp中提供接口, 返回链接。

?
由于WMLAnchorElement继承了WMLAElement, 就不需要再添加这个方法了。

然后修改WebViewCore.cpp, 原来获取href的方法是这样的:

?
在这里增加WML的支持, 修改如下:

?
还有获取链接标题的方法,修改如下:

?
4. 移动梦网无法正确显示,解析出错。

移动梦网返回的数据格式为application/vnd.wap.xhtml+xml, 包含了xhtml和xml两种格式。而CMCC的数据本身又不是严格按照W3C标准来的, 导致在解析的时候出现了语法错误提示。 对于这种情况,我们显然无法去要求CMCC改变数据, 只能把这种格式当做普通的html来显示, html没有那么严格的语法检查, 可以正常显示。修改framework/base/core/java/android/webkit/LoadListener.java:

?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐