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);

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

     

     

  • 相关阅读:
    以&quot;小刀会“的成败论当今创业成败
    COCOS2D 学习笔记
    password加密的算法
    bzoj1087【SCOI2005】互不侵犯King
    HDU--2222--Keywords Search--AC自己主动机
    【leetcode】Subsets II (middle) ☆
    【leetcode】Word Search (middle)
    【hadoop2.6.0】利用JAVA API 实现数据上传
    【leetcode】Palindrome Partitioning II(hard) ☆
    【hadoop2.6.0】利用Hadoop的 Java API
  • 原文地址:https://www.cnblogs.com/liucheng/p/2504091.html
Copyright © 2011-2022 走看看