JavaScriptCore 현황

(JSC SquirrelFish, SFX의 관계에 관해)

 

 

요약

l  SquirrelFish SquirrelFishExtreme(SFX) JavaScriptCore의 아키텍처를 개선하여 실행성능을 향상시킬 목적으로 WebKit 엔지니어들이 시작한 프로젝트의 코드네임

n  SquirrelFish bytecode VM 방식을 구현하기 위해 시작한 프로젝트

n  SFX (SquirrelFishExtreme) native code JIT 방식을 구현하기 위해 시작한 프로젝트

l  2008 6 SquirrelFish WebKit SVN trunk에 통합됨

n  (SquirrelFishWebKit SVN main trunk에 통합된) 현재 상황에서 JSC SquirrelFish, SFX는 동일함

l  현재 Linux ARM JIT는 지원하나 WinCE ARM JIT는 지원하고 있지 않음

 

 

WIKI 백과 중에서
http://en.wikipedia.org/wiki/WebKit#JavaScriptCore

l  2008/6/2 WebKit 프로젝트가 JavaScriptCore“SquirrelFish (bytecode interpreter)” rewrite 했음을 발표함

l  2008/9/18 x86 JIT (SFX: SquirrelFishExtreme)를 발표함

l  2009/1 Mac OSX on x86-64 JIT 발표함

 

 

뉴스그룹 중에서

2008/5/18/공지
http://old.nabble.com/The-SquirrelFish-Cometh-to17298445.html#a17298445

l  기존 JavaScriptCore AST 기반 인터프리터였다. 성능에 관한 아키텍처적 문제가 있었다

l  그래서 bytecode VM 아키텍처의 SquirrelFish 프로젝트를 시작했다

l  별도의 SVN repository에서 작업을 진행했으나 조만간 main trunk에 통합할 것이다

 

2008/6/98/질문: WebKitGtk 최신 소스에 SquirrelFish JS-engine이 적용되어 있는가?
http://old.nabble.com/Get-SquirrelFish-for-Webkit-in-linux-to17724999.html#a17724999

ð  2주전에 merge됐다.

 

2008/6/13/공지
http://old.nabble.com/JavaScriptCore-directory-reorganization-to17816031.html#a17816031

l  SquirrelFish가 완료되어 SVN trunk JavaScriptCore 디렉토리를 변경한다

 

2008/12/24/질문: SFX non-x86 JIT를 지원하는가?
http://old.nabble.com/SquirrelFish-Extreme-for-non-x-86-platforms-td21159116.html

ð  JIT는 아직 x86만 지원한다

ð  JIT를 기타 CPU로 포팅하는 것을 고려 중이다

ð  JITbytecode 모델보다 효율적일지 판단 중이다. JIT는 메모리를 압도적으로 많이 사용한다

 

2009/12/11/질문: WinCE JIT 어찌되어 가나?
http://old.nabble.com/JIT-on-Windows-CE-to26740395.html#a26740395

ð  개발 중이다.

 

 

 

(이상입니다.)

 


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

