Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: Source/core/loader/appcache/ApplicationCacheHost.cpp

Issue 1194003004: Oilpan: enable appcache + move DocumentLoader to the heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: rebased Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/loader/appcache/ApplicationCacheHost.h ('k') | Source/web/FrameLoaderClientImpl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2009 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 ApplicationCacheHost::ApplicationCacheHost(DocumentLoader* documentLoader) 63 ApplicationCacheHost::ApplicationCacheHost(DocumentLoader* documentLoader)
64 : m_domApplicationCache(nullptr) 64 : m_domApplicationCache(nullptr)
65 , m_documentLoader(documentLoader) 65 , m_documentLoader(documentLoader)
66 , m_defersEvents(true) 66 , m_defersEvents(true)
67 { 67 {
68 ASSERT(m_documentLoader); 68 ASSERT(m_documentLoader);
69 } 69 }
70 70
71 ApplicationCacheHost::~ApplicationCacheHost() 71 ApplicationCacheHost::~ApplicationCacheHost()
72 { 72 {
73 // Verify that detachFromDocumentLoader() has been performed already.
74 ASSERT(!m_host);
73 } 75 }
74 76
75 void ApplicationCacheHost::willStartLoadingMainResource(ResourceRequest& request ) 77 void ApplicationCacheHost::willStartLoadingMainResource(ResourceRequest& request )
76 { 78 {
77 // We defer creating the outer host object to avoid spurious creation/destru ction 79 // We defer creating the outer host object to avoid spurious creation/destru ction
78 // around creating empty documents. At this point, we're initiating a main r esource 80 // around creating empty documents. At this point, we're initiating a main r esource
79 // load for the document, so its for real. 81 // load for the document, so its for real.
80 82
81 if (!isApplicationCacheEnabled()) 83 if (!isApplicationCacheEnabled())
82 return; 84 return;
83 85
84 ASSERT(m_documentLoader->frame()); 86 ASSERT(m_documentLoader->frame());
85 LocalFrame& frame = *m_documentLoader->frame(); 87 LocalFrame& frame = *m_documentLoader->frame();
86 m_host = frame.loader().client()->createApplicationCacheHost(this); 88 m_host = frame.loader().client()->createApplicationCacheHost(this);
87 if (m_host) { 89 if (!m_host)
88 WrappedResourceRequest wrapped(request); 90 return;
89 91
90 const WebApplicationCacheHost* spawningHost = 0; 92 WrappedResourceRequest wrapped(request);
91 Frame* spawningFrame = frame.tree().parent();
92 if (!spawningFrame || !spawningFrame->isLocalFrame())
93 spawningFrame = frame.loader().opener();
94 if (!spawningFrame || !spawningFrame->isLocalFrame())
95 spawningFrame = &frame;
96 if (DocumentLoader* spawningDocLoader = toLocalFrame(spawningFrame)->loa der().documentLoader())
97 spawningHost = spawningDocLoader->applicationCacheHost() ? spawningD ocLoader->applicationCacheHost()->m_host.get() : 0;
98 93
99 m_host->willStartMainResourceRequest(wrapped, spawningHost); 94 const WebApplicationCacheHost* spawningHost = nullptr;
100 } 95 Frame* spawningFrame = frame.tree().parent();
96 if (!spawningFrame || !spawningFrame->isLocalFrame())
97 spawningFrame = frame.loader().opener();
98 if (!spawningFrame || !spawningFrame->isLocalFrame())
99 spawningFrame = &frame;
100 if (DocumentLoader* spawningDocLoader = toLocalFrame(spawningFrame)->loader( ).documentLoader())
101 spawningHost = spawningDocLoader->applicationCacheHost() ? spawningDocLo ader->applicationCacheHost()->m_host.get() : nullptr;
102
103 m_host->willStartMainResourceRequest(wrapped, spawningHost);
101 104
102 // NOTE: The semantics of this method, and others in this interface, are sub tly different 105 // NOTE: The semantics of this method, and others in this interface, are sub tly different
103 // than the method names would suggest. For example, in this method never re turns an appcached 106 // than the method names would suggest. For example, in this method never re turns an appcached
104 // response in the SubstituteData out argument, instead we return the appcac hed response thru 107 // response in the SubstituteData out argument, instead we return the appcac hed response thru
105 // the usual resource loading pipeline. 108 // the usual resource loading pipeline.
106 } 109 }
107 110
108 void ApplicationCacheHost::selectCacheWithoutManifest() 111 void ApplicationCacheHost::selectCacheWithoutManifest()
109 { 112 {
110 if (m_host) 113 if (m_host)
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 m_host->willStartSubResourceRequest(wrapped); 160 m_host->willStartSubResourceRequest(wrapped);
158 } 161 }
159 } 162 }
160 163
161 void ApplicationCacheHost::setApplicationCache(ApplicationCache* domApplicationC ache) 164 void ApplicationCacheHost::setApplicationCache(ApplicationCache* domApplicationC ache)
162 { 165 {
163 ASSERT(!m_domApplicationCache || !domApplicationCache); 166 ASSERT(!m_domApplicationCache || !domApplicationCache);
164 m_domApplicationCache = domApplicationCache; 167 m_domApplicationCache = domApplicationCache;
165 } 168 }
166 169
167 void ApplicationCacheHost::dispose() 170 void ApplicationCacheHost::detachFromDocumentLoader()
168 { 171 {
169 // FIXME: Oilpan: remove the dispose step when the owning DocumentLoader 172 // Detach from the owning DocumentLoader and let go of WebApplicationCacheHo st.
170 // becomes a garbage collected object. Until that time, have the 173 setApplicationCache(nullptr);
171 // DocumentLoader dispose and disable this ApplicationCacheHost when
172 // it is finalized. Releasing the WebApplicationCacheHost is needed
173 // to prevent further embedder notifications, which risk accessing an
174 // invalid DocumentLoader.
175 setApplicationCache(0);
176 m_host.clear(); 174 m_host.clear();
177 m_documentLoader = nullptr; 175 m_documentLoader = nullptr;
178 } 176 }
179 177
180 void ApplicationCacheHost::notifyApplicationCache(EventID id, int progressTotal, int progressDone, WebApplicationCacheHost::ErrorReason errorReason, const Strin g& errorURL, int errorStatus, const String& errorMessage) 178 void ApplicationCacheHost::notifyApplicationCache(EventID id, int progressTotal, int progressDone, WebApplicationCacheHost::ErrorReason errorReason, const Strin g& errorURL, int errorStatus, const String& errorMessage)
181 { 179 {
182 if (id != PROGRESS_EVENT) 180 if (id != PROGRESS_EVENT)
183 InspectorInstrumentation::updateApplicationCacheStatus(m_documentLoader- >frame()); 181 InspectorInstrumentation::updateApplicationCacheStatus(m_documentLoader- >frame());
184 182
185 if (m_defersEvents) { 183 if (m_defersEvents) {
(...skipping 23 matching lines...) Expand all
209 m_host->getResourceList(&webResources); 207 m_host->getResourceList(&webResources);
210 for (size_t i = 0; i < webResources.size(); ++i) { 208 for (size_t i = 0; i < webResources.size(); ++i) {
211 resources->append(ResourceInfo( 209 resources->append(ResourceInfo(
212 webResources[i].url, webResources[i].isMaster, webResources[i].isMan ifest, webResources[i].isFallback, 210 webResources[i].url, webResources[i].isMaster, webResources[i].isMan ifest, webResources[i].isFallback,
213 webResources[i].isForeign, webResources[i].isExplicit, webResources[ i].size)); 211 webResources[i].isForeign, webResources[i].isExplicit, webResources[ i].size));
214 } 212 }
215 } 213 }
216 214
217 void ApplicationCacheHost::stopDeferringEvents() 215 void ApplicationCacheHost::stopDeferringEvents()
218 { 216 {
219 RefPtr<DocumentLoader> protect(documentLoader()); 217 RefPtrWillBeRawPtr<DocumentLoader> protect(documentLoader());
220 for (unsigned i = 0; i < m_deferredEvents.size(); ++i) { 218 for (unsigned i = 0; i < m_deferredEvents.size(); ++i) {
221 const DeferredEvent& deferred = m_deferredEvents[i]; 219 const DeferredEvent& deferred = m_deferredEvents[i];
222 dispatchDOMEvent(deferred.eventID, deferred.progressTotal, deferred.prog ressDone, deferred.errorReason, deferred.errorURL, deferred.errorStatus, deferre d.errorMessage); 220 dispatchDOMEvent(deferred.eventID, deferred.progressTotal, deferred.prog ressDone, deferred.errorReason, deferred.errorURL, deferred.errorStatus, deferre d.errorMessage);
223 } 221 }
224 m_deferredEvents.clear(); 222 m_deferredEvents.clear();
225 m_defersEvents = false; 223 m_defersEvents = false;
226 } 224 }
227 225
228 void ApplicationCacheHost::dispatchDOMEvent(EventID id, int progressTotal, int p rogressDone, WebApplicationCacheHost::ErrorReason errorReason, const String& err orURL, int errorStatus, const String& errorMessage) 226 void ApplicationCacheHost::dispatchDOMEvent(EventID id, int progressTotal, int p rogressDone, WebApplicationCacheHost::ErrorReason errorReason, const String& err orURL, int errorStatus, const String& errorMessage)
229 { 227 {
230 if (m_domApplicationCache) { 228 if (!m_domApplicationCache)
231 const AtomicString& eventType = ApplicationCache::toEventType(id); 229 return;
232 RefPtrWillBeRawPtr<Event> event = nullptr; 230
233 if (id == PROGRESS_EVENT) 231 const AtomicString& eventType = ApplicationCache::toEventType(id);
234 event = ProgressEvent::create(eventType, true, progressDone, progres sTotal); 232 RefPtrWillBeRawPtr<Event> event = nullptr;
235 else if (id == ERROR_EVENT) 233 if (id == PROGRESS_EVENT)
236 event = ApplicationCacheErrorEvent::create(errorReason, errorURL, er rorStatus, errorMessage); 234 event = ProgressEvent::create(eventType, true, progressDone, progressTot al);
237 else 235 else if (id == ERROR_EVENT)
238 event = Event::create(eventType); 236 event = ApplicationCacheErrorEvent::create(errorReason, errorURL, errorS tatus, errorMessage);
239 m_domApplicationCache->dispatchEvent(event, ASSERT_NO_EXCEPTION); 237 else
240 } 238 event = Event::create(eventType);
239 m_domApplicationCache->dispatchEvent(event, ASSERT_NO_EXCEPTION);
241 } 240 }
242 241
243 ApplicationCacheHost::Status ApplicationCacheHost::status() const 242 ApplicationCacheHost::Status ApplicationCacheHost::status() const
244 { 243 {
245 return m_host ? static_cast<Status>(m_host->status()) : UNCACHED; 244 return m_host ? static_cast<Status>(m_host->status()) : UNCACHED;
246 } 245 }
247 246
248 bool ApplicationCacheHost::update() 247 bool ApplicationCacheHost::update()
249 { 248 {
250 return m_host ? m_host->startUpdate() : false; 249 return m_host ? m_host->startUpdate() : false;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 } 285 }
287 286
288 void ApplicationCacheHost::notifyErrorEventListener(WebApplicationCacheHost::Err orReason reason, const WebURL& url, int status, const WebString& message) 287 void ApplicationCacheHost::notifyErrorEventListener(WebApplicationCacheHost::Err orReason reason, const WebURL& url, int status, const WebString& message)
289 { 288 {
290 notifyApplicationCache(ERROR_EVENT, 0, 0, reason, url.string(), status, mess age); 289 notifyApplicationCache(ERROR_EVENT, 0, 0, reason, url.string(), status, mess age);
291 } 290 }
292 291
293 DEFINE_TRACE(ApplicationCacheHost) 292 DEFINE_TRACE(ApplicationCacheHost)
294 { 293 {
295 visitor->trace(m_domApplicationCache); 294 visitor->trace(m_domApplicationCache);
295 visitor->trace(m_documentLoader);
296 } 296 }
297 297
298 } // namespace blink 298 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/loader/appcache/ApplicationCacheHost.h ('k') | Source/web/FrameLoaderClientImpl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698