| 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 |