Improve use of NeverDestroyed
[WebKit-https.git] / Source / WebCore / inspector / InspectorApplicationCacheAgent.cpp
1 /*
2  * Copyright (C) 2010, 2015 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 #include "ApplicationCacheHost.h"
30 #include "DocumentLoader.h"
31 #include "Frame.h"
32 #include "FrameLoader.h"
33 #include "InspectorPageAgent.h"
34 #include "InstrumentingAgents.h"
35 #include "MainFrame.h"
36 #include "NetworkStateNotifier.h"
37 #include <inspector/InspectorValues.h>
38 #include <wtf/text/StringBuilder.h>
39
40 using namespace Inspector;
41
42 namespace WebCore {
43
44 InspectorApplicationCacheAgent::InspectorApplicationCacheAgent(WebAgentContext& context, InspectorPageAgent* pageAgent)
45     : InspectorAgentBase(ASCIILiteral("ApplicationCache"), context)
46     , m_frontendDispatcher(std::make_unique<Inspector::ApplicationCacheFrontendDispatcher>(context.frontendRouter))
47     , m_backendDispatcher(Inspector::ApplicationCacheBackendDispatcher::create(context.backendDispatcher, this))
48     , m_pageAgent(pageAgent)
49 {
50 }
51
52 void InspectorApplicationCacheAgent::didCreateFrontendAndBackend(FrontendRouter*, BackendDispatcher*)
53 {
54 }
55
56 void InspectorApplicationCacheAgent::willDestroyFrontendAndBackend(Inspector::DisconnectReason)
57 {
58     m_instrumentingAgents.setInspectorApplicationCacheAgent(nullptr);
59 }
60
61 void InspectorApplicationCacheAgent::enable(ErrorString&)
62 {
63     m_instrumentingAgents.setInspectorApplicationCacheAgent(this);
64
65     // We need to pass initial navigator.onOnline.
66     networkStateChanged();
67 }
68
69 void InspectorApplicationCacheAgent::updateApplicationCacheStatus(Frame* frame)
70 {
71     if (!frame)
72         return;
73     auto* documentLoader = frame->loader().documentLoader();
74     if (!documentLoader)
75         return;
76
77     auto& host = documentLoader->applicationCacheHost();
78     int status = host.status();
79     auto manifestURL = host.applicationCacheInfo().manifest.string();
80
81     m_frontendDispatcher->applicationCacheStatusUpdated(m_pageAgent->frameId(frame), manifestURL, status);
82 }
83
84 void InspectorApplicationCacheAgent::networkStateChanged()
85 {
86     m_frontendDispatcher->networkStateUpdated(NetworkStateNotifier::singleton().onLine());
87 }
88
89 void InspectorApplicationCacheAgent::getFramesWithManifests(ErrorString&, RefPtr<Inspector::Protocol::Array<Inspector::Protocol::ApplicationCache::FrameWithManifest>>& result)
90 {
91     result = Inspector::Protocol::Array<Inspector::Protocol::ApplicationCache::FrameWithManifest>::create();
92
93     for (Frame* frame = &m_pageAgent->mainFrame(); frame; frame = frame->tree().traverseNext()) {
94         auto* documentLoader = frame->loader().documentLoader();
95         if (!documentLoader)
96             continue;
97
98         auto& host = documentLoader->applicationCacheHost();
99         String manifestURL = host.applicationCacheInfo().manifest.string();
100         if (!manifestURL.isEmpty()) {
101             result->addItem(Inspector::Protocol::ApplicationCache::FrameWithManifest::create()
102                 .setFrameId(m_pageAgent->frameId(frame))
103                 .setManifestURL(manifestURL)
104                 .setStatus(static_cast<int>(host.status()))
105                 .release());
106         }
107     }
108 }
109
110 DocumentLoader* InspectorApplicationCacheAgent::assertFrameWithDocumentLoader(ErrorString& errorString, const String& frameId)
111 {
112     Frame* frame = m_pageAgent->assertFrame(errorString, frameId);
113     if (!frame)
114         return nullptr;
115
116     return InspectorPageAgent::assertDocumentLoader(errorString, frame);
117 }
118
119 void InspectorApplicationCacheAgent::getManifestForFrame(ErrorString& errorString, const String& frameId, String* manifestURL)
120 {
121     DocumentLoader* documentLoader = assertFrameWithDocumentLoader(errorString, frameId);
122     if (!documentLoader)
123         return;
124
125     *manifestURL = documentLoader->applicationCacheHost().applicationCacheInfo().manifest.string();
126 }
127
128 void InspectorApplicationCacheAgent::getApplicationCacheForFrame(ErrorString& errorString, const String& frameId, RefPtr<Inspector::Protocol::ApplicationCache::ApplicationCache>& applicationCache)
129 {
130     auto* documentLoader = assertFrameWithDocumentLoader(errorString, frameId);
131     if (!documentLoader)
132         return;
133
134     auto& host = documentLoader->applicationCacheHost();
135     applicationCache = buildObjectForApplicationCache(host.resourceList(), host.applicationCacheInfo());
136 }
137
138 Ref<Inspector::Protocol::ApplicationCache::ApplicationCache> InspectorApplicationCacheAgent::buildObjectForApplicationCache(const Vector<ApplicationCacheHost::ResourceInfo>& applicationCacheResources, const ApplicationCacheHost::CacheInfo& applicationCacheInfo)
139 {
140     return Inspector::Protocol::ApplicationCache::ApplicationCache::create()
141         .setManifestURL(applicationCacheInfo.manifest.string())
142         .setSize(applicationCacheInfo.size)
143         .setCreationTime(applicationCacheInfo.creationTime)
144         .setUpdateTime(applicationCacheInfo.updateTime)
145         .setResources(buildArrayForApplicationCacheResources(applicationCacheResources))
146         .release();
147 }
148
149 Ref<Inspector::Protocol::Array<Inspector::Protocol::ApplicationCache::ApplicationCacheResource>> InspectorApplicationCacheAgent::buildArrayForApplicationCacheResources(const Vector<ApplicationCacheHost::ResourceInfo>& applicationCacheResources)
150 {
151     auto result = Inspector::Protocol::Array<Inspector::Protocol::ApplicationCache::ApplicationCacheResource>::create();
152     for (auto& info : applicationCacheResources)
153         result->addItem(buildObjectForApplicationCacheResource(info));
154     return result;
155 }
156
157 Ref<Inspector::Protocol::ApplicationCache::ApplicationCacheResource> InspectorApplicationCacheAgent::buildObjectForApplicationCacheResource(const ApplicationCacheHost::ResourceInfo& resourceInfo)
158 {
159     StringBuilder types;
160
161     if (resourceInfo.isMaster)
162         types.appendLiteral("Master ");
163
164     if (resourceInfo.isManifest)
165         types.appendLiteral("Manifest ");
166
167     if (resourceInfo.isFallback)
168         types.appendLiteral("Fallback ");
169
170     if (resourceInfo.isForeign)
171         types.appendLiteral("Foreign ");
172
173     if (resourceInfo.isExplicit)
174         types.appendLiteral("Explicit ");
175
176     return Inspector::Protocol::ApplicationCache::ApplicationCacheResource::create()
177         .setUrl(resourceInfo.resource.string())
178         .setSize(static_cast<int>(resourceInfo.size))
179         .setType(types.toString())
180         .release();
181 }
182
183 } // namespace WebCore