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

Side by Side Diff: Source/core/fetch/ResourceFetcher.cpp

Issue 23734006: Add histograms to ResourceFetcher to measure memory cache hit rate. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix clang build (by adding missing switch case) Created 7 years, 3 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
« Source/core/fetch/Resource.h ('K') | « Source/core/fetch/Resource.h ('k') | no next file » | 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) 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) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ 6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 #include "core/loader/FrameLoaderClient.h" 52 #include "core/loader/FrameLoaderClient.h"
53 #include "core/loader/PingLoader.h" 53 #include "core/loader/PingLoader.h"
54 #include "core/loader/UniqueIdentifier.h" 54 #include "core/loader/UniqueIdentifier.h"
55 #include "core/loader/appcache/ApplicationCacheHost.h" 55 #include "core/loader/appcache/ApplicationCacheHost.h"
56 #include "core/page/ContentSecurityPolicy.h" 56 #include "core/page/ContentSecurityPolicy.h"
57 #include "core/page/DOMWindow.h" 57 #include "core/page/DOMWindow.h"
58 #include "core/page/Frame.h" 58 #include "core/page/Frame.h"
59 #include "core/page/Performance.h" 59 #include "core/page/Performance.h"
60 #include "core/page/ResourceTimingInfo.h" 60 #include "core/page/ResourceTimingInfo.h"
61 #include "core/page/Settings.h" 61 #include "core/page/Settings.h"
62 #include "core/platform/HistogramSupport.h"
62 #include "core/platform/Logging.h" 63 #include "core/platform/Logging.h"
63 #include "core/platform/chromium/TraceEvent.h" 64 #include "core/platform/chromium/TraceEvent.h"
64 #include "public/platform/Platform.h" 65 #include "public/platform/Platform.h"
65 #include "public/platform/WebURL.h" 66 #include "public/platform/WebURL.h"
66 #include "weborigin/SecurityOrigin.h" 67 #include "weborigin/SecurityOrigin.h"
67 #include "weborigin/SecurityPolicy.h" 68 #include "weborigin/SecurityPolicy.h"
68 #include "wtf/text/CString.h" 69 #include "wtf/text/CString.h"
69 #include "wtf/text/WTFString.h" 70 #include "wtf/text/WTFString.h"
70 71
71 #define PRELOAD_DEBUG 0 72 #define PRELOAD_DEBUG 0
72 73
73 namespace WebCore { 74 namespace WebCore {
74 75
75 static Resource* createResource(Resource::Type type, const ResourceRequest& requ est, const String& charset) 76 namespace {
77
78 enum ActionUponResourceRequest {
79 LoadResource,
80 RevalidateResource,
81 UseResourceFromCache,
82 NumberOfResourceRequestActions = 3,
abarth-chromium 2013/09/16 21:04:35 ditto
Philippe 2013/09/17 08:37:50 Done.
83 };
84
85 Resource* createResource(Resource::Type type, const ResourceRequest& request, co nst String& charset)
76 { 86 {
77 switch (type) { 87 switch (type) {
78 case Resource::Image: 88 case Resource::Image:
79 return new ImageResource(request); 89 return new ImageResource(request);
80 case Resource::CSSStyleSheet: 90 case Resource::CSSStyleSheet:
81 return new CSSStyleSheetResource(request, charset); 91 return new CSSStyleSheetResource(request, charset);
82 case Resource::Script: 92 case Resource::Script:
83 return new ScriptResource(request, charset); 93 return new ScriptResource(request, charset);
84 case Resource::SVGDocument: 94 case Resource::SVGDocument:
85 return new DocumentResource(request, Resource::SVGDocument); 95 return new DocumentResource(request, Resource::SVGDocument);
86 case Resource::Font: 96 case Resource::Font:
87 return new FontResource(request); 97 return new FontResource(request);
88 case Resource::Raw: 98 case Resource::Raw:
89 case Resource::MainResource: 99 case Resource::MainResource:
90 return new RawResource(request, type); 100 return new RawResource(request, type);
91 case Resource::XSLStyleSheet: 101 case Resource::XSLStyleSheet:
92 return new XSLStyleSheetResource(request); 102 return new XSLStyleSheetResource(request);
93 case Resource::LinkPrefetch: 103 case Resource::LinkPrefetch:
94 return new Resource(request, Resource::LinkPrefetch); 104 return new Resource(request, Resource::LinkPrefetch);
95 case Resource::LinkSubresource: 105 case Resource::LinkSubresource:
96 return new Resource(request, Resource::LinkSubresource); 106 return new Resource(request, Resource::LinkSubresource);
97 case Resource::TextTrack: 107 case Resource::TextTrack:
98 return new TextTrackResource(request); 108 return new TextTrackResource(request);
99 case Resource::Shader: 109 case Resource::Shader:
100 return new ShaderResource(request); 110 return new ShaderResource(request);
101 case Resource::ImportResource: 111 case Resource::ImportResource:
102 return new RawResource(request, type); 112 return new RawResource(request, type);
113 case Resource::NumberOfTypes:
114 ASSERT_NOT_REACHED();
103 } 115 }
104 116
105 ASSERT_NOT_REACHED(); 117 ASSERT_NOT_REACHED();
106 return 0; 118 return 0;
107 } 119 }
108 120
109 static ResourceLoadPriority loadPriority(Resource::Type type, const FetchRequest & request) 121 ResourceLoadPriority loadPriority(Resource::Type type, const FetchRequest& reque st)
110 { 122 {
111 if (request.priority() != ResourceLoadPriorityUnresolved) 123 if (request.priority() != ResourceLoadPriorityUnresolved)
112 return request.priority(); 124 return request.priority();
113 125
114 switch (type) { 126 switch (type) {
115 case Resource::MainResource: 127 case Resource::MainResource:
116 return ResourceLoadPriorityVeryHigh; 128 return ResourceLoadPriorityVeryHigh;
117 case Resource::CSSStyleSheet: 129 case Resource::CSSStyleSheet:
118 return ResourceLoadPriorityHigh; 130 return ResourceLoadPriorityHigh;
119 case Resource::Script: 131 case Resource::Script:
120 case Resource::Font: 132 case Resource::Font:
121 case Resource::Raw: 133 case Resource::Raw:
122 case Resource::ImportResource: 134 case Resource::ImportResource:
123 return ResourceLoadPriorityMedium; 135 return ResourceLoadPriorityMedium;
124 case Resource::Image: 136 case Resource::Image:
125 return request.forPreload() ? ResourceLoadPriorityVeryLow : ResourceLoad PriorityLow; 137 return request.forPreload() ? ResourceLoadPriorityVeryLow : ResourceLoad PriorityLow;
126 case Resource::XSLStyleSheet: 138 case Resource::XSLStyleSheet:
127 return ResourceLoadPriorityHigh; 139 return ResourceLoadPriorityHigh;
128 case Resource::SVGDocument: 140 case Resource::SVGDocument:
129 return ResourceLoadPriorityLow; 141 return ResourceLoadPriorityLow;
130 case Resource::LinkPrefetch: 142 case Resource::LinkPrefetch:
131 return ResourceLoadPriorityVeryLow; 143 return ResourceLoadPriorityVeryLow;
132 case Resource::LinkSubresource: 144 case Resource::LinkSubresource:
133 return ResourceLoadPriorityLow; 145 return ResourceLoadPriorityLow;
134 case Resource::TextTrack: 146 case Resource::TextTrack:
135 return ResourceLoadPriorityLow; 147 return ResourceLoadPriorityLow;
136 case Resource::Shader: 148 case Resource::Shader:
137 return ResourceLoadPriorityMedium; 149 return ResourceLoadPriorityMedium;
150 case Resource::NumberOfTypes:
151 ASSERT_NOT_REACHED();
abarth-chromium 2013/09/16 21:04:35 That's pretty ugly.
Philippe 2013/09/17 08:37:50 Yeah I know :) I didn't want to make this a defaul
138 } 152 }
139 ASSERT_NOT_REACHED(); 153 ASSERT_NOT_REACHED();
140 return ResourceLoadPriorityUnresolved; 154 return ResourceLoadPriorityUnresolved;
141 } 155 }
142 156
143 static Resource* resourceFromDataURIRequest(const ResourceRequest& request) 157 Resource* resourceFromDataURIRequest(const ResourceRequest& request)
144 { 158 {
145 const KURL& url = request.url(); 159 const KURL& url = request.url();
146 ASSERT(url.protocolIsData()); 160 ASSERT(url.protocolIsData());
147 161
148 WebKit::WebString mimetype; 162 WebKit::WebString mimetype;
149 WebKit::WebString charset; 163 WebKit::WebString charset;
150 RefPtr<SharedBuffer> data = PassRefPtr<SharedBuffer>(WebKit::Platform::curre nt()->parseDataURL(url, mimetype, charset)); 164 RefPtr<SharedBuffer> data = PassRefPtr<SharedBuffer>(WebKit::Platform::curre nt()->parseDataURL(url, mimetype, charset));
151 if (!data) 165 if (!data)
152 return 0; 166 return 0;
153 ResourceResponse response(url, mimetype, data->size(), charset, String()); 167 ResourceResponse response(url, mimetype, data->size(), charset, String());
154 168
155 Resource* resource = createResource(Resource::Image, request, charset); 169 Resource* resource = createResource(Resource::Image, request, charset);
156 resource->responseReceived(response); 170 resource->responseReceived(response);
157 // FIXME: AppendData causes an unnecessary memcpy. 171 // FIXME: AppendData causes an unnecessary memcpy.
158 if (data->size()) 172 if (data->size())
159 resource->appendData(data->data(), data->size()); 173 resource->appendData(data->data(), data->size());
160 resource->finish(); 174 resource->finish();
161 return resource; 175 return resource;
162 } 176 }
163 177
178 } // namespace
179
164 ResourceFetcher::ResourceFetcher(DocumentLoader* documentLoader) 180 ResourceFetcher::ResourceFetcher(DocumentLoader* documentLoader)
165 : m_document(0) 181 : m_document(0)
166 , m_documentLoader(documentLoader) 182 , m_documentLoader(documentLoader)
167 , m_requestCount(0) 183 , m_requestCount(0)
168 , m_garbageCollectDocumentResourcesTimer(this, &ResourceFetcher::garbageColl ectDocumentResourcesTimerFired) 184 , m_garbageCollectDocumentResourcesTimer(this, &ResourceFetcher::garbageColl ectDocumentResourcesTimerFired)
169 , m_autoLoadImages(true) 185 , m_autoLoadImages(true)
170 , m_imagesEnabled(true) 186 , m_imagesEnabled(true)
171 , m_allowStaleResources(false) 187 , m_allowStaleResources(false)
172 { 188 {
173 } 189 }
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 // These resources can corrupt only the frame's pixels. 366 // These resources can corrupt only the frame's pixels.
351 treatment = TreatAsPassiveContent; 367 treatment = TreatAsPassiveContent;
352 break; 368 break;
353 369
354 case Resource::MainResource: 370 case Resource::MainResource:
355 case Resource::LinkPrefetch: 371 case Resource::LinkPrefetch:
356 case Resource::LinkSubresource: 372 case Resource::LinkSubresource:
357 // These cannot affect the current document. 373 // These cannot affect the current document.
358 treatment = TreatAsAlwaysAllowedContent; 374 treatment = TreatAsAlwaysAllowedContent;
359 break; 375 break;
376 case Resource::NumberOfTypes:
377 ASSERT_NOT_REACHED();
360 } 378 }
361 } 379 }
362 if (treatment == TreatAsActiveContent) { 380 if (treatment == TreatAsActiveContent) {
363 if (Frame* f = frame()) { 381 if (Frame* f = frame()) {
364 if (!f->loader()->mixedContentChecker()->canRunInsecureContent(m_doc ument->securityOrigin(), url)) 382 if (!f->loader()->mixedContentChecker()->canRunInsecureContent(m_doc ument->securityOrigin(), url))
365 return false; 383 return false;
366 } 384 }
367 } else if (treatment == TreatAsPassiveContent) { 385 } else if (treatment == TreatAsPassiveContent) {
368 if (Frame* f = frame()) { 386 if (Frame* f = frame()) {
369 Frame* top = f->tree()->top(); 387 Frame* top = f->tree()->top();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 return false; 428 return false;
411 } 429 }
412 break; 430 break;
413 case Resource::SVGDocument: 431 case Resource::SVGDocument:
414 case Resource::XSLStyleSheet: 432 case Resource::XSLStyleSheet:
415 if (!m_document->securityOrigin()->canRequest(url)) { 433 if (!m_document->securityOrigin()->canRequest(url)) {
416 printAccessDeniedMessage(url); 434 printAccessDeniedMessage(url);
417 return false; 435 return false;
418 } 436 }
419 break; 437 break;
438 case Resource::NumberOfTypes:
439 ASSERT_NOT_REACHED();
420 } 440 }
421 441
422 switch (type) { 442 switch (type) {
423 case Resource::XSLStyleSheet: 443 case Resource::XSLStyleSheet:
424 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS ecurityPolicy()->allowScriptFromSource(url)) 444 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS ecurityPolicy()->allowScriptFromSource(url))
425 return false; 445 return false;
426 break; 446 break;
427 case Resource::Script: 447 case Resource::Script:
428 case Resource::ImportResource: 448 case Resource::ImportResource:
429 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS ecurityPolicy()->allowScriptFromSource(url)) 449 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS ecurityPolicy()->allowScriptFromSource(url))
(...skipping 27 matching lines...) Expand all
457 case Resource::Raw: 477 case Resource::Raw:
458 case Resource::LinkPrefetch: 478 case Resource::LinkPrefetch:
459 case Resource::LinkSubresource: 479 case Resource::LinkSubresource:
460 break; 480 break;
461 case Resource::TextTrack: 481 case Resource::TextTrack:
462 // Cues aren't called out in the CPS spec yet, but they only work with a media element 482 // Cues aren't called out in the CPS spec yet, but they only work with a media element
463 // so use the media policy. 483 // so use the media policy.
464 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS ecurityPolicy()->allowMediaFromSource(url)) 484 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS ecurityPolicy()->allowMediaFromSource(url))
465 return false; 485 return false;
466 break; 486 break;
487 case Resource::NumberOfTypes:
488 ASSERT_NOT_REACHED();
467 } 489 }
468 490
469 // Last of all, check for insecure content. We do this last so that when 491 // Last of all, check for insecure content. We do this last so that when
470 // folks block insecure content with a CSP policy, they don't get a warning. 492 // folks block insecure content with a CSP policy, they don't get a warning.
471 // They'll still get a warning in the console about CSP blocking the load. 493 // They'll still get a warning in the console about CSP blocking the load.
472 494
473 // FIXME: Should we consider forPreload here? 495 // FIXME: Should we consider forPreload here?
474 if (!checkInsecureContent(type, url, options.mixedContentBlockingTreatment)) 496 if (!checkInsecureContent(type, url, options.mixedContentBlockingTreatment))
475 return false; 497 return false;
476 498
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 // See if we can use an existing resource from the cache. 556 // See if we can use an existing resource from the cache.
535 ResourcePtr<Resource> resource = memoryCache()->resourceForURL(url); 557 ResourcePtr<Resource> resource = memoryCache()->resourceForURL(url);
536 558
537 const RevalidationPolicy policy = determineRevalidationPolicy(type, request. mutableResourceRequest(), request.forPreload(), resource.get(), request.defer()) ; 559 const RevalidationPolicy policy = determineRevalidationPolicy(type, request. mutableResourceRequest(), request.forPreload(), resource.get(), request.defer()) ;
538 switch (policy) { 560 switch (policy) {
539 case Reload: 561 case Reload:
540 memoryCache()->remove(resource.get()); 562 memoryCache()->remove(resource.get());
541 // Fall through 563 // Fall through
542 case Load: 564 case Load:
543 resource = loadResource(type, request, request.charset()); 565 resource = loadResource(type, request, request.charset());
566 HistogramSupport::histogramEnumeration(
567 "WebCore.ResourceFetcher.ActionUponResourceRequest", LoadResource,
568 NumberOfResourceRequestActions);
544 break; 569 break;
545 case Revalidate: 570 case Revalidate:
546 resource = revalidateResource(request, resource.get()); 571 resource = revalidateResource(request, resource.get());
572 HistogramSupport::histogramEnumeration(
573 "WebCore.ResourceFetcher.ActionUponResourceRequest", RevalidateResou rce,
574 NumberOfResourceRequestActions);
547 break; 575 break;
548 case Use: 576 case Use:
549 resource->updateForAccess(); 577 resource->updateForAccess();
550 notifyLoadedFromMemoryCache(resource.get()); 578 notifyLoadedFromMemoryCache(resource.get());
579 HistogramSupport::histogramEnumeration(
580 "WebCore.ResourceFetcher.ActionUponResourceRequest", UseResourceFrom Cache,
581 NumberOfResourceRequestActions);
582 HistogramSupport::histogramEnumeration(
583 "WebCore.ResourceFetcher.ResourceHasClientUponCacheHit", resource->h asClients(), 2);
584 HistogramSupport::histogramEnumeration(
585 "WebCore.ResourceFetcher.ResourceTypeUponCacheHit", resource->type() ,
586 Resource::NumberOfTypes);
551 break; 587 break;
552 } 588 }
553 589
554 if (!resource) 590 if (!resource)
555 return 0; 591 return 0;
556 592
557 if (policy != Use) 593 if (policy != Use)
558 resource->setIdentifier(createUniqueIdentifier()); 594 resource->setIdentifier(createUniqueIdentifier());
559 595
560 if (!request.forPreload() || policy != Use) { 596 if (!request.forPreload() || policy != Use) {
(...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after
1310 } 1346 }
1311 #endif 1347 #endif
1312 1348
1313 const ResourceLoaderOptions& ResourceFetcher::defaultResourceOptions() 1349 const ResourceLoaderOptions& ResourceFetcher::defaultResourceOptions()
1314 { 1350 {
1315 DEFINE_STATIC_LOCAL(ResourceLoaderOptions, options, (SendCallbacks, SniffCon tent, BufferData, AllowStoredCredentials, ClientRequestedCredentials, AskClientF orCrossOriginCredentials, DoSecurityCheck, CheckContentSecurityPolicy, UseDefaul tOriginRestrictionsForType, DocumentContext)); 1351 DEFINE_STATIC_LOCAL(ResourceLoaderOptions, options, (SendCallbacks, SniffCon tent, BufferData, AllowStoredCredentials, ClientRequestedCredentials, AskClientF orCrossOriginCredentials, DoSecurityCheck, CheckContentSecurityPolicy, UseDefaul tOriginRestrictionsForType, DocumentContext));
1316 return options; 1352 return options;
1317 } 1353 }
1318 1354
1319 } 1355 }
OLDNEW
« Source/core/fetch/Resource.h ('K') | « Source/core/fetch/Resource.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698