最近发现中国移动有个wap2.0测试,即测试你的浏览器是否能打开移动梦网wap2.0网站,不知道的可以google一下cmcc wap2.0 test。用Android手机试了下,当点击测试链接的时候会出现无法解析网页的情况,然后用同事Iphone试试,也不行。奇怪了,我们知道android 和 iphone都是用的webkit的引擎,难道webkit有这么搓,连个wap2.0都没搞定。
网上有说是wml没开启,好吧,于是照着大神的指导,将webkit封存的wml代码开启,加入编译系统,前后各种调试做了2天,终于成功编译得到libwebcore.so,果断push进机器,打开测试,还是不行。。。顿时肉牛满面。
静下心来,决定潜心研究下wap2.0为何物。这有个很好的网站分享之
http://www.developershome.com/wap/xhtmlmp/xhtml_mp_tutorial.asp?page=mimeTypesFileExtension
wap2.0 用的语言是XHTML MP,XHTML MP是XHTML的子集,在XHTML MP出现之前,WAP网站的开发者们只能用WML和WML script来创建WAP的网站。而与此同时,web的开发者们却在用强大得多的HTML、CSS、XHTML等来进行传统网站的开发。所以XHTML MP的目标就是浏览者在WAP和web上获得尽可能相似的浏览体验。
好吧,我承认上段是维基百科copy下来的
再看看XHTML MP 处理的MIME类型
The following three MIME types can be used for XHTML MP documents:
application/vnd.wap.xhtml+xml
application/xhtml+xml
text/html xhtml跟html类似,但语法上更加严格。相比之下html语法就显得比较松散,对网页编写者来说,比较方便,但对于机器来说,语言的
语法越松散,处理起来就越困难。
就是说XHTML MP可以加载以上3种类型的网页。
在看了下webkit的代码,都有支持啊,也就是说webkit是支持XHTML MP的,那这样为什么还过不了CMCC的测试,CMCC有这么牛逼?
偶然用同事诺基亚测试,竟然可以通过,这是神马情况。。
偶然又看到网上说CMCC的网页代码本身又不是严格按照W3C标准来的, 导致在解析的时候出现了语法错误提示。神马意思?难道是网页打开的时候加载的MIME类型是application/xhtml+xml,但它本身代码语法却没达到这个标准。于是决定把它降降级,将上面2种
application/vnd.wap.xhtml+xml
application/xhtml+xml 网页全部转
text/html处理
于是在webkit 目录下grep -R “vnd.wap.xhtml+xml' ./*
发现在external/webkit/Source/WebCore/dom/DOMImplementation.cpp有处理的代码 PassRefPtr DOMImplementation::createDocument(const String& type, Frame* frame, const KURL& url, bool inViewSourceMode)
{
if (inViewSourceMode)
return HTMLViewSourceDocument::create(frame, url, type);
// Plugins cannot take HTML and XHTML from us, and we don't even need to initialize the plugin database for those.
if (type == "text/html")
return HTMLDocument::create(frame, url);
if (type == "application/xhtml+xml"
#if ENABLE(XHTMLMP)
|| type == "application/vnd.wap.xhtml+xml"
#endif
)
return Document::createXHTML(frame, url);
。。。。。。
}
将application/vnd.wap.xhtml+xml 和application/xhtml+xml改为跟text/html一样
PassRefPtr DOMImplementation::createDocument(const String& type, Frame* frame, const KURL& url, bool inViewSourceMode)
{
if (inViewSourceMode)
return HTMLViewSourceDocument::create(frame, url, type);
// Plugins cannot take HTML and XHTML from us, and we don't even need to initialize the plugin database for those.
if (type == "text/html")
return HTMLDocument::create(frame, url);
if (type == "application/xhtml+xml"
#if ENABLE(XHTMLMP)
|| type == "application/vnd.wap.xhtml+xml"
#endif
)
//return Document::createXHTML(frame, url);
return HTMLDocument::create(frame, url);
。。。。。
}
然后编译webkit,push进去libwebcore.so
再打开测试页面,bingo通过啦。。
ok收工