MiniBrowserLauncher程式碼分析

來源:互聯網
上載者:User

    暫時先只關注怎麼修改webkit的介面,所以先從MiniBrowserLauncher這個例子看起。

   在這個工程裡面我最先看到的是一段英文的注釋,估計是與apple有關的著作權申請,因為這段英文貫穿整個

webkit項目,所以我決定先翻譯這段話,來做為我切入webkit的起點.

/*
* Copyright (C) 2012 Apple Inc. All rights reserved.
*
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */
翻譯: 著作權歸蘋果公司所有。

            分發和使用原始碼或二進位檔案時,不管修改與否,只要符合以下情況那都是被允許:

1.分發和使用原始碼時必須要保留上面的著作權申明,這個情況列表以及下面的否認聲明。

2.好像是重複上一條的話

            任何電子或紙質檔案中要提供這個聲明。

程式碼分析:

    整個MiniBrowserLauncher工程下面只有一個檔案DLLLauncherMain.cpp,這個檔案由

wWainMain入口函數裡面調用MiniBrowser.dll,最後執行dll裡面的一個函數(_dllLauncherEntryPoint@16)

完成整個應用程式的執行工作。

   然後我們主要跟蹤MiniBrowser這個工程,看看這個工程主要是做了些什麼.

   MiniBrowser的主工程檔案是main.cpp,此檔案裡麵包含三個函數:

   1.BOOL WINAPI DllMain(HINSTANCE dllInstance, DWORD reason, LPVOID)

    2.static bool shouldTranslateMessage(const MSG& msg)

    3.extern "C" __declspec(dllexport) int WINAPI dllLauncherEntryPoint(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpstrCmdLine, int nCmdShow)

   DllMain是dll工程的入口函數,但是這裡面的工作主要由MiniBrowser來完成,我們來看看

   MiniBrowser這個類做了些什麼.

   MiniBrowser的靜態函數建立一個自己的靜態全域執行個體對象,然後返回,這個類主要包含一個std::set<BrowserWindow*> m_browserWindows

所有的操作基本上都是操作這個容器.

   BrowserWindow: 這個類包含三個HWND(m_window,m_rebarWindow,m_comboBoxWindow)和一個BrowserView,其中這個BrowserView是重點,因為其他的都是一些

基本的Win32建立視窗動作,而這個BrowserView就是載入整個網頁頁面的視窗了.我們可以看到這裡面調用BrowserView的函數有:

1.goToURL(url) : 

這個函數總的作用是載入URL,先把wstring的參數轉化為WKURLREF的一個字元變數,然後從WKViewRef中得到一個WKPageRef,把這兩個參數當做

WKPageLoadURL函數的實參來實現載入URL操作

2.create(webViewRect, this) :

先分析下這個函數的參數,第一個參數應該是設定這個View在哪個地區,第二個參數是它的父視窗,

然後初始化一個結構體WKPageUIClient,這個結構體資訊太豐富了,我列在下面:

struct WKPageUIClient {
    int                                                                 version;
    const void *                                                        clientInfo;

    // Version 0
    WKPageCreateNewPageCallback_deprecatedForUseWithV0                  createNewPage_deprecatedForUseWithV0;
    WKPageCallback                                                      showPage;
    WKPageCallback                                                      close;
    WKPageTakeFocusCallback                                             takeFocus;
    WKPageFocusCallback                                                 focus;
    WKPageUnfocusCallback                                               unfocus;
    WKPageRunJavaScriptAlertCallback                                    runJavaScriptAlert;
    WKPageRunJavaScriptConfirmCallback                                  runJavaScriptConfirm;
    WKPageRunJavaScriptPromptCallback                                   runJavaScriptPrompt;
    WKPageSetStatusTextCallback                                         setStatusText;
    WKPageMouseDidMoveOverElementCallback_deprecatedForUseWithV0        mouseDidMoveOverElement_deprecatedForUseWithV0;
    WKPageMissingPluginButtonClickedCallback_deprecatedForUseWithV0     missingPluginButtonClicked_deprecatedForUseWithV0;
    WKPageDidNotHandleKeyEventCallback                                  didNotHandleKeyEvent;
    WKPageDidNotHandleWheelEventCallback                                didNotHandleWheelEvent;
    WKPageGetToolbarsAreVisibleCallback                                 toolbarsAreVisible;
    WKPageSetToolbarsAreVisibleCallback                                 setToolbarsAreVisible;
    WKPageGetMenuBarIsVisibleCallback                                   menuBarIsVisible;
    WKPageSetMenuBarIsVisibleCallback                                   setMenuBarIsVisible;
    WKPageGetStatusBarIsVisibleCallback                                 statusBarIsVisible;
    WKPageSetStatusBarIsVisibleCallback                                 setStatusBarIsVisible;
    WKPageGetIsResizableCallback                                        isResizable;
    WKPageSetIsResizableCallback                                        setIsResizable;
    WKPageGetWindowFrameCallback                                        getWindowFrame;
    WKPageSetWindowFrameCallback                                        setWindowFrame;
    WKPageRunBeforeUnloadConfirmPanelCallback                           runBeforeUnloadConfirmPanel;
    WKPageCallback                                                      didDraw;
    WKPageCallback                                                      pageDidScroll;
    WKPageExceededDatabaseQuotaCallback                                 exceededDatabaseQuota;
    WKPageRunOpenPanelCallback                                          runOpenPanel;
    WKPageDecidePolicyForGeolocationPermissionRequestCallback           decidePolicyForGeolocationPermissionRequest;
    WKPageHeaderHeightCallback                                          headerHeight;
    WKPageFooterHeightCallback                                          footerHeight;
    WKPageDrawHeaderCallback                                            drawHeader;
    WKPageDrawFooterCallback                                            drawFooter;
    WKPagePrintFrameCallback                                            printFrame;
    WKPageCallback                                                      runModal;
    void*                                                               unused1; // Used to be didCompleteRubberBandForMainFrame
    WKPageSaveDataToFileInDownloadsFolderCallback                       saveDataToFileInDownloadsFolder;
    WKPageShouldInterruptJavaScriptCallback                             shouldInterruptJavaScript;    

    // Version 1
    WKPageCreateNewPageCallback                                         createNewPage;
    WKPageMouseDidMoveOverElementCallback                               mouseDidMoveOverElement;
    WKPageDecidePolicyForNotificationPermissionRequestCallback          decidePolicyForNotificationPermissionRequest;
    WKPageUnavailablePluginButtonClickedCallback                        unavailablePluginButtonClicked;

    // Version 2
    WKPageShowColorPickerCallback                                       showColorPicker;
    WKPageHideColorPickerCallback                                       hideColorPicker;
};

 這個結構體變數賦好值以後, 就用做初始化這個函數WKPageSetPageUIClient.這個函數從字面上來看,應該是設定webkit頁面UI的

3.setFrame(webViewRect)

這個函數的作用就是調用::SetWindowPos對網頁頁面視窗進行調整

4.webView(),而這個函數是被用來當做另一個函數的參數來用的WKViewGetWindow(m_browserView.webView())

這樣我們就可以在BrowserView類裡面找到這幾個函數加以分析!

webView()只是簡單地return 一個BrowserView的一個變數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.