Chinaunix首页 | 论坛 | 博客
  • 博客访问: 88054
  • 博文数量: 70
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 417
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-11 10:48
文章分类

全部博文(70)

分类: Html/Css

2014-05-08 17:04:05

问题在闲扯中由 司徒正美 大大无意间提出。360极速浏览器马甲 Chromium 的很彻底,连 navigator.vendor 的返回值 "Google Inc." 都没有改掉。
偶试了下均使用 WebKit 内核的傲游3、搜狗浏览器、QQ浏览器5的页面极速模式,navigator.vendor 的返回值依然是 "Google Inc." 
这个其实并不怪异,由于 Goolge 为 WebKit 贡献了不少代码(为了Chromium与Android项目,细节偶在 V8 解释的 PPT 中已有一些介绍),连 WebCore 中  Config.h 文件的版权都变为Google与Apple两家了 :
Copyright (C) 2004, 2005, 2006 Apple Inc.
Copyright (C) 2009 Google Inc. All rights reserved.

但令人疑惑的是,在 Config.h 文件中条件编译语句仅为编译平台是 Android 时指定常量  WEBCORE_NAVIGATOR_VENDOR 值为 "Google Inc." ,定义处如下:
#if PLATFORM(ANDROID)
#define WEBCORE_NAVIGATOR_VENDOR "Google Inc."

navigator.vendor 属性的调用是由 WebCore/page/NavigatorBase.cpp 文件内 vendor 方法返回 WEBCORE_NAVIGATOR_VENDOR 常量值:
#ifndef WEBCORE_NAVIGATOR_VENDOR
#define WEBCORE_NAVIGATOR_VENDOR "Apple Computer, Inc."
#endif // ifndef WEBCORE_NAVIGATOR_VENDOR
……
String NavigatorBase::vendor() const
{
    return WEBCORE_NAVIGATOR_VENDOR;
}
文件中先检查了 WEBCORE_NAVIGATOR_VENDOR 常量是否定义,没有定义就将值指定为  "Apple Computer, Inc." 这与 Safari 中 navigator.vendor 的返回值为 "Apple Computer, Inc." 的情况是一致的。

除此之外的 C++ 文件中就没有再次找到  WEBCORE_NAVIGATOR_VENDOR 常量定义的地方。
难道所有的山寨浏览器都是使用 Android 编译平台?这个结论显然是极不靠谱的。
 
最终,在 WebCore 目录下发现了 WebCore.gpy 文件,这个文件是由 Goolge 用 python 编写的工具,作用是用它来生成 WebKit 项目所对应的工程文件,如 VC 工程文件或者 X Code 工程文件等。
其中就有初始的 WEBCORE_NAVIGATOR_VENDOR 常量定义:
      'defines': [
        'WEBCORE_NAVIGATOR_VENDOR="Google Inc."',
      ],
如果使用这个工具,生成 WebKit 项目工程文件,那么  WEBCORE_NAVIGATOR_VENDOR 常量一早就被生成好了,值是 "Google Inc."
这样,在编译器编译 NavigatorBase.cpp 前 #ifndef 宏生效,识别出 WEBCORE_NAVIGATOR_VENDOR 常量已经被定义,不会再将其指定字符串值  "Apple Computer, Inc."

Safari 开发肯定有自己的内部项目工程文件,不会用 WebCore.gpy 这个后来者生成工程开发。所以 WEBCORE_NAVIGATOR_VENDOR 值初始并没有被定义(Android编译环境除外),NavigatorBase.cpp 中的 #ifndef 宏生效,WEBCORE_NAVIGATOR_VENDOR 值被指定为  "Apple Computer, Inc." 这就是 Safari 中 navigator.vendor 的返回值为 "Apple Computer, Inc." 的原因了。

而国内的基于 WebKit 内核的浏览器必定要生成项目的初始工程文件,很有可能就是使用了 Google 提供的 WebCore.gpy 工具。这导致 WEBCORE_NAVIGATOR_VENDOR 值被初始为 "Google Inc."。事实证明,傲游3、搜狗浏览器、QQ浏览器5在其后的开发过程中均没对这个常量再做修改。
阅读(1057) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~