MiniBrowserLauncher代码分析

    暂时先只关注怎么修改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的一个变量





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值