标签:
我们看webkit代码,到处是client,那么何为client呢? 其实,client(客户端)指的就是对某件事情感兴趣的人(物),对Frame加载感兴趣的人,他可以继承Frame加载器的客户端,通过客户端的一系列接口,他就可以获知Frame加载到什么阶段了。请看FrameLoaderClient的各种各样的事件接口:
将要发生型:
virtual void dispatchWillSendSubmitEvent(PassRefPtr<FormState>) = 0;
virtual void dispatchWillSubmitForm(FramePolicyFunction, PassRefPtr<FormState>) = 0;
virtual void dispatchWillSendRequest(DocumentLoader*, unsigned long id, ResourceRequest&, const ResourceResponse& ) = 0;
virtual void dispatchWillPerformClientRedirect(const KURL&, double interval, double fireDate) = 0;
已经发生型:
virtual void dispatchDidReceiveAuthenticationChallenge(DocumentLoader*, unsigned long id, const AuthenticationChallenge&) = 0;
virtual void dispatchDidCancelAuthenticationChallenge(DocumentLoader*, unsigned long identifier, const AuthenticationChallenge&) = 0;
virtual void dispatchDidReceiveResponse(DocumentLoader*, unsigned long identifier, const ResourceResponse&) = 0;
virtual void dispatchDidReceiveContentLength(DocumentLoader*, unsigned long identifier, int dataLength) = 0;
virtual void dispatchDidFinishLoading(DocumentLoader*, unsigned long identifier) = 0;
virtual void dispatchDidFailLoading(DocumentLoader*, unsigned long identifier, const ResourceError&) = 0;
动作型:
virtual Frame* dispatchCreatePage(const NavigationAction&) = 0;
virtual void dispatchShow() = 0;
virtual void startDownload(const ResourceRequest&, const String& suggestedName = String()) = 0;
请注意,这些都是纯虚接口,需要client实现的。进一步看Qt是如何实现它:
void FrameLoaderClientQt::dispatchDidFinishLoad()
{
很简单,就是发出一个信号signal:
emitLoadFinished(true);
}
void FrameLoaderClientQt::emitLoadFinished(bool ok)
{
分别通知webpage和webframe关于此事件:
if (wasOriginatingLoad && webPage)
emit webPage->loadFinished(ok);
emit m_webFrame->loadFinished(ok);
}
用户在这里:
mainwindow::mainwindow(const QUrl& url, BrowserMode mode)
:m_homepage(url), m_isStartLoading(false), m_browserMode(mode), m_timerId(0), m_js_timerId(0)
{
view = new QWebView(this);
page = new WebPage(this);
把client关心的事件注册到QWebFrame的slot,以便QWebFrame通过emit就可以发出信号、调用此回调函数:
connect(page->mainFrame(), SIGNAL(loadFinished(bool)), this, SLOT(loadFinished()));
}
看看,我在这呢!
void mainwindow::loadFinished()
{
用户可以在此显示一些frame加载之后的东西,比如结束loading图标的显示等等。
}
当然,client也可以不关心某些事件:
void FrameLoaderClientQt::savePlatformDataToCachedFrame(CachedFrame*)
{
notImplemented();
}
虽然不关心,实现它还是必不可少的。client基类是个接口,没有缺省的实现。
标签:
原文地址:http://blog.csdn.net/lichwei1983/article/details/44021259