OLD | NEW |
1 /* | 1 /* |
2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) | 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) |
3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) | 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) |
4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) | 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) |
5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) | 5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) |
6 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All
rights reserved. | 6 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All
rights reserved. |
7 | 7 |
8 This library is free software; you can redistribute it and/or | 8 This library is free software; you can redistribute it and/or |
9 modify it under the terms of the GNU Library General Public | 9 modify it under the terms of the GNU Library General Public |
10 License as published by the Free Software Foundation; either | 10 License as published by the Free Software Foundation; either |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 { | 130 { |
131 visitor->trace(m_resource); | 131 visitor->trace(m_resource); |
132 CachedMetadataHandler::trace(visitor); | 132 CachedMetadataHandler::trace(visitor); |
133 } | 133 } |
134 | 134 |
135 void Resource::CachedMetadataHandlerImpl::setCachedMetadata(uint32_t dataTypeID,
const char* data, size_t size, CachedMetadataHandler::CacheType cacheType) | 135 void Resource::CachedMetadataHandlerImpl::setCachedMetadata(uint32_t dataTypeID,
const char* data, size_t size, CachedMetadataHandler::CacheType cacheType) |
136 { | 136 { |
137 // Currently, only one type of cached metadata per resource is supported. | 137 // Currently, only one type of cached metadata per resource is supported. |
138 // If the need arises for multiple types of metadata per resource this could | 138 // If the need arises for multiple types of metadata per resource this could |
139 // be enhanced to store types of metadata in a map. | 139 // be enhanced to store types of metadata in a map. |
140 ASSERT(!m_cachedMetadata); | 140 DCHECK(!m_cachedMetadata); |
141 m_cachedMetadata = CachedMetadata::create(dataTypeID, data, size); | 141 m_cachedMetadata = CachedMetadata::create(dataTypeID, data, size); |
142 if (cacheType == CachedMetadataHandler::SendToPlatform) | 142 if (cacheType == CachedMetadataHandler::SendToPlatform) |
143 sendToPlatform(); | 143 sendToPlatform(); |
144 } | 144 } |
145 | 145 |
146 void Resource::CachedMetadataHandlerImpl::clearCachedMetadata(CachedMetadataHand
ler::CacheType cacheType) | 146 void Resource::CachedMetadataHandlerImpl::clearCachedMetadata(CachedMetadataHand
ler::CacheType cacheType) |
147 { | 147 { |
148 m_cachedMetadata.clear(); | 148 m_cachedMetadata.clear(); |
149 if (cacheType == CachedMetadataHandler::SendToPlatform) | 149 if (cacheType == CachedMetadataHandler::SendToPlatform) |
150 sendToPlatform(); | 150 sendToPlatform(); |
151 } | 151 } |
152 | 152 |
153 PassRefPtr<CachedMetadata> Resource::CachedMetadataHandlerImpl::cachedMetadata(u
int32_t dataTypeID) const | 153 PassRefPtr<CachedMetadata> Resource::CachedMetadataHandlerImpl::cachedMetadata(u
int32_t dataTypeID) const |
154 { | 154 { |
155 if (!m_cachedMetadata || m_cachedMetadata->dataTypeID() != dataTypeID) | 155 if (!m_cachedMetadata || m_cachedMetadata->dataTypeID() != dataTypeID) |
156 return nullptr; | 156 return nullptr; |
157 return m_cachedMetadata.get(); | 157 return m_cachedMetadata.get(); |
158 } | 158 } |
159 | 159 |
160 String Resource::CachedMetadataHandlerImpl::encoding() const | 160 String Resource::CachedMetadataHandlerImpl::encoding() const |
161 { | 161 { |
162 return m_resource->encoding(); | 162 return m_resource->encoding(); |
163 } | 163 } |
164 | 164 |
165 void Resource::CachedMetadataHandlerImpl::setSerializedCachedMetadata(const char
* data, size_t size) | 165 void Resource::CachedMetadataHandlerImpl::setSerializedCachedMetadata(const char
* data, size_t size) |
166 { | 166 { |
167 // We only expect to receive cached metadata from the platform once. | 167 // We only expect to receive cached metadata from the platform once. |
168 // If this triggers, it indicates an efficiency problem which is most | 168 // If this triggers, it indicates an efficiency problem which is most |
169 // likely unexpected in code designed to improve performance. | 169 // likely unexpected in code designed to improve performance. |
170 ASSERT(!m_cachedMetadata); | 170 DCHECK(!m_cachedMetadata); |
171 m_cachedMetadata = CachedMetadata::createFromSerializedData(data, size); | 171 m_cachedMetadata = CachedMetadata::createFromSerializedData(data, size); |
172 } | 172 } |
173 | 173 |
174 void Resource::CachedMetadataHandlerImpl::sendToPlatform() | 174 void Resource::CachedMetadataHandlerImpl::sendToPlatform() |
175 { | 175 { |
176 if (m_cachedMetadata) { | 176 if (m_cachedMetadata) { |
177 const Vector<char>& serializedData = m_cachedMetadata->serializedData(); | 177 const Vector<char>& serializedData = m_cachedMetadata->serializedData(); |
178 Platform::current()->cacheMetadata(response().url(), response().response
Time(), serializedData.data(), serializedData.size()); | 178 Platform::current()->cacheMetadata(response().url(), response().response
Time(), serializedData.data(), serializedData.size()); |
179 } else { | 179 } else { |
180 Platform::current()->cacheMetadata(response().url(), response().response
Time(), nullptr, 0); | 180 Platform::current()->cacheMetadata(response().url(), response().response
Time(), nullptr, 0); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 , m_status(NotStarted) | 299 , m_status(NotStarted) |
300 , m_needsSynchronousCacheHit(false) | 300 , m_needsSynchronousCacheHit(false) |
301 , m_linkPreload(false) | 301 , m_linkPreload(false) |
302 , m_isRevalidating(false) | 302 , m_isRevalidating(false) |
303 , m_isAlive(false) | 303 , m_isAlive(false) |
304 , m_options(options) | 304 , m_options(options) |
305 , m_responseTimestamp(currentTime()) | 305 , m_responseTimestamp(currentTime()) |
306 , m_cancelTimer(this, &Resource::cancelTimerFired) | 306 , m_cancelTimer(this, &Resource::cancelTimerFired) |
307 , m_resourceRequest(request) | 307 , m_resourceRequest(request) |
308 { | 308 { |
309 ASSERT(m_type == unsigned(type)); // m_type is a bitfield, so this tests car
eless updates of the enum. | 309 DCHECK_EQ(m_type, unsigned(type)); // m_type is a bitfield, so this tests ca
reless updates of the enum. |
310 InstanceCounters::incrementCounter(InstanceCounters::ResourceCounter); | 310 InstanceCounters::incrementCounter(InstanceCounters::ResourceCounter); |
311 | 311 |
312 // Currently we support the metadata caching only for HTTP family. | 312 // Currently we support the metadata caching only for HTTP family. |
313 if (m_resourceRequest.url().protocolIsInHTTPFamily()) | 313 if (m_resourceRequest.url().protocolIsInHTTPFamily()) |
314 m_cacheHandler = CachedMetadataHandlerImpl::create(this); | 314 m_cacheHandler = CachedMetadataHandlerImpl::create(this); |
315 MemoryCoordinator::instance().registerClient(this); | 315 MemoryCoordinator::instance().registerClient(this); |
316 } | 316 } |
317 | 317 |
318 Resource::~Resource() | 318 Resource::~Resource() |
319 { | 319 { |
320 InstanceCounters::decrementCounter(InstanceCounters::ResourceCounter); | 320 InstanceCounters::decrementCounter(InstanceCounters::ResourceCounter); |
321 } | 321 } |
322 | 322 |
323 DEFINE_TRACE(Resource) | 323 DEFINE_TRACE(Resource) |
324 { | 324 { |
325 visitor->trace(m_loader); | 325 visitor->trace(m_loader); |
326 visitor->trace(m_cacheHandler); | 326 visitor->trace(m_cacheHandler); |
327 visitor->trace(m_clients); | 327 visitor->trace(m_clients); |
328 visitor->trace(m_clientsAwaitingCallback); | 328 visitor->trace(m_clientsAwaitingCallback); |
329 visitor->trace(m_finishedClients); | 329 visitor->trace(m_finishedClients); |
330 MemoryCoordinatorClient::trace(visitor); | 330 MemoryCoordinatorClient::trace(visitor); |
331 } | 331 } |
332 | 332 |
333 void Resource::setLoader(ResourceLoader* loader) | 333 void Resource::setLoader(ResourceLoader* loader) |
334 { | 334 { |
335 RELEASE_ASSERT(!m_loader); | 335 CHECK(!m_loader); |
336 ASSERT(stillNeedsLoad()); | 336 DCHECK(stillNeedsLoad()); |
337 m_loader = loader; | 337 m_loader = loader; |
338 m_status = Pending; | 338 m_status = Pending; |
339 } | 339 } |
340 | 340 |
341 void Resource::checkNotify() | 341 void Resource::checkNotify() |
342 { | 342 { |
343 notifyClientsInternal(MarkFinishedOption::ShouldMarkFinished); | 343 notifyClientsInternal(MarkFinishedOption::ShouldMarkFinished); |
344 } | 344 } |
345 | 345 |
346 void Resource::notifyClientsInternal(MarkFinishedOption markFinishedOption) | 346 void Resource::notifyClientsInternal(MarkFinishedOption markFinishedOption) |
(...skipping 14 matching lines...) Expand all Loading... |
361 if (m_clients.contains(client)) { | 361 if (m_clients.contains(client)) { |
362 m_finishedClients.add(client); | 362 m_finishedClients.add(client); |
363 m_clients.remove(client); | 363 m_clients.remove(client); |
364 } | 364 } |
365 } | 365 } |
366 | 366 |
367 void Resource::appendData(const char* data, size_t length) | 367 void Resource::appendData(const char* data, size_t length) |
368 { | 368 { |
369 TRACE_EVENT0("blink", "Resource::appendData"); | 369 TRACE_EVENT0("blink", "Resource::appendData"); |
370 DCHECK(!m_isRevalidating); | 370 DCHECK(!m_isRevalidating); |
371 ASSERT(!errorOccurred()); | 371 DCHECK(!errorOccurred()); |
372 if (m_options.dataBufferingPolicy == DoNotBufferData) | 372 if (m_options.dataBufferingPolicy == DoNotBufferData) |
373 return; | 373 return; |
374 if (m_data) | 374 if (m_data) |
375 m_data->append(data, length); | 375 m_data->append(data, length); |
376 else | 376 else |
377 m_data = SharedBuffer::create(data, length); | 377 m_data = SharedBuffer::create(data, length); |
378 setEncodedSize(m_data->size()); | 378 setEncodedSize(m_data->size()); |
379 } | 379 } |
380 | 380 |
381 void Resource::setResourceBuffer(PassRefPtr<SharedBuffer> resourceBuffer) | 381 void Resource::setResourceBuffer(PassRefPtr<SharedBuffer> resourceBuffer) |
382 { | 382 { |
383 DCHECK(!m_isRevalidating); | 383 DCHECK(!m_isRevalidating); |
384 ASSERT(!errorOccurred()); | 384 DCHECK(!errorOccurred()); |
385 ASSERT(m_options.dataBufferingPolicy == BufferData); | 385 DCHECK_EQ(m_options.dataBufferingPolicy, BufferData); |
386 m_data = resourceBuffer; | 386 m_data = resourceBuffer; |
387 setEncodedSize(m_data->size()); | 387 setEncodedSize(m_data->size()); |
388 } | 388 } |
389 | 389 |
390 void Resource::setDataBufferingPolicy(DataBufferingPolicy dataBufferingPolicy) | 390 void Resource::setDataBufferingPolicy(DataBufferingPolicy dataBufferingPolicy) |
391 { | 391 { |
392 m_options.dataBufferingPolicy = dataBufferingPolicy; | 392 m_options.dataBufferingPolicy = dataBufferingPolicy; |
393 m_data.clear(); | 393 m_data.clear(); |
394 setEncodedSize(0); | 394 setEncodedSize(0); |
395 } | 395 } |
396 | 396 |
397 void Resource::error(const ResourceError& error) | 397 void Resource::error(const ResourceError& error) |
398 { | 398 { |
399 ASSERT(!error.isNull()); | 399 DCHECK(!error.isNull()); |
400 m_error = error; | 400 m_error = error; |
401 m_isRevalidating = false; | 401 m_isRevalidating = false; |
402 | 402 |
403 if (m_error.isCancellation() || !isPreloaded()) | 403 if (m_error.isCancellation() || !isPreloaded()) |
404 memoryCache()->remove(this); | 404 memoryCache()->remove(this); |
405 | 405 |
406 if (!errorOccurred()) | 406 if (!errorOccurred()) |
407 setStatus(LoadError); | 407 setStatus(LoadError); |
408 ASSERT(errorOccurred()); | 408 DCHECK(errorOccurred()); |
409 m_data.clear(); | 409 m_data.clear(); |
410 m_loader = nullptr; | 410 m_loader = nullptr; |
411 checkNotify(); | 411 checkNotify(); |
412 } | 412 } |
413 | 413 |
414 void Resource::finish(double loadFinishTime) | 414 void Resource::finish(double loadFinishTime) |
415 { | 415 { |
416 DCHECK(!m_isRevalidating); | 416 DCHECK(!m_isRevalidating); |
417 m_loadFinishTime = loadFinishTime; | 417 m_loadFinishTime = loadFinishTime; |
418 if (!errorOccurred()) | 418 if (!errorOccurred()) |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 } | 573 } |
574 setResponse(response); | 574 setResponse(response); |
575 String encoding = response.textEncodingName(); | 575 String encoding = response.textEncodingName(); |
576 if (!encoding.isNull()) | 576 if (!encoding.isNull()) |
577 setEncoding(encoding); | 577 setEncoding(encoding); |
578 } | 578 } |
579 | 579 |
580 void Resource::setSerializedCachedMetadata(const char* data, size_t size) | 580 void Resource::setSerializedCachedMetadata(const char* data, size_t size) |
581 { | 581 { |
582 DCHECK(!m_isRevalidating); | 582 DCHECK(!m_isRevalidating); |
583 ASSERT(!m_response.isNull()); | 583 DCHECK(!m_response.isNull()); |
584 if (m_cacheHandler) | 584 if (m_cacheHandler) |
585 m_cacheHandler->setSerializedCachedMetadata(data, size); | 585 m_cacheHandler->setSerializedCachedMetadata(data, size); |
586 } | 586 } |
587 | 587 |
588 CachedMetadataHandler* Resource::cacheHandler() | 588 CachedMetadataHandler* Resource::cacheHandler() |
589 { | 589 { |
590 return m_cacheHandler.get(); | 590 return m_cacheHandler.get(); |
591 } | 591 } |
592 | 592 |
593 | 593 |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
744 if (!m_loader) | 744 if (!m_loader) |
745 return; | 745 return; |
746 if (m_type == Raw) | 746 if (m_type == Raw) |
747 cancelTimerFired(&m_cancelTimer); | 747 cancelTimerFired(&m_cancelTimer); |
748 else if (!m_cancelTimer.isActive()) | 748 else if (!m_cancelTimer.isActive()) |
749 m_cancelTimer.startOneShot(0, BLINK_FROM_HERE); | 749 m_cancelTimer.startOneShot(0, BLINK_FROM_HERE); |
750 } | 750 } |
751 | 751 |
752 void Resource::cancelTimerFired(TimerBase* timer) | 752 void Resource::cancelTimerFired(TimerBase* timer) |
753 { | 753 { |
754 ASSERT_UNUSED(timer, timer == &m_cancelTimer); | 754 DCHECK_EQ(timer, &m_cancelTimer); |
755 if (!hasClientsOrObservers() && m_loader) | 755 if (!hasClientsOrObservers() && m_loader) |
756 m_loader->cancel(); | 756 m_loader->cancel(); |
757 } | 757 } |
758 | 758 |
759 void Resource::setDecodedSize(size_t decodedSize) | 759 void Resource::setDecodedSize(size_t decodedSize) |
760 { | 760 { |
761 if (decodedSize == m_decodedSize) | 761 if (decodedSize == m_decodedSize) |
762 return; | 762 return; |
763 size_t oldSize = size(); | 763 size_t oldSize = size(); |
764 m_decodedSize = decodedSize; | 764 m_decodedSize = decodedSize; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 didAddClient(client); | 803 didAddClient(client); |
804 } | 804 } |
805 | 805 |
806 // It is still possible for the above loop to finish a new client synchronou
sly. | 806 // It is still possible for the above loop to finish a new client synchronou
sly. |
807 // If there's no client waiting we should deschedule. | 807 // If there's no client waiting we should deschedule. |
808 bool scheduled = ResourceCallback::callbackHandler().isScheduled(this); | 808 bool scheduled = ResourceCallback::callbackHandler().isScheduled(this); |
809 if (scheduled && m_clientsAwaitingCallback.isEmpty()) | 809 if (scheduled && m_clientsAwaitingCallback.isEmpty()) |
810 ResourceCallback::callbackHandler().cancel(this); | 810 ResourceCallback::callbackHandler().cancel(this); |
811 | 811 |
812 // Prevent the case when there are clients waiting but no callback scheduled
. | 812 // Prevent the case when there are clients waiting but no callback scheduled
. |
813 ASSERT(m_clientsAwaitingCallback.isEmpty() || scheduled); | 813 DCHECK(m_clientsAwaitingCallback.isEmpty() || scheduled); |
814 } | 814 } |
815 | 815 |
816 void Resource::prune() | 816 void Resource::prune() |
817 { | 817 { |
818 destroyDecodedDataIfPossible(); | 818 destroyDecodedDataIfPossible(); |
819 } | 819 } |
820 | 820 |
821 void Resource::prepareToSuspend() | 821 void Resource::prepareToSuspend() |
822 { | 822 { |
823 prune(); | 823 prune(); |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1032 return "Link prefetch resource"; | 1032 return "Link prefetch resource"; |
1033 case Resource::TextTrack: | 1033 case Resource::TextTrack: |
1034 return "Text track"; | 1034 return "Text track"; |
1035 case Resource::ImportResource: | 1035 case Resource::ImportResource: |
1036 return "Imported resource"; | 1036 return "Imported resource"; |
1037 case Resource::Media: | 1037 case Resource::Media: |
1038 return "Media"; | 1038 return "Media"; |
1039 case Resource::Manifest: | 1039 case Resource::Manifest: |
1040 return "Manifest"; | 1040 return "Manifest"; |
1041 } | 1041 } |
1042 ASSERT_NOT_REACHED(); | 1042 NOTREACHED(); |
1043 return initatorTypeNameToString(initiatorInfo.name); | 1043 return initatorTypeNameToString(initiatorInfo.name); |
1044 } | 1044 } |
1045 | 1045 |
1046 bool Resource::shouldBlockLoadEvent() const | 1046 bool Resource::shouldBlockLoadEvent() const |
1047 { | 1047 { |
1048 return !m_linkPreload && isLoadEventBlockingResourceType(); | 1048 return !m_linkPreload && isLoadEventBlockingResourceType(); |
1049 } | 1049 } |
1050 | 1050 |
1051 bool Resource::isLoadEventBlockingResourceType() const | 1051 bool Resource::isLoadEventBlockingResourceType() const |
1052 { | 1052 { |
1053 switch (m_type) { | 1053 switch (m_type) { |
1054 case Resource::MainResource: | 1054 case Resource::MainResource: |
1055 case Resource::Image: | 1055 case Resource::Image: |
1056 case Resource::CSSStyleSheet: | 1056 case Resource::CSSStyleSheet: |
1057 case Resource::Script: | 1057 case Resource::Script: |
1058 case Resource::Font: | 1058 case Resource::Font: |
1059 case Resource::SVGDocument: | 1059 case Resource::SVGDocument: |
1060 case Resource::XSLStyleSheet: | 1060 case Resource::XSLStyleSheet: |
1061 case Resource::ImportResource: | 1061 case Resource::ImportResource: |
1062 return true; | 1062 return true; |
1063 case Resource::Raw: | 1063 case Resource::Raw: |
1064 case Resource::LinkPrefetch: | 1064 case Resource::LinkPrefetch: |
1065 case Resource::TextTrack: | 1065 case Resource::TextTrack: |
1066 case Resource::Media: | 1066 case Resource::Media: |
1067 case Resource::Manifest: | 1067 case Resource::Manifest: |
1068 return false; | 1068 return false; |
1069 } | 1069 } |
1070 ASSERT_NOT_REACHED(); | 1070 NOTREACHED(); |
1071 return false; | 1071 return false; |
1072 } | 1072 } |
1073 | 1073 |
1074 } // namespace blink | 1074 } // namespace blink |
OLD | NEW |