Content Shell main()의 두번째 라인이자 마지막 라인인 ContentMain() 호출이다.
int ContentMain(int argc,
const char** argv,
ContentMainDelegate* delegate);
ShellMainDelegate 객체를 생성한 뒤, ContentMain()를 호출하면서 Content Shell을 실행하고 있다.
이제 ContentMain()에 전달한 ShellMainDelegate 객체가 어디서 어떻게 쓰이는지 살펴보고,
클라이언트들(ShellContentBrowserClient, RendererClient, UtilityClient 등) 가
언제 어디서 참조되는지 알아보자.
ContentMain()... 긴 여정이 될 것 같은 느낌이다.
ContentMain()의 구현은 다음과 같다.
ContentMain()은 ContentMainRunner 클래스를 통해 content module의 초기화, 실행, 종료를
처리하고 있다.
사실 ContentMainRunner 는 추상클래스이고, ContentMainRunner::Create()를 통해 추상클래스를 구현한 ContentMainRunnerImpl 객체가 생성된다.
Chromium 코드를 보다보면 많은 패턴들을 만나게 되는데, 여기서는 factory method 패턴을 만난것 같다. :)
ContentMainDelegate 포인터는 Content State 를 초기화하는 Initialize()의 파라미터로 전달된다.
class ContentMainRunner {
virtual int Initialize(int argc,
const char** argv,
ContentMainDelegate* delegate) = 0;
};
Initialize()의 실제 구현부분으로 가보자.
Initialize()는 src/content/app/content_main_runner.cc 에 구현되어있다.
Initialize()에서 delegate를 참조하여 ShellMainDelegate 의 멤버함수를 호출하는 첫번째 부분이다.
BasicStartupComplete()를 호출하는 부분이다. ContentMainRunner의 아주 초기 시점에 호출이 되는 것을 알 수 있다. (ShellMainDelegate 클래스의 위 함수는 빈 함수임)
몇몇 함수들이 수행된 후 PreSandboxStartup()이 호출된다.
ShellMainDeleage 의 PreSandboxStartup()에서는 ShellContentClient 객체를 content module의 content client 등록하고 (content::SetContentClient()), process_type 에 맞는 sub client(browser client, renderer client 등)를 초기화한다.
다음으로 SandboxInitialized() 가 호출된다.
ShellMainDelegate의 SandboxInitialized()는 아무일도 하지 않는다.
ContentMainRunner의 Initialize() 에서 ShellMainDelegate 의 역할을 간단히 정리해보면,
content module에 content client 등록(ShellContentClient)과 sub client 등록인것 같다.
댓글 없음:
댓글 쓰기