WebKit之Page Cache

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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值