'페이지 로딩 시퀀스'에 해당되는 글 2건

  1. 2009.05.13 (page link 클릭에 의한) WebKit의 URL load 시퀀스 분석 (3)
  2. 2009.04.24 WebKit의 URL load 시퀀스 분석 (11)
이전 기사에서 사용자가 URL을 입력했을 때, WebKit이 해당 페이지를 load 하는 시퀀스를 분석했었다. 이번에는 페이지가 load되어 있는 상태에서 사용자가 웹페이지의 HTML Anchor를 클릭했을 때 WebKit이 새로운 페이지를 load 하는 시퀀스를 정리한다. 서론이 다소 길었다. 사실 다음 시퀀스 다이어그램이 전부다. FrameLoader::loadWithDocumentLoader() 이후의 시퀀스는 이전 기사의 FrameLoader::load(docLoader) 호출 이후의 시퀀스와 동일하다.



이미지를 클릭하면 원본 크기로 볼 수 있다.
저작자 표시 비영리 변경 금지
신고
Posted by ingee

댓글을 달아 주세요

  1. 의정 2009.07.10 17:28 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 궁금한게 있어서 왔어요^^ webkit을 빌드해서 보드에 올렸습니다. 브라우저는그냥
    기본 브라우저인 Gtklauncher를 사용합니다.

    실행하면 구글이 나오는데 이때 마우스로 이것저것 클릭하면 잘 이동합니다. 피카사, 유투브등등 페이지 이동이 잘됩니다.

    검색창에 뭔가 넣어서 검색하고 검색된 결과를 마우스로 클릭하면 꿈쩍도 하지 않습니다.
    그러나 그 화면에서 검색결과가 아닌 다른걸 눌러보면 페이지 이동이 잘됩니다.

    유독 검색결과만 클릭해도 이동이 안되요...왜 그런거죠?
    특별히 더 작업해줘야하거나, 소스를 수정해야하나요?

    소스를 수정한다면 webkit쪽인지, 아니면 기본브라우저인 Gtklauncher를 수정해야하는지
    당췌 감이 안옵니다.

    조금의 힌트도 큰힘이 될꺼예요. 그럼 복많이 받으세요

    • zeodtr 2009.08.17 16:41 신고  댓글주소  수정/삭제

      GtkLauncher에는 새 창을 띄우는 event가 구현되어 있지 않아서 그런 것 아닐까요? WinLauncher도 마찬가지인 것 같더군요.
      대신 해당 URL을 복사한 뒤 다시 주소창에 넣어주면 잘 될 거예요.

    • ingee 2009.08.18 13:39 신고  댓글주소  수정/삭제

      아우... 죄송합니다. 님의 글을 미처 못봤습니다. 답변주신 zeo님 고맙습니다. zeo님의 답이 맞다고 생각합니다.

WebKit의 핵심 시퀀스를 요약하면 아마 다음과 같을 것이다.
- URL 문서를 loading 하는 시퀀스
- loading한 문서를 parsing 하는 시퀀스
- parsing된 내용의 layout을 결정하는 시퀀스
- 구성한 화면을 출력하는 시퀀스

이들중 "URL 문서를 loading하는 시퀀스"를 분석하게 됐다.
WebKit을 갖고 일하는 개발자들에게 조금이라도 보탬이 되면 좋겠다. 혹시나 분석한 내용에 오류가 있다면, 댓글이나 트랙백으로 가르침 주시기 바란다. 분석에 사용한 WebKit은 작년말(2008년 12월) 버전이며 (rev. 39476), cURL을 사용하는 win32 port를 기준으로 하고 있다.

URL을 load 하는 시퀀스를 분석하면서 WebKit에 존재하는 수 많은 종류의 loader들 때문에 골치 아팠다. 대강의 내용을 정리하면 다음과 같다 (클래스 다이어그램에 메모박스로 주석 달아 놓았다).
- FrameLoader : URL-load 과정을 총괄하는 loader (1개의 frame에는 여러개의 web-page가 load될 수 있다).
- DocumentLoader : 1개의 web-page load를 책임지는 loader.
- MainResourceLoader : base-document (HTML 문서) load를 책임지는 loader.
- ResourceLoader : sub-document (CSS, js, image, ...) load를 책임지는 loader.

