WebCoreFrameBridge.cpp

BrowserFrame通过jni传下来的调用都会调用到WebCoreFrameBridge.cpp中的对应函数中,其他webkit的模块想回调信息给BrowserFrame则要通过WebFrame类。主要使用WebFrame类的是WebCoreSupport/目录下的WebUrlLoadClient,ChromeClientAndroid,FrameLoaderClientAndroid。这三个类都保存了WebFrame的指针作为成员变量,而在jni目录下还有些类用到WebFrame,但只是在某个功能中用到,并没有把它作为成员。

BrowserFrame.java的正向与反向的jni调用

在WebCoreFrameBridge.cpp中提供的JNI函数中,主要提供了对WebCore::Frame的调用,即BrowserFrame通过jni调用到c层的WebCoreFrameBridge.cpp中的函数,在WebCoreFrameBridge.cpp中可以找到对应的WebCore::Frame,并执行WebCore::Frame的操作,或者通过WebCore::Frame找到WebCore::Frame中的成员,调用WebCore::Frame中成员的操作。

典型的例子如:

Java层执行前进或后退时,会调用BrowserFrame::goBackOrForward,该函数中会调用jni函数nativeGoBackOrForward,该jni函数对应c层的WebCoreFrameBridge.cpp中的GoBackOrForward。GoBackOrForward会找到对应的WebCore::Frame,然后调用pFrame->page()->goBack()之类的函数。

对于回调给java层BrameFrame,是通过WebFrame的函数,反向调用jni,来回调到java层的BrowserFrame的。

典型的例子如:

当需要向java层回调加载进度信息时,首先在WebKit平台相关层的WebCoreSupport/的FrameLoaderClientAndroid::postProgressEstimateChangedNotification(),在FrameLoaderClientAndroid中存有WebFrame的成员变量,所以这里通过成员WebFrame调用它的WebFrame::setProgress(),在WebFrame::setProgress()中通过jni反向调用,调用到java层BrowserFrame::setProgress。这样就完成了整个回调的过程。

CreateFrame

WebCoreFrameBridge.cpp中很重要的一个函数就是CreateFrame。这个函数在java层的BrowserFrame的构造函数中通过jni调用的。

在CreateFrame中会创建很多对象,这些对象的关系比较复杂。

下图为CreateFrame中创建的几个主要的类对象。

首先要明确,这个CreateFrame是在BrowserFrame构造时被创建的,而BrowserFrame又是同WebView一同创建的,即每个WebView有唯一的一个BrowserFrame对应。

这样可见上述的这些类对象,都是跟一个WebView对应的。

对于WebCore中的类的概念:

WebCore::Page

一个Page对应浏览器的一个Tab页,也即对应一个WebView,就是说一个Page对应一个Tab下的完整的html网页

所以Page是个比较大的总体的概念.

它包括对这个页面的设置Settings,它的窗口类Chrome,加载的进度信息ProgressTracker,前进后退的管理控制BackForwardController,渲染的主题RenderTheme,主Frame。

Settings:

一个页面的设置。Java层的WebSettings通过jni与c层的WebSettings关联,在执行同步设置时,就会在c层的WebSettings中使用java层的设置项来配置Page中的WebCore::Settings成员。这样完成java层WebView的WebSettings与c层WebKit的WebCore::Settings的同步。

Chrome:

这个还不是很清楚,貌似是WebCore的角度看来是页面窗口相关的内容,提供窗口,控件等行为的类。在WebCore::Chrome中有接口类成员WebCore::ChromeClient实际实现为ChromeClientAndroid子类,用于实现平台相关的回调部分。ChromeClientAndroid是在WebCoreSupport/目录下的,它又可以通过找到WebFrame来实现与上层jni的回调。

ProgressTracker:

维护了Page中接收数据的数量和进度等信息。回调时主要通过Frame->FrameLoader-> FrameLoaderClient执行回调,这个就是FrameLoaderClientAndroid,定义在WebCoreSupport/目录下,它又可以通过找到WebFrame来实现与上层jni的回调。

WebCore::BackForwardController:

维护了前进与后退的操作

RenderTheme:

定义了很多默认样式属性,作为一些默认的CSS的样式,比如一些控件的颜色值等。

Frame:

Page中只有一个Frame就是m_mainFrame,是这个Page的主体数据内容。

WebCore::Frame

一个Frame对应一棵DOM树。一个html网页还可以有子Frame用iFrame来标识的,就像猫扑那样的页面,这样一个Page下就可以有多个Frame。但是Page中只有一个Frame就是mainFrame。其他的Frame是由Frame结构中的FrameTree结构来组建。

另外一个Frame有一个FrameLoader,在构造时一并创建,用于加载html网页及其资源用。

由下图可见,Frame针对一个网页的加载(FrameLoader),显示(FrameView),DOM树(Document),控制(ScriptController,Editor,SelectionController,EventHandler等)

Jni/WebViewCore

对应于java层的WebViewCore,java层主要传递了一些事件,如click事件,以及对控件的一些回调,比如SendListBoxChoices。

