什麼是Chrome和ChromeClient,chromechromeclient
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委託的參與。
以上部分內容來自於網路。