qt5 qtwebkit加载html,webkit加载网页(qtwebkit,citywanderer)

Source/WebCore/loader/FrameLoader.cpp:1585)

cbef093dcc044b2793832001e2365e43.png1585policyChecker()->checkNavigationPolicy(loader->request(), loader, formState,

cbef093dcc044b2793832001e2365e43.png1586callContinueLoadAfterNavigationPolicy,this);//回调函数?如下调用

——>m_frame->loader()->client()->dispatchDecidePolicyForNavigationAction(Source/WebCore/loader/PolicyChecker.cpp:87)

cbef093dcc044b2793832001e2365e43.png84m_callback.set(request, formState.get(),function, argument);//callContinueLoadAfterNavigationPolicy

一旦客户端指示FrameLoader将本次加载视为一个导航,FrameLoader就推动DocumentLoader进入”provisional”状态,在该状态,DocumentLoader会发起一个网络请求,并等待以确定网络请求将发起一个下载还是一个新的document。

——>page->d->acceptNavigationRequest(Source/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp:1271)

callPolicyFunction(Source/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp:1283)

回调函数?如上

//——>(m_frame->loader()->policyChecker()->*function)(action) (245)——>callback.call(Source/WebCore/loader/PolicyChecker.cpp:160)

——>m_navigationFunction(Source/WebCore/loader/PolicyCallback.cpp:103)

——>loader->continueLoadAfterNavigationPolicy(Source/WebCore/loader/FrameLoader.cpp:2977)

cbef093dcc044b2793832001e2365e43.png2974voidFrameLoader::callContinueLoadAfterNavigationPolicy(void*argument,

cbef093dcc044b2793832001e2365e43.png2975constResourceRequest&request, PassRefPtrformState,boolshouldContinue)

2f88ce130b654eb5dc6788e02dbcfc90.png

dbf989d57862681739b642d8621fe1f0.png2976918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.png2977FrameLoader*loader=static_cast(argument);

df37983f39daa189b8c814e01a6a9011.png2978loader->continueLoadAfterNavigationPolicy(request, formState, shouldContinue);

0ac3a2d53663ec01c7f7225264eeefae.png2979}

——>continueLoadAfterWillSubmitForm(Source/WebCore/loader/FrameLoader.cpp:3105)

——>m_provisionalDocumentLoader->startLoadingMainResource(Source/WebCore/loader/FrameLoader.cpp:2572)

接下去,DocumentLoader会创建一个MainResourceLoader对象,这个对象主要用来通过ResourceHandle接口同平台网络库进行交互。将MainResourceLoader和DocumentLoader分开来主要有两个目的:(1)MainResourceLoader让DocumentLoader从处理ResourceHandle回调的细节中抽身出来(2)降低MainResourceLoader的生命周期和DocumentLoader的生命周期(同Document绑定)的耦合度。

——>m_mainResourceLoader->load(Source/WebCore/loader/DocumentLoader.cpp:798)

——>loadNow(Source/WebCore/loader/MainResourceLoader.cpp:612)

——>ResourceHandle::create(Source/WebCore/loader/MainResourceLoader.cpp:585)

——>newHandle->start(Source/WebCore/platform/network/ResourceHandle.cpp:71)

——>new QNetworkReplyHandler(Source/WebCore/platform/network/qt/ResourceHandleQt.cpp:100)

——>r.toNetworkRequest(Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp:399) 设置http头

——>m_queue.push 提交事件? (Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp:401)

——>flush();(Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp:164)

——>(m_replyHandler->*(m_enqueuedCalls.takeFirst()))(); (Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp:195)

——>QNetworkReplyHandler::start() (Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp:659)

建立连接(ESTABLISHED)、发送请求 665: QNetworkReply* reply = sendNetworkRequest(d->m_context->networkAccessManager(), d->m_firstRequest);

——>601 WebCore::QNetworkReplyHandler::sendNetworkRequest

——>626 manager->get(m_request)      665     QNetworkReply* reply = sendNetworkRequest(d->m_context->networkAccessManager(), d->m_firstRequest);

669     m_replyWrapper = new QNetworkReplyWrapper(&m_queue, reply, m_resourceHandle->shouldContentSniff() && d->m_context-

>mimeSniffingEnabled(), this);               ——>208 QNetworkReplyWrapper::QNetworkReplyWrapper(QNetworkReplyHandlerCallQueue* queue, QNetworkReply* reply, bool

sniffMIMETypes, QObject* parent)

209     : QObject(parent)

210     , m_reply(reply)

211     , m_queue(queue)

212     , m_responseContainsData(false)

213     , m_sniffMIMETypes(sniffMIMETypes)