可以看到,这些是跟某个页面(即BrowserFrame)无关的,是系统的一些事件,这些会直接在java层的WebViewCore中直接通过native方法调用到c层的。之前的Framework架构的介绍中可以看到,很多情况下都是app层发消息给WebViewCore线程,然后WebViewCore中又通过其BrowserFrame成员来调用BrowserFrame的native方法。该流程是针对跟某个Frame相关的一些操作,如果是跟Frame不直接相关的,则会通过WebViewCore自身的native方法,直接调用到c层的jni/WebViewCore中。

主要的JNI类:

Webkit JNI的更多相关文章

  1. [Android Webkit]JNI基础及Java层与C++层的交互

    1. JNI 注册 1.1. JNI的基础结构       JAVA == JNI == Native Code      JNI(Java Native Interface)是Java与Native ...

  2. XE7 Unit scope names

    今天编译RM报表 7.0 for XE7 ,build设计时包,提示 {$IFDEF JPEG}, JPEG{$ENDIF} 没有找到 JPEG.DCU,这个应该是XE7自带. 后来 在项目选项里,编 ...

  3. android4.2 webkit 中的jni

    在android 应用开发中使用WebView,当一个webveiw 被创建时, 也会去load 他所对应的动态库,这里动态库也就是传说中的webkit 内核等. C++ 层与java 层的交互也是通 ...

  4. webkit事件处理

    1,概述 原文地址:http://blog.csdn.net/awebkit/article/details/8493716 浏览器处理事件一般有两个过程,捕获过程和冒泡过程,这是由addEventL ...

  5. webkit模块介绍

    一.Webkit模块   用到的第三方库如下:   cairo 一个2D绘图库 casqt Unicode处理用的库,从QT中抽取部分代码形成的 expat 一个XML SAX解析器的库 freety ...

  6. Android webkit 事件传递流程详解

    前言:基于android webview 上定制自己使用的可移植浏览器apk,遇到好多按键处理的问题.所以索性研究了一下keyevent 事件的传递流程. frameworks 层 keyevent ...

  7. JNI总结(一)

    JNI 是 Java平台中的一个强大特性.应用程序能够通过 JNI把 C/C++代码集成进 Java程序中.通过 JNI.开发人员在利用 Java平台强大功能的同一时候,又不必放弃对原有代码的投资.由 ...

  8. 在ubuntu12.04下编译android4.1.2添加JNI层出现问题

    tiny4412学习者,在ubuntu12.04下编译android4.1.2添加JNI层出现问题: (虚心请教解决方法) trouble writing output: Too many metho ...

  9. Android JNI开发提高篇

    有关JNI的开发技术,我们继续围绕Android平台进行,JNI可以支持C或C++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C而C++的和这些有什么不同呢? Android平台上的JN ...

随机推荐

  1. 学习 WebService 第五步:在Local创建测试用WebService(WSDL)

    [准备] Eclipse+Tomcat7(Tomcat端口修改为不冲突的值) axis2 1.7.7 jar包(没有来这里下载:http://www.apache.org/dyn/closer.lua ...

  2. APUE 学习笔记(三) 文件和目录

    1. 文件类型 文件类型信息包含在 struct stat 里的 st_mode 成员 (1)普通文件,unix内核并不区分文本文件和二进制文件 (2)目录文件,这种文件包含了其他文件的名字以及指向这 ...

  3. Crash的数字表格 BZOJ 2154 / jzptab BZOJ 2693

    jzptab [问题描述] 求: 多组询问 [输入格式] 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M [输出格式] T行 每行一个整数 表示第i组数据的结果 [样例输入] 1 4 ...

  4. Codeforces 919 A. Supermarket

    这场cf有点意思,hack场,C题等于1的特判hack很多人(我hack成功3个人,上分了,哈哈哈,咳咳...) D题好像是树形dp,E题好像是中国剩余定理,F题好像还是dp,具体的不清楚,最近dp的 ...

  5. win7快捷键和ubuntu快捷键

    http://www.cnblogs.com/xfiver/archive/2010/12/08/1899905.html http://www.pc841.com/article/20121203- ...

  6. luogu U10783 名字被和谐了

    链接 https://www.luogu.org/problem/show?pid=U10783 题目背景 众所周知,我们称g是a的约数,当且仅当g是正数且a mod g = 0. 众所周知,若g既是 ...

  7. Android Glide源码分析

    1. 功能介绍 图片加载框架,相对于UniversalImageLoader,Picasso,它还支持video,Gif,SVG格式,支持缩略图请求,旨在打造更好的列表图片滑动体验.Glide有生命周 ...

  8. iOS -- SKViedoNode类

    SKViedoNode类 继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) ...

  9. GOPATH设置

    go help gopath查看gopath的原文帮助信息 go env查看gopath的配置 GOPATH与工作空间 前面我们在安装Go的时候看到需要设置GOPATH变量,Go从1.1版本到1.7必 ...

  10. fast-cgi & php-fpm 等的理解

    原文地址:https://segmentfault.com/q/1010000000256516 网上有的说,fastcgi是一个协议,php-fpm实现了这个协议: 有的说,php-fpm是fast ...