WebView,WebFrame, Frame, FrameView, Document, Page的关系以及FrameLoader,DocumentLoader

WebView对应一个window.

WebView有一个Page,一个WebView对应一个page.

RenderView给WebView建立一个WebFrameImpl作为最顶层的rootwebframe.

一个webView的page里面可以有WebFrame构成的树,最顶层就是mainWebFrame. Root WebFrame可以建立孩子WebFrame.

WebFrame的client是RenderFrameImpl,这个RenderFrameImpl是RenderViewImpl::initialize里面建立的。

每个WebFrame会建立自己的Frame.而每个Frame会建立自己的FrameView.

所有这些WebFrame都持有containerView也就是WebView的引用。

一个Page关联一个最顶层的WebFrame,所以关联最顶层的Frame,最顶层的Frame对应整个网页,不被销毁。他的孩子会被销毁替换。

从最顶层的frame可以访问到各孩子frame.

每个frame内部有一个frameloader。

每个frame还会建立DocumentLoader.DocumentLoader也和frame关联。

每个Frame和一个document关联。

每个Frame又会关联一个FrameView.FrameView继承自ScrollView,又继承自Widget.所以他是实际和显示相关的。



Frame的创建点2个:

WebFrameImpl::initializeAsMainFrame

WebFrameImpl::createChildFrame(),会先创建一个WebFrame,然后建立Frame.

都会调用Frame::create().

Frame的构造函数回传进来一个HTMLFrameOwnerElement,对于mainFrame,这个是空,对于childframe这个才有值。





render建立主frame和FrameView的流程:

RenderView被建立时,会建立mainFrame,从而会建立FrameLoader,并且会加载空文档,所以也会直接建立一个FrameView:

->IPC::ChannelProxy::Context::OnDispatchMessage

->content::ChildThread::OnMessageReceived

->content::RenderThreadImpl::OnControlMessageReceived

->content::RenderThreadImpl::OnCreateNewView

->content::RenderViewImpl::Create

->content::RenderViewImpl::Initialize

->WebKit::WebViewImpl::initializeMainFrame

->WebKit::WebFrameImpl::initializeAsMainFrame

->WebCore::FrameLoader::init

->WebCore::DocumentLoader::startLoadingMainResource

->WebCore::DocumentLoader::maybeLoadEmpty

->WebCore::DocumentLoader::finishedLoading

->WebCore::FrameLoader::commitProvisionalLoad

->FrameLoader::transitionToCommitted(PassRefPtr<CachedPage>cachedPage)

->voidFrameLoaderClientImpl::transitionToCommittedForNewPage()

->WebFrameImpl::createFrameView()

->Frame::createView(),创建FrameView.

→ 调用如下:

  1. FrameView::create(),建立FrameView

  2. ownerRenderer()->setWidget(frameView);ownerRender其实是HTMLFrameOwnerElement->render(),会得到一个RenderPart,然后RenderPart->setWidget()相当于告诉该render以后向哪里绘制。HTMLFrameOwnerElement是WebFrameImpl::initializeAsMainFrame中建立Frame时传进来的。由于此时,建立的是mainframe,此时的HTMLFrameOwnerElement是空的。



子Frame啥时候建立的?

->HTMLFrameElementBase::parseAttribute,当解析到src属性时,把src的值当作location调用下面函数:

->voidHTMLFrameElementBase::setLocation(constString&str) //str就是链接地址

->HTMLFrameElementBase::openURL(boollockBackForwardList)

->HTMLFrameOwnerElement::loadOrRedirectSubframe(constKURL&url, constAtomicString&frameName, boollockBackForwardList)//这个函数会创建childframe,并初始化childFrame,然后启动childframe的loader.