댓글을 달아 주세요

  1. 조인성스토커 2010.02.12 16:13 신고  댓글주소  수정/삭제  댓글쓰기

    WebKit 엔진에서 Javascript 부분을 공부하고 있는데 질문이 있어서...
    javascript 의 기존 object(window, form etc... )가 아닌
    임의의 object를 추가 하고 싶은데 어떻게 해야되는지 전혀 감이 잡히지 않네요..
    임의의 object를 추가하고 object의 properties랑 method 또한 추가 하려 합나디
    이 블로그에 정리 되어 있는 걸로 해보려 하는데 잘 안되서 이렇게 질문까지 남겨봐요 ㅜ

  2. 2010.02.16 07:09  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  3. ingee 2010.02.17 17:23 신고  댓글주소  수정/삭제  댓글쓰기

    주인장이 모자라서 별다른 조언은 못드릴것 같습니다. 하지만, 시도하는 주제어가 모두 흥미롭네요. 병렬화, 퍼포먼스 향상...
    웹킷 platform.h 나 config.h 를 뒤져보면 멀티쓰래드에 대한 고려가 담겨 있는 것을 볼 수 있습니다. 해당 파일과 뉴스그룹을 뒤져서 웹킷 엔지니어들이 닦아 놓은 기반이 있는지 확인하시고 작업하는 것이 좋겠습니다.
    작업을 진행하다가 뭐라도 공유할 꺼리가 생기면 댓글/트랙백 등을 통해 동료 엔지니어들을 이끌어주시기 바랍니다. 하시는 일에 성과 있기를 빕니다.

    • 조인성스토커 2010.02.17 17:43 신고  댓글주소  수정/삭제

      제가 수정하고자 하는 것은 custom js object 추가 하는 방법과는 전혀 다른 문제의 것인가요??
      저는 같은 매커니즘인 줄 알고 따라 해보려 계속 시도중인데 실패 하고 있습니다ㅜㅜ

    • 2010.02.17 19:01  댓글주소  수정/삭제

      비밀댓글입니다

  4. 조인성스토커 2010.02.17 19:22 신고  댓글주소  수정/삭제  댓글쓰기

    ...... 비밀댓글로 리플이 달렸는데... 이거 볼수 있는 방법은 뭔가요??ㅋ
    댓글을 꼭 비밀로 보내야 한다면 ...
    죄송하지만 제 메일로 좀 ㅋㅋ
    clfgusxk@nate.com

    • ingee 2010.02.17 19:26 신고  댓글주소  수정/삭제

      'exahz' 님은 JS Object 추가와 다른 주제로 댓글을 다셨습니다. '조인성스토커'님이 궁금해하는 문제와는 거리가 좀 있습니다. 님의 경우에도 주인장의 한계로 구체적인 답변을 드리기는 어렵지만, $/JavaScriptCore/API/JSObjectRef.h 파일의 주석을 정독하면 도움이 되지 않을까 생각합니다. 좋은 성과 이루시기 빕니다.

    • 조인성스토커 2010.02.17 20:50 신고  댓글주소  수정/삭제

      답변 감사 드려요~
      우선 커스텀 js object 추가와는 같은 개념이 맞는건가요?? 커스텀 js object에 가보니 이것도 JSObjectRef.h 파일을 참조하여 만들던데 ;; ㅋ ^^

    • ingee 2010.02.18 07:10 신고  댓글주소  수정/삭제

      "javascript 의 기존 object(window, form etc... )가 아닌 임의의 object를 추가 하는 것"과 "커스텀 JS Object를 추가하는 것"은 같은 일, 맞습니다.

  5. kleeck 2011.12.12 15:20 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요
    한가지 궁금한 것이 있어서
    JSC를 기반으로 성능을 개선한 프로젝트가 SFX라고 되어 있고 또 동일하다고 하는데요

    그렇다면은 SFX형태의 JSC를 구할려면은 WebKit 사이트에서 다운받아 jsc로 컴파일 되어 돌아가는
    예제 브라우저들이 SFX 엔진이 적용이 되어 있는건가요?

    궁금해서 글을 남기빈다.

    • ingee 2011.12.12 23:51 신고  댓글주소  수정/삭제

      2010년2월 기준으로 밖에 답변드리지 못합니다. 제 답에 크게 의미 두지 마세요. 다른 좋은 분들이 정확한 답변 달아주시기를 기대합니다.
      JSC는 JavaScriptCore로 WebKitCore와 함께 WebKit 소스의 주요 블럭중 하나입니다. 이부분의 성능을 개선하기 위한 별도의 프로젝트가 SFX였고, 당시(2010년 2월), 별도 개발되던 SFX의 소스가 WebKit에 합쳐졌습니다. 그래서 JSC와 SFX는 동일한 모듈을 지칭하게 됐습니다.

JavaScriptCore 분석

WebKit 2009.12.10 17:50
간단한 내용이지만 고생하는 누군가에게 도움이 되면 좋겠다.


JavaScriptCore 분석

(WebKit rev 50723 기준)

 

JavaScriptCore 관련 소식/ ARM JIT 현황

l  JSC 소스에 PLATFORM(ARM_THUMB2), PLATFORM(ARM_TRADITIONAL) 컴파일 플랙에 대한 구현부가 존재한다.

l  WM6 포트에 적용할 수 있는지는 테스트해봐야 안다.

l  관련 뉴스 그룹 기사