214 {

215     Q_ASSERT(m_reply);

216

217     // setFinished() must be the first that we connect, so isFinished() is updated when running other slots.

//

一旦加载系统接收到足够的信息可以确定资源确实代表了document,FrameLoader就将DocumentLoader推向”committed”状态,在该状态中,frame将显示document。

下载完了之后

——>QtMIMETypeSniffer::qt_metacall()(WebKitBuild/Debug/WebCore/moc_QtMIMETypeSniffer.cpp:77)

——>trySniffing()(Source/WebCore/platform/network/qt/QtMIMETypeSniffer.cpp:59)

——>m_sniffer.sniff(data.constData(), data.size())(Source/WebCore/platform/network/qt/QtMIMETypeSniffer.cpp:51)

cbef093dcc044b2793832001e2365e43.png50QByteArray data=m_reply->peek(m_sniffer.dataSize());

cbef093dcc044b2793832001e2365e43.png51constchar*sniffedMimeType=m_sniffer.sniff(data.constData(), data.size());       data.constData()保存着网页内容,涉及的变量包括m_reply、m_sniffer

——>emit finished (Source/WebCore/platform/network/qt/QtMIMETypeSniffer.cpp:65)

——>QMetaObject::activate(WebKitBuild/Debug/WebCore/moc_QtMIMETypeSniffer.cpp:88)

……

WebCore::QNetworkReplyWrapper::qt_metacall (WebKitBuild/Debug/WebCore/moc_QNetworkReplyHandler.cpp)

2f88ce130b654eb5dc6788e02dbcfc90.png

dbf989d57862681739b642d8621fe1f0.png77if(_c==QMetaObject::InvokeMetaMethod)918e8df969f9f8c8d002f25cda86cade.png{

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png78switch(_id)918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.png79case0: receiveMetaData();break;

df37983f39daa189b8c814e01a6a9011.png80case1: didReceiveFinished();break;

df37983f39daa189b8c814e01a6a9011.png81case2: didReceiveReadyRead();break;

df37983f39daa189b8c814e01a6a9011.png82case3: receiveSniffedMIMEType();break;

df37983f39daa189b8c814e01a6a9011.png83case4: setFinished();break;

df37983f39daa189b8c814e01a6a9011.png84default: ;

4a5daaec04350a363f186a4d2c5ed6ce.png85}df37983f39daa189b8c814e01a6a9011.png86_id-=5;

0ac3a2d53663ec01c7f7225264eeefae.png87}

——>receiveSniffedMIMEType()(WebKitBuild/Debug/WebCore/moc_QNetworkReplyHandler.cpp:82)

——>emitMetaDataChanged()(Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp:305)

——>QueueLocker lock(m_queue)(Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp)         ——>~QueueLocker() { m_queue->unlock(); } (203)

——>flush();(178)

——>(m_replyHandler->*(m_enqueuedCalls.takeFirst()))(); (195)

——>1、QNetworkReplyHandler::forwardData (572)

——>client->didReceiveData(m_resourceHandle, data.constData(), data.length(), -1); (586)

——>ResourceLoader::didReceiveData(ResourceHandle*, const char* data, int length, int encodedDataLength) (Source/WebCore/loader/ResourceLoader.cpp:427)

data指向保存页面内容

——>MainResourceLoader::didReceiveData (Source/WebCore/loader/MainResourceLoader.cpp:431)

——>ResourceLoader::didReceiveData (Source/WebCore/loader/ResourceLoader.cpp:267)

cbef093dcc044b2793832001e2365e43.png279addData(data, length, allAtOnce);

cbef093dcc044b2793832001e2365e43.png280//FIXME: If we get a resource with more than 2B bytes, this code won't do the right thing.cbef093dcc044b2793832001e2365e43.png281//However, with today's computers and networking speeds, this won't happen in practice.cbef093dcc044b2793832001e2365e43.png282//Could be an issue with a giant local file.cbef093dcc044b2793832001e2365e43.png283if(m_sendResourceLoadCallbacks&&m_frame)

cbef093dcc044b2793832001e2365e43.png284frameLoader()->notifier()->didReceiveData(this, data, length, static_cast(encodedDataLength));            保存页面到cache 函数: addData()

——>ResourceLoadNotifier::didReceiveData (Source/WebCore/loader/ResourceLoadNotifier.cpp:77)

——>ResourceLoadNotifier::dispatchDidReceiveContentLength (133)

——>InspectorInstrumentation::didReceiveContentLength (Source/WebCore/inspector/InspectorInstrumentation.h:713)

——>InspectorInstrumentation::didReceiveContentLengthImpl (Source/WebCore/inspector/InspectorInstrumentation.cpp:487)

html解析

——>2、QNetworkReplyHandler::finish(Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp:437)

——>ResourceLoader::didFinishLoading (Source/WebCore/loader/ResourceLoader.cpp:434)      ——>MainResourceLoader::didFinishLoading (Source/WebCore/loader/MainResourceLoader.cpp:466)

——>FrameLoader::finishedLoading(Source/WebCore/loader/FrameLoader.cpp:2287)

——>DocumentLoader::finishedLoading (Source/WebCore/loader/DocumentLoader.cpp:282)

——>FrameLoader::finishedLoadingDocument(DocumentLoader* loader) (Source/WebCore/loader/FrameLoader.cpp:2333)

——>FrameLoaderClientQt::finishedLoading(DocumentLoader* loader) (Source/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp:626)

