Webkit里的Chrome概念比较抽象,而其实现ChromeClient更不好理解,它们常常给研究Webkit带来困惑,下面这篇小文解释这两者的概念。
1 Chrome
Chrome 常常用于描述用户接口元素(Element),比如alert, confirm, prompt。
2 ChromeClient
ChromeClient是一个抽象接口,ChromeClient功能集中在大家熟知的用户接口(Chrome),比如alert, popup, confirm, window.open等--也就是包含某个WebCore的页面(Page)的视图(View)的用户接口。WebCore用ChromeClient与多个WebCore之上的WebKit API 层交互。这个抽象是重要的,因为WebCore之上有许多API层,他们处理层与层之间的用户接口大不相同,例如WebKit和WebKit2就有明显不同的需求。
举一个简单的例子,ChromeClient::runJavaScriptAlert被JS的alert函数调用。mac 上的WebView class的runJavaScriptAlert的实现只是简单的调用合适的委托方法(WebUIDelegate):
442 if ([delegate respondsToSelector:selector]) {
443 CallUIDelegate(m_webView, selector, message);
444 return;
445 }
Qt是在QWebPage里实现的:
void QWebPage::javaScriptAlert(QWebFrame *frame, const QString& msg)
{
Q_UNUSED(frame)
#ifndef QT_NO_MESSAGEBOX
QWidget* parent = (d->client) ? d->client->ownerWidget() : 0;
QMessageBox box(parent);
box.setWindowTitle(tr("JavaScript Alert - %1").arg(mainFrame()->url().host()));
box.setTextFormat(Qt::PlainText);
box.setText(msg);
box.setStandardButtons(QMessageBox::Ok);
box.exec();
#endif
}
其他情况下,比如显示工具提示信息,是由ChromeClient的具体实现直接处理的,无需WebView委托的参与。
以上部分内容来自于网络。