->调用如下:

  1. RefPtr<Frame>parentFrame = document()->frame();拿到本HTMLFrameOwnerElement的document对应的主Frame.

  2. parentFrame->loader()->client()->createFrame(url,frameName, this,..)其实调用了FrameLoaderClientImpl::createFrame,创建childframe,第三个参数this就是传入的HTMLFrameOwnerElement.也是一个HTMLElement.一个page里所有的Frame共用一个FrameLoaderClientImpl.

      1. >WebFrameImpl::createChildFrame()

          1. ->Frame::create(

            ->Frame::Init()

            ->FrameLoader::init(),//启动childframe的FrameLoader.开始加载资源当资源数据到来之后会触发本Frame的FrameView的创建,当然那就是异步的了

            ->创建ProvisionalDocumentLoader,并调用m_provisionalDocumentLoader->startLoadingMainResource()以及activeDocLoader->startLoadingSpeculativeResource()。

  1. childFrame->loader()->started();

  2. toRenderWidget(renderObject)->setWidget(FrameView);renderObject是和这个HTMLElement关联的RenderObject,把它cast成RenderWidget.然后设置他的Widget为childFrame里面的FrameView.不过一般当Frame刚建立时,这个view可能是空的,所以这个操作可能不会执行。



下面是一个创建childframe的callstack的场景:

这个场景看样子就是加载网页的过程中,收到backgroundhtml parser发来的一些token,处理并增加一个childframe的过程。

#0 WebCore::HTMLFrameOwnerElement::loadOrRedirectSubframe(this=0x33888014, url=..., frameName=..., lockBackForwardList=true)at../../third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp:127

#1 0x6226b91c in openURL (lockBackForwardList=true, this=0x33888014) at../../third_party/WebKit/Source/core/html/HTMLFrameElementBase.cpp:93

#2 WebCore::HTMLFrameElementBase::openURL(this=0x33888014, lockBackForwardList=<optimized out>) at../../third_party/WebKit/Source/core/html/HTMLFrameElementBase.cpp:73

#3 0x627cf016 in WebCore::ChildNodeInsertionNotifier::notify(this=0x650899c0, node=<optimized out>) at../../third_party/WebKit/Source/core/dom/ContainerNodeAlgorithms.h:228

#4 0x627cf19a in WebCore::ContainerNode::parserAppendChild(this=0x3387de44, newChild=...) at../../third_party/WebKit/Source/core/dom/ContainerNode.cpp:676

#5 0x622bd6ee in WebCore::insert (task=..., lazyAttach=<optimizedout>) at../../third_party/WebKit/Source/core/html/parser/HTMLConstructionSite.cpp:105

#6 0x622bd708 in executeInsertTask (task=...) at../../third_party/WebKit/Source/core/html/parser/HTMLConstructionSite.cpp:122

#7 WebCore::executeTask (task=...) at../../third_party/WebKit/Source/core/html/parser/HTMLConstructionSite.cpp:162

#8 0x622be256 in WebCore::HTMLConstructionSite::executeQueuedTasks(this=<optimized out>) at../../third_party/WebKit/Source/core/html/parser/HTMLConstructionSite.cpp:213

#9 0x622c1396 inWebCore::HTMLDocumentParser::constructTreeFromCompactHTMLToken(this=0x6b477b68, compactToken=...) at../../third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp:598

#100x622c3186 inWebCore::HTMLDocumentParser::processParsedChunkFromBackgroundParser(this=0x6b477b68, popChunk=...) at../../third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp:422

#110x622c32d8 in WebCore::HTMLDocumentParser::pumpPendingSpeculations(this=0x6b477b68) at../../third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp:467

#120x622c3682 inWebCore::HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser(this=0x6b477b68, chunk=...) at../../third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp:317

#130x622bad76 in WTF::FunctionWrapper<void(WebCore::HTMLDocumentParser::*)(WTF::PassOwnPtr<WebCore::HTMLDocumentParser::ParsedChunk>)>::operator()(this=0x6b46b810, c=..., p1=...)

at../../third_party/WebKit/Source/wtf/Functional.h:210

#140x622badac in WTF::BoundFunctionImpl<WTF::FunctionWrapper<void(WebCore::HTMLDocumentParser::*)(WTF::PassOwnPtr<WebCore::HTMLDocumentParser::ParsedChunk>)>,void (WTF::WeakPtr<WebCore::HTMLDocumentParser>, WTF

::PassOwnPtr<WebCore::HTMLDocumentParser::ParsedChunk>)>::operator()()(this=<optimized out>) at../../third_party/WebKit/Source/wtf/Functional.h:420

#150x6222df40 in operator() (this=0x693cea08) at../../third_party/WebKit/Source/wtf/Functional.h:577

#16WTF::callFunctionObject (context=0x693cea08) at../../third_party/WebKit/Source/wtf/MainThread.cpp:62

#170x61f3a922 in Run (this=<synthetic pointer>, a1=<optimizedout>) at ../../base/bind_internal.h:171

#18MakeItSo (runnable=..., a1=<optimized out>) at../../base/bind_internal.h:871

#19base::internal::Invoker<1,base::internal::BindState<base::internal::RunnableAdapter<void(*)(void*)>, void (void*), void (void*)>, void(void*)>::Run(base::internal::BindStateBase*) (base=<optimizedout>)

at../../base/bind_internal.h:1169

#200x621dbe40 in Run (this=0x65089c38) at ../../base/callback.h:396

#21base::MessageLoop::RunTask (this=0x65089cc0, pending_task=...) at../../base/message_loop/message_loop.cc:482

#220x621dc33a in base::MessageLoop::DeferOrRunPendingTask(this=0x65089cc0, pending_task=...) at../../base/message_loop/message_loop.cc:494

#230x621dc66c in DoWork (this=<optimized out>) at../../base/message_loop/message_loop.cc:608

#24base::MessageLoop::DoWork (this=0x65089cc0) at../../base/message_loop/message_loop.cc:587

#250x621dca86 in base::MessagePumpDefault::Run (this=0x5952d468,delegate=0x65089cc0) at../../base/message_loop/message_pump_default.cc:32

#260x621dc08a in base::MessageLoop::RunInternal (this=0x65089cc0) at../../base/message_loop/message_loop.cc:436

#270x621e4572 in base::RunLoop::Run (this=0x65089ca0) at../../base/run_loop.cc:45

#280x621db8f8 in base::MessageLoop::Run (this=<optimized out>) at../../base/message_loop/message_loop.cc:307

#290x621ed86a in base::Thread::ThreadMain (this=0x1) at../../base/threading/thread.cc:203

#300x621eb4a6 in base::(anonymous namespace)::ThreadFunc(params=<optimized out>) at../../base/threading/platform_thread_posix.cc:80

#310x40104a5c in __thread_entry () from/tmp/tshao-adb-gdb-libs/system/lib/libc.so

#320x40104bd8 in pthread_create () from/tmp/tshao-adb-gdb-libs/system/lib/libc.so





下面是另一个创建childframe的callstack场景:

这个场景看样子是资源加载完成后,执行完了script之后继续处理backgroundhtmlparser发来的一些任务,并插入一个子frame.

#0 WebKit::WebFrameImpl::createChildFrame (this=0x661a79c0,request=..., ownerElement=0x33888014) at../../third_party/WebKit/Source/web/WebFrameImpl.cpp:2150

#1 0x6218fea6 in WebKit::FrameLoaderClientImpl::createFrame(this=0x661a79e4, url=..., name=..., ownerElement=0x33888014,referrer=..., allowsScrolling=true, marginWidth=-1, marginHeight=-1)

at../../third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp:644

