1/*
2 * Copyright (C) 2010 Apple Inc. All rights reserved.
3 * Copyright (C) 2010 Google Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1.  Redistributions of source code must retain the above copyright
9 *     notice, this list of conditions and the following disclaimer.
10 * 2.  Redistributions in binary form must reproduce the above copyright
11 *     notice, this list of conditions and the following disclaimer in the
12 *     documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
21 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "InspectorApplicationCacheAgent.h"
28
29#if ENABLE(INSPECTOR) && ENABLE(OFFLINE_WEB_APPLICATIONS)
30
31#include "ApplicationCacheHost.h"
32#include "DocumentLoader.h"
33#include "Frame.h"
34#include "FrameLoader.h"
35#include "InspectorAgent.h"
36#include "InspectorFrontend.h"
37#include "InspectorValues.h"
38#include "InstrumentingAgents.h"
39#include "NetworkStateNotifier.h"
40#include "Page.h"
41#include "ResourceResponse.h"
42
43namespace WebCore {
44
45InspectorApplicationCacheAgent::InspectorApplicationCacheAgent(InstrumentingAgents* instrumentingAgents, Page* inspectedPage)
46    : m_instrumentingAgents(instrumentingAgents)
47    , m_inspectedPage(inspectedPage)
48    , m_frontend(0)
49{
50}
51
52void InspectorApplicationCacheAgent::setFrontend(InspectorFrontend* frontend)
53{
54    m_frontend = frontend->applicationcache();
55    m_instrumentingAgents->setInspectorApplicationCacheAgent(this);
56}
57
58void InspectorApplicationCacheAgent::clearFrontend()
59{
60    m_instrumentingAgents->setInspectorApplicationCacheAgent(0);
61    m_frontend = 0;
62}
63
64void InspectorApplicationCacheAgent::updateApplicationCacheStatus(Frame* frame)
65{
66    ApplicationCacheHost::Status status = frame->loader()->documentLoader()->applicationCacheHost()->status();
67    m_frontend->updateApplicationCacheStatus(status);
68}
69
70void InspectorApplicationCacheAgent::networkStateChanged()
71{
72    bool isNowOnline = networkStateNotifier().onLine();
73    m_frontend->updateNetworkState(isNowOnline);
74}
75
76void InspectorApplicationCacheAgent::getApplicationCaches(ErrorString*, RefPtr<InspectorObject>* applicationCaches)
77{
78    DocumentLoader* documentLoader = m_inspectedPage->mainFrame()->loader()->documentLoader();
79    if (!documentLoader)
80        return;
81    ApplicationCacheHost* host = documentLoader->applicationCacheHost();
82    ApplicationCacheHost::CacheInfo info = host->applicationCacheInfo();
83
84    ApplicationCacheHost::ResourceInfoList resources;
85    host->fillResourceList(&resources);
86    *applicationCaches = buildObjectForApplicationCache(resources, info);
87}
88
89PassRefPtr<InspectorObject> InspectorApplicationCacheAgent::buildObjectForApplicationCache(const ApplicationCacheHost::ResourceInfoList& applicationCacheResources, const ApplicationCacheHost::CacheInfo& applicationCacheInfo)
90{
91    RefPtr<InspectorObject> value = InspectorObject::create();
92    value->setNumber("size", applicationCacheInfo.m_size);
93    value->setString("manifest", applicationCacheInfo.m_manifest.string());
94    value->setString("lastPathComponent", applicationCacheInfo.m_manifest.lastPathComponent());
95    value->setNumber("creationTime", applicationCacheInfo.m_creationTime);
96    value->setNumber("updateTime", applicationCacheInfo.m_updateTime);
97    value->setArray("resources", buildArrayForApplicationCacheResources(applicationCacheResources));
98    return value;
99}
100
101PassRefPtr<InspectorArray> InspectorApplicationCacheAgent::buildArrayForApplicationCacheResources(const ApplicationCacheHost::ResourceInfoList& applicationCacheResources)
102{
103    RefPtr<InspectorArray> resources = InspectorArray::create();
104
105    ApplicationCacheHost::ResourceInfoList::const_iterator end = applicationCacheResources.end();
106    ApplicationCacheHost::ResourceInfoList::const_iterator it = applicationCacheResources.begin();
107    for (int i = 0; it != end; ++it, i++)
108        resources->pushObject(buildObjectForApplicationCacheResource(*it));
109
110    return resources;
111}
112
113PassRefPtr<InspectorObject> InspectorApplicationCacheAgent::buildObjectForApplicationCacheResource(const ApplicationCacheHost::ResourceInfo& resourceInfo)
114{
115    RefPtr<InspectorObject> value = InspectorObject::create();
116    value->setString("name", resourceInfo.m_resource.string());
117    value->setNumber("size", resourceInfo.m_size);
118
119    String types;
120    if (resourceInfo.m_isMaster)
121        types.append("Master ");
122
123    if (resourceInfo.m_isManifest)
124        types.append("Manifest ");
125
126    if (resourceInfo.m_isFallback)
127        types.append("Fallback ");
128
129    if (resourceInfo.m_isForeign)
130        types.append("Foreign ");
131
132    if (resourceInfo.m_isExplicit)
133        types.append("Explicit ");
134
135    value->setString("type", types);
136    return value;
137}
138
139} // namespace WebCore
140
141#endif // ENABLE(INSPECTOR) && ENABLE(OFFLINE_WEB_APPLICATIONS)
142