android4.1.2 网页a标签处理流程


V8DOMWindowCustom.cpp中openCallback是页面js接口open()的具体实现类。

openCallback()调用DOMWindow::open().

DOMWindow::open 调用

WebCore::createWindow()这个函数定义在FrameLoader.cpp中。
WebCore::createWindow(){
oldPage->chrome()->createWindow()
}
Chrome::createWindow(){
Page* newPage = m_client->createWindow(frame, request, features, action);
}
ChromeClientAndroid::createWindow(){
WebCore::Frame* newFrame = m_webFrame->createWindow(dialog,
            ScriptController::processingUserGesture());
}
WebCoreFrameBridge.cpp是java层BrowserFrame的jni层,也是WebFrame的实现类
WebFrame::createWindow(){
  jobject obj = env->CallObjectMethod(javaFrame.get(), mJavaFrame->mCreateWindow, dialog, userGesture);
}
BrowserFrame.java
BrowserFrame createWindow(){
mCallbackProxy.createWindow();
}
CallbackProxy.java
BrowserFrame createWindow(){
sendMessage(obtainMessage(CREATE_WINDOW, dialog ? 1 : 0,userGesture ? 1 : 0, msg));
}
CallbackProxy.java
handleMessage(){
case CREATE_WINDOW:
 if (!mWebChromeClient.onCreateWindow(mWebView,
                                msg.arg1 == 1, msg.arg2 == 1,
                                (Message) msg.obj))
}
浏览器应用程序实现WebChromeClient接口。
所以CallbackProxy.java会调用到
Browser应用的Tab.java中的;
WebChromeClient::CreateWindow(){
if (dialog) {
  createSubWindow();
  mWebViewController.attachSubWindow(Tab.this);
 transport.setWebView(mSubView);
 } else {
  final Tab newTab = mWebViewController.openTab(null, Tab.this,true, true);
  transport.setWebView(newTab.getWebView())
所以createWindow是由webkit内核通知Browser应用程序执行的。

a标签href属性有正常值时,处理流程如下:

HTMLAnchorElement::defaultEventHandler()会调用

HTMLAnchorElement::handleLinkClick()会调用
FrameLoader::urlselected()

你可能感兴趣的:(android4.1.2 网页a标签处理流程)