15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorApplicationCacheAgent.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorPageAgent.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorState.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InstrumentingAgents.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentLoader.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h"
351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/page/NetworkStateNotifier.h"
36c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "wtf/text/StringBuilder.h"
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace ApplicationCacheAgentState {
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char applicationCacheAgentEnabled[] = "applicationCacheAgentEnabled";
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)InspectorApplicationCacheAgent::InspectorApplicationCacheAgent(InspectorPageAgent* pageAgent)
4509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    : InspectorBaseAgent<InspectorApplicationCacheAgent>("ApplicationCache")
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_pageAgent(pageAgent)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_frontend(0)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorApplicationCacheAgent::setFrontend(InspectorFrontend* frontend)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frontend = frontend->applicationcache();
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorApplicationCacheAgent::clearFrontend()
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_instrumentingAgents->setInspectorApplicationCacheAgent(0);
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frontend = 0;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorApplicationCacheAgent::restore()
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_state->getBoolean(ApplicationCacheAgentState::applicationCacheAgentEnabled)) {
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ErrorString error;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        enable(&error);
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorApplicationCacheAgent::enable(ErrorString*)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_state->setBoolean(ApplicationCacheAgentState::applicationCacheAgentEnabled, true);
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_instrumentingAgents->setInspectorApplicationCacheAgent(this);
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We need to pass initial navigator.onOnline.
761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    networkStateChanged(networkStateNotifier().onLine());
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
79d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void InspectorApplicationCacheAgent::updateApplicationCacheStatus(LocalFrame* frame)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
81f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    DocumentLoader* documentLoader = frame->loader().documentLoader();
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!documentLoader)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ApplicationCacheHost* host = documentLoader->applicationCacheHost();
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ApplicationCacheHost::Status status = host->status();
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ApplicationCacheHost::CacheInfo info = host->applicationCacheInfo();
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String manifestURL = info.m_manifest.string();
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frontend->applicationCacheStatusUpdated(m_pageAgent->frameId(frame), manifestURL, static_cast<int>(status));
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void InspectorApplicationCacheAgent::networkStateChanged(bool online)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_frontend->networkStateUpdated(online);
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorApplicationCacheAgent::getFramesWithManifests(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::ApplicationCache::FrameWithManifest> >& result)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result = TypeBuilder::Array<TypeBuilder::ApplicationCache::FrameWithManifest>::create();
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* mainFrame = m_pageAgent->mainFrame();
103f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    for (Frame* frame = mainFrame; frame; frame = frame->tree().traverseNext(mainFrame)) {
104f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        if (!frame->isLocalFrame())
105f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            continue;
106f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        DocumentLoader* documentLoader = toLocalFrame(frame)->loader().documentLoader();
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!documentLoader)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ApplicationCacheHost* host = documentLoader->applicationCacheHost();
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ApplicationCacheHost::CacheInfo info = host->applicationCacheInfo();
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        String manifestURL = info.m_manifest.string();
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!manifestURL.isEmpty()) {
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RefPtr<TypeBuilder::ApplicationCache::FrameWithManifest> value = TypeBuilder::ApplicationCache::FrameWithManifest::create()
115f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                .setFrameId(m_pageAgent->frameId(toLocalFrame(frame)))
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                .setManifestURL(manifestURL)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                .setStatus(static_cast<int>(host->status()));
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result->addItem(value);
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DocumentLoader* InspectorApplicationCacheAgent::assertFrameWithDocumentLoader(ErrorString* errorString, String frameId)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = m_pageAgent->assertFrame(errorString, frameId);
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return InspectorPageAgent::assertDocumentLoader(errorString, frame);
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorApplicationCacheAgent::getManifestForFrame(ErrorString* errorString, const String& frameId, String* manifestURL)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DocumentLoader* documentLoader = assertFrameWithDocumentLoader(errorString, frameId);
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!documentLoader)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ApplicationCacheHost::CacheInfo info = documentLoader->applicationCacheHost()->applicationCacheInfo();
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    *manifestURL = info.m_manifest.string();
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorApplicationCacheAgent::getApplicationCacheForFrame(ErrorString* errorString, const String& frameId, RefPtr<TypeBuilder::ApplicationCache::ApplicationCache>& applicationCache)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DocumentLoader* documentLoader = assertFrameWithDocumentLoader(errorString, frameId);
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!documentLoader)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ApplicationCacheHost* host = documentLoader->applicationCacheHost();
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ApplicationCacheHost::CacheInfo info = host->applicationCacheInfo();
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ApplicationCacheHost::ResourceInfoList resources;
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    host->fillResourceList(&resources);
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    applicationCache = buildObjectForApplicationCache(resources, info);
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<TypeBuilder::ApplicationCache::ApplicationCache> InspectorApplicationCacheAgent::buildObjectForApplicationCache(const ApplicationCacheHost::ResourceInfoList& applicationCacheResources, const ApplicationCacheHost::CacheInfo& applicationCacheInfo)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return TypeBuilder::ApplicationCache::ApplicationCache::create()
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        .setManifestURL(applicationCacheInfo.m_manifest.string())
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        .setSize(applicationCacheInfo.m_size)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        .setCreationTime(applicationCacheInfo.m_creationTime)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        .setUpdateTime(applicationCacheInfo.m_updateTime)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        .setResources(buildArrayForApplicationCacheResources(applicationCacheResources))
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        .release();
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<TypeBuilder::Array<TypeBuilder::ApplicationCache::ApplicationCacheResource> > InspectorApplicationCacheAgent::buildArrayForApplicationCacheResources(const ApplicationCacheHost::ResourceInfoList& applicationCacheResources)
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<TypeBuilder::Array<TypeBuilder::ApplicationCache::ApplicationCacheResource> > resources = TypeBuilder::Array<TypeBuilder::ApplicationCache::ApplicationCacheResource>::create();
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ApplicationCacheHost::ResourceInfoList::const_iterator end = applicationCacheResources.end();
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ApplicationCacheHost::ResourceInfoList::const_iterator it = applicationCacheResources.begin();
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (int i = 0; it != end; ++it, i++)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        resources->addItem(buildObjectForApplicationCacheResource(*it));
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return resources;
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<TypeBuilder::ApplicationCache::ApplicationCacheResource> InspectorApplicationCacheAgent::buildObjectForApplicationCacheResource(const ApplicationCacheHost::ResourceInfo& resourceInfo)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
182c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    StringBuilder builder;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resourceInfo.m_isMaster)
1849e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        builder.appendLiteral("Master ");
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resourceInfo.m_isManifest)
1879e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        builder.appendLiteral("Manifest ");
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resourceInfo.m_isFallback)
1909e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        builder.appendLiteral("Fallback ");
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resourceInfo.m_isForeign)
1939e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        builder.appendLiteral("Foreign ");
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resourceInfo.m_isExplicit)
1969e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        builder.appendLiteral("Explicit ");
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<TypeBuilder::ApplicationCache::ApplicationCacheResource> value = TypeBuilder::ApplicationCache::ApplicationCacheResource::create()
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        .setUrl(resourceInfo.m_resource.string())
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        .setSize(static_cast<int>(resourceInfo.m_size))
201c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        .setType(builder.toString());
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value;
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
205c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void InspectorApplicationCacheAgent::trace(Visitor* visitor)
206c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
207c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_pageAgent);
208c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    InspectorBaseAgent::trace(visitor);
209c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
210c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
211c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
213