분석한 내용을 다음 2장의 UML 다이어그램으로 정리한다. 이미지를 클릭하면 원본 크기로 볼 수 있다.


<<URL load 과정에 참여하는 Class 들>>

 

<<URL load 간단 시퀀스 (HTML 파일 1개로만 이루어진 페이지 load 시퀀스)>>


분석을 위해 다음과 같은 뉴스그룹 기사들을 참고했다. 다른 사람들에게도 참고가 되기를 바라며, 해석 없이 그대로 올린다.


"문서 load 시퀀스"
from http://osdir.com/ml/opendarwin.webkit.devel/2006-10/msg00041.html
======================================================================

Main resource loaded, started from app via API:

[ WebFrame ] (ObjC, WebKit)
[ FrameLoader ] (C++, WebCore) ---> [ FrameLoaderClient ] (C++ abstract base class, implemented in webkit to deliver delegates)
 [ DocumentLoader ] (C++, WebCore)
[ MainResourceLoader ]  (C++, WebCore)
[ ResourceLoader ] (C++, WebCore)
[ FrameLoader ] (C++, WebCore)

 

Main resource loaded, started from engine via link click or form submission:

[ FrameLoader ] (C++, WebCore) ---> [ FrameLoaderClient ] (C++ abstract base class, implemented in webkit to deliver delegates)
 [ DocumentLoader ] (C++, WebCore)
[ MainResourceLoader ]  (C++, WebCore)
[ ResourceLoader ] (C++, WebCore)
[ FrameLoader ] (C++, WebCore)


Subresource load:

[ DocumentLoader ]  (C++, WebCore)
[ Cache ] (C++, WebCore)
[ FrameLoader ] (C++, WebCore) ---> [ FrameLoaderClient ] (C++ abstract base class, implemented in webkit to deliver delegates)
 [ SubresourceLoader ] (C++, WebCore)
[ ResourceLoader ] (C++, WebCore)
[ Cache ] (C++, WebCore)
[ CachedResource ] (C++ WebCore)

 

"Loader의 종류 및 역할"
from http://www.nabble.com/Role-of-all-loaders-to22115931.html#a22172592
========================================================================

Re: Role of all loaders  
by Darin Adler Feb 24, 2009; 08:28am :: Rate this Message:    (use ratings to moderate[?])

> FrameLoader

Controls the process of loading web pages into a frame. Contains all  
the loading-related functions and data instead of having them all on  
Frame itself. There’s one of these for each frame.

> DocumentLoader

Controls the process of loading one particular web page into a frame.  
When a new page is loaded, the frame loader creates a new document  
loader and then later destroys the old one.

> DocLoader

Part of the caching machinery. Manages the cached loading for a  
particular document. May be merged with DocumentLoader at some point  
in the future, or perhaps renamed.

> MainResourceLoader

FrameLoader and DocumentLoader use ResourceLoader objects to load  
individual resources. The main resource is the HTML file (or SVG file  
or whatever). The ResourceLoader for the main resource is a  
MainResourceLoader.

> Sub resource Loader

The ResourceLoader objects for subresources such as images, scripts,  
and CSS style sheets are SubresourceLoader objects.

     -- Darin

 

"URL loading중 발생하는 frameLoaderClient를 통한 이벤트"
from http://www.nabble.com/FrameLoaderClient-notifications-to16025970.html#a16030339
=====================================================================================
Re: FrameLoaderClient notifications  
by Darin Adler Mar 14, 2008; 02:37am :: Rate this Message:    (use ratings to moderate[?])