n  2009/06/09: ARM JIT 릴리즈 됐다.
Today, we realized that there is a new ARM JIT port for WebKit. (http://trac.webkit.org/changeset/44514> )

n  2009/10/22: WinMobile에서는 안된다.
The current implementation is designed for Linux

n  2009/04/01: ARM port of JIT 공시
on a Nokia N810, and we gained 13% performance improvement. The memory consumption is increased by 3.3%.

 

 

JSC Class Diagram


 

다이어그램이 나타내는 내용 몇 가지를 다음과 같이 요약한다.

l  페이지의 root Frame WebView 1:1 관계다.

n  동일한 WebView에서 페이지를 이동할 때, root Frame 인스턴스는 유지된다.

n  페이지에 따라 sub Frame들이 필요할 때가 있는데 sub Frame들은 페이지 이동시 생성되거나 소멸된다.

n  sub Frame의 소멸은 Cache 때문에 즉각적으로 이루어지지 않는다.

l  Frame의 멤버로 ScriptController 인스턴스가 존재한다.

n  ScriptController WebCore 세계에서 JSCore를 쉽게 호출하도록 캡슐화(창구를 단일화)하는 역할을 한다.

n  WebCore가 페이지를 처리할 때, HTMLTokenParser JavaScript 소스 코드를 만나면 ScriptController::evaluate() 메소드를 호출한다. 그것으로 WebCore JSCore 사이의 모든 연결이 끝난다.

l  JSGlobalData는 싱글톤 객체로 system wide하게 1개 존재하며, 시스템과 life-cycle을 같이 한다.

n  JSGlobalDataJSC 동작에 필요한 모든 것을 나타낸다 (Lexer, Parser, Interpreter, and Data).

l  JSC::GlobalObject의 실 구현체는 WebCore::JSDOMWindow 이다.

n  JSDOMWindow Frame에 속해 있다.

l  ExecState JSCore의 실행 상태에 관한 모든 것을 나타낸다.

n  Mostly, an ExecState represents the state of execution in the VM. (Geoffrey Garen)

n  ExecState JSGlobalObject에 의해 생성/초기화 되며, JSGlobalObject life-cycle을 함께 한다.

l  JSContextRef ExecState와 동일하다.

n  JavaScriptCore/API/ 폴더 아래 있는 JSC public API을 호출하기 위해 정의한 타입이다.

n  JSC public APIC based API 이다. 이 때문에 ExecState* 객체 타입을 JSContextRef 타입으로 변환해서 사용해야 한다. 타입 변환을 위해 toRef()toJS() 함수를 사용한다.

n  toRef() toJS() 함수는 타입 캐스팅만 수행하는 inline 함수다. 때문에 런타임 실행 오버헤드가 없다 (컴파일 타임에 처리됨).

 

 

JavaScript 소스코드 실행 시퀀스, 

JSGlobalObject& ExecState 생성/초기화 시퀀스


 

l  JS 코드가 없는 페이지에서는 JSGlobalObject ExecState가 생성/초기화 되지 않는다.

l  JSGlobalObject ExecState 인스턴스는 JS 코드가 존재하는 페이지에서만 생성/초기화 된다.

 

 

(이상입니다.)

 

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

댓글을 달아 주세요

  1. 소혼 2009.12.12 16:24 신고  댓글주소  수정/삭제  댓글쓰기

    전혀 간단하지 않아요.
    아직 자세히 보지 않았지만 많은 도움이 될 것 같습니다.
    찬찬히 코드랑 비교하며 볼께요 ^^ 다시 한번 감사합니다.

  2. webkit 2010.07.14 19:14 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 프레임 로딩이 완전히 끝난시점에 자바스크립트를 실행하는데요, 이 코드가 실행되면서 dom구조를 바꾸게 되는데, 실행하고 나서 바로 dom을 확인하면 그대로이더라구요..
    그래서 자바스크립트를 실행하면 비동기적으로 이루어진다고 생각되는데, 그러면 실행이 완료되는 시점에 처리를해줄수있는 delegate같은게 있는지요? 제가 생각하고 있는게 맞는지 모르겠습니다 --;; 답변 부탁드리겠습니다.

PC에서 Visual Studio 디버그 모드로 웹킷을 실행시켰다 종료시키면 기절할 정도로 많은 메모리 leak이 보고된다.
처음엔 명성 높은 웹킷 소스에서 그토록 많은 leak이 쏟아진다는 것이 믿어지지 않았다. 처음 프로그래밍을 배울 때 메모리 leak은 하나도 남김 없이 제거해야 할 절대 악으로 배웠다. 그래서 메모리 leak에 대해서는 강박관념에 가까운 혐오를 갖고 있다. 그런데 결론을 말하자면 WebKit 소스가 종료시 내는 leak은 의도적인 것이라고 한다. 종료 시점에 사용하던 메모리를 해지하는 절차를 생략함으로써 (해당 절차를 OS에게 맡김으로써) 처리 속도를 높이는 것이 설계 취지란다. 딱히 반박할 수도 없고... 경우에 따라서는 합리적인 판단일 수도 있겠다 하고 수긍하고 있다. 관련된 뉴스 그룹 기사는 다음과 같다.

http://www.nabble.com/freeing-static-variables-to24714380.html


뉴스 그룹 기사를 요약하면 다음과 같다.

static global 변수의 leak은 의도적이다 (by "Adam Treat-2")
* 웹킷은 static global 변수의 해지(clean up)에 관여하지 않는다. 해당 작업은 OS에게 맡긴다.

의도적인 leak에 대한 태클 (by "Zoltan" and "Antonio Gomes")
* 보고되는 leak이 너무 많아, 실제 주의해야 할 개발자의 실수에 의한 leak을 알아내기 어렵다.
* WebKit을 어플리케이션 형태가 아닌 다른 어플리케이션의 플러그인 형태로 사용할 경우, WebKit 플러그인을 내릴 때 leak이 발생하면 문제가 된다.


참고를 위해 뉴스 기사 원문을 아래와 같이 첨부한다.

_______________________________________________
freeing static variables 
by Zoltan Herczeg Jul 29, 2009; 05:05pm

Hi all,

Valgrind reports a lot of memory leaks when QtLauncher quits, because many
static local variables are not freed. I did a little research and realized
there is no consistent way to define static variables in webkit:

WebCore/css/CSSSelector.cpp: CSSSelector::extractPseudoType()
   using a DEFINE_STATIC_LOCAL() macro

WebCore/bindings/js/JSDOMWindowBase.cpp:
JSDOMWindowBase::commonJSGlobalData()
   static JSGlobalData* globalData;

WebCore/platform/qt/CursorQt.cpp:
   Cursors* Cursors::s_self = 0; (no static keyword)

I belive it would be a good thing to define a template for static
variables, which can (optionally) free static variables (enabled in debug
mode, but sometimes it would be good to enable it in release mode as well)

And I am wondering whether it would be worth to free (some) static
variables if they are used in a given time period. This may help to reduce
the memory consumption in the long run. This would be an optional feature,
an extra flag (or timeout value) for the template, which can be enabled or
disabled at compile time. If disabled, the value of this flag is not used
at all.

Regards
Zoltan


_______________________________________________
Re: freeing static variables 
by Zoltan Herczeg Jul 30, 2009; 03:55pm

Hi,

any thoughts on this? I hope my qestion was clear :) I would like to pack
the static declarations into wrapper classes, so we can add platform
and/or compilation mode (debug/release) dependent functionality to all
static variables (i.e: freeing them on exit).

