Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 #include "modules/cachestorage/InspectorCacheStorageAgent.h" | 6 #include "modules/cachestorage/InspectorCacheStorageAgent.h" |
| 7 | 7 |
| 8 #include "core/InspectorBackendDispatcher.h" | 8 #include "core/InspectorBackendDispatcher.h" |
| 9 #include "core/InspectorTypeBuilder.h" | 9 #include "core/InspectorTypeBuilder.h" |
| 10 #include "core/dom/Document.h" | |
| 11 #include "core/dom/ExecutionContext.h" | |
| 12 #include "core/frame/Frame.h" | |
| 13 #include "core/page/Page.h" | |
| 14 #include "modules/cachestorage/CacheStorage.h" | |
| 10 #include "platform/JSONValues.h" | 15 #include "platform/JSONValues.h" |
| 11 #include "platform/heap/Handle.h" | 16 #include "platform/heap/Handle.h" |
| 12 #include "platform/weborigin/DatabaseIdentifier.h" | 17 #include "platform/weborigin/DatabaseIdentifier.h" |
| 13 #include "platform/weborigin/KURL.h" | 18 #include "platform/weborigin/KURL.h" |
| 14 #include "platform/weborigin/SecurityOrigin.h" | 19 #include "platform/weborigin/SecurityOrigin.h" |
| 15 #include "public/platform/Platform.h" | 20 #include "public/platform/Platform.h" |
| 16 #include "public/platform/WebServiceWorkerCache.h" | 21 #include "public/platform/WebServiceWorkerCache.h" |
| 17 #include "public/platform/WebServiceWorkerCacheError.h" | 22 #include "public/platform/WebServiceWorkerCacheError.h" |
| 18 #include "public/platform/WebServiceWorkerCacheStorage.h" | 23 #include "public/platform/WebServiceWorkerCacheStorage.h" |
| 19 #include "public/platform/WebServiceWorkerRequest.h" | 24 #include "public/platform/WebServiceWorkerRequest.h" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 59 size_t pipe = id.find('|'); | 64 size_t pipe = id.find('|'); |
| 60 if (pipe == WTF::kNotFound) { | 65 if (pipe == WTF::kNotFound) { |
| 61 *errorString = "Invalid cache id."; | 66 *errorString = "Invalid cache id."; |
| 62 return false; | 67 return false; |
| 63 } | 68 } |
| 64 *securityOrigin = id.substring(0, pipe); | 69 *securityOrigin = id.substring(0, pipe); |
| 65 *cacheName = id.substring(pipe + 1); | 70 *cacheName = id.substring(pipe + 1); |
| 66 return true; | 71 return true; |
| 67 } | 72 } |
| 68 | 73 |
| 69 PassOwnPtr<WebServiceWorkerCacheStorage> assertCacheStorage(ErrorString* errorSt ring, const String& securityOrigin) | |
| 70 { | |
| 71 RefPtr<SecurityOrigin> secOrigin = SecurityOrigin::createFromString(security Origin); | |
| 72 String identifier = createDatabaseIdentifierFromSecurityOrigin(secOrigin.get ()); | |
| 73 OwnPtr<WebServiceWorkerCacheStorage> cache = adoptPtr(Platform::current()->c acheStorage(identifier)); | |
| 74 if (!cache) | |
| 75 *errorString = "Could not find cache storage."; | |
| 76 return cache.release(); | |
| 77 } | |
| 78 | |
| 79 PassOwnPtr<WebServiceWorkerCacheStorage> assertCacheStorageAndNameForId(ErrorStr ing* errorString, const String& cacheId, String* cacheName) | |
| 80 { | |
| 81 String securityOrigin; | |
| 82 if (!parseCacheId(errorString, cacheId, &securityOrigin, cacheName)) { | |
| 83 return nullptr; | |
| 84 } | |
| 85 return assertCacheStorage(errorString, securityOrigin); | |
| 86 } | |
| 87 | |
| 88 CString serviceWorkerCacheErrorString(WebServiceWorkerCacheError* error) | 74 CString serviceWorkerCacheErrorString(WebServiceWorkerCacheError* error) |
| 89 { | 75 { |
| 90 switch (*error) { | 76 switch (*error) { |
| 91 case WebServiceWorkerCacheErrorNotImplemented: | 77 case WebServiceWorkerCacheErrorNotImplemented: |
| 92 return CString("not implemented."); | 78 return CString("not implemented."); |
| 93 break; | 79 break; |
| 94 case WebServiceWorkerCacheErrorNotFound: | 80 case WebServiceWorkerCacheErrorNotFound: |
| 95 return CString("not found."); | 81 return CString("not found."); |
| 96 break; | 82 break; |
| 97 case WebServiceWorkerCacheErrorExists: | 83 case WebServiceWorkerCacheErrorExists: |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 111 RequestCacheNames(const String& securityOrigin, PassRefPtrWillBeRawPtr<Reque stCacheNamesCallback> callback) | 97 RequestCacheNames(const String& securityOrigin, PassRefPtrWillBeRawPtr<Reque stCacheNamesCallback> callback) |
| 112 : m_securityOrigin(securityOrigin) | 98 : m_securityOrigin(securityOrigin) |
| 113 , m_callback(callback) | 99 , m_callback(callback) |
| 114 { | 100 { |
| 115 } | 101 } |
| 116 | 102 |
| 117 ~RequestCacheNames() override { } | 103 ~RequestCacheNames() override { } |
| 118 | 104 |
| 119 void onSuccess(WebVector<WebString>* caches) | 105 void onSuccess(WebVector<WebString>* caches) |
| 120 { | 106 { |
| 121 RefPtr<Array<Cache>> array = Array<Cache>::create(); | 107 RefPtr<Array<TypeBuilder::CacheStorage::Cache>> array = Array<TypeBuilde r::CacheStorage::Cache>::create(); |
| 122 for (size_t i = 0; i < caches->size(); i++) { | 108 for (size_t i = 0; i < caches->size(); i++) { |
| 123 String name = String((*caches)[i]); | 109 String name = String((*caches)[i]); |
| 124 RefPtr<Cache> entry = Cache::create() | 110 RefPtr<TypeBuilder::CacheStorage::Cache> entry = TypeBuilder::CacheS torage::Cache::create() |
| 125 .setSecurityOrigin(m_securityOrigin) | 111 .setSecurityOrigin(m_securityOrigin) |
| 126 .setCacheName(name) | 112 .setCacheName(name) |
| 127 .setCacheId(buildCacheId(m_securityOrigin, name)); | 113 .setCacheId(buildCacheId(m_securityOrigin, name)); |
| 128 array->addItem(entry); | 114 array->addItem(entry); |
| 129 } | 115 } |
| 130 m_callback->sendSuccess(array); | 116 m_callback->sendSuccess(array); |
| 131 } | 117 } |
| 132 | 118 |
| 133 void onError(WebServiceWorkerCacheError* error) | 119 void onError(WebServiceWorkerCacheError* error) |
| 134 { | 120 { |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 385 } | 371 } |
| 386 | 372 |
| 387 private: | 373 private: |
| 388 String m_requestSpec; | 374 String m_requestSpec; |
| 389 String m_cacheName; | 375 String m_cacheName; |
| 390 RefPtrWillBePersistent<DeleteEntryCallback> m_callback; | 376 RefPtrWillBePersistent<DeleteEntryCallback> m_callback; |
| 391 }; | 377 }; |
| 392 | 378 |
| 393 } // namespace | 379 } // namespace |
| 394 | 380 |
| 395 InspectorCacheStorageAgent::InspectorCacheStorageAgent() | 381 InspectorCacheStorageAgent::InspectorCacheStorageAgent(Page* page) |
| 396 : InspectorBaseAgent<InspectorCacheStorageAgent, InspectorFrontend::CacheSto rage>("CacheStorage") | 382 : InspectorBaseAgent<InspectorCacheStorageAgent, InspectorFrontend::CacheSto rage>("CacheStorage") |
| 383 , m_page(page) | |
| 397 { | 384 { |
| 398 } | 385 } |
| 399 | 386 |
| 400 InspectorCacheStorageAgent::~InspectorCacheStorageAgent() { } | 387 InspectorCacheStorageAgent::~InspectorCacheStorageAgent() { } |
| 401 | 388 |
| 402 DEFINE_TRACE(InspectorCacheStorageAgent) | 389 DEFINE_TRACE(InspectorCacheStorageAgent) |
| 403 { | 390 { |
| 404 InspectorBaseAgent::trace(visitor); | 391 InspectorBaseAgent::trace(visitor); |
| 405 } | 392 } |
| 406 | 393 |
| 407 void InspectorCacheStorageAgent::requestCacheNames(ErrorString* errorString, con st String& securityOrigin, PassRefPtrWillBeRawPtr<RequestCacheNamesCallback> cal lback) | 394 void InspectorCacheStorageAgent::requestCacheNames(ErrorString* errorString, con st String& securityOrigin, PassRefPtrWillBeRawPtr<RequestCacheNamesCallback> cal lback) |
| 408 { | 395 { |
| 396 RefPtr<SecurityOrigin> secOrigin = SecurityOrigin::createFromString(security Origin); | |
| 397 ExecutionContext* executionContext = assertExecutionContextForOrigin(errorSt ring, secOrigin.get()); | |
| 398 if (!executionContext) { | |
| 399 callback->sendFailure(*errorString); | |
| 400 return; | |
| 401 } | |
| 402 | |
| 403 if (!CacheStorage::canAccessCacheStorage(executionContext)) { | |
|
pfeldman
2015/08/03 23:53:49
Inspector should have access to everything, but we
jsbell
2015/08/04 00:14:53
Implicitly, entries won't exist if the page doesn'
| |
| 404 // Don't treat this as an error, just don't attempt to open and enumerat e the caches. | |
| 405 callback->sendSuccess(Array<TypeBuilder::CacheStorage::Cache>::create()) ; | |
| 406 return; | |
| 407 } | |
| 408 | |
| 409 OwnPtr<WebServiceWorkerCacheStorage> cache = assertCacheStorage(errorString, securityOrigin); | 409 OwnPtr<WebServiceWorkerCacheStorage> cache = assertCacheStorage(errorString, securityOrigin); |
| 410 if (!cache) { | 410 if (!cache) { |
| 411 callback->sendFailure(*errorString); | 411 callback->sendFailure(*errorString); |
| 412 return; | 412 return; |
| 413 } | 413 } |
| 414 cache->dispatchKeys(new RequestCacheNames(securityOrigin, callback)); | 414 cache->dispatchKeys(new RequestCacheNames(securityOrigin, callback)); |
| 415 } | 415 } |
| 416 | 416 |
| 417 void InspectorCacheStorageAgent::requestEntries(ErrorString* errorString, const String& cacheId, int skipCount, int pageSize, PassRefPtrWillBeRawPtr<RequestEntr iesCallback> callback) | 417 void InspectorCacheStorageAgent::requestEntries(ErrorString* errorString, const String& cacheId, int skipCount, int pageSize, PassRefPtrWillBeRawPtr<RequestEntr iesCallback> callback) |
| 418 { | 418 { |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 444 { | 444 { |
| 445 String cacheName; | 445 String cacheName; |
| 446 OwnPtr<WebServiceWorkerCacheStorage> cache = assertCacheStorageAndNameForId( errorString, cacheId, &cacheName); | 446 OwnPtr<WebServiceWorkerCacheStorage> cache = assertCacheStorageAndNameForId( errorString, cacheId, &cacheName); |
| 447 if (!cache) { | 447 if (!cache) { |
| 448 callback->sendFailure(*errorString); | 448 callback->sendFailure(*errorString); |
| 449 return; | 449 return; |
| 450 } | 450 } |
| 451 cache->dispatchOpen(new GetCacheForDeleteEntry(request, cacheName, callback) , WebString(cacheName)); | 451 cache->dispatchOpen(new GetCacheForDeleteEntry(request, cacheName, callback) , WebString(cacheName)); |
| 452 } | 452 } |
| 453 | 453 |
| 454 ExecutionContext* InspectorCacheStorageAgent::assertExecutionContextForOrigin(Er rorString* error, SecurityOrigin* origin) | |
| 455 { | |
| 456 for (Frame* frame = m_page->mainFrame(); frame; frame = frame->tree().traver seNext()) { | |
|
pfeldman
2015/08/03 23:53:48
This approach is super-confusing, I was so happy i
jsbell
2015/08/04 00:14:53
Top level: don't try to and query CacheStorage if
| |
| 457 if (!frame->isLocalFrame()) | |
| 458 continue; | |
| 459 LocalFrame* localFrame = toLocalFrame(frame); | |
| 460 if (localFrame->document() && localFrame->document()->securityOrigin()-> isSameSchemeHostPort(origin)) | |
| 461 return localFrame->document(); | |
| 462 } | |
| 463 | |
| 464 *error = "No frame is available for the request"; | |
| 465 return 0; | |
| 466 } | |
| 467 | |
| 468 PassOwnPtr<WebServiceWorkerCacheStorage> InspectorCacheStorageAgent::assertCache Storage(ErrorString* errorString, const String& securityOrigin) | |
| 469 { | |
| 470 RefPtr<SecurityOrigin> secOrigin = SecurityOrigin::createFromString(security Origin); | |
| 471 ExecutionContext* executionContext = assertExecutionContextForOrigin(errorSt ring, secOrigin.get()); | |
| 472 if (!executionContext || !CacheStorage::canAccessCacheStorage(executionConte xt, errorString)) | |
| 473 return nullptr; | |
| 474 | |
| 475 String identifier = createDatabaseIdentifierFromSecurityOrigin(secOrigin.get ()); | |
| 476 OwnPtr<WebServiceWorkerCacheStorage> cache = adoptPtr(Platform::current()->c acheStorage(identifier)); | |
| 477 if (!cache) | |
| 478 *errorString = "Could not find cache storage."; | |
| 479 return cache.release(); | |
| 480 } | |
| 481 | |
| 482 PassOwnPtr<WebServiceWorkerCacheStorage> InspectorCacheStorageAgent::assertCache StorageAndNameForId(ErrorString* errorString, const String& cacheId, String* cac heName) | |
| 483 { | |
| 484 String securityOrigin; | |
| 485 if (!parseCacheId(errorString, cacheId, &securityOrigin, cacheName)) | |
| 486 return nullptr; | |
| 487 return assertCacheStorage(errorString, securityOrigin); | |
| 488 } | |
| 454 | 489 |
| 455 } // namespace blink | 490 } // namespace blink |
| OLD | NEW |