> I suppose the following order of loading events for a page with a  
> single frame (please, correct me, if I'm wrong):
>
> page load started
> main document load started
> title received
> icon received
> * main document load finished
> ** resource load started
> resource load finished
> page load finished
...[show rest of quote]

The the FrameLoaderClient functions about the frame (not the ones that  
take DocumentLoader*) are what you want. They are all about this  
cycle. dispatchDidStartProvisionalLoad is the one that goes first, and  
then there are quite a few others, ending with dispatchDidFinishLoad,  
dispatchDidFailLoad or dispatchDidFailProvisionalLoad.

> OK, I see. Is there any other load process other than provisional?

All loads start provisional.

>> dispatchWillSendRequest will be called repeatedly with different  
>> URLs when a server does redirection. This is normal. How it should  
>> be handled depends on what API you've devised.
>
> Is there any separate notification about redirection, or this method  
> is enough?

There is
dispatchDidReceiveServerRedirectForProvisionalLoad for loads of the  
main resource of a frame, but dispatchWillSendRequest alone is all  
that's needed for arbitrary resource loads.

> One more question: is there any method about starting loading of an  
> external resource? Is it dispatchWillSendRequest?  
> dispatchDidReceiveResponse?

assignIdentifierToInitialRequest and dispatchWillSendRequest

     -- Darin

 

"HTTP 스택은 누가 처리하나?"
from http://www.nabble.com/Complicated-Loaders-to18706606.html#a18724848
========================================================================

The sequence of FrameLoader and DocumentLoader functions is indeed complicated
and overloaded.  This is slowly being improved over time, little by little. 
And no, there is no documentation at this time.


I'm not sure of the exact motivation for your question, but you did end on
a very specific note so this might be of use.  The question of "how WebKit is
invoking the HTTP stack" is much simpler - the ResourceRequest, ResourceHandle,
and ResourceResponse classes are all fairly encapsulated and represent
HTTP connections.

~Brady

저작자 표시 비영리 변경 금지
신고
Posted by ingee

댓글을 달아 주세요

  1. 미완성인 2009.08.26 10:24 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요

    Webkit을 공부중인 학생인데요

    현재 loader부분을 분석하고 있었습니다.

    FrameLoader를 설명하실때 1개의 Frame에 여러개의 web-page가 load될 수 있다고 하셨는데요

    1개의 web-page 안에 여러개의 Frame이 load되지 않나요?

    제가 이해하고 있는 page의 개념이 여기서는 다르게 적용되는거 같아서 질문드립니다.

    여기서의 web-page란 무엇을 뜻하나요?

    그리고 MainResourceLoader가 base-document load를 책임지는 loader라고 하셨는데..그럼 이것이 가장 큰 loader인가요?

    제가 이렇게 생각하게 된건 웹페이지라는 것이 가장 큰 base HTML 안에 여러개의 프레임으로 나눠져 있다고 알고 있기 때문입니다.

    • ingee 2009.08.26 15:04 신고  댓글주소  수정/삭제

      안녕하세요. 님의 생각이 틀리지 않습니다. 단지 님이 쓰는 용어와 제가 쓰는 용어에 다소 차이가 있는 것 같습니다. '1개의 Frame에 여러개의 web-page가 로드될 수 있다'는 설명은 가장 큰 base HTML이 표시되는 자리가 WebCore::Frame 객체이고, 그 Frame 객체가 다른 Frame들을 포함할 수 있다라는 의미입니다. 각 Frame 객체들은 하나의 web-page ('HTML 문서' + '이미지 등의 기타 리소스')를 표시하구요.

    • ingee 2009.08.26 15:07 신고  댓글주소  수정/삭제

      1개의 웹페이지 단위에서 볼때는 MainResourceLoader가 대장(가장 큰 로더...)이지만, 1개의 WebView를 채우는 전체를 볼때는 FrameLoader가 대장이라고 생각합니다... 좋은 하루 되세요.

    • 암흑도깨비 2012.01.12 13:59 신고  댓글주소  수정/삭제

      webkit와 gtk관계에서는 GNOME에서 설명하기를
      1개의 webview(webpage)는 메인 프레임이 되고,
      그 아래에 n개의 프레임을 생성할 수 있다고
      명시되어 있습니다.

      저는 그렇게 알고 있는데;; 음..

  2. 미완성인 2009.08.26 16:42 신고  댓글주소  수정/삭제  댓글쓰기

    답변 감사드립니다.

    이제 이해가 되는데요. 하지만 그렇게되면

    Frame을 생성할때마다 FrameLoader가 PramePrivate클래스에서 생성되던데요.

    이말인 즉슨 하나의 Frame마다 하나의 FrameLoader가 할당되어진다는 말이고 이말은 결국 FrameLoader는 하나의 Frame만을 관리하는의미가 아닌지요. 그렇다면 하나의 FrameLoader에서 여러 Frame들을 관리할수 없지 않은가요.. DocumentLoader와 역할이 같기도 하고요. 제가 잘못이해하고 있는건가요?

    웹페이지의 구조를 제가 정확히 몰라서 그런것인지.. FrameLoader와 DocumentLoader의 하는 역할 차이점도 확실히 모르겠습니다. 멤버함수를 보면 FrameLoader는 주로 정책위주의 함수이고 DocumentLoader는 주로 리소스 관련한 함수로 구성되어 있었습니다. 정확한 역할의 차이는 무엇인가요..

    제가 스스로 알아봐야하는데 보면볼수록 더욱더 복잡해져가는 관계로 이렇게 질문드립니다.

    감사합니다. 좋은하루되세요

    • ingee 2009.08.27 13:53 신고  댓글주소  수정/삭제

      해당 코드를 본지가 쫌 지나서 맞는 기억인지는 모르겠습니다. 1개의 FrameLoader가 1개의 Frame만을 위해 존재하는 것은 맞다고 기억합니다. 분석하시고 정리되면 시원하게 트랙백 하나 걸어주세요. ^^

    • 깜장병아리 2009.09.25 11:14 신고  댓글주소  수정/삭제

      FrameLoader는 Page정책을 확인 및 관리 그리고 로딩 상태 관리를 하는 부분이 맞습니다.
      (리로드다.. 리프레쉬다.. 그냥 URL로딩이다.. 앞뒤 이동으로 온거다...등등등 (ex) 리로드이면 cache에 있는 것을 사용하지 말고 다시 HTTP를 통해 가져 와라.. 등등..그리고 로딩 중이다 로딩이 끝났다. 등등)

      리소스 관련은 DocumentLoader가 관리 하는 것이 맞구요.. (frameLoder의 멤버로 있습니다)
      그 하위로 Type에 따라 HTML문서면 MainResourceLoader가...
      Contents라면 SubResourceLoader가 (요녀석은 또 다시 여러개입니다.) 관리를 하게 됩니다.
      (홈피가 없어서리 말로만 하자니.. 영.... 시원하게 그림을 그려 보여 드렸음 좋겠지만.. 허허허)

      그래서 페이지가 다 로딩 되었느냐를 판단하기 위해서는
      최상위 mainFrame의 FrameLoader뿐만 아니라 그 하위의 Frame들을 돌면서 로딩 상황을 체크 하는것이지요.

      정리 하자면..
      webkit의 대장 로더는 FrameLoader가 맞습니다.
      FrameLoader는 하위로 documentLoader를 가지고 documentLoader는 type별로 다시 resourceLoader들을 가지고.. ㅎㅎㅎ

      (현재 최신소스와 다를 수 있음을 참고 부탁 드립니다. 전 08년 4/4분기 소스... rev 37xxx)

  3. webkit 2010.06.30 21:10 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 ingee님 또 질문을 하게 되었습니다;
    주로 소스보다 설명을 먼저 읽고, 소스를 찾아보면서 맞는지 확인을 해보고 있는데요.
    ---
    FrameLoader은 각 frame의 로딩을 담당한다.
    (각 frame을 담당하기도 하지만, 전체 프레임인 mainframe도 담당하고 있으므로, 전체를 책임지게 된다고 볼 수 있다.)
    한개의 프레임 내에서는 각 FrameLoader가 DocumentLoader를 생성한다.
    DocumentLoader는 MainResourceLoader를 생성한다.
    MainResourceLoader는 프레임의 html 로딩을 담당하고, ResourceHandle을 통해서 (플랫폼에 접근해서) 네트워크를 사용한다.
    이미지나 스크립트, CSS 등 기타 자원들은 DocLoader가 담당하는데 DocLoader는 Cache에 자원을 요청한다.
    Cache는 자원을 이미 로딩해두고 있으면 바로 넘겨주고, 없으면 각 자원에 맞는 객체를 생성하고 그 객체는 Loader를 통해서 자원을 로딩한다.
    Loader는 SubresourceLoader를 생성하고 그 동작은 MainResourceLoader와 비슷하다.
    ---
    제가 이해한 바는 대략적으로 위와 같습니다. 그리고 제가 드릴 질문은 다음과 같습니다. 두서 없지만 조언 부탁드리겠습니다.

    1. 제가 알고 있는게 맞나요?;
    2. xxxLoader와 xxxLoaderClient의 관계를 모르겠습니다; 이런 구조를 이해하기에 뭔가 참고할만한게 있을까요?
    3. WebFrame이 하나의 프레임을 나타내는거 같은데, WebFramePrivate은 뭔가요?
    4. Document가 프레임에 속하는 문서를 말하나요? 또 Frame은 뭔지 잘 모르겠습니다.

    한번에 너무 많은 질문 드려서 죄송합니다. 혹시 바쁘시다면 그냥 참고할만한 자료라도 알려주시면 감사드리겠습니다.

    • ingee 2010.07.05 23:12 신고  댓글주소  수정/삭제

      현재 웹킷을 보고 있지 않아서 전, 패쓰~ 합니다. 다른 분들의 좋은 답변 있으면 좋겠습니다. 소스를 꼼꼼히 보시는 것 같습니다. 분석하신 글을 어디든 올리시고 URL을 공유하면 많은 분들께 도움될 것 같습니다.

    • 감성코드 2011.08.25 11:05 신고  댓글주소  수정/삭제

      1번 : 저도 공부 중인데 맞다고 봅니다. ㅋ
      2번 : xxLoader와 xxLoaderClient라고 하는 것이 어떤 것을 말씀하는지 잘 모르겠는데요.
      FrameLoader, FrameLoaderClient와 같은 클래스를 말씀하시는 거라 믿고,
      FrameLoaderClient.h 파일을 보면 순수가상함수들이 많이 보일 겁니다. 그리고 FrameLoader.cpp를 보시면 client의 객체를 생성해서 해당 가상함수를 호출하고 있지요. 그러니까 xxxLoader는 xxxLoaderClient를 이용해서 맡은 일을 수행합니다. xxxLoaderClient는 개발자가 자신의 목적에 맞게 xxxLoaderClient를 상속해서 쓰는 것이지요. 그래서 같은 웹킷이라도 크롬이나 사파리가 다르게 동작하게 됩니다. 디자인 패턴 중에 뭔가 이름이 있을 것 같은데 ... 뭐라 말할 방법이 없네요. ^^;
      3. 제가 가진 소스에 WebFramePrivate라는 부분이 없어서 답변이 어렵네요. 1년이나 지난 후라 없어졌을 수도.
      4. Frame은 액자라고 보시고 Document는 사진이라고 보시면 될 것 같습니다. MainFrame은 가장 큰 액자가 될 것이구요. 그 MainFrame에 사진은 한 장이 될 수도 있고 두 장이 될 수도 있고 세 장이 될 수도 있겠지요. 그러면 그 각각의 사진 역시 작은 틀이 필요할 것입니다. 이 틀이 Frame이지요. 이 틀은 가장 큰 사진을 왼쪽에 두고 오른 쪽에 작은 사진을 위 아래로 둘 수도 있을 겁니다. 이렇게 틀을 정의하고 나면 각 틀에 사진을 넣습니다. Document를 불러오는 것이지요. 요즘은 사진만 넣는 것이 아니라 꾸미기도 합니다. 요고이 subresource가 되겠죠.

      잘못된 부분은 누군가 강렬히 지적해 주시리라 믿습니다.

  4. ingee 2011.08.26 20:45 신고  댓글주소  수정/삭제  댓글쓰기

    감성코드님, 좋은 답글 고맙습니다.