2012년 3월 21일 수요일

Content Shell 의 구조 - ShellMainDelegate 클래스(1)

앞 포스트에서 Content Shell의 메인함수를 살펴보았다.
메인함수는 ShellMainDelegate 객체를 생성하고, ContentMain() 함수는 이 객체를 가지고
Content Shell을 실행하고 있다

계속 Content에 대한 이야기를 하고 있는데, 과연 Content가 무엇인가?
아래 그림은 Chromium Developer Site 에 있는 다이어그램이다.


위 다이어그램은 Chrome 에서 Content의 위치를 보여주고 있다.
(Content Shell이 아님, Chrome임)
Chrome은 Content Module이 제공하는 Content API를 이용하여 구현된 것처럼 보인다.

Developer 페이지에서 Content Module은 페이지 렌더링을 위한 Core Module이라고 기술하고 있다.
다이어그램을 보면 Content Module이 WebKit을 이용하고 있는 것을 알 수 있다.
아마도 Chrome은 페이지 렌더링은 Content API를 이용하여 페이지 렌더링을 하고
그외 다른 특징들(ex, Extension, NaCl)은 Chrome 계층에서 구현을 하고 있는 듯 하다.

Content Module은 크롬 브라우저를 구성하는 엔진(WebKit을 포함하는)이라고 보는게 맞는듯 하다.
그리고, Content Shell은 Content Module을 이용한 레퍼런스 브라우저 정도가 될 것 같다.

ShellMainDelegate 클래스 분석에 앞서 간단히 Content Module의 위치(?)가 어느쯤인지 알아보았다.

자 그럼 ShellMainDelegate 클래스를 알아보자.

src/content/shell/shell_main_delegate.h 파일을 보면, ShellMainDelegate 클래스는
content::ContentMainDelegate 인터페이스 클래스를 구현하고 있는 것을 알 수 있다.

Content Module이 정의해 놓은 ContentMainDelegate 인터페이스에 맞게 Delegate 클래스를
구현하면, Content Module을 이용한 브라우저를 구현할 수 있는 것 같다.

ContentMainDelegate 인터페이스가 정의하고 있는 함수들은 다음과 같다.

* BasicStartupComplete()
* PreSandboxStartup()
* SandboxInitialized()
* RunProcess()
* ProcessExiting()
* ZygoteStarting()
* ZygoteForked()

Mac 관련 함수를 제외하고 보니 위의 7개의 함수만 구현을 하면 나도 Content Module을 이용하여
브라우저를 만들수가 있을 것 같다~~ :)

함수 프로토타입위에 친절히 주석이 달려있긴하지만, 아직은 내용이 와닿지 않는다.
그래도 한번 살펴보자.
이해가 안가더라도 이후에 ShellMainDelegate 클래스를 구현한 부분을 보면 조금은 이해가 가지 않을까?

1. BasicStartupComplete()
주석에 따르면 이 함수를 통해 embedder에게 아주 기본적인 작업(absolute basic startup)이
끝났음을 말해준다고 한다.
embedder?? 아마 여기서 embedder는 Chrome 모듈 또는 Content Shell이 될 것 같다.
ContentMain() 함수가 호출 되면, Content Module이 초기화 작업을 진행하다 아주 기본 작업이 끝났음을 embedder(chrome, chromium or content shell)에게 알려주는 함수인 것이다.

2. PreSandboxStartup()
Content Module이 Embedder에게 Sandbox가 초기화되기 전에 필요한 일을 당장 해라라고 이 함수를 통해 알려준다.
embedder는 이 함수에서 관련 작업을 수행하면 될 것이다. 그런데 여기서 말하는 sandbox는 무엇일까?
흠... 차차 알게되겠지 ^^;

3. Sandboxinitialized()
이제 embedder는 이 함수를 통해 sandbox 초기화 이후에 수행할 수 있는 작업을 할 수 있게 있다.
sandbox 초기화 이후에 embedder가 할 일이 무엇일까? 궁금 궁금..

4. RunProcess()
Embedder에게 프로세스를 시작하라고 말한다? 이것은 무슨 말일까?
Content Module은 멀티프로세스 렌더링 구조를 가지고 있다고 말하고 있는데,
프로세스는 embedder를 통해 생성된다는 말인가??? 이해가 잘 안된다...

5. ProcessExisting()
프로세스가 끝나기 전에 호출한다고 하는데, 여기서 말하는 프로세스는 RunProcess()를 통해 생성한
프로세스 인가? 점점 궁금해진다. 얼른 ShellMainDelegate 클래스의 구현이 보고 싶어진다.

6. ZygoteStarting()
Zygote 가 나왔다. 안드로이드에서 처음 들은 단어인 Zygote...
Zygote 개념이 Chromium 에서도 사용되나보다.
Embedder에게 Zygote 프로세스가 시작되었다고 알려준단다.
이 함수의 리턴값은 ZygoteForkDelegate* 란 Delegate 로 미루어 ContentModule에서
zygote 관련일을 이 포인터를 통해 embedder에게 요청하는 것을 짐작할 수 있다.

7. ZygoteForked()
Zygote 프로세스가 fork 될 때마다 호출된다고 한다. Zygote는 자신을 자가 복제 세포 처럼 fork() 하여
다른 프로세스로 변신을 하는데, 아마도 zygote가 fork 되었으니 새로운 프로세스로 변신할 준비가 되었다고 embedder 에게 알려주는 함수인것 같은 느낌이다.

앞서 Content Module 이 엔진이라고 비유를 했었는데, 이 엔진 자체로는 브라우저가 될 수 없고,
UI 등등 브라우저 Customizaiton 이 필요한 부분들은 Content Module이 이 Delegate 를 통해
embedder에게 위임(delegate)하고 있는 것을 알 수 있다.

오픈소스를 보며 항상 느끼는 것이지만, 코드가 정말 구조화가 잘 되어 있는 느낌이다.
학생 때 오픈소스를 알았더라면... 하는 생각을 요즘들어 자주 하지만 지금이라도 늦지 않았다!!

다음 포스트에서는 이 ContentMainDeleage 인터페이스 클래스를 ShellMainDelegate 클래스가 어떻게 구현을 하고 있는지
살펴보자.

댓글 없음:

댓글 쓰기