Zoltan


_______________________________________________
Re: freeing static variables 
by tonikitoo (Antonio Gomes) Jul 30, 2009; 11:06pm

Zoltan, I think it would be a great add from a embedder-dev point of view.

Particularly, such leaks have been faced here in a soon past, when we
were loading a webkit browser as a plugin, and not as an application
by itself. So, we the webkit plugin was unloaded, it used to left
behind lots of leaks affecting the (main)  loader application, and as
we you might imagine many of this leaks were from global vars
(including in dependency libs , e.g. fontconfig =/)

--Antonio Gomes


_______________________________________________
Re: freeing static variables 
by Adam Treat-2 Jul 30, 2009; 11:26pm

On Thursday 30 July 2009 02:55:18 am Zoltan Herczeg wrote:
> Hi,
>
> any thoughts on this? I hope my qestion was clear :) I would like to pack
> the static declarations into wrapper classes, so we can add platform
> and/or compilation mode (debug/release) dependent functionality to all
> static variables (i.e: freeing them on exit).
>
> Zoltan

I've tried this before and it didn't work out so well.  The order in which you
free them becomes very important and error prone.  

And, of course, whatever solution you make has to be optional and easy to
maintain as the default policy in WebKit is to not care - by design - about
cleaning up after static globals on exit as that is left to the OS.

Another strategy for the embedded case where you want to free everything on
exit is to create a custom memory handler that will do this for you.

Cheers,
Adam


_______________________________________________
Re: freeing static variables 
by Zoltan Herczeg Aug 05, 2009; 12:10am

Hi Adam,

thank you for your suggestions. I have something similar in my mind.

I have opened a bugzilla entry and submited an early patch draft about my
concept:
https://bugs.webkit.org/show_bug.cgi?id=27980

The patch frees memory objects in a reversed creation order, and seemed
working well with QtLauncher (although only a subset of static variables
are freed right now). Do you know about special cases when this approach
is not enough?

Actually it is hard to find real memory leaks in the output of valgrind
because many of them are related to static variables. I hope this feature
will help to the leak hunters in the future.

Cheers,
Zoltan

 (끝)

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

댓글을 달아 주세요

JavaScriptCore를 변형해 쓰기 위해 분석하고 있다. 다음은 JSC에 관한 간단한 클래스 다이어그램이다. 웹킷을 사용하는 엔지니어들에게 도움이 되면 좋겠다.


다음은 JSC관련 객체들의 라이프사이클에 관한 메모이다.
  • WebCore::JSDOMWindow 인스턴스는 (다시 말해 JSC::JSGlobalObject 인스턴스는) 페이지를 새로 로드할 때마다 새로 만든다.
  • JSC::GlobalData 인스턴스는 application과 life-cycle을 같이 한다 (즉, 한번 만들면 어플리케이션을 종료시킬 때까지 같은 놈을 사용한다).

 (끝)

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

댓글을 달아 주세요

WebKit을 갖고 작업할 때, 꼭 풀어야 하는 문제중 하나가 커스텀 JS Object를 추가하는 일이다. 관련 자료를 아래와 같이 요약한다.


JS Object 확장 방식

 

 

관련 뉴스그룹 기사

http://www.nabble.com/Extending-webkit-javascript-td21517784.html#a21536928

l  frameLoadDelegate2::didClearWindowObject() custom JS object JS context에 등록하는 최적의 자리다. 해당 함수는 현재 web 문서의 스크립트가 실행되기 직전에 호출된다.

 

 

커스텀 JS Object 추가 절차 요약

l  $/JavaScriptCore/API/tests/testapi.c 파일과
$/JavaScriptCore/API/JSObjectRef.h
파일에 유용한 정보가 있다.

l  JSClassDefinition 구조체의 staticValues 필드와 staticFunctions 필드를 이용하는 것이 커스텀 속성을 가진 커스텀 JS Object를 정의하는 가장 간단한 방법이다.

l  커스텀 속성을 가진 커스텀 객체를 정의하려면

n  커스텀 속성을 위한 get 함수와 set 함수를 준비한다 (ingeeGetPropFunc 함수)

n  커스텀 속성 테이블 JSStaticValue 배열을 준비한다 (ingeePorpArr 배열)

