WebKit之Page Cache
Page、Frame
一个Page可以显示多个web页面,每个页面都有一个main frame,main frame可以有子frame,frame是不共享的
如此一个Page有一个BackForwardList,有若干个HistoryItem,每个HistoryItem都有一个CachedPage
在WebKit中所有可以并且缓存了的Page都记录在Page Cache中
在Page Cache中缓存的是HistoryItem对象,使用LRU链表将所有缓存的HistoryItem保存起来
当要清除某个HistoryItem在PageCache中有定时器进行辅助清理
实际上真正缓存对象的是CachedPage,而对缓存的管理对象是HistoryItem,所有的HistoryItem存储在BackForwardList中
CachedPage主要缓存了CachedFrame对象,CachedFrame主要缓存了Page的几个主要对象:Document、DocumentLoader和FrameView等
当资源加载完毕调用FrameLoader::commitProvisionalLoad时会进行Page Cache操作:
1. 如果可以缓存当前页面且当前页面没有缓存,调用cachePageForHistoryItem缓存当前页面,即添加到PageCache类中,只有主Frame对应的HistoryItem才会加入PageCache类中
2. 在transitionToCommitted中,对于新加载的页面会创建HitoryItem树(按照主frame与子frame的关系)
3. 如果是加载自Page Cache,在调用open从Page Cache中加载
void FrameLoader::commitProvisionalLoad(PassRefPtr<CachedPage> prpCachedPage)
{
RefPtr<CachedPage> cachedPage = prpCachedPage;
......
if (canCachePage() && !m_currentHistoryItem->isInPageCache()) {
if (Document* document = m_frame->document())
document->suspendActiveDOMObjects();
cachePageForHistoryItem(m_currentHistoryItem.get());
}
......
transitionToCommitted(cachedPage);
......
if (cachedPage && cachedPage->document()) {
open(*cachedPage);
......
} else {
......
}
......
opened();
}