From http://hi.youkuaiyun.com/caimouse
1, 整个chrome代码大概1G左右,,需要编译VC200137个工程 2,入门的分析,是了解这么一个大工程的一种手段。 比如测试整个工程是否可以编译,是否可以修改代码等等 3,可以在输入超级连接框里直接通过GOOGLE搜索所有的内容,是chrome比较大的创新 4, 第7节~13节分析了chrome EZURL的实现 类SearchProvider是从搜索引擎里查找合适的内容;类HistoryURLProvider是从历史的URL里查找合适的内容;类KeywordProvider是从关键字搜索引擎里查找合适的内容;类HistoryContentsProvider是从历史内容里查找合适内容。从上面四种智能提示里,在以前的浏览器里一般只能做到从历史的URL里提示,现在“可多米”可以做到从搜索引擎和关键字引擎里查找到相应的结果回来,可见它是智能提示完美的体现,智能的水平可想而知了。这就是强大的云计算典型应用,如果没有强大的服务器群是做不到几亿人输入关键字时,还能快速返回结果的。 5,MVC模式的应用 controller_->ExecuteCommand(IDC_OPENURL); controller_是类CommandController的实例,它主要是由MVC设计模式的控制类,可见这里可以学习怎么样把MVC设计模式应用到实际例子里,使用这种模式主要是分离面渲染、逻辑控制和不同的数据来源,这样方便维护代码。 其实所有的命令并不是CommandController来处理,它只是一个中传站,把命令发往不同的浏览器对象,如下面的代码: #001 void CommandController::ExecuteCommand(int id) { #002 if (IsCommandEnabled(id)) #003 handler_->ExecuteCommand(id); #004 } 6,IPC机制 让类RenderProcessHost把消息发送出去,那么这个消息是谁在另一端接收的呢?按照IPC的机制可知是另外一个进程在接收,这个进程就是类RenderProcess。 类RenderProcessHost把所有的消息通过类IPC::ChannelProxy发送出去,在另一个子进程里通过类RenderThread和类RenderView来接收消息,然后在类RenderThread和类RenderView把消息分发处理 7,chrome 主要通过 WebKit/WebKit/COM 中的API 与webkit engine交互。 例如WebFrame.h 中的 WebFrame::loadRequest(url) 8,模板实现的多态特性 是最高效的实现方式,比使用虚函数更少占内存,并且运行的速度也更快 class WebFrame : public base::RefCounted<WebFrame> { WebFrame是一个接口类,但它先继承引用计数类RefCounted,这样对于这个对象多次访问,就可以使用引用计数来判断对象的生命周期了。对于base::RefCounted<WebFrame>的语法, 其实它是一种模板实现的多态特性,这种方案是最高效的实现方式,比使用虚函数更少占内存,并且运行的速度也更快。它就是解决如下的问题: void Release() { if (subtle::RefCountedBase::Release()) { delete static_cast<T*>(this); } } 上面的函数里static_cast<T*>(this),它就是一种多态的实现方法,由于base::RefCounted类并没有声明为虚析构函数,如下: template <class T> class RefCounted : public subtle::RefCountedBase { public: RefCounted() { } ~RefCounted() { } 既然没有把类RefCounted声明为虚析构函数,又想在基类里调用派生类的析构函数,只好使用static_cast和类型转换了,这是一种比较好的模板使用方法,在WTL里就大量使用这种技术。 接着可以看到: class WebFrameImpl : public WebFrame { public: WebFrameImpl(); ~WebFrameImpl(); 类WebFrameImpl是继承接口类WebFrame,这里是使用接口与实现分离的设计模式,这样更方便代码灵活地复用 9,Chrome的浏览器使用WTL库来设计界面 使用WinHTTP函数来创建HTTP连接,并且使用它来发送请求,接受数据放在共享内存中, 把共享内存通过管道消息发送给渲染进程。