n  커스텀 객체를 위한 JSClassDefinition을 정의한다 (ingeeClassDef 변수)

n  적절한 시점에 JSClassCreate() 함수를 호출하여 타입을 등록한다

n  적절한 시점에 JSObjectMake() 함수를 호출하여 객체를 생성한다

 

static JSValueRef ingeeGetPropFunc

( JSContextRef ctx

, JSObjectRef object

, JSStringRef propertyName

, JSValueRef* exception

)

{

return JSValueMakeUndefined(ctx); //undefined-value 리턴 (단지 샘플...)

}

 

static JSStaticValue ingeePorpArr[]=

{ { "prop1", ingeeGetPropFunc, 0, kJSPropertyAttributeNone }

, { "prop2", ingeeGetPropFunc, 0, kJSPropertyAttributeNone }

, { "prop3", ingeeGetPropFunc, 0, kJSPropertyAttributeNone }

, { 0, 0, 0, 0 }

};

 

static JSClassDefinition ingeeClassDef=

{ 0 //ver

, kJSClassAttributeNone //attributes

, "PersonObject" //className

, 0 //parentClass

, ingeePorpArr //staticValues

, 0 //staticFunctions

, 0 //initialize

, 0 //finalize

, 0 //hasProperty

, 0 //getProperty

, 0 //setProperty

, 0 //deleteProperty

, 0 //getPropertyNames

, 0 //callAsFunction

, 0 //callAsConstructor

, 0 //hasInstance

, 0 //convertToType

};

 

JSValue* SomeFuncToCreateJSObject( ExecState* exec )

{

static JSClassRef ingeeClass;

if (!ingeeClass)

ingeeClass= JSClassCreate(&ingeeClassDef);

 

JSContextRef ctx= JSC::toRef(exec);

JSObjectRef objRef= JSObjectMake(ctx, ingeeClass, (void*)0/*someData*/ );

return JSC::toJS(objRef);

}

 

 

(끝)

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

댓글을 달아 주세요

  1. 워럽 2009.08.31 17:46 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 :)
    웹킷쪽을 보다가 우연히 들르게 되었는데 좋은자료가 참 많네요 :)

    많은것을 배워가는데 여쭤볼게 있어서 질문하나 드려봅니다.

    안드로이드 플랫폼상의 웹킷을 수정해서 커스텀 object를 구현하고자 하는데,

    커스텀 오브젝트의 정의부분을 어떻게 꾸미셨나 싶어서 여쭤보고자 합니다 :)
    살포시 정의부분 소스좀 부탁드릴 수 있을까요??

    • ingee 2009.08.31 19:52 신고  댓글주소  수정/삭제

      반갑습니다. Custom Javascript Object 말씀이신거죠? 대단한 소스는 아니지만 회사 과제를 수행하며 작성한 소스는 오픈하기 어렵습니다. 제것이 아니라 회사것이라서요. 그렇더라도 본 기사에서 언급한 내용을 크게 벗어나지 않습니다. 충분히 유추할 수 있는 수준입니다.
      어쨌든 오픈 소스 웹킷에 대한 분석과 노하우는 회사 재산이 아니라 인류 공용의 재산이라 생각하고 과감하게 오픈하고 있습니다. 님께서도 작업 결과로 좋은 내용 얻게되시면 공유 부탁 드립니다.

  2. 워럽 2009.09.01 10:33 신고  댓글주소  수정/삭제  댓글쓰기

    아~ 회사업무상이셨구나 :)
    개인 프로젝트용인줄 알고 오픈요청을 했었네요 ^^;

    무례한 부탁을 드려서 죄송합니다 :(

    저도 쌩뚱맞게 웹킷을 만지라는 명령이 떨어져서 날고생 중입니다 -_ㅠ

    함께 대박프로젝트 내서 성과 팍팍을 이뤄봐요 :)

    • ingee 2009.09.01 20:05 신고  댓글주소  수정/삭제

      고생하는 엔지니어끼리 돕고 삽시다. ^^
      님의 블로그에 자주 들러야 할 것 같습니다. 좋은 글 많던데요. 방문 고맙습니다. 좋은 하루 되세요.

    • csro 2010.01.08 17:27 신고  댓글주소  수정/삭제

      Android는 WebView안에있는 addJavascriptInterface라는 메소드를 쓰시면 될것 같은데요. 자바로 처리해야하지 만요.

    • ingee 2010.01.16 07:04 신고  댓글주소  수정/삭제

      to csro
      addJavascriptInterface, 꽤 유용해 보이는데요? 안드로이드의 유연함에 경외감마저 듭니다. 사용하셨던 경험을 얘기해주시면 큰 도움될 것 같습니다.

  3. 깜장병아리 2009.09.25 10:35 신고  댓글주소  수정/삭제  댓글쓰기

    웹킷을 4년째 하고 있는 프로그래머입니다. ㅋㅋㅋ
    여기 오니 좋은글들이 많이 있네요..

    회사에서 갑자기 NPRuntime을 사용해야 한다해서 분석하다가
    이와 같은 좋은 글이 있어 잘 보고 갑니다.
    ^^*

    더 좋은 세상을 위해서 IT개발자 파이팅...

  4. 미완성인 2009.09.28 18:44 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요
    다들 저와 비슷한 일을 하시네요..
    좋은 정보가 많아 참고하고 있습니다.
    저도 이와같은 블로그를 하나 만들어 공유해야겠습니다..

    커스텀 Object를 구현해보려고 하는데
    위에 나와있는 예제는 DumpRenderTree를 debugging으로 사용시에만 해당되던데요
    Winlauncher로 디버깅했을시에는 FrameLoadDelegate가 생성되지만 didClearWindowObject()가 실행되지 않았습니다.
    그러면 커스텀 object를 확장하기 위해서 이용하는 API가 DumpRenderTree인가요?
    그것을 언로드 시켰을때는 커스텀 object 확장을 하지 못하는것인지 궁금합니다.

    JS API 또는 하드코딩으로 커스텀 object를 확장하려고 하는데
    저 위에 있는것이 하드코딩인지 API를 이용하는것인지 감이 잘안잡혀서요.

    • ingee 2009.09.28 19:24 신고  댓글주소  수정/삭제

      Q- DumpRenderTree를 디버깅으로 사용시에만 해당?
      A- 이건 질문을 이해 못했습니다. -_-;;

      Q- FrameLoadDelegate가 생성되지만 didClearWindowObject()가 실행되지 않음.
      A- didClearWindowObject()는 FrameLoadDelegate2 타입 COM 인터페이스의 메소드입니다.

      Q- 그러면, 커스텀 object 확장하는 API가 DumpRenderTree인가?
      A- 이것도 질문을 이해 못했습니다. -_-;;;

      Q- 하드코딩이냐 API 이용이냐?
      A- 이것도 질문을 이해 못했습니다. -_-;;;
      하드코딩이라고 답해야 할 것 같은 느낌만 갖습니다.

      블로그 주인장이 별 도움 안되서... 그래도 자주 방문 주시고 댓글이나 트랙백 많이 걸어주세요.

  5. 천궁 2010.08.26 17:04 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 저도 요즘 WebKit 때문에 탈모 증상이 나타나는 개발자입니다~ㅡㅡ;;;
    addJavascriptInterface의 function 같은 경우
    제가 알고 있기로는 Android가 시초가 아니라
    QT에서 먼저 만들어서 쓰는 것으로 알고 있습니다.
    QT에서 JavaScript custom object 만드는 건 class 만들기보다
    쉽거든요 ㅋ
    암튼 덕분에 많은 도움 받고 갑니다.

    • ingee 2010.08.30 10:57 신고  댓글주소  수정/삭제

      WebKit 같은 멋진 일을 하시다니 부러울 따름입니다. 일을 만들어 하지 못하고 시키는대로 하는 입장이라 WebKit을 손에서 내려놨습니다. 놓으라길래 놓았지만 아쉽움이 깊습니다. 어여 일을 만들어낼 수 있는 주변머리를 찾아야겠다 결심하고 있습니다.
      기술은 나눠야 맛. 좋은 정보 찾거든 댓글이나 트랙백으로 나눠주세요.

    • 천궁 2010.08.30 20:42 신고  댓글주소  수정/삭제

      WebKit 같은 멋진일~ㅡㅡ;;;
      동감이 심히 힘들긴하지만
      그래도 재밌는 일 정도까지는 인정할께요 ㅋ

      저도 WebKit을 계속 파면 재밌을거 같긴한데
      요즘은 WebKit 보다는 Custom object 추가하는
      작업 중이라 ㅋ

      참. 웹킷하시고 싶으시면 제가 다니는 회사로~ㅜㅜ;;;;
      (농담 반 / 진담 반 ㅋㅋ)

    • ingee 2010.08.31 11:08 신고  댓글주소  수정/삭제

      감사합니다. 지금은 새로운 일을 잡았고 일년정도는 뒤 안돌아보고 몰입하려고 합니다. 자주 들려주세요.

  6. 천궁 2010.08.31 16:50 신고  댓글주소  수정/삭제  댓글쓰기

    아 요즘 JS extension 관련하여 자료 찾다보면 이 페이지가 눈에 자주 뛰네요~
    무슨 새로운 일을 하시는 지 궁굼하네요 ㅋ

    오늘 찾아온 이유는

    HTML JS로 아래와 같은 형식을 호출 가능하게 할려고 하는데
    parentClass 등록으로는 잘 진행이 안되에요 흑~ㅜㅜ;;
    "callAsConstructor" 부분도 파고 있는데 역시 안나오네요 ㅋ

    [아래]
    CustomerObjectParent.CustomerObject.method();

    혹시 이 방법에 대해서 아시면 간단하게 코멘트 부탁드립니다.

    그리고 두개 더 문의 드릴께요
    혹시 Object를 반환하는 method 만드는 방법 알고 계신지와
    JS에서 method 호출할 때 파라미터로 function을 받아 async로
    호출하는 방법도 혹시 아시면 가르쳐 주시길 부탁드립니다.

    이 JS extension 관련하여 아무리 찾아도 제대로 된 reference가 안 나오네요~ㅡㅡ;;;
    진짜 10여년만에 완전 맨땅에 헤딩하고 있습니다 흑~ㅜㅜ;;;;

    • ingee 2010.09.23 22:18 신고  댓글주소  수정/삭제

      1.
      CustomObjectParent.CustomObject.method(); 호출 가능합니다.

      2.
      Object를 반환하는 method 가능합니다.

      무책임하지만 어떻게 가능한지는 잊었습니다. -_-;;;
      가끔은 "가능하다"라는 사실만 알아도 도움이 되는 경우가 있습니다. 부디 도움이 되면 좋겠습니다.

      JSObject.h 였었나? JSAPI.h 였었나??? JSAPI쪽 폴더에 보면 헤더 파일이 하나 있는데, custom JS Object를 추가하는데 도움이 되는 함수와 주석이 잔뜩 들어있습니다. 찾아서 정독하시면 도움이 될 것 같습니다.

  7. 박작가 2011.09.26 17:44 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. Webkit 기능에 대해 정리를 잘 해주셨네요. 도움 많이 받고 있습니다. 감사합니다.
    한가지 문의가 있습니다.
    위의 방법으로 custom object를 만들 때 기존에 javascript에서 제공되고 있던 Date와 같은 object를 상속받게 하고 싶은데 이게 가능한가요?
    위의 , JSClassDefinition의 값 중에 parentClass 값을 넣어주면 될 것 같은데
    해당 값을 어떻게 생성해야 할지 막막하네요. 해당 내용에 대해 조언 부탁드려요.
    감사합니다.

    • ingee 2011.10.10 11:05 신고  댓글주소  수정/삭제

      웹킷 실무에서 조금 벗어나 있습니다. 안타깝지만 이 질문에 대한 답변을 다른 방문자분들께 미뤄야겠습니다. 혹시 좋은 답을 스스로 찾으시면 다른 개발자들을 위해 간단하게라도 메모 남겨주세요. 감사합니다.