#2 0x6226c03a in WebCore::HTMLFrameOwnerElement::loadOrRedirectSubframe(this=0x33888014, url=..., frameName=...,lockBackForwardList=<optimized out>)

at../../third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp:143

#3 0x6226b91c in openURL (lockBackForwardList=true, this=0x33888014) at../../third_party/WebKit/Source/core/html/HTMLFrameElementBase.cpp:93

#4 WebCore::HTMLFrameElementBase::openURL(this=0x33888014, lockBackForwardList=<optimized out>) at../../third_party/WebKit/Source/core/html/HTMLFrameElementBase.cpp:73

#5 0x627cf016 in WebCore::ChildNodeInsertionNotifier::notify(this=0x650895e8, node=<optimized out>) at../../third_party/WebKit/Source/core/dom/ContainerNodeAlgorithms.h:228

#6 0x627cf19a in WebCore::ContainerNode::parserAppendChild(this=0x338582b4, newChild=...) at../../third_party/WebKit/Source/core/dom/ContainerNode.cpp:676

#7 0x622bd6ee in WebCore::insert (task=..., lazyAttach=<optimizedout>) at../../third_party/WebKit/Source/core/html/parser/HTMLConstructionSite.cpp:105

#8 0x622bd708 in executeInsertTask (task=...) at../../third_party/WebKit/Source/core/html/parser/HTMLConstructionSite.cpp:122

#9 WebCore::executeTask (task=...) at../../third_party/WebKit/Source/core/html/parser/HTMLConstructionSite.cpp:162

#100x622be256 in WebCore::HTMLConstructionSite::executeQueuedTasks(this=<optimized out>) at../../third_party/WebKit/Source/core/html/parser/HTMLConstructionSite.cpp:213

#110x622c1396 inWebCore::HTMLDocumentParser::constructTreeFromCompactHTMLToken(this=0x694443e8, compactToken=...) at../../third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp:598

#120x622c3186 inWebCore::HTMLDocumentParser::processParsedChunkFromBackgroundParser(this=0x694443e8, popChunk=...) at../../third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp:422

#130x622c32d8 in WebCore::HTMLDocumentParser::pumpPendingSpeculations(this=0x694443e8) at../../third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp:467

#140x622c3462 inWebCore::HTMLDocumentParser::resumeParsingAfterScriptExecution(this=0x694443e8) at../../third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp:872

#150x622c35c2 in WebCore::HTMLDocumentParser::notifyFinished(this=0x694443e8, cachedResource=0x69234fe8) at../../third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp:917

#160x6275ee66 in checkNotify (this=0x69234fe8) at../../third_party/WebKit/Source/core/loader/cache/Resource.cpp:205

#17WebCore::Resource::checkNotify (this=0x69234fe8) at../../third_party/WebKit/Source/core/loader/cache/Resource.cpp:198

#180x6275d574 in WebCore::Resource::finishOnePart (this=<optimizedout>) at../../third_party/WebKit/Source/core/loader/cache/Resource.cpp:240

#190x6275d6aa in WebCore::Resource::finish(this=0x69234fe8, finishTime=<optimized out>) at../../third_party/WebKit/Source/core/loader/cache/Resource.cpp:248

#200x62754458 in didFinishLoading (finishTime=161969.75042699999,this=0x6ad2eea0) at../../third_party/WebKit/Source/core/loader/ResourceLoader.cpp:363

#21WebCore::ResourceLoader::didFinishLoading(this=0x6ad2eea0, finishTime=<optimized out>) at../../third_party/WebKit/Source/core/loader/ResourceLoader.cpp:351

#220x61f3cf48 inwebkit_glue::WebURLLoaderImpl::Context::OnCompletedRequest(this=0x6ae4aac8, error_code=<optimized out>,was_ignored_by_handler=<optimized out>, security_info=...,completion_time=...)

at../../webkit/child/weburlloader_impl.cc:726

#230x62d6bfb4 in content::ResourceDispatcher::OnRequestComplete(this=0x595bc780, request_id=<optimized out>, error_code=0,was_ignored_by_handler=<optimized out>, security_info=...,browser_completion_time=...)

at../../content/child/resource_dispatcher.cc:514

#240x62d6b648 in DispatchToMethod<content::ResourceDispatcher, void(content::ResourceDispatcher::*)(int, int, bool, std::string const&,base::TimeTicks const&), int, int, bool, std::string,base::TimeTicks> (

obj=<optimizedout>, method=

(void(content::ResourceDispatcher::*)(content::ResourceDispatcher * const,int, int, bool, const std::basic_string<char,std::char_traits<char>, std::allocator<char> > &,const base::TimeTicks &)) 0x62d6bf3d

<content::ResourceDispatcher::OnRequestComplete(int,int, bool, std::string const&, base::TimeTicks const&)>,arg=...) at ../../base/tuple.h:579

#250x62d6b694 inResourceMsg_RequestComplete::Dispatch<content::ResourceDispatcher,content::ResourceDispatcher, void(content::ResourceDispatcher::*)(int, int, bool, std::string const&,base::TimeTicks const&)>

(msg=0x69656080,obj=0x595bc780, func=

(void(content::ResourceDispatcher::*)(content::ResourceDispatcher * const,int, int, bool, const std::basic_string<char,std::char_traits<char>, std::allocator<char> > &,const base::TimeTicks &)) 0x62d6bf3d

<content::ResourceDispatcher::OnRequestComplete(int,int, bool, std::string const&, base::TimeTicks const&)>,sender=<optimized out>) at../../content/common/resource_messages.h:268

#260x62d6b8a6 in content::ResourceDispatcher::DispatchMessage(this=0x595bc780, message=...) at../../content/child/resource_dispatcher.cc:615

