[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kfm-devel
Subject:    Way to find out what objects are going away to load
From:       Mario Teijeiro Otero <emeteo () escomposlinux ! org>
Date:       2004-06-27 11:18:38
Message-ID: 200406271318.47471.emeteo () escomposlinux ! org
[Download RAW message or body]


I am trying to make plugin for konqueror, that it has, at first, the same 
functionalities that kadblock on firefox.

That is to say, from a URL's pattern to load or not to load the diverse
objects DOM  in which they are made up a document HTML.

According to I can to investigate, this is not possible to do it, since when 
one is going away to begin the load of an object (loader.cpp l. 1026 ), the 
emitted signal is requestStarted, and the parameters are intern of khtml.

Like workaround, I am working in adding a signal khtml_part, which is emmited  
in khtml_part.cpp l.1848 slotLoaderRequestStarted:

void KHTMLPart::slotLoaderRequestStarted( khtml::DocLoader* dl, 
khtml::CachedObject *obj )
{
  if ( obj && obj->type() == khtml::CachedObject::Image && d->m_doc && 
d->m_doc->docLoader() == dl ) {
    KHTMLPart* p = this;
    while ( p ) {
      KHTMLPart* op = p;
      p->d->m_totalObjectCount++;
      p = p->parentPart();
      if ( !p && op->d->m_loadedObjects <= op->d->m_totalObjectCount
        && !op->d->m_progressUpdateTimer.isActive())
	op->d->m_progressUpdateTimer.start( 200, true );
    }
  }
  bool cancel=false;
  emit loaderRequestStarted( &(obj->url()), &cancel );  
  if (cancel) {
        kdDebug(6050) << " KHTMLPART::slotLoaderRequestStarted: canceling: " 
<< obj->url().string() << endl;
        Cache::loader()->cancelRequest(obj);        
  }
  
}

Also I added a function named cancelRequest to Cache::Loader, that is equal to 
cancelRequests, but only cancel the CacheObject passed as parameter, instead 
of all Request of DocLoader(). This seems to work more or less well: I get to 
avoid to load certains URL's.:

void Loader::cancelRequest (CachedObject * object)
{
    /* Remove from pending list */
    QPtrListIterator<Request> pIt( m_requestsPending );
    while (pIt.current()){
        if (pIt.current()->object == object) {
            CDEBUG << "canceling pending request for " << 
pIt.current()->object->url().string() << endl;
            Cache::removeCacheEntry(object);
            m_requestsPending.remove(pIt);
            return;
        }
        else
            ++pIt;
    }
    
    /* Idem but for the loading list */
    QPtrDictIterator<Request> lIt( m_requestsLoading );
    while (lIt.current()) {
        if ((lIt.current()->object == object)) {
            CDEBUG << "canceling Loading request for " << 
lIt.current()->object->url().string() << endl;
            KIO::Job *job = static_cast<KIO::Job *>( lIt.currentKey() );
            Cache::removeCacheEntry(object);
            m_requestsLoading.remove(lIt.currentKey());
            job->kill();
            return;
        }
        else
            ++lIt;
    }
}


I am putting in an impasse? 

There is another way to do it without having to touch khtml (preferred)?

Regards


[Attachment #3 (application/pgp-signature)]

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic