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()