external/webkit/Android.mk
external/webkit/WebCore/Android.mk
external/webkit/WebCore/Android.derived.mk
external/webkit/JavaScriptCore/wtf/Platform.h
external/webkit/webkit/android/jni/WebViewCore.h
external/webkit/webkit/android/jni/WebViewCore.cpp
external/webkit/WebCore/wml/WMLAElement.h
external/webkit/WebCore/wml/WMLAElement.cpp
external/webkit/WebCore/dom/DOMImplementation.cpp
frameworks/base/core/java/android/webkit/LoadListener.java
(一) 修改编译文件
1. external/webkit/JavaScriptCore/wtf/Platform.h中添加:
#if PLATFORM(ANDROID)
。。。。
#define ENABLE_WML
#endif
这段非必需, 最有效的办法是直接在命令行打开特定feature, 这样定义的feature在.mk和所有源文件中都可见。如:
mm ENABLE_WML=true ENBLE_SVG=true
2. external/webkit/Android.mk中添加:
ifeq ($(ENABLE_WML), true)
endif
查找LOCAL_CFLAGS += -DENABLE_SVG=1,模仿加一段:
ifeq ($(ENABLE_WML),true)
LOCAL_CFLAGS += -DENABLE_WML=1
endif
(这段非必需,不加也能编译通过)
3.external/webkit/WebCore/Android.derived.mk中添加:
查找style_sheets := $(style_sheets) $(LOCAL_PATH)/css/svg.css,类似加上如下脚本,
这种脚本会在\out\target\product\generic\obj\STATIC_LIBRARIES\libnfwebcore_intermediates
\WebCore\css下生成包含wmlUserAgentStyleSheet[]的UserAgentStyleSheets.h/UserAgentStyleSheets.cpp:
ifeq ($(ENABLE_WML), true)
style_sheets := $(style_sheets) $(LOCAL_PATH)/css/wml.css
endif
#WML attribute names
ifeq ($(ENABLE_WML), true)
GEN:= $(intermediates)/WMLNames.cpp $(intermediates)/WMLNames.h
$(GEN): PRIVATE_PATH := $(LOCAL_PATH)
$(GEN): PRIVATE_CUSTOM_TOOL = perl -I $(PRIVATE_PATH)/bindings/scripts $< --tags $(wml_tag) --attrs $(wml_attrs) --factory --wrapperFactory --output $(dir $@)
$(GEN): wml_tag := $(LOCAL_PATH)/wml/WMLTagNames.in
$(GEN): wml_attrs := $(LOCAL_PATH)/wml/WMLAttributeNames.in
$(GEN): $(LOCAL_PATH)/dom/make_names.pl $(wml_tag) $(wml_attrs)
LOCAL_GENERATED_SOURCES += $(GEN)
endif
4. external/webkit/WebCore/Android.mk中添加如下代码,让WebCore/wml下的文件参加编译:
ifeq ($(ENABLE_WML), true)
LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
endif
(二) 修改WML代码文件
1. 打开对WML格式解析的通道
修改\external\webkit\WebCore\dom\DOMImplementation.cpp
获取到服务器返回的数据中的content-type字段值后,会调用这个类里面的isXMLMIMEType()方法来判断是否按照XML格式来解析。我们看这个方法:
bool DOMImplementation::isXMLMIMEType(const String& mimeType)
{
if (mimeType == "text/xml" || mimeType == "application/xml" || mimeType == "text/xsl")
static const char* const validChars = "[0-9a-zA-Z_\\-+~!$\\^{}|.%'`#&*]"; // per RFCs: 3023, 2045
DEFINE_STATIC_LOCAL(RegularExpression, xmlTypeRegExp, (String("^") + validChars + "+/" + validChars + "+\\+xml$", TextCaseSensitive));
return xmlTypeRegExp.match(mimeType) > -1;
}
这里只包含了text/xml, application/xml, text/xls. 我们需要把WML相应的MiMeType类型加进去
if(mimeType == “text/vnd.wap.wml”)
修改framework/base/core/java/android/webkit/LoadListener.java, 源码如下:
// Does the header parsing work on the WebCore thread.
private void handleHeaders(Headers headers) {
…
} else if (mMimeType.equals("text/vnd.wap.wml")) {
// As we don't support wml, render it as plain text
mMimeType = "text/plain";
}
我们可以看到, 原来是不支持wml格式的,都当做text/plain来处理了,这样显然是不能正确显示的。所以这一行mMimeType = "text/plain"; 需要注释掉。
2. 对WML中的超链接元素(WMLAElement和WMLAnchorElement)中href属性值的变量替换。
笔者发现,在一个WML的登陆页面上,填入用户名和密码后,点击登陆,附加到url后面的用户名和密码是$(username) 和$(password) ,有web开发经验的XDJM都知道,这是没有将变量替换为页面上相应值。我们需要修改WMLAElement.cpp中处理点击事件的方法:
添加包含:
#include "WMLVariables.h"
void WMLAElement::defaultEventHandler(Event* event)
{
#if 0
#else
}
3. 在页面上长按链接时弹出选项点击失效
这是由于点击时是从webkit层去获取这个链接的地址和标题的, 而源码中只考虑了HTML格式的页面, WML页面被忽略了。返回的href为null。
首先要在WMLAElement.h中声明一个函数, 返回链接。
添加包含:
#include "KURL.h"
添加声明:
virtual KURL href() const;
然后在WMLAElement.cpp中实现该函数, 返回链接。
KURL WMLAElement::href() const
{
String href = substituteVariableRefere
document(), WMLVariableEscapingEscap
return document()->completeURL(href);
}
再修改WebViewCore.h, 添加如下代码:
添加包含:
#if ENABLE(WML)
#include "WMLNames.h"
#include "WMLAElement.h"
#include "WMLAnchorElement.h"
#endif
namespace WebCore {
#if ENABLE(WML)
#endif
}
class WebViewCore : public WebCoreRefObject {
#if ENABLE(WML)
#endif
};
最后修改WebViewCore.cpp, 添加/修改如下代码:
#if ENABLE(WML)
WebCore::WMLAnchorElement* WebViewCore::retrieveWMLAElement(WebCore::Frame* frame, WebCore::Node* node)
{
}
#endif
WebCore::String WebViewCore::retrieveHref(WebCore::Frame* frame, WebCore::Node* node)
{
#if ENABLE(WML)
#endif
}
WebCore::String WebViewCore::retrieveAnchorText(WebCore::Frame* frame, WebCore::Node* node)
{
#if ENABLE(WML)
#endif
}
至此,WML功能全部添加完成!
WML测试网页: http://121.8.100.132:8080/fb/index.jsp