CachedResouce

本文详细阐述了网页中各类资源(如图片、样式表、脚本等)的加载过程,包括从请求发起、缓存机制到加载调度的具体实现。同时介绍了关键类如CachedResourceLoader、ResourceLoader的工作原理。

1.LoadProcess

way one

a.CachedResourceClient

b.->CachedResource.load(CachedResourceLoader* cachedResourceLoader)

c.->CachedResourceLoader::load(CachedResource* resource, bool incremental, SecurityCheckPolicy securityCheck, bool sendResourceLoadCallbacks)

d.->CachedResourceRequest::load(this, resource, incremental, securityCheck, sendResourceLoadCallbacks);

e.ResourceRequest.start()

way two

a.other call CachedResourceClient.XXX() //for example, ImageLoader's updateFromElement.

b.CachedResourceLoader::requestXXX

c.->CachedResource.load(CachedResourceLoader* cachedResourceLoader)

d.->CachedResourceLoader::load(CachedResource* resource, bool incremental, SecurityCheckPolicy securityCheck, bool sendResourceLoadCallbacks)

e.->CachedResourceRequest::load(this, resource, incremental, securityCheck, sendResourceLoadCallbacks);

f.ResourceRequest.start()



2.CachedResource's subclasses

CachedCSSStyleSheet
CachedFont 
CachedImage
CachedScript
CachedXSLStyleSheet
All page information is presented with CachedResource


3.client

A ask B to do something.  B is somethingWorker, and A will have a object "somethingWorkerClient" for B to callback.

or A is a subclass of somethingWorkerClient.

IconLoader inherited from SubResourceLoaderClient

so IconLoader will ask other class to load for it,and using SubResourceLoaderClient to call back。

ImageLoader inherited from CachedResourceClient

so ImageLoader will ask other classes load for it ,and the callback will be finished through CacheResourceClient。

(may not be right)


4.

CacheResourceClient's subclasses:

 CachedScriptSourceProvider

ClipboardAndroid,

CSSFontFaceSource,

CSSImageValue,

CSSImportRule,

HTMLDocument

HTMLDocumentParser,

HTMLLinkElement,

ImageLoader

,PendingScript,

ProcessingInstruction,

RenderObject,

ScriptElement,

SVGFEImageElement

SVGFontFaceUriElement

XMLTokenizer,

XMLDocumentParser,

XSLImportRule


SubResourceLoaderClient was used in  SubResourceLoader, it means that the "SubResourceLoaderClient"'s loading process is done in "SubResourceLoader"

it's subclasses including:CachedResourceRequest,DocumentThreadableLoader,IconLoader


5.CacheResourceLoader's loading process

CacheResource.load----->CachedResourceLoader.load--->CachedResourceRequest.load&add()---->ResourceLoader.start()(through "ResourceLoadScheduler::scheduleLoad")


CachedResourceLoader::requestImage

CachedResourceLoader::requestResource

CachedResourceLoader::loadResource

CachedImage::load

CachedResource::load

CachedResourceRequest::load

ResourceLoadScheduler::scheduleSubresourceLoad

ResourceLoadScheduler::scheduleLoad

ResourceLoadScheduler::servePendingRequests

ResourceLoader::start



6. create HtmlImageElement
HTMLConstructionSite::createHTMLElement(WebCore::AtomicHTMLToken & token={...})
Element::setAttributeMap
StyledElement::attribute
HTMLImageElement::parseMappedAttribute
ImageLoader::updateFromElement() 
CachedResourceLoader::requestImage(WebCore::ResourceRequest & request={...}) 
CachedResourceLoader::requestResource()
CachedResourceLoader::loadResource()
WebCore::CachedImage::load(WebCore::CachedResourceLoader)
CachedResource::load(CachedResourceLoader )





FrameLoader

1.FrameLoader's state
FrameStateComplete
FrameStateProvisional
FrameStateCommittedPage

FrameStateProvisional, FrameLoader's init();
2.FrameLoader has 3 documentLoader
    RefPtr<DocumentLoader> m_documentLoader;
    RefPtr<DocumentLoader> m_provisionalDocumentLoader;
    RefPtr<DocumentLoader> m_policyDocumentLoader;

3. state and loader
a.FrameStateComplete (when last load is finished)
m_documentLoader, last page's documentLoader;
m_provisionalDocumentLoader, null;
m_policyDocumentLoader, null

changing to FrameStateProvisional:

loadWithDocumentLoader, create a new DocumentLoader, evaluate it to m_policyDocumentLoader.

PolicyChecker::checkNavigationPolicy, check the policy and save it to m_policyDocumentLoader.

if checkNavigationPolicy ok, stopAllLoaders and evaluate m_policyDocumentLoader to m_provisionalDocumentLoader.

change state to FrameStateProvisional


b. FrameStateProvisional 

m_documentLoader, last page's documentLoader;

m_policyDocumentLoader, as m_provisionalDocumentLoader;
m_provisionalDocumentLoader, the new documentloader;

(FrameLoader::commitProvisionalLoad())

if history, PageCache to CachePage
else
MainResourceLoader.load()
after receive:
MainResourceLoader::didReceiveData
m_documentLoader= m_provisionalDocumentLoader
m_provisionalDocumentLoader=NULL
change state to FrameStateCommittedPage

c. FrameStateCommittedPage

m_documentLoader, new page's documentLoader;

m_provisionalDocumentLoader, NULL;
m_policyDocumentLoader, NULL;

when the last subresource is OK, documentLoader delete the subResourceLoader from m_subresourceLoaders.
change state to FrameStateComplete .


4. function called in different state
a.FrameStateComplete

b.FrameStateProvisional
FrameLoader::init{
FrameLoader::commitProvisionalLoad
FrameLoader::transitionToCommitted
history()->updateForCommit();
//set document loader
DocumentWriter::begin
FrameLoader::finishedParsing()
FrameLoader::completed()
FrameLoader::checkLoadComplete()//Called every time a resource is completely loaded or an error is received.
}
FrameLoader::load{
m_policyDocumentLoader= m_documentLoader;
FrameLoader::callContinueLoadAfterNavigationPolicy;
FrameLoader::continueLoadAfterNavigationPolicy;
FrameLoader::stopAllLoaders;
m_provisionalDocumentLoader=new;
FrameLoader::provisionalLoadStarted
m_policyDocumentLoader=NULL;
}
MainResourceLoader::didReceiveResponse{
FrameLoader::commitProvisionalLoad()
FrameLoader::transitionToCommitted
m_documentLoader=new
m_provisionalDocumentLoader=NULL:
FrameLoader::receivedFirstData()
FrameLoader::didBeginDocument
FrameLoader::finishedLoading()
FrameLoader::finishedParsing()
FrameLoader::checkLoadCompleteForThisFrame()
}
c.FrameStateCommittedPage


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值