——>DocumentWriter::end() (Source/WebCore/loader/DocumentWriter.cpp:211)

cbef093dcc044b2793832001e2365e43.png211voidDocumentWriter::end()

2f88ce130b654eb5dc6788e02dbcfc90.png

dbf989d57862681739b642d8621fe1f0.png212918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.png213m_frame->loader()->didEndDocument();

df37983f39daa189b8c814e01a6a9011.png214endIfNotLoadingMainResource();

0ac3a2d53663ec01c7f7225264eeefae.png215}            213 ——>Document::finishParsing() (Source/WebCore/dom/Document.cpp:2246)

214: DocumentWriter::endIfNotLoadingMainResource() (Source/WebCore/loader/DocumentWriter.cpp  228)

cbef093dcc044b2793832001e2365e43.png228addData(0,0,true);

cbef093dcc044b2793832001e2365e43.png229m_frame->document()->finishParsing();               ——>DocumentWriter::addData() (208)               

——>DecodedDataDocumentParser::appendBytes(DocumentWriter* writer , const char* data, int length, bool shouldFlush) (Source/WebCore/dom/DecodedDataDocumentParser.cpp:40)

——> HTMLDocumentParser::append(const SegmentedString& source) (Source/WebCore/html/parser/HTMLDocumentParser.cpp:367)                  ——> HTMLDocumentParser::pumpTokenizerIfPossible(SynchronousMode mode) (175)

——> HTMLDocumentParser::pumpTokenizer(SynchronousMode mode) (261)

解析、执行script

——> HTMLDocumentParser::canTakeNextToken(SynchronousMode mode, PumpSession& session) (223)

——> HTMLDocumentParser::runScriptsForPausedTreeBuilder() (205)

——> HTMLScriptRunner::execute(PassRefPtr scriptElement, const TextPosition1& scriptStartPosition) Source/WebCore/html/parser/HTMLScriptRunner.cpp:167)

——> WebCore::HTMLScriptRunner::runScript(this=0x81e2a58, script=0x832c040, scriptStartPosition=...) (296)                     ——> WebCore::ScriptElement::prepareScript (this=0x832c084, scriptStartPosition=...,     supportLegacyTypes=WebCore::ScriptElement::DisallowLegacyTypeInTypeAttribute)(Source/WebCore/dom/ScriptElement.cpp:240)

——> WebCore::ScriptElement::executeScript (this=0x832c084, sourceCode=...) (283)

——> WebCore::ScriptController::evaluate (this=0x828d1a4, sourceCode=...) (Source/WebCore/bindings/js/ScriptController.cpp:166)

——> WebCore::ScriptController::evaluateInWorld (143)

——> WebCore::JSMainThreadExecState::evaluate (Source/WebCore/bindings/js/JSMainThreadExecState.h:54)

——> JSC::evaluate(exec=0xae3f499c, scopeChain=0xae3ee5c8, source=..., thisValue=...) (Source/JavaScriptCore/runtime/Completion.cpp:64)

——> JSC::Interpreter::execute (Source/JavaScriptCore/interpreter/Interpreter.cpp:767)

——> JSC::JITCode::execute (Source/JavaScriptCore/jit/JITCode.h:77)

——> ?? ()

——> WebCore::jsHTMLDocumentPrototypeFunctionWrite(WebCore/generated/JSHTMLDocument.cpp:445)

——> WebCore::JSHTMLDocument::write(Source/WebCore/bindings/js/JSHTMLDocumentCustom.cpp:161)

——> WebCore::documentWrite (156)

——> WebCore::Document::write (Source/WebCore/dom/Document.cpp:2227)

——> WebCore::HTMLDocumentParser::insert(Source/WebCore/html/parser/HTMLDocumentParser.cpp:324)

回到了html的解析

——> WebCore::HTMLDocumentParser::pumpTokenizerIfPossible (175)

——> WebCore::HTMLDocumentParser::pumpTokenizer  (299)                                    查看是否有script,1、如果有,转到“ 解析、执行script”;2、如果没有转到下面“”

完成解析html

InspectorInstrumentation::didWriteHTML(cookie, m_tokenizer->lineNumber());                  ——> InspectorInstrumentation::didWriteHTML  (Source/WebCore/inspector/InspectorInstrumentation.h:803)

——>

——> Document::finishParsing() (Source/WebCore/dom/Document.cpp:2259)

——>HTMLDocumentParser::finish()  (Source/WebCore/html/parser/HTMLDocumentParser.cpp:427)

——>HTMLDocumentParser::attemptToEnd() (399)

——>

生成dom树

附件(js)下载、解析

二、下载

三、加载

参考文档

1.官方文档:1

4.其他技术性文章:Introduction to WebKit Objective-C Programming Guide http://developer.apple.com/library/mac/#documentation/AppleApplications/Conceptual/SafariJSProgTopics/WebKitJavaScript.html

6. http://www.webkit.org/coding/technical-articles.html

相关技巧

1.cscope查找类的定义:cs find e class.*QString[^;]*($|{)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值