码迷,mamicode.com
首页 > 其他好文 > 详细

各种各样的client

时间:2015-03-02 19:08:09      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

      我们看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基类是个接口,没有缺省的实现。

各种各样的client

标签:

原文地址:http://blog.csdn.net/lichwei1983/article/details/44021259

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!