WebCore:

        Reviewed by Darin.
        
        Make page loads go fast.
        
        http://bugs.webkit.org/show_bug.cgi?id=17480

        - Implement speculative preloading. When a script load blocks the main parser, use a side 
          parser to pick up more resources.
        - Implement per-host load queues, prioritize scripts and stylesheets over images.
        
        Depending on content and network latency this may speed things up quite a bit.

        * WebCore.xcodeproj/project.pbxproj:
        * dom/Document.cpp:
        (WebCore::Document::implicitClose):
        Clear the preloads after laoding completes.
        
        * html/HTMLLinkElement.cpp:
        (WebCore::HTMLLinkElement::parseMappedAttribute):
        (WebCore::HTMLLinkElement::tokenizeRelAttribute):
        * html/HTMLLinkElement.h:
        Make tokenizeRelAttribute() public static so it can be used from elsewhere.
        Eliminate a pointless bitfield so I can get references.
        
        * html/HTMLTokenizer.cpp:
        (WebCore::HTMLTokenizer::scriptHandler):
        (WebCore::HTMLTokenizer::scriptExecution):
        (WebCore::HTMLTokenizer::write):
        * html/HTMLTokenizer.h:
        Spin up the preload scanner whenever a script load blocks the parser. One scanner tracks the end of 
        the document while temporary ones are created as needed to scan document.write() output.
        
        * html/PreloadScanner.cpp: Added.
        (WebCore::PreloadScanner::PreloadScanner):
        (WebCore::PreloadScanner::~PreloadScanner):
        (WebCore::PreloadScanner::begin):
        (WebCore::PreloadScanner::end):
        (WebCore::PreloadScanner::reset):
        (WebCore::PreloadScanner::write):
        (WebCore::isWhitespace):
        (WebCore::PreloadScanner::clearLastCharacters):
        (WebCore::PreloadScanner::rememberCharacter):
        (WebCore::PreloadScanner::lastCharactersMatch):
        (WebCore::legalEntityFor):
        (WebCore::PreloadScanner::consumeEntity):
        (WebCore::PreloadScanner::tokenize):
        (WebCore::PreloadScanner::processAttribute):
        (WebCore::PreloadScanner::emitCharacter):
        (WebCore::PreloadScanner::tokenizeCSS):
        (WebCore::PreloadScanner::emitTag):
        (WebCore::PreloadScanner::emitCSSRule):
        * html/PreloadScanner.h: Added.
        (WebCore::PreloadScanner::inProgress):
        (WebCore::PreloadScanner::):
        HTML5 tokenization plus some glue code. Fake CSS parsing thrown in just for fun.
        
        * loader/Cache.cpp:
        (WebCore::Cache::pruneDeadResources):
        Preloads have zero refcount, avoid kicking them out too early.
        
        * loader/CachedResource.cpp:
        (WebCore::CachedResource::CachedResource):
        (WebCore::CachedResource::ref):
        * loader/CachedResource.h:
        (WebCore::CachedResource::):
        (WebCore::CachedResource::preloadResult):
        (WebCore::CachedResource::setRequestedFromNetworkingLayer):
        (WebCore::CachedResource::canDelete):
        (WebCore::CachedResource::isPreloaded):
        (WebCore::CachedResource::increasePreloadCount):
        (WebCore::CachedResource::decreasePreloadCount):
        Keep track which resources are preloads. Avoid deleting them. Track
        at which point of the loading preloads get utilized to enable some interesting 
        statistics.
        
        * loader/DocLoader.cpp:
        (WebCore::DocLoader::~DocLoader):
        (WebCore::DocLoader::checkForReload):
        (WebCore::DocLoader::registerPreload):
        (WebCore::DocLoader::clearPreloads):
        (WebCore::DocLoader::printPreloadStats):
        * loader/DocLoader.h:
        Ensure we utilize preloaded resources during reloads.
        Keep a list of all preloads in the document. Clear the preloads after
        parsing is complete. Some debug statistics.
        
        * loader/DocumentLoader.cpp:
        (WebCore::DocumentLoader::isLoadingInAPISense):
        Avoid signaling that loading is complete too early. 
        
        * loader/loader.cpp:
        (WebCore::Loader::Loader):
        (WebCore::Loader::~Loader):
        (WebCore::Loader::determinePriority):
        (WebCore::Loader::load):
        (WebCore::Loader::scheduleServePendingRequests):
        (WebCore::Loader::requestTimerFired):
        (WebCore::Loader::servePendingRequests):
        (WebCore::Loader::cancelRequests):
        (WebCore::Loader::Host::Host):
        (WebCore::Loader::Host::~Host):
        (WebCore::Loader::Host::addRequest):
        (WebCore::Loader::Host::hasRequests):
        (WebCore::Loader::Host::servePendingRequests):
        (WebCore::Loader::Host::didFinishLoading):
        (WebCore::Loader::Host::didFail):
        (WebCore::Loader::Host::didReceiveResponse):
        (WebCore::Loader::Host::didReceiveData):
        (WebCore::Loader::Host::cancelPendingRequests):
        (WebCore::Loader::Host::cancelRequests):
        * loader/loader.h:
        (WebCore::Loader::):
        Distribute load requests to per-host priority queues. Limit the number of loads issued to the 
        networking layer so we have better changes of getting important requests through first.
        Prioritize scripts > stylesheets > images.

WebKit/mac:

        Reviewed by Darin.

        * ForwardingHeaders/wtf/Deque.h: Added.



git-svn-id: http://svn.webkit.org/repository/webkit/trunk@31038 268f45cc-cd09-0410-ab3c-d52691b4dbfc
19 files changed