#270x62d6c758 in OnMessageReceived (message=..., this=0x595bc780) at../../content/child/resource_dispatcher.cc:305

#28content::ResourceDispatcher::OnMessageReceived (this=0x595bc780,message=...) at ../../content/child/resource_dispatcher.cc:268

#290x62d5a2f6 in content::ChildThread::OnMessageReceived(this=0x5952a304, msg=...) at ../../content/child/child_thread.cc:314

#300x6217331a in IPC::ChannelProxy::Context::OnDispatchMessage(this=0x594f6938, message=...) at ../../ipc/ipc_channel_proxy.cc:264

#310x6217277a in Run (a1=..., object=<optimized out>,this=0x65089b60) at ../../base/bind_internal.h:190

#32MakeItSo (a2=..., runnable=..., a1=<optimized out>) at../../base/bind_internal.h:898

#33base::internal::Invoker<2,base::internal::BindState<base::internal::RunnableAdapter<void(IPC::ChannelProxy::Context::*)(IPC::Message const&)>, void(IPC::ChannelProxy::Context*, IPC::Message const&), void (I

PC::ChannelProxy::Context*,IPC::Message)>, void (IPC::ChannelProxy::Context*, IPC::Messageconst&)>::Run(base::internal::BindStateBase*)(base=0x69656068) at ../../base/bind_internal.h:1253

#340x621dbe40 in Run (this=0x65089c38) at ../../base/callback.h:396

#35base::MessageLoop::RunTask (this=0x65089cc0, pending_task=...) at../../base/message_loop/message_loop.cc:482

#360x621dc33a in base::MessageLoop::DeferOrRunPendingTask(this=0x65089cc0, pending_task=...) at../../base/message_loop/message_loop.cc:494

#370x621dc66c in DoWork (this=<optimized out>) at../../base/message_loop/message_loop.cc:608

#38base::MessageLoop::DoWork (this=0x65089cc0) at../../base/message_loop/message_loop.cc:587

#390x621dca86 in base::MessagePumpDefault::Run (this=0x5952d468,delegate=0x65089cc0) at../../base/message_loop/message_pump_default.cc:32

#400x621dc08a in base::MessageLoop::RunInternal (this=0x65089cc0) at../../base/message_loop/message_loop.cc:436

#410x621e4572 in base::RunLoop::Run (this=0x65089ca0) at../../base/run_loop.cc:45

#420x621db8f8 in base::MessageLoop::Run (this=<optimized out>) at../../base/message_loop/message_loop.cc:307

#430x621ed86a in base::Thread::ThreadMain (this=0x1) at../../base/threading/thread.cc:203

#440x621eb4a6 in base::(anonymous namespace)::ThreadFunc(params=<optimized out>) at../../base/threading/platform_thread_posix.cc:80

#450x40104a5c in __thread_entry () from/tmp/tshao-adb-gdb-libs/system/lib/libc.so

#460x40104bd8 in pthread_create () from/tmp/tshao-adb-gdb-libs/system/lib/libc.so

#470x00000000 in ?? ()



下面是第三个建立childframe的callstack场景:

这里看样子是v8脚本引擎执行一个api调用,设置了一个元素的属性,引起了一个IFrame的创建。这里的element节点是HTMLIFrameElement.有classHTMLIFrameElement FINAL : publicHTMLFrameElementBase 。可见脚本执行也会创建childframe。

#0 WebCore::HTMLFrameOwnerElement::loadOrRedirectSubframe(this=0x338880cc, url=..., frameName=..., lockBackForwardList=false)at../../third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp:127

#1 0x6226b91c in openURL (lockBackForwardList=false, this=0x338880cc)at../../third_party/WebKit/Source/core/html/HTMLFrameElementBase.cpp:93

#2 WebCore::HTMLFrameElementBase::openURL(this=0x338880cc, lockBackForwardList=<optimized out>) at../../third_party/WebKit/Source/core/html/HTMLFrameElementBase.cpp:73

#3 0x6226b9e2 in WebCore::HTMLFrameElementBase::setLocation(this=0x338880cc, str=...) at../../third_party/WebKit/Source/core/html/HTMLFrameElementBase.cpp:198

#4 0x6226ba9a in WebCore::HTMLFrameElementBase::parseAttribute(this=0x338880cc, name=..., value=...) at../../third_party/WebKit/Source/core/html/HTMLFrameElementBase.cpp:105

#5 0x6226d736 in WebCore::HTMLIFrameElement::parseAttribute(this=0x338880cc, name=..., value=...) at../../third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp:97

#6 0x627f150e inWebCore::Element::attributeChanged (this=0x338880cc, name=...,newValue=..., reason=WebCore::Element::ModifiedDirectly) at../../third_party/WebKit/Source/core/dom/Element.cpp:911

#7 0x627edc84 in WebCore::Element::didModifyAttribute (this=0x338880cc,name=..., value=...) at../../third_party/WebKit/Source/core/dom/Element.cpp:2845

#8 0x627f39ba in WebCore::Element::setAttributeInternal(this=0x338880cc, index=0, name=..., newValue=...,inSynchronizationOfLazyAttribute=WebCore::Element::NotInSynchronizationOfLazyAttribute)

at../../third_party/WebKit/Source/core/dom/Element.cpp:884

#9 0x627f46b0 in WebCore::Element::setAttribute(this=0x338880cc, localName=..., value=..., es=...) at../../third_party/WebKit/Source/core/dom/Element.cpp:841

#100x62911a50 in setAttributeMethod (args=...) atgen/blink/bindings/V8Element.cpp:4151

#11WebCore::ElementV8Internal::setAttributeMethodCallback(args=...) at gen/blink/bindings/V8Element.cpp:4161

#120x61d1448c in v8::internal::FunctionCallbackArguments::Call(this=0x65089178, f=<optimized out>) at../../v8/src/arguments.cc:103

#130x61d204fc in HandleApiCallHelper<false> (isolate=0x599ea008,args=...) at ../../v8/src/builtins.cc:1272

#14Builtin_implHandleApiCall (isolate=0x599ea008, args=...) at../../v8/src/builtins.cc:1289

#15v8::internal::Builtin_HandleApiCall(args_length=4, args_object=0x650891e8, isolate=0x599ea008) at../../v8/src/builtins.cc:1288

#160x6630ab7c in ?? ()





下面又是一个v8引起的子frame的建立:

#0 WebCore::HTMLFrameOwnerElement::loadOrRedirectSubframe(this=0x33888184, url=..., frameName=..., lockBackForwardList=true)at../../third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp:127

#1 0x6226b91c in openURL (lockBackForwardList=true, this=0x33888184) at../../third_party/WebKit/Source/core/html/HTMLFrameElementBase.cpp:93

#2 WebCore::HTMLFrameElementBase::openURL (this=0x33888184,lockBackForwardList=<optimized out>) at../../third_party/WebKit/Source/core/html/HTMLFrameElementBase.cpp:73

#3 0x627cf016 in WebCore::ChildNodeInsertionNotifier::notify(this=0x650895c0, node=<optimized out>) at../../third_party/WebKit/Source/core/dom/ContainerNodeAlgorithms.h:228

#4 0x627cf39e in WebCore::updateTreeAfterInsertion (parent=0x3387f654,child=0x338b890c, attachBehavior=WebCore::AttachLazily) at../../third_party/WebKit/Source/core/dom/ContainerNode.cpp:1036

#5 0x627d061e in WebCore::ContainerNode::insertBefore (this=0x3387f654,newChild=..., refChild=<optimized out>, es=...,attachBehavior=WebCore::AttachLazily)

at../../third_party/WebKit/Source/core/dom/ContainerNode.cpp:279

#6 0x62264584 in WebCore::HTMLElement::insertAdjacent (this=0x3386f4ac,where=..., newChild=0x3388c014, es=...) at../../third_party/WebKit/Source/core/html/HTMLElement.cpp:502

#7 0x6226470c in WebCore::HTMLElement::insertAdjacentHTML(this=0x3386f4ac, where=..., markup=..., es=...) at../../third_party/WebKit/Source/core/html/HTMLElement.cpp:570

#8 0x629d212c in insertAdjacentHTMLMethod (args=...) atgen/blink/bindings/V8HTMLElement.cpp:627

#9 WebCore::HTMLElementV8Internal::insertAdjacentHTMLMethodCallback(args=...) at gen/blink/bindings/V8HTMLElement.cpp:637

#100x61d1448c in v8::internal::FunctionCallbackArguments::Call(this=0x65089788, f=<optimized out>) at../../v8/src/arguments.cc:103

#110x61d204fc in HandleApiCallHelper<false> (isolate=0x599ea008,args=...) at ../../v8/src/builtins.cc:1272

#12Builtin_implHandleApiCall (isolate=0x599ea008, args=...) at../../v8/src/builtins.cc:1289

#13v8::internal::Builtin_HandleApiCall (args_length=4,args_object=0x650897fc, isolate=0x599ea008) at../../v8/src/builtins.cc:1288

#140x6630ab7c in ?? ()

#150x6630ab7c in ?? ()





Render在一个frame的数据来了之后,建立该frame的FrameView的流程:

某个frame的数据来了之后,从下层ResourceLoader通知上来,通过DocumentLoader,到达FrameLoader,FrameLoader让DocumentLoader状态切换成commited,表明收到数据确认了,那么此时就建立该Frame的FrameView.看来子frame的frameView应该也是这个流程。

#0 WebCore::Frame::createView (this=0x59467a58, viewportSize=...,backgroundColor=...,

transparent=false,fixedLayoutSize=..., useFixedLayout=true,

horizontalScrollbarMode=WebCore::ScrollbarAuto,horizontalLock=false,

verticalScrollbarMode=WebCore::ScrollbarAuto,verticalLock=false)

at../../third_party/WebKit/Source/core/page/Frame.cpp:482

#1 0x61b23af2 in WebKit::WebFrameImpl::createFrameView(this=0x594679b0)

at../../third_party/WebKit/Source/web/WebFrameImpl.cpp:2222

这里其实缺少了一行调用stack:FrameLoaderClientImpl::transitionToCommittedForNewPage()

#2 0x620cc584 in WebCore::FrameLoader::transitionToCommitted(this=0x59467ab0, cachedPage=...)//这个函数把当前的用于加载的DocumentLoader从Provisional状态改为commited状态,这样这个DocumentLoader成为当前的正式的Documentloader.之前的Frame数据和Doucmentloader被清理。

at../../third_party/WebKit/Source/core/loader/FrameLoader.cpp:1342

#3 0x620cc6d4 in WebCore::FrameLoader::commitProvisionalLoad(this=0x59467ab0)

at../../third_party/WebKit/Source/core/loader/FrameLoader.cpp:1230

#4 0x620c4518 in WebCore::DocumentLoader::dataReceived(this=0x60e09068, resource=<optimized out>,

data=0x68b60000"<!DOCTYPE html>\r\n<html>\r\n\r\n<head>\r\n<metacharset=\"UTF-8\" />\r\n<metahttp-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"/>\r\n<meta name=\"viewport\" content=\"width=device-

width,minimum-scale=1.0,user-"...,length=2802)

at../../third_party/WebKit/Source/core/loader/DocumentLoader.cpp:658

#5 0x620ddea4 in WebCore::RawResource::appendData(this=0x658ec3d0,

