Changeset 181970 in webkit
- Timestamp:
- Mar 25, 2015 1:59:18 PM (9 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 2 added
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r181959 r181970 1 2015-03-25 Antti Koivisto <antti@apple.com> 2 3 Separate entry decoding from validation 4 https://bugs.webkit.org/show_bug.cgi?id=143052 5 6 Reviewed by Chris Dumez. 7 8 Make NetworkCache::Cache a class and move it to a file of its own. 9 Move the encoding/decoding code there. 10 11 * NetworkProcess/NetworkProcess.cpp: 12 (WebKit::fetchDiskCacheEntries): 13 (WebKit::clearDiskCacheEntries): 14 * NetworkProcess/NetworkResourceLoader.cpp: 15 (WebKit::sendReplyToSynchronousRequest): 16 (WebKit::NetworkResourceLoader::start): 17 (WebKit::NetworkResourceLoader::sendBufferMaybeAborting): 18 (WebKit::NetworkResourceLoader::didRetrieveCacheEntry): 19 (WebKit::NetworkResourceLoader::validateCacheEntry): 20 * NetworkProcess/NetworkResourceLoader.h: 21 * NetworkProcess/cache/NetworkCache.cpp: 22 (WebKit::NetworkCache::collectVaryingRequestHeaders): 23 (WebKit::NetworkCache::canUse): 24 25 Focused function for deciding if we can use a cache entry and if it needs validation. 26 27 (WebKit::NetworkCache::Cache::retrieve): 28 (WebKit::NetworkCache::Cache::store): 29 (WebKit::NetworkCache::Cache::update): 30 (WebKit::NetworkCache::Cache::traverse): 31 (WebKit::NetworkCache::encodeStorageEntry): Deleted. 32 (WebKit::NetworkCache::decodeStorageEntry): Deleted. 33 * NetworkProcess/cache/NetworkCache.h: 34 * NetworkProcess/cache/NetworkCacheEntry.cpp: Added. 35 (WebKit::NetworkCache::Entry::Entry): 36 (WebKit::NetworkCache::Entry::encode): 37 (WebKit::NetworkCache::Entry::decode): 38 (WebKit::NetworkCache::Entry::initializeBufferFromStorageEntry): 39 (WebKit::NetworkCache::Entry::buffer): 40 (WebKit::NetworkCache::Entry::shareableResourceHandle): 41 (WebKit::NetworkCache::Entry::needsValidation): 42 (WebKit::NetworkCache::Entry::setNeedsValidation): 43 * NetworkProcess/cache/NetworkCacheEntry.h: Added. 44 (WebKit::NetworkCache::Entry::key): 45 (WebKit::NetworkCache::Entry::timeStamp): 46 (WebKit::NetworkCache::Entry::response): 47 (WebKit::NetworkCache::Entry::varyingRequestHeaders): 48 (WebKit::NetworkCache::Entry::sourceStorageEntry): 49 * NetworkProcess/cache/NetworkCacheStatistics.h: 50 * NetworkProcess/cache/NetworkCacheStatisticsCocoa.mm: 51 (WebKit::NetworkCache::cachedEntryReuseFailureToDiagnosticKey): 52 (WebKit::NetworkCache::Statistics::recordRetrievedCachedEntry): 53 * WebKit2.xcodeproj/project.pbxproj: 54 1 55 2015-03-25 David Hyatt <hyatt@apple.com> 2 56 -
trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp
r181775 r181970 288 288 } 289 289 290 origins->add(SecurityOrigin::create(entry->response .url()));290 origins->add(SecurityOrigin::create(entry->response().url())); 291 291 }); 292 292 … … 380 380 381 381 if (entry) { 382 if (originsToDelete->contains(SecurityOrigin::create(entry->response .url())))383 cacheKeysToDelete->append(entry-> storageEntry.key);382 if (originsToDelete->contains(SecurityOrigin::create(entry->response().url()))) 383 cacheKeysToDelete->append(entry->key()); 384 384 return; 385 385 } -
trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp
r181688 r181970 70 70 }; 71 71 72 static void sendReplyToSynchronousRequest(NetworkResourceLoader::SynchronousLoadData& data, WebCore::SharedBuffer* buffer)72 static void sendReplyToSynchronousRequest(NetworkResourceLoader::SynchronousLoadData& data, const WebCore::SharedBuffer* buffer) 73 73 { 74 74 ASSERT(data.delayedReply); … … 151 151 return; 152 152 } 153 if (loader->m_parameters.needsCertificateInfo && !entry->response .containsCertificateInfo()) {153 if (loader->m_parameters.needsCertificateInfo && !entry->response().containsCertificateInfo()) { 154 154 loader->startNetworkLoad(); 155 155 return; 156 156 } 157 if (entry->needs Revalidation) {157 if (entry->needsValidation()) { 158 158 loader->validateCacheEntry(WTF::move(entry)); 159 159 return; … … 530 530 } 531 531 532 bool NetworkResourceLoader::sendBufferMaybeAborting( WebCore::SharedBuffer& buffer, size_t encodedDataLength)532 bool NetworkResourceLoader::sendBufferMaybeAborting(const WebCore::SharedBuffer& buffer, size_t encodedDataLength) 533 533 { 534 534 ASSERT(!isSynchronous()); … … 536 536 #if PLATFORM(COCOA) 537 537 ShareableResource::Handle shareableResourceHandle; 538 NetworkResourceLoader::tryGetShareableHandleFromSharedBuffer(shareableResourceHandle, buffer);538 NetworkResourceLoader::tryGetShareableHandleFromSharedBuffer(shareableResourceHandle, const_cast<WebCore::SharedBuffer&>(buffer)); 539 539 if (!shareableResourceHandle.isNull()) { 540 540 send(Messages::WebResourceLoader::DidReceiveResource(shareableResourceHandle, currentTime())); … … 544 544 #endif 545 545 546 IPC::SharedBufferDataReference dataReference(& buffer);546 IPC::SharedBufferDataReference dataReference(&const_cast<WebCore::SharedBuffer&>(buffer)); 547 547 return sendAbortingOnFailure(Messages::WebResourceLoader::DidReceiveData(dataReference, encodedDataLength)); 548 548 } … … 552 552 { 553 553 if (isSynchronous()) { 554 m_synchronousLoadData->response = entry->response ;555 sendReplyToSynchronousRequest(*m_synchronousLoadData, entry->buffer .get());554 m_synchronousLoadData->response = entry->response(); 555 sendReplyToSynchronousRequest(*m_synchronousLoadData, entry->buffer()); 556 556 } else { 557 sendAbortingOnFailure(Messages::WebResourceLoader::DidReceiveResponse(entry->response , m_parameters.isMainResource));557 sendAbortingOnFailure(Messages::WebResourceLoader::DidReceiveResponse(entry->response(), m_parameters.isMainResource)); 558 558 559 559 #if ENABLE(SHAREABLE_RESOURCE) 560 if (!entry->shareableResourceHandle .isNull())561 send(Messages::WebResourceLoader::DidReceiveResource(entry->shareableResourceHandle , currentTime()));560 if (!entry->shareableResourceHandle().isNull()) 561 send(Messages::WebResourceLoader::DidReceiveResource(entry->shareableResourceHandle(), currentTime())); 562 562 else { 563 563 #endif 564 bool shouldContinue = sendBufferMaybeAborting(*entry->buffer , entry->buffer->size());564 bool shouldContinue = sendBufferMaybeAborting(*entry->buffer(), entry->buffer()->size()); 565 565 if (!shouldContinue) 566 566 return; … … 578 578 ASSERT(!m_handle); 579 579 580 String eTag = entry->response .httpHeaderField(WebCore::HTTPHeaderName::ETag);581 String lastModified = entry->response .httpHeaderField(WebCore::HTTPHeaderName::LastModified);580 String eTag = entry->response().httpHeaderField(WebCore::HTTPHeaderName::ETag); 581 String lastModified = entry->response().httpHeaderField(WebCore::HTTPHeaderName::LastModified); 582 582 if (!eTag.isEmpty()) 583 583 m_currentRequest.setHTTPHeaderField(WebCore::HTTPHeaderName::IfNoneMatch, eTag); -
trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h
r179373 r181970 162 162 void startBufferingTimerIfNeeded(); 163 163 void bufferingTimerFired(); 164 bool sendBufferMaybeAborting( WebCore::SharedBuffer&, size_t encodedDataLength);164 bool sendBufferMaybeAborting(const WebCore::SharedBuffer&, size_t encodedDataLength); 165 165 166 166 bool isSynchronous() const; -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp
r181926 r181970 30 30 31 31 #include "Logging.h" 32 #include "NetworkCacheCoders.h"33 32 #include "NetworkCacheStatistics.h" 34 33 #include "NetworkCacheStorage.h" 35 #include "NetworkResourceLoader.h"36 #include "WebCoreArgumentCoders.h"37 #include <JavaScriptCore/JSONObject.h>38 34 #include <WebCore/CacheValidation.h> 39 35 #include <WebCore/FileSystem.h> … … 41 37 #include <WebCore/NetworkStorageSession.h> 42 38 #include <WebCore/PlatformCookieJar.h> 39 #include <WebCore/ResourceRequest.h> 43 40 #include <WebCore/ResourceResponse.h> 44 41 #include <WebCore/SharedBuffer.h> 45 42 #include <wtf/NeverDestroyed.h> 46 #include <wtf/StringHasher.h>47 43 #include <wtf/text/StringBuilder.h> 48 44 … … 111 107 } 112 108 113 static Storage::Entry encodeStorageEntry(const WebCore::ResourceRequest& request, const WebCore::ResourceResponse& response, PassRefPtr<WebCore::SharedBuffer> responseData) 114 { 115 Encoder encoder; 116 encoder << response; 117 109 static Vector<std::pair<String, String>> collectVaryingRequestHeaders(const WebCore::ResourceRequest& request, const WebCore::ResourceResponse& response) 110 { 118 111 String varyValue = response.httpHeaderField(WebCore::HTTPHeaderName::Vary); 119 bool hasVaryingRequestHeaders = !varyValue.isEmpty(); 120 121 encoder << hasVaryingRequestHeaders; 122 123 if (hasVaryingRequestHeaders) { 124 Vector<String> varyingHeaderNames; 125 varyValue.split(',', false, varyingHeaderNames); 126 127 Vector<std::pair<String, String>> varyingRequestHeaders; 128 for (auto& varyHeaderName : varyingHeaderNames) { 129 String headerName = varyHeaderName.stripWhiteSpace(); 130 String headerValue = headerValueForVary(request, headerName); 131 varyingRequestHeaders.append(std::make_pair(headerName, headerValue)); 132 } 133 encoder << varyingRequestHeaders; 134 } 135 encoder.encodeChecksum(); 136 137 auto timeStamp = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()); 138 Data header(encoder.buffer(), encoder.bufferSize()); 139 Data body; 140 if (responseData) 141 body = { reinterpret_cast<const uint8_t*>(responseData->data()), responseData->size() }; 142 143 return { makeCacheKey(request), timeStamp, header, body }; 112 if (varyValue.isEmpty()) 113 return { }; 114 Vector<String> varyingHeaderNames; 115 varyValue.split(',', /*allowEmptyEntries*/ false, varyingHeaderNames); 116 Vector<std::pair<String, String>> varyingRequestHeaders; 117 varyingRequestHeaders.reserveCapacity(varyingHeaderNames.size()); 118 for (auto& varyHeaderName : varyingHeaderNames) { 119 String headerName = varyHeaderName.stripWhiteSpace(); 120 String headerValue = headerValueForVary(request, headerName); 121 varyingRequestHeaders.append(std::make_pair(headerName, headerValue)); 122 } 123 return varyingRequestHeaders; 144 124 } 145 125 … … 171 151 } 172 152 173 static std::unique_ptr<Entry> decodeStorageEntry(const Storage::Entry& storageEntry, const WebCore::ResourceRequest& request, CachedEntryReuseFailure& failure) 174 { 175 Decoder decoder(storageEntry.header.data(), storageEntry.header.size()); 176 177 WebCore::ResourceResponse cachedResponse; 178 if (!decoder.decode(cachedResponse)) { 179 LOG(NetworkCache, "(NetworkProcess) response decoding failed\n"); 180 failure = CachedEntryReuseFailure::Other; 181 return nullptr; 182 } 183 184 bool hasVaryingRequestHeaders; 185 if (!decoder.decode(hasVaryingRequestHeaders)) { 186 failure = CachedEntryReuseFailure::Other; 187 return nullptr; 188 } 189 190 if (hasVaryingRequestHeaders) { 191 Vector<std::pair<String, String>> varyingRequestHeaders; 192 if (!decoder.decode(varyingRequestHeaders)) { 193 failure = CachedEntryReuseFailure::Other; 194 return nullptr; 195 } 196 197 if (!verifyVaryingRequestHeaders(varyingRequestHeaders, request)) { 198 LOG(NetworkCache, "(NetworkProcess) varying header mismatch\n"); 199 failure = CachedEntryReuseFailure::VaryingHeaderMismatch; 200 return nullptr; 201 } 202 } 203 if (!decoder.verifyChecksum()) { 204 LOG(NetworkCache, "(NetworkProcess) checksum verification failure\n"); 205 failure = CachedEntryReuseFailure::Other; 206 return nullptr; 153 static UseDecision canUse(const Entry& entry, const WebCore::ResourceRequest& request) 154 { 155 if (!verifyVaryingRequestHeaders(entry.varyingRequestHeaders(), request)) { 156 LOG(NetworkCache, "(NetworkProcess) varying header mismatch\n"); 157 return UseDecision::NoDueToVaryingHeaderMismatch; 207 158 } 208 159 209 160 bool allowExpired = cachePolicyAllowsExpired(request.cachePolicy()); 210 auto timeStamp = std::chrono::duration_cast<std::chrono::duration<double>>(storageEntry.timeStamp);211 double age = WebCore::computeCurrentAge( cachedResponse, timeStamp.count());212 double lifetime = WebCore::computeFreshnessLifetimeForHTTPFamily( cachedResponse, timeStamp.count());161 auto doubleTimeStamp = std::chrono::duration<double>(entry.timeStamp()); 162 double age = WebCore::computeCurrentAge(entry.response(), doubleTimeStamp.count()); 163 double lifetime = WebCore::computeFreshnessLifetimeForHTTPFamily(entry.response(), doubleTimeStamp.count()); 213 164 bool isExpired = age > lifetime; 214 165 // We never revalidate in the case of a history navigation (i.e. allowExpired is true). 215 bool needsRevalidation = !allowExpired && (cachedResponse.cacheControlContainsNoCache() || isExpired); 216 217 if (needsRevalidation) { 218 bool hasValidatorFields = cachedResponse.hasCacheValidatorFields(); 219 LOG(NetworkCache, "(NetworkProcess) needsRevalidation hasValidatorFields=%d isExpired=%d age=%f lifetime=%f", isExpired, hasValidatorFields, age, lifetime); 220 if (!hasValidatorFields) { 221 failure = CachedEntryReuseFailure::MissingValidatorFields; 222 return nullptr; 223 } 224 } 225 226 auto entry = std::make_unique<Entry>(); 227 entry->storageEntry = storageEntry; 228 entry->needsRevalidation = needsRevalidation; 229 230 cachedResponse.setSource(needsRevalidation ? WebCore::ResourceResponse::Source::DiskCacheAfterValidation : WebCore::ResourceResponse::Source::DiskCache); 231 entry->response = cachedResponse; 232 233 #if ENABLE(SHAREABLE_RESOURCE) 234 RefPtr<SharedMemory> sharedMemory = storageEntry.body.isMap() ? SharedMemory::createFromVMBuffer(const_cast<uint8_t*>(storageEntry.body.data()), storageEntry.body.size()) : nullptr; 235 RefPtr<ShareableResource> shareableResource = sharedMemory ? ShareableResource::create(sharedMemory.release(), 0, storageEntry.body.size()) : nullptr; 236 237 if (shareableResource && shareableResource->createHandle(entry->shareableResourceHandle)) 238 entry->buffer = entry->shareableResourceHandle.tryWrapInSharedBuffer(); 239 else 240 #endif 241 entry->buffer = WebCore::SharedBuffer::create(storageEntry.body.data(), storageEntry.body.size()); 242 243 return entry; 166 bool needsRevalidation = !allowExpired && (entry.response().cacheControlContainsNoCache() || isExpired); 167 if (!needsRevalidation) 168 return UseDecision::Use; 169 170 bool hasValidatorFields = entry.response().hasCacheValidatorFields(); 171 LOG(NetworkCache, "(NetworkProcess) needsRevalidation hasValidatorFields=%d isExpired=%d age=%f lifetime=%f", isExpired, hasValidatorFields, age, lifetime); 172 if (!hasValidatorFields) 173 return UseDecision::NoDueToMissingValidatorFields; 174 175 return UseDecision::Validate; 244 176 } 245 177 … … 281 213 unsigned priority = originalRequest.priority(); 282 214 283 m_storage->retrieve(storageKey, priority, [this, originalRequest, completionHandler, startTime, storageKey, webPageID](std::unique_ptr<Storage::Entry> entry) {284 if (! entry) {215 m_storage->retrieve(storageKey, priority, [this, originalRequest, completionHandler, startTime, storageKey, webPageID](std::unique_ptr<Storage::Entry> storageEntry) { 216 if (!storageEntry) { 285 217 LOG(NetworkCache, "(NetworkProcess) not found in storage"); 286 218 … … 291 223 return false; 292 224 } 293 ASSERT(entry->key == storageKey); 294 295 CachedEntryReuseFailure failure = CachedEntryReuseFailure::None; 296 auto decodedEntry = decodeStorageEntry(*entry, originalRequest, failure); 297 bool success = !!decodedEntry; 298 if (m_statistics) 299 m_statistics->recordRetrievedCachedEntry(webPageID, storageKey, originalRequest, failure); 225 226 ASSERT(storageEntry->key == storageKey); 227 228 auto cacheEntry = Entry::decode(*storageEntry); 229 230 auto useDecision = cacheEntry ? canUse(*cacheEntry, originalRequest) : UseDecision::NoDueToDecodeFailure; 231 switch (useDecision) { 232 case UseDecision::Use: 233 break; 234 case UseDecision::Validate: 235 cacheEntry->setNeedsValidation(); 236 break; 237 default: 238 cacheEntry = nullptr; 239 }; 300 240 301 241 #if !LOG_DISABLED 302 242 auto elapsedMS = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - startTime).count(); 303 243 #endif 304 LOG(NetworkCache, "(NetworkProcess) retrieve complete success=%d priority=%u time=%lldms", success, originalRequest.priority(), elapsedMS); 305 completionHandler(WTF::move(decodedEntry)); 306 return success; 244 LOG(NetworkCache, "(NetworkProcess) retrieve complete useDecision=%d priority=%u time=%lldms", useDecision, originalRequest.priority(), elapsedMS); 245 completionHandler(WTF::move(cacheEntry)); 246 247 if (m_statistics) 248 m_statistics->recordRetrievedCachedEntry(webPageID, storageKey, originalRequest, useDecision); 249 return useDecision != UseDecision::NoDueToDecodeFailure; 307 250 }); 308 251 } … … 357 300 } 358 301 359 auto storageEntry = encodeStorageEntry(originalRequest, response, WTF::move(responseData)); 302 Entry cacheEntry(makeCacheKey(originalRequest), response, WTF::move(responseData), collectVaryingRequestHeaders(originalRequest, response)); 303 304 auto storageEntry = cacheEntry.encode(); 360 305 361 306 m_storage->store(storageEntry, [completionHandler](bool success, const Data& bodyData) { … … 374 319 } 375 320 376 void Cache::update(const WebCore::ResourceRequest& originalRequest, const Entry& e ntry, const WebCore::ResourceResponse& validatingResponse)321 void Cache::update(const WebCore::ResourceRequest& originalRequest, const Entry& existingEntry, const WebCore::ResourceResponse& validatingResponse) 377 322 { 378 323 LOG(NetworkCache, "(NetworkProcess) updating %s", originalRequest.url().string().latin1().data()); 379 324 380 WebCore::ResourceResponse response = e ntry.response;325 WebCore::ResourceResponse response = existingEntry.response(); 381 326 WebCore::updateResponseHeadersAfterRevalidation(response, validatingResponse); 382 327 383 auto updateEntry = encodeStorageEntry(originalRequest, response, entry.buffer); 384 385 m_storage->update(updateEntry, entry.storageEntry, [](bool success, const Data&) { 328 Entry updateEntry(existingEntry.key(), response, existingEntry.buffer(), collectVaryingRequestHeaders(originalRequest, response)); 329 330 auto updateStorageEntry = updateEntry.encode(); 331 332 m_storage->update(updateStorageEntry, existingEntry.sourceStorageEntry(), [](bool success, const Data&) { 386 333 LOG(NetworkCache, "(NetworkProcess) updated, success=%d", success); 387 334 }); … … 399 346 ASSERT(isEnabled()); 400 347 401 m_storage->traverse([traverseHandler](const Storage::Entry* entry) {402 if (! entry) {348 m_storage->traverse([traverseHandler](const Storage::Entry* storageEntry) { 349 if (!storageEntry) { 403 350 traverseHandler(nullptr); 404 351 return; 405 352 } 406 353 407 Entry cacheEntry; 408 cacheEntry.storageEntry = *entry; 409 410 Decoder decoder(cacheEntry.storageEntry.header.data(), cacheEntry.storageEntry.header.size()); 411 if (!decoder.decode(cacheEntry.response)) 354 auto cacheEntry = Entry::decode(*storageEntry); 355 if (!cacheEntry) 412 356 return; 413 357 414 traverseHandler( &cacheEntry);358 traverseHandler(cacheEntry.get()); 415 359 }); 416 360 } … … 419 363 { 420 364 return WebCore::pathByAppendingComponent(m_storage->baseDirectoryPath(), "dump.json"); 421 }422 423 static bool entryAsJSON(StringBuilder& json, const Storage::Entry& entry)424 {425 Decoder decoder(entry.header.data(), entry.header.size());426 WebCore::ResourceResponse cachedResponse;427 if (!decoder.decode(cachedResponse))428 return false;429 json.append("{\n");430 json.append("\"hash\": ");431 JSC::appendQuotedJSONStringToBuilder(json, entry.key.hashAsString());432 json.append(",\n");433 json.append("\"partition\": ");434 JSC::appendQuotedJSONStringToBuilder(json, entry.key.partition());435 json.append(",\n");436 json.append("\"timestamp\": ");437 json.appendNumber(entry.timeStamp.count());438 json.append(",\n");439 json.append("\"URL\": ");440 JSC::appendQuotedJSONStringToBuilder(json, cachedResponse.url().string());441 json.append(",\n");442 json.append("\"headers\": {\n");443 bool firstHeader = true;444 for (auto& header : cachedResponse.httpHeaderFields()) {445 if (!firstHeader)446 json.append(",\n");447 firstHeader = false;448 json.append(" ");449 JSC::appendQuotedJSONStringToBuilder(json, header.key);450 json.append(": ");451 JSC::appendQuotedJSONStringToBuilder(json, header.value);452 }453 json.append("\n}\n");454 json.append("}");455 return true;456 365 } 457 366 … … 471 380 return; 472 381 } 382 auto cacheEntry = Entry::decode(*entry); 383 if (!cacheEntry) 384 return; 473 385 StringBuilder json; 474 if (!entryAsJSON(json, *entry)) 475 return; 386 cacheEntry->asJSON(json); 476 387 json.append(",\n"); 477 388 auto writeData = json.toString().utf8(); -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.h
r181756 r181970 29 29 #if ENABLE(NETWORK_CACHE) 30 30 31 #include "NetworkCacheEntry.h" 31 32 #include "NetworkCacheStorage.h" 32 33 #include "ShareableResource.h" … … 55 56 }; 56 57 57 struct Entry {58 Storage::Entry storageEntry;59 WebCore::ResourceResponse response;60 RefPtr<WebCore::SharedBuffer> buffer;61 #if ENABLE(SHAREABLE_RESOURCE)62 ShareableResource::Handle shareableResourceHandle;63 #endif64 bool needsRevalidation;65 };66 67 58 enum class RetrieveDecision { 68 59 Yes, … … 81 72 }; 82 73 83 enum class CachedEntryReuseFailure { 84 None, 85 VaryingHeaderMismatch, 86 MissingValidatorFields, 87 Other, 74 enum class UseDecision { 75 Use, 76 Validate, 77 NoDueToVaryingHeaderMismatch, 78 NoDueToMissingValidatorFields, 79 NoDueToDecodeFailure, 88 80 }; 89 81 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStatistics.h
r181689 r181970 52 52 void recordNotUsingCacheForRequest(uint64_t webPageID, const Key&, const WebCore::ResourceRequest&, RetrieveDecision); 53 53 void recordRetrievalFailure(uint64_t webPageID, const Key&, const WebCore::ResourceRequest&); 54 void recordRetrievedCachedEntry(uint64_t webPageID, const Key&, const WebCore::ResourceRequest&, CachedEntryReuseFailure);54 void recordRetrievedCachedEntry(uint64_t webPageID, const Key&, const WebCore::ResourceRequest&, UseDecision); 55 55 56 56 private: -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStatisticsCocoa.mm
r181702 r181970 263 263 } 264 264 265 static String cachedEntryReuseFailureToDiagnosticKey( CachedEntryReuseFailure failure)266 { 267 switch ( failure) {268 case CachedEntryReuseFailure::VaryingHeaderMismatch:265 static String cachedEntryReuseFailureToDiagnosticKey(UseDecision decision) 266 { 267 switch (decision) { 268 case UseDecision::NoDueToVaryingHeaderMismatch: 269 269 return WebCore::DiagnosticLoggingKeys::varyingHeaderMismatchKey(); 270 case CachedEntryReuseFailure::MissingValidatorFields:270 case UseDecision::NoDueToMissingValidatorFields: 271 271 return WebCore::DiagnosticLoggingKeys::missingValidatorFieldsKey(); 272 case CachedEntryReuseFailure::Other:272 case UseDecision::NoDueToDecodeFailure: 273 273 return WebCore::DiagnosticLoggingKeys::otherKey(); 274 case CachedEntryReuseFailure::None: 274 case UseDecision::Use: 275 case UseDecision::Validate: 275 276 ASSERT_NOT_REACHED(); 276 277 break; … … 279 280 } 280 281 281 void Statistics::recordRetrievedCachedEntry(uint64_t webPageID, const Key& key, const WebCore::ResourceRequest& request, CachedEntryReuseFailure failure)282 void Statistics::recordRetrievedCachedEntry(uint64_t webPageID, const Key& key, const WebCore::ResourceRequest& request, UseDecision decision) 282 283 { 283 284 WebCore::URL requestURL = request.url(); 284 if ( failure == CachedEntryReuseFailure::None) {285 if (decision == UseDecision::Use || decision == UseDecision::Validate) { 285 286 LOG(NetworkCache, "(NetworkProcess) webPageID %llu: %s is in the cache and is used", webPageID, requestURL.string().ascii().data()); 286 287 NetworkProcess::singleton().logDiagnosticMessageWithResult(webPageID, WebCore::DiagnosticLoggingKeys::networkCacheKey(), WebCore::DiagnosticLoggingKeys::retrievalKey(), WebCore::DiagnosticLoggingResultPass, WebCore::ShouldSample::Yes); … … 288 289 } 289 290 290 String diagnosticKey = cachedEntryReuseFailureToDiagnosticKey( failure);291 String diagnosticKey = cachedEntryReuseFailureToDiagnosticKey(decision); 291 292 LOG(NetworkCache, "(NetworkProcess) webPageID %llu: %s is in the cache but wasn't used, reason: %s", webPageID, requestURL.string().ascii().data(), diagnosticKey.utf8().data()); 292 293 NetworkProcess::singleton().logDiagnosticMessageWithValue(webPageID, WebCore::DiagnosticLoggingKeys::networkCacheKey(), WebCore::DiagnosticLoggingKeys::unusableCachedEntryKey(), diagnosticKey, WebCore::ShouldSample::Yes); -
trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj
r181777 r181970 1767 1767 E1EE53E311F8CFC000CCBEE4 /* InjectedBundlePageEditorClient.h in Headers */ = {isa = PBXBuildFile; fileRef = E1EE53DC11F8CF9F00CCBEE4 /* InjectedBundlePageEditorClient.h */; }; 1768 1768 E1EE53E711F8CFFB00CCBEE4 /* InjectedBundlePageEditorClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E1EE53E611F8CFFB00CCBEE4 /* InjectedBundlePageEditorClient.cpp */; }; 1769 E413F59D1AC1ADC400345360 /* NetworkCacheEntry.h in Headers */ = {isa = PBXBuildFile; fileRef = E413F59B1AC1ADB600345360 /* NetworkCacheEntry.h */; }; 1770 E413F59F1AC1AF9D00345360 /* NetworkCacheEntry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E413F59E1AC1AF9D00345360 /* NetworkCacheEntry.cpp */; }; 1769 1771 E42E060F1AA7523400B11699 /* NetworkCacheIOChannelCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = E42E060D1AA750E500B11699 /* NetworkCacheIOChannelCocoa.mm */; }; 1770 1772 E42E06101AA7523B00B11699 /* NetworkCacheIOChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = E42E060B1AA7440D00B11699 /* NetworkCacheIOChannel.h */; }; … … 4016 4018 E1FEF39A190F76F300731658 /* com.apple.WebKit.Databases.sb.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = com.apple.WebKit.Databases.sb.in; sourceTree = "<group>"; }; 4017 4019 E1FEF39C190F791C00731658 /* DatabaseProcessIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DatabaseProcessIOS.mm; sourceTree = "<group>"; }; 4020 E413F59B1AC1ADB600345360 /* NetworkCacheEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCacheEntry.h; sourceTree = "<group>"; }; 4021 E413F59E1AC1AF9D00345360 /* NetworkCacheEntry.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkCacheEntry.cpp; sourceTree = "<group>"; }; 4018 4022 E42E060B1AA7440D00B11699 /* NetworkCacheIOChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCacheIOChannel.h; sourceTree = "<group>"; }; 4019 4023 E42E060D1AA750E500B11699 /* NetworkCacheIOChannelCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NetworkCacheIOChannelCocoa.mm; sourceTree = "<group>"; }; … … 7471 7475 E489D2881A0A2DB80078C06A /* NetworkCacheEncoder.cpp */, 7472 7476 E489D2891A0A2DB80078C06A /* NetworkCacheEncoder.h */, 7477 E413F59E1AC1AF9D00345360 /* NetworkCacheEntry.cpp */, 7478 E413F59B1AC1ADB600345360 /* NetworkCacheEntry.h */, 7473 7479 834B250E1A831A8D00CFB150 /* NetworkCacheFileSystemPosix.h */, 7474 7480 E42E060B1AA7440D00B11699 /* NetworkCacheIOChannel.h */, … … 7830 7836 7CD622781739D863005BD7FF /* PluginSandboxProfile.h in Headers */, 7831 7837 1A6FB7AF11E64B6800DB1371 /* PluginView.h in Headers */, 7838 E413F59D1AC1ADC400345360 /* NetworkCacheEntry.h in Headers */, 7832 7839 E1CC1B9012D7EADF00625838 /* PrintInfo.h in Headers */, 7833 7840 86F9536518FF58F5001DB2EF /* ProcessAssertion.h in Headers */, … … 9384 9391 BC82837B16B36A4F00A278FE /* ChildProcessEntryPoint.mm in Sources */, 9385 9392 A7E93CED1925331100A1DC48 /* ChildProcessIOS.mm in Sources */, 9393 E413F59F1AC1AF9D00345360 /* NetworkCacheEntry.cpp in Sources */, 9386 9394 9F54F88F16488E87007DF81A /* ChildProcessMac.mm in Sources */, 9387 9395 E1513C66166EABB200149FCB /* ChildProcessProxy.cpp in Sources */,
Note: See TracChangeset
for help on using the changeset viewer.