暫時先只關注怎麼修改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的一個變數