ttp-equiv=\"X-UA-Compatible\"content=\"IE=edge,chrome=1\" />\r\n<metaname=\"viewport\"content=\"width=device-width,minimum-scale=1.0,user-"...,length=2802)

at../../third_party/WebKit/Source/core/loader/cache/RawResource.cpp:49

#6 0x620d4d58 in WebCore::ResourceLoader::didReceiveData(this=0x60e0a310,

dth=device-width,minimum-scale=1.0,user-"...,length=2802, encodedDataLength=-1)

at../../third_party/WebKit/Source/core/loader/ResourceLoader.cpp:348

#7 0x618bdc38 in OnReceivedData (encoded_data_length=<optimizedout>, data_length=2802,

data=0x68b60000"<!DOCTYPE html>\r\n<html>\r\n\r\n<head>\r\n<metacharset=\"UTF-8\" />\r\n<metahttp-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"/>\r\n<meta name=\"viewport\" content=\"width=device-

width,minimum-scale=1.0,user-"...,this=0x60e0bbc8)

at../../webkit/child/weburlloader_impl.cc:693

#8 webkit_glue::WebURLLoaderImpl::Context::OnReceivedData(this=0x60e0bbc8,

ttp-equiv=\"X-UA-Compatible\"content=\"IE=edge,chrome=1\" />\r\n<metaname=\"viewport\"content=\"width=device-width,minimum-scale=1.0,user-"...,data_length=2802, encoded_data_length=<optimized out>)

at../../webkit/child/weburlloader_impl.cc:678

#9 0x626ed3d4 in content::ResourceDispatcher::OnReceivedData(this=0x59c5b458, message=...,

request_id=0,data_offset=<optimized out>, data_length=2802,encoded_data_length=-1)

at../../content/child/resource_dispatcher.cc:417

#100x626ec7ce inResourceMsg_DataReceived::Dispatch<content::ResourceDispatcher,content::ResourceDispatcher, int, int, int, int> (msg=0x67906e98,obj=0x59c5b458, sender=<optimized out>, func=

int,int, int, int)) 0x626ed2ad<content::ResourceDispatcher::OnReceivedData(IPC::Message const&,int, int, int, int)>) at../../content/common/resource_messages.h:253

#110x626ecae2 in content::ResourceDispatcher::DispatchMessage(this=0x59c5b458, message=...)

at../../content/child/resource_dispatcher.cc:613

#120x626eda00 in OnMessageReceived (message=..., this=0x59c5b458)

at../../content/child/resource_dispatcher.cc:305

#13content::ResourceDispatcher::OnMessageReceived (this=0x59c5b458,message=...)

at../../content/child/resource_dispatcher.cc:268

#140x626db59e in content::ChildThread::OnMessageReceived(this=0x59bc231c, msg=...)

at../../content/child/child_thread.cc:314

#150x61af431a in IPC::ChannelProxy::Context::OnDispatchMessage(this=0x59bc2580, message=...)

at../../ipc/ipc_channel_proxy.cc:264

#160x61af377a in Run (a1=..., object=<optimized out>,this=0x64e0ab60)

at../../base/bind_internal.h:190

#17MakeItSo (a2=..., runnable=..., a1=<optimized out>) at../../base/bind_internal.h:898

#18base::internal::Invoker<2,base::internal::BindState<base::internal::RunnableAdapter<void(IPC::ChannelProxy::Context::*)(IPC::Message const&)>, void(IPC::ChannelProxy::Context*, IPC::Message const&), void (I

econst&)>::Run(base::internal::BindStateBase*)(base=0x67906e80) at ../../base/bind_internal.h:1253

#190x61b5ce40 in Run (this=0x64e0ac38) at ../../base/callback.h:396

#20base::MessageLoop::RunTask (this=0x64e0acc0, pending_task=...)

at../../base/message_loop/message_loop.cc:482

#210x61b5d33a in base::MessageLoop::DeferOrRunPendingTask(this=0x64e0acc0, pending_task=...)

at../../base/message_loop/message_loop.cc:494

#220x61b5d66c in DoWork (this=<optimized out>) at../../base/message_loop/message_loop.cc:608

#23base::MessageLoop::DoWork (this=0x64e0acc0) at../../base/message_loop/message_loop.cc:587

#240x61b5da86 in base::MessagePumpDefault::Run (this=0x59befeb8,delegate=0x64e0acc0)

at../../base/message_loop/message_pump_default.cc:32

#250x61b5d08a in base::MessageLoop::RunInternal (this=0x64e0acc0)

at../../base/message_loop/message_loop.cc:436

#260x61b65572 in base::RunLoop::Run (this=0x64e0aca0) at../../base/run_loop.cc:45

#270x61b5c8f8 in base::MessageLoop::Run (this=<optimized out>)

at../../base/message_loop/message_loop.cc:307

#280x61b6e86a in base::Thread::ThreadMain (this=0x1) at../../base/threading/thread.cc:203

#290x61b6c4a6 in base::(anonymous namespace)::ThreadFunc(params=<optimized out>)

at../../base/threading/platform_thread_posix.cc:80

#300x40104a5c in __thread_entry () from/tmp/tshao-adb-gdb-libs/system/lib/libc.so

#310x40104bd8 in pthread_create () from/tmp/tshao-adb-gdb-libs/system/lib/libc.so

#320x00000000 in ?? ()



那么Frame::createView干了什么:

->Frame::createView(),创建FrameView.

→ 调用如下:

  1. FrameView::create(),建立FrameView

  2. ownerRenderer()->setWidget(frameView);ownerRender其实是HTMLFrameOwnerElement->render(),会得到一个RenderPart,然后RenderPart->setWidget()相当于告诉该render以后向哪里绘制。HTMLFrameOwnerElement是建立childFrame时传进来的,对应本frame的HTMLElement.由于此时.当建立mainframe时,HTMLFrameOwnerElement就是空的。



