今天用vs单步跟了一下webkit的运行流程,基本是这样的
1.WinLauncher 里面的 _WINMAIN_ 做一些程序的加载 然后进入
2.通过函数 entryPoint(hInstance, hPrevInstance, lpstrCmdLine, nCmdShow);
#if USE_CONSOLE_ENTRY_POINT
typedef int (WINAPI*EntryPoint)(int, const char*[]);
const char* entryPointName = "_dllLauncherEntryPoint@8";
#else
typedef int (WINAPI*EntryPoint)(HINSTANCE, HINSTANCE, LPWSTR, int);
const char* entryPointName = "_dllLauncherEntryPoint@16";
#endif
//应该是利用工厂方法获得正确的处理函数
EntryPoint entryPoint = reinterpret_cast<EntryPoint>(::GetProcAddress(module, entryPointName));// 看起来像一个仿函数,先不管,继续往后看
3.进入extern "C" __declspec(dllexport) int WINAPI dllLauncherEntryPoint(HINSTANCE, HINSTANCE, LPTSTR, int nCmdShow)
做一些初始化工作,包括创建win窗口,建立frame对象等等
。。。。。
IWebFrame* frame;
hr = gWebView->mainFrame(&frame);
if (FAILED(hr))
goto exit;
static BSTR defaultHTML = SysAllocString(TEXT("<p style=\"background-color: #00FF00\">Testing</p><img id=\"webkit logo\" src=\"http://webkit.org/images/icon-gold.png\" alt=\"Face\"><div style=\"border: solid blue; background: white;\" contenteditable=\"true\">div with blue border</div><ul><li>foo<li>bar<li>baz</ul>"));
frame->loadHTMLString(defaultHTML, 0);
4.进入WebFrame::loadHTMLString 开始对网页进行读取
RefPtr<SharedBuffer> sharedBuffer = SharedBuffer::create(reinterpret_cast<char*>(string), sizeof(UChar) * SysStringLen(string));
BString utf16Encoding(TEXT("utf-16"), 6);
loadData(sharedBuffer.release(), 0, utf16Encoding, baseURL, unreachableURL);
//前两行是获取对webkit内部字符编码的格式 ,第三行进入loaddata开始对url请求进行处理
5.WebFrame::loadData(PassRefPtr<WebCore::SharedBuffer> data, BSTR mimeType, BSTR textEncodingName, BSTR baseURL, BSTR failingURL)
String mimeTypeString(mimeType, SysStringLen(mimeType));
if (!mimeType)
mimeTypeString = "text/html";
String encodingString(textEncodingName, SysStringLen(textEncodingName)); // 获取内部处理字符编码的格式
// FIXME: We should really be using MarshallingHelpers::BSTRToKURL here,
// but that would turn a null BSTR into a null KURL, and we crash inside of
// WebCore if we use a null KURL in constructing the ResourceRequest.
KURL baseKURL = KURL(KURL(), String(baseURL ? baseURL : L"", SysStringLen(baseURL))); //对url进行预处理,包括解析host,path。fragement等等
KURL failingKURL = MarshallingHelpers::BSTRToKURL(failingURL);
ResourceRequest request(baseKURL);
SubstituteData substituteData(data, mimeTypeString, encodingString, failingKURL);
// This method is only called from IWebFrame methods, so don't ASSERT that the Frame pointer isn't null.
if (Frame* coreFrame = core(this))
coreFrame->loader()->load(request, substituteData, false);
饿 在上班呢 今天看到这里,未完待续!