zoukankan      html  css  js  c++  java
  • webkit初探

    今天用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);

    饿  在上班呢 今天看到这里,未完待续!

     

     

  • 相关阅读:
    Linux下使用Nexus搭建Maven私服
    使用Nexus搭建Maven内部服务器
    windows Maven3.0 服务器配置搭建
    Linux中more和less命令用法
    Jmeter使用入门
    【转载】 DeepMind发表Nature子刊新论文:连接多巴胺与元强化学习的新方法
    【转载】 十图详解tensorflow数据读取机制(附代码)
    【转载】 tensorflow中 tf.train.slice_input_producer 和 tf.train.batch 函数
    (待续) https://zhuanlan.zhihu.com/p/27629294
    ( 待续 ) https://zhuanlan.zhihu.com/p/57864886
  • 原文地址:https://www.cnblogs.com/liucheng/p/2504091.html
Copyright © 2011-2022 走看看