ATE Pin Electronics电路学习总结 PinElectronics(PE)是ATE测试机的核心模拟前端电路,负责ATE与芯片间的信号转换与交互。主要包含四大功能模块:Driver实现逻辑信号到模拟电平的转换(VIH/VIL可编程);Receiver对DUT输出进行采样比较(VOH/VOL判定);ActiveLoad施加可编程电流负载;PPMU进行精密电压/电流测量。PE的性能直接影响功能测试和直流参数测试的精度,需定期校准维护。关键参数包括:Driver电压精度(±5mV)、Receiver比较精度(±10-50mV)、PPMU测量精度(±1- 阅读详情

相关推荐

【正点原子I.MX6U-MINI移植篇】Ubuntu-base根文件系统移植构建过程详解(四)

能不能在ARM板上运行Ubuntu呢?答案肯定是可以的,Ubuntu是Linux系统的一种,可以简单的将Ubuntu理解为一个根文件系统,和我们用busybox、buildroot制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移植到我们的开发板上。

果果小师弟的博客 3772

Web自动化——frame切换&多窗口切换&窗口截图&验证码处理

1 frame切换 1.1 什么是frame? frame是HTML页面中的一种框架,主要作用是在当前页面中指定区域显示另一页面元素;frame的两种形式: # 形式一: <frameset cols="25%,75%"> <frame src="frame_a.htm"> <frame src="frame_b.htm"> </frameset> # 形式二: <iframe name="iframe_a" src="demo_ifra

WildGrass、的博客 1556

避坑指南:GROMACS模拟中.tpr、.xtc、.edr、.cpt文件你用对了吗?从生成到分析全流程解析

本文详细解析GROMACS分子动力学模拟中.tpr、.xtc、.edr、.cpt等核心文件的使用技巧,从文件生成到轨迹优化、能量分析的全流程避坑指南。重点介绍拓扑文件校验、轨迹格式选择、周期性边界处理等实战经验,帮助科研人员高效管理模拟数据并准确提取关键能量信息。

weixin_30631587的博客 118

如何调用sdk_协作利器:SDK和API

新的全球性商业规则是:要么协作,要么消失。——《维基经济学》世界正在改变,全球的商业规则也在变化,在当今越来越重视合作的社会,只要涉及到软件定义功能的产品,一般都会有这两样:SDK和API。闻西也常常在工作中接触他们,因为,很多顾客希望能够在公司的产品上,开发一些有自己特色的功能,很显然,这不是闻西当前工作的特殊之处,而是具备普遍性,很多企业也都在提供SDK或API给客户,从而在某种程度上,与客户...

weixin_39968436的博客 3501

windows 下AD9361的 no-os master 工程搭建

参考网站: https://wiki.analog.com/resources/fpga/docs/build#windows_environment_setup https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/software/no-os-setup 参考博客: https://blog.youkuaiyun.com...

Bronceyang的博客 7295

基于Web的智能家居(源码+开题)

实践上,智能家居系统的普及和应用将极大改善人们的居住体验,提高生活质量,同时也有助于促进智能家居产业链的发展和完善,为社会经济发展注入新的活力。此外,本研究还将对基于Web的智能家居系统的用户体验进行深入研究,通过用户调研和数据分析,不断优化系统功能和界面设计,提升用户的使用体验和满意度。针对以上问题,本研究将综合运用物联网、云计算、大数据等新一代信息技术,通过系统架构设计、功能模块开发、安全性保障、用户体验优化等多个方面的研究工作,力求为基于Web的智能家居系统的研发和应用提供全面而有效的解决方案。

sryue06的博客 1904

电脑fps低怎么办_Nvidia控制面板打不开,怎么办?

搭载Nvidia独立显卡的笔记本电脑,我们可以在桌面空白处右键点击,选择“Nvidia控制面板”进行相关选项设置,但有时在桌面右键点击没有出现“Nvidia控制面板”选项,或者点击“Nvidia控制面板”时出现如下图“显示设置不可用”的异常提示,该如何常规排查解决呢?一、确认Nvidia显卡设备是否已正常识别到。请由【设备管理器】—【显示适配器】—查看是否有Nvidia显卡设备?若没有,请右键点击...

weixin_39712969的博客 1478

从零到一:AnythingLLM与Ollama的本地知识库搭建实战

本文详细介绍了如何使用AnythingLLM与Ollama从零开始搭建本地知识库,涵盖技术选型、环境部署、系统配置及优化策略。通过RAG技术架构,实现安全高效的文档管理与智能问答,特别适合企业及个人构建私有化知识管理系统。

weixin_29079643的博客 567

web自动化处理frame以及弹窗

处理弹窗

山海的博客 1857

抄表程序员的DLMS/COSEM协议实战:从抓包到解析,手把手教你读懂IEC62056报文

本文深入解析DLMS/COSEM协议在智能电表通信中的应用,从报文捕获到数据解析的全流程实战指南。涵盖HDLC帧解析、应用层连接建立、数据请求/响应解码等核心内容,并提供Wireshark配置、OBIS代码速查表等实用工具,帮助开发者快速掌握IEC62056标准下的电能表通信技术。

weixin_29178069的博客 302

华为OD机试 - 小火车最多人时所在园区站点(Java 2024 E卷 100分)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 996

webkit内部的WebView, page, WebFrame, Frame, document, frameView, RenderView, RenderFrame, Widget的关系和构建

webkit内部的WebView,page, WebFrame, Frame, document, frameView, RenderView, RenderFrame,Widget的层级关联关系以及构建过程 Webcore内部: Page, Node, Element, Document, Settings WebKit接口层: WebView(WebViewImpl

1807

SAP-ABAP:SAP IDOC 全面学习指南

SAP-ABAP:SAP IDOC 全面学习指南

baidu_35680696的博客 1617

F框架WebFrame:快速原型开发的利器

F#框架WebFrame:快速原型开发的利器 WebFrame 是一个基于 F# 语言的开源框架,专为快速原型开发设计,与 ASP.NET Core 深度集成。该项目旨在提供一种简单、直观的方式来构建 Web 应用程序,同时保持代码的优雅和高效。 1. 项目基础介绍与主要编程语言 WebFrame 是一个使用 F# 语言编写的框架,F# 是一种多范式的编程语言,支持函数式编程和面向对象编程。它运行...

gitblog_00228的博客 707

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

FrameView的使用

介绍一个帧率,显卡,cpu监控软件,为游戏发烧友提供实时的游戏性能监控和体验

江海细流的专栏 826

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

nvidia frameview sdk有什么用_nvidia显卡设置 让显卡发挥最大的性能

nvidia显卡也就n卡,玩大型游戏通常都会使用n卡的电脑,然而有时候会电脑卡画面会非常的卡,包括玩娱乐图片的感觉不清晰,有点粗糙,根本不能随心自如的遨玩,这是为什么呢?其实这是nvidia显卡设置的问题,nvidia显卡没设置好就会出现这种情况,下面不妨一起来对“NVIDIA”诸项重设一遍,让显卡发挥最大的性能。1、如果我们独立显卡采用的是N卡,如果在桌面的空白处,鼠标右键点击,弹出菜单之后,我...

weixin_39529443的博客 4万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

nvidia frameview sdk有什么用_形象理解Api和SDK

API:概念:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。——百度百科 在Java中,API相当于是一个别人已经实现了某个功能的接口。比如别人写了一个两个数字相加求和的方法:public static int add...

weixin_39812465的博客 1万+

Tensorflow安装踩坑记录

Tensorflow安装踩坑记录 前段时间购置了3070ti,我欢天喜地地以为我的深度学习之旅就要顺利开始了,但我完全没意识到,这是我漫漫踩坑之路的开始。 如无特殊提示,以下均使用使用anaconda+python3.7进行安装 Tensorflow安装版本选取 参阅官网,根据GPU型号选择合适的CUDA和CUDnn版本 要注意如果在安装CUDA的时候提示:you have installed a higher version of frameview SDK,那么要到控制面板里面卸载framev

saltfishcqk的博客 1万+

nvidia frameview sdk有什么用_用一块芯片将服务器性能提升百倍,这家公司是怎么做到的?...

自1999年Nvidia发布Geforce256图形芯片开始,人们就定义了GPU,这也使得计算机能够渲染出更加饱满的图像,带给人们绝佳的观赏体验。不过归根结底,GPU只是一块插在PCI-E上的加速卡,用于处理复杂且工作量极大的任务。在人工智能、计算机视觉、数据挖掘等技术驱动的今天,计算资源不足成为诸多企业老大难的问题。诚然,多买两台服务器或许能解决问题,可随之而来的...

weixin_39706367的博客 4397

Netbeans FrameView

http://www.jarvana.com/jarvana/view/net/java/dev/appframework/appframework/1.03/appframework-1.03-javadoc.jar!/org/jdesktop/application/FrameView.html  Find more appframework Jav

HUGEHEADHUGE的专栏 1244

探索下一代Web框架:FastAPI-Amis-WebFrame

探索下一代Web框架:FastAPI-Amis-WebFrame 去发现同类优质开源项目:https://gitcode.com/ 在前端开发领域,Amis和FastAPI的结合为我们提供了一种高效、灵活且易于维护的解决方案。 就是这样一款基于这些先进技术构建的Web框架,旨在简化前后端分离的应用程序开发流程。 项目简介 FastAPI-Amis-WebFrame 是一个开源项目,它整合了Pyth...

gitblog_00063的博客 802

WebFrame类参考

WebFrame类参考继承NSObject的符合NSObject的(NSObject的) 框架/系统/资源库/框架/ WebKit.framework可用性在Mac OS X v10.2时可使用Safar

ffr225的专栏 1551

electron 中 webFrame 作用

允许将自定义的 CSS 样式注入到网页内容中,从而改变页面的外观。这在需要统一应用的视觉风格或者对特定页面进行样式修改时很方便。

weixin_64684095的博客 841

Web框架开发-web框架

web框架(web framwork)是一种开发框架,用来支持动态网站,网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了。浏览器和服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率。

liudefang的专栏 1364

WebFrame:快速原型开发的F框架

WebFrame:快速原型开发的F#框架 项目介绍 WebFrame 是一个专为快速原型开发设计的F#框架,基于ASP.NET Core构建。它旨在解决F#在Web开发中的痛点,提供一种简洁、直观且高效的开发体验。无论你是F#的新手还是经验丰富的开发者,WebFrame都能让你在短时间内构建出功能强大的Web应用。 项目技术分析 技术栈 F#:作为主要编程语言,F#以其强大的函数式编程特性著称。...

gitblog_00735的博客 577

web框架介绍

(Web Framework)是一套预先编写好的代码库和工具集,用于简化 Web 应用的开发流程。它提供了一套标准化的结构和功能,帮助开发者快速构建、部署和维护 Web 服务,而无需从零实现底层基础功能(如网络协议、数据解析等)。

ZMXdecode的博客 903
上一篇: 打开一个tab到加载完成的流程
下一篇: RefPtr, passRefPtr, adoptRefPtr, OwnPtr
csshell2002
博客等级 码龄11年 30粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值