본 기사는 2008년 12월 버전 (rev. 39476) WebKit win32 port를 기준으로 한다.

http://webkit.org에 존재하는 “WebKit Objective-C Programming Guide” 문서를 보면 다음과 같은 그림이 존재한다.



이 그림에서 aWebFrameView는 폐기됐다 (적어도 windows port에서는…). 지금 현실에 맞게 그림을 재구성하면 다음과 같다.


  • WebView는 WebKit 엔진을 담고 있는 main-window를 나타내는 개념이다.
  • WebFrame은 WebKit이 표시하는 페이지를 나타내는 개념이다.
    • WebView는 1개의 WebFrame을 main-frame 멤버로 갖는다.
    • WebFrame은 0개 또는 여러 개의 WebFrame을 children 멤버로 가질 수 있다 (HTML & 태그 처리…).


화면 구성 요소들에 대한 클래스 다이어그램은 다음과 같다.



언제나처럼 이미지를 클릭하면 원본 크기로 볼 수 있다.

 

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

댓글을 달아 주세요

  1. 2009.07.15 01:15  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  2. seungzzang 2010.03.03 14:35 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 자료 감사합니다. 이제 막 webkit에 대해서 알아가는 중인데, 많은 도움이 되고 있습니다. 감사합니다. ^^

  3. seungzzang 2010.03.06 14:56 신고  댓글주소  수정/삭제  댓글쓰기

    아... 죄송해요. 실수했네요. ingee님. 좋은 하루되세요 ^^

  4. seungzzang 2010.03.06 14:57 신고  댓글주소  수정/삭제  댓글쓰기

    궁금한게 있는데요. ingee님은 webkit 소스를 수정할때, 어떤 에디터를 사용하나요? Eclipse? SourceInsight? VC2005? 어떤 에디터가 소스를 보기 편한지가 궁금하네요. ^^

  5. happyshan 2010.03.24 17:57 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 글 감사합니다.
    본문 중 “WebKit Objective-C Programming Guide” 문서는 어디에 있는건가요?
    이외에도 webkit을 이용할 수 있는 programming guide를 찾고 있는데, webkit.org 어디에 있는지 못찾겠네요.

    • ingee 2010.03.25 17:57 신고  댓글주소  수정/삭제

      에이, 너무하시네... 구글링만 해도 나오던데... ^^;;
      농담입니다. 뭐라도 도움줄 수 있어 기쁩니다. 자주 들러 주세요.
      http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/DisplayWebContent/DisplayWebContent.html 입니다.

    • happyshan 2010.03.25 19:13 신고  댓글주소  수정/삭제

      어. 그렇군요. -.-a
      webkit.org site에서 검색했더니 안나오길래...
      어제는 제 손이 삐었나봅니다. ^^

      감사합니다.
      (o.o) (_ _) (o.o)

    • ingee 2010.03.25 22:36 신고  댓글주소  수정/삭제

      webkit.org 메뉴 구성이 좀 난잡합니다. 저도 이런저런 문서를 기억하고 찾으려하다 못찾고 애먹는 경우가 많습니다. 어려움 겪으신것 충분히 이해합니다. 좋은 작업 결과 만드시기 바랍니다.

  6. lisa 2012.07.12 22:25 신고  댓글주소  수정/삭제  댓글쓰기

    1개월차 신입사원입니다.
    웹킷공부하는데 뭐가뭔지하나도모르겠네요 ㅠㅠ
    그래도 많은 도움 받고 갑니다 ㅠㅠ....
    함수나 클래스가 무슨일을 하는지 해석하는것도 안되는 이런 사회초년생 ㅠㅠ
    앞으로자주들리겠습니다 ㅋㅋ
    댓글좋아하신다고하셔서 머리도터질거같고 해서 남기고가요^^

이전 기사에서 사용자가 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 신고  댓글주소  수정/삭제  댓글쓰기

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

UML 하면 떠오르는 다이어그램이 무엇일까?
대부분의 사람들이 Class Diagram을 UML의 대표 다이어그램으로 떠올린다. 그래서 UML을 도구로 S/W를 설계할 때 Class Diagram을 먼저 그리려고 애쓰곤 한다. 그런데, Class Diagram은 UML의 모든 다이어그램들 중에서 abstraction degree (추상화 정도)가 가장 높은 다이어그램이다. 순서로 따지자면 S/W 설계시에 가장 마지막에 그려야 할 다이어그램이다.

웹킷을 가지고 작업하면서 WebKit 코어를 헤집어보게 됐다. 분석한 결과를 블로그에 꾸준이 올리려고 한다. 그러기에 앞서 분석을 설명하는 "언어"에 대해 일러두려 한다. UML은 소프트웨어 형상에 관한 자신의 생각을 표현하는 "언어"다. 클래스 다이어그램을 그리는 많은 기법들이 존재하는데, 일러두려고 하는 것은 클래스와 클래스 사이의 association (연관관계) 표기에 관한 것이다.


앞으로 블로그에 올리는 클래스 다이어그램에서는 클래스와 클래스 사이의 관계를 가능한 association-line과 role-name 만으로 표현하려고 한다. 하얀 다이아몬드와 검은 다이아몬드 같은 예쁜 기호는 가능한 사용하지 않으려고 한다. 사용하는 어휘가 많아질수록 오해의 여지가 높아지기 때문이다. 위의 그림에서 표기한 ClassA와 ClassB 사이의 관계를 문장으로 옮기면 "ClassA is role-A of ClassB", "ClassB is role-B of ClassA"와 같다. 이와 같은 표기법은 당연(?)하게도 내 생각이 아니다 (분하다...). 훌륭한 선배 개발자의 경험에서 우러난 가이드이다 (클래스 다이어그램 그리는 법에 관한 책을 통해 배운 방법이다. 그 책의 저자는 임베디드 분야에서 무척 많은 경험을 쌓은 훌륭한 S/W 엔지니어였다).
저작자 표시 비영리 변경 금지
신고
Posted by ingee

댓글을 달아 주세요

  1. 써니 2009.05.29 16:21 신고  댓글주소  수정/삭제  댓글쓰기

    웹킷 개발 관련 자료를 검색하다 흘러들어왔다, 간결하면서도 핵심을 짚은 글을 읽고 갑니다.

    그런데 한가지 여쭙고자 합니다. 저는 소프트웨어 구조를 표현할 때 '시퀀스 다이어그램'과
    '클래스 다이어그램', 2가지 만을 작성합니다.
    나머지 유형의 다이어그램들의 사용할 일이 별로 없었습니다.

    그런데, 추상화 레벨이 가장 낮은 다이어그램은 어떤 걸까요? ^^;

    • ingee 2009.06.03 11:26 신고  댓글주소  수정/삭제

      반갑습니다. 저도 시퀀스 다이어그램과 클래스 다이어그램을 주로 사용합니다. 개발을 하면서 다이어그램을 그려가는 순서가 중요하다는 사실을 깨달았습니다. 저는 제일 먼저 유스케이스 다이어그램을 그립니다. 어떤 일을 해야할지 항목을 나열하기 위한 용도 입니다. 그리고 각 항목별로 시퀀스 다이어그램을 그립니다. 시퀀스 다이어그램을 그려가면서 클래스 다이어그램을 점차 정리해 갑니다. 최종적으로 가장 마지막에 완성하는 것은 클래스 다이어그램입니다. 셋중에 비교하자면 유스케이스 다이어그램이 가장 추상화 정도가 낮다 (이해하기 쉽다, 현실적이다)고 생각합니다.

웹킷 뉴스 그룹은 작업 정보의 보고다.
일이 막힐 때, 머리를 비우고 아래 사이트에서 검색어를 입력한 다음 일년치 정도의 기사를 정독하면 문제 해결의 실마리를 잡을 수 있을 것이다.

http://www.nabble.com/Webkit-f14949.html
저작자 표시 비영리 변경 금지
신고
Posted by ingee

댓글을 달아 주세요