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

Side by Side Diff: trunk/src/chrome/browser/nacl_host/pnacl_host.cc

Issue 23684032: Revert 221275 "Handle cache-control:no-store header in PNaCl tra..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "chrome/browser/nacl_host/pnacl_host.h" 5 #include "chrome/browser/nacl_host/pnacl_host.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
(...skipping 27 matching lines...) Expand all
38 render_view_id(0), 38 render_view_id(0),
39 nexe_fd(base::kInvalidPlatformFileValue), 39 nexe_fd(base::kInvalidPlatformFileValue),
40 got_nexe_fd(false), 40 got_nexe_fd(false),
41 got_cache_reply(false), 41 got_cache_reply(false),
42 got_cache_hit(false), 42 got_cache_hit(false),
43 is_incognito(false), 43 is_incognito(false),
44 callback(NexeFdCallback()), 44 callback(NexeFdCallback()),
45 cache_info(nacl::PnaclCacheInfo()) {} 45 cache_info(nacl::PnaclCacheInfo()) {}
46 PnaclHost::PendingTranslation::~PendingTranslation() {} 46 PnaclHost::PendingTranslation::~PendingTranslation() {}
47 47
48 bool PnaclHost::TranslationMayBeCached(
49 const PendingTranslationMap::iterator& entry) {
50 return !entry->second.is_incognito &&
51 !entry->second.cache_info.has_no_store_header;
52 }
53
54 /////////////////////////////////////// Initialization 48 /////////////////////////////////////// Initialization
55 49
56 static base::FilePath GetCachePath() { 50 static base::FilePath GetCachePath() {
57 NaClBrowserDelegate* browser_delegate = NaClBrowser::GetDelegate(); 51 NaClBrowserDelegate* browser_delegate = NaClBrowser::GetDelegate();
58 // Determine where the translation cache resides in the file system. It 52 // Determine where the translation cache resides in the file system. It
59 // exists in Chrome's cache directory and is not tied to any specific 53 // exists in Chrome's cache directory and is not tied to any specific
60 // profile. If we fail, return an empty path. 54 // profile. If we fail, return an empty path.
61 // Start by finding the user data directory. 55 // Start by finding the user data directory.
62 base::FilePath user_data_dir; 56 base::FilePath user_data_dir;
63 if (!browser_delegate || 57 if (!browser_delegate ||
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 LOG(ERROR) << "OnTempFileReturn: id not found"; 261 LOG(ERROR) << "OnTempFileReturn: id not found";
268 BrowserThread::PostBlockingPoolTask( 262 BrowserThread::PostBlockingPoolTask(
269 FROM_HERE, base::Bind(base::IgnoreResult(base::ClosePlatformFile), fd)); 263 FROM_HERE, base::Bind(base::IgnoreResult(base::ClosePlatformFile), fd));
270 return; 264 return;
271 } 265 }
272 if (fd == base::kInvalidPlatformFileValue) { 266 if (fd == base::kInvalidPlatformFileValue) {
273 // This translation will fail, but we need to retry any translation 267 // This translation will fail, but we need to retry any translation
274 // waiting for its result. 268 // waiting for its result.
275 LOG(ERROR) << "OnTempFileReturn: temp file creation failed"; 269 LOG(ERROR) << "OnTempFileReturn: temp file creation failed";
276 std::string key(entry->second.cache_key); 270 std::string key(entry->second.cache_key);
271 bool is_incognito = entry->second.is_incognito;
277 entry->second.callback.Run(fd, false); 272 entry->second.callback.Run(fd, false);
278 pending_translations_.erase(entry); 273 pending_translations_.erase(entry);
279 // No translations will be waiting for entries that will not be stored. 274 // No translations will be waiting for an incongnito translation
280 if (TranslationMayBeCached(entry)) 275 if (!is_incognito)
281 RequeryMatchingTranslations(key); 276 RequeryMatchingTranslations(key);
282 return; 277 return;
283 } 278 }
284 PendingTranslation* pt = &entry->second; 279 PendingTranslation* pt = &entry->second;
285 pt->got_nexe_fd = true; 280 pt->got_nexe_fd = true;
286 pt->nexe_fd = fd; 281 pt->nexe_fd = fd;
287 CheckCacheQueryReady(entry); 282 CheckCacheQueryReady(entry);
288 } 283 }
289 284
290 // Check whether both the cache query and the temp file have returned, and check 285 // Check whether both the cache query and the temp file have returned, and check
291 // whether we actually got a hit or not. 286 // whether we actually got a hit or not.
292 void PnaclHost::CheckCacheQueryReady( 287 void PnaclHost::CheckCacheQueryReady(
293 const PendingTranslationMap::iterator& entry) { 288 const PendingTranslationMap::iterator& entry) {
294 PendingTranslation* pt = &entry->second; 289 PendingTranslation* pt = &entry->second;
295 if (!(pt->got_cache_reply && pt->got_nexe_fd)) 290 if (!(pt->got_cache_reply && pt->got_nexe_fd))
296 return; 291 return;
297 if (!pt->got_cache_hit) { 292 if (!pt->got_cache_hit) {
298 // Check if there is already a pending translation for this file. If there 293 // Check if there is already a pending translation for this file. If there
299 // is, we will wait for it to come back, to avoid redundant translations. 294 // is, we will wait for it to come back, to avoid redundant translations.
300 for (PendingTranslationMap::iterator it = pending_translations_.begin(); 295 for (PendingTranslationMap::iterator it = pending_translations_.begin();
301 it != pending_translations_.end(); 296 it != pending_translations_.end();
302 ++it) { 297 ++it) {
303 // Another translation matches if it's a request for the same file, 298 // Another translation matches if it's a request for the same file,
304 if (it->second.cache_key == entry->second.cache_key && 299 if (it->second.cache_key == entry->second.cache_key &&
305 // and it's not this translation, 300 // and it's not this translation,
306 it->first != entry->first && 301 it->first != entry->first &&
307 // and it can be stored in the cache, 302 // and it's not incognito,
308 TranslationMayBeCached(it) && 303 !it->second.is_incognito &&
309 // and it's already gotten past this check and returned the miss. 304 // and if it's already gotten past this check and returned the miss.
310 it->second.got_cache_reply && 305 it->second.got_cache_reply &&
311 it->second.got_nexe_fd) { 306 it->second.got_nexe_fd) {
312 return; 307 return;
313 } 308 }
314 } 309 }
315 ReturnMiss(entry); 310 ReturnMiss(entry);
316 return; 311 return;
317 } 312 }
318 313
319 if (!base::PostTaskAndReplyWithResult( 314 if (!base::PostTaskAndReplyWithResult(
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 << "," << pp_instance << " not found."; 377 << "," << pp_instance << " not found.";
383 return; 378 return;
384 } 379 }
385 bool store_nexe = true; 380 bool store_nexe = true;
386 // If this is a premature response (i.e. we haven't returned a temp file 381 // If this is a premature response (i.e. we haven't returned a temp file
387 // yet) or if it's an unsuccessful translation, or if we are incognito, 382 // yet) or if it's an unsuccessful translation, or if we are incognito,
388 // don't store in the cache. 383 // don't store in the cache.
389 // TODO(dschuff): use a separate in-memory cache for incognito 384 // TODO(dschuff): use a separate in-memory cache for incognito
390 // translations. 385 // translations.
391 if (!entry->second.got_nexe_fd || !entry->second.got_cache_reply || 386 if (!entry->second.got_nexe_fd || !entry->second.got_cache_reply ||
392 !success || !TranslationMayBeCached(entry)) { 387 !success || entry->second.is_incognito) {
393 store_nexe = false; 388 store_nexe = false;
394 } else if (!base::PostTaskAndReplyWithResult( 389 } else if (!base::PostTaskAndReplyWithResult(
395 BrowserThread::GetBlockingPool(), 390 BrowserThread::GetBlockingPool(),
396 FROM_HERE, 391 FROM_HERE,
397 base::Bind(&PnaclHost::CopyFileToBuffer, 392 base::Bind(&PnaclHost::CopyFileToBuffer,
398 entry->second.nexe_fd), 393 entry->second.nexe_fd),
399 base::Bind(&PnaclHost::StoreTranslatedNexe, 394 base::Bind(&PnaclHost::StoreTranslatedNexe,
400 weak_factory_.GetWeakPtr(), 395 weak_factory_.GetWeakPtr(),
401 id))) { 396 id))) {
402 store_nexe = false; 397 store_nexe = false;
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 for (PendingTranslationMap::iterator it = pending_translations_.begin(); 518 for (PendingTranslationMap::iterator it = pending_translations_.begin();
524 it != pending_translations_.end();) { 519 it != pending_translations_.end();) {
525 PendingTranslationMap::iterator to_erase(it++); 520 PendingTranslationMap::iterator to_erase(it++);
526 if (to_erase->first.first == render_process_id) { 521 if (to_erase->first.first == render_process_id) {
527 // Clean up the open files. 522 // Clean up the open files.
528 BrowserThread::PostBlockingPoolTask( 523 BrowserThread::PostBlockingPoolTask(
529 FROM_HERE, 524 FROM_HERE,
530 base::Bind(base::IgnoreResult(base::ClosePlatformFile), 525 base::Bind(base::IgnoreResult(base::ClosePlatformFile),
531 to_erase->second.nexe_fd)); 526 to_erase->second.nexe_fd));
532 std::string key(to_erase->second.cache_key); 527 std::string key(to_erase->second.cache_key);
528 bool is_incognito = to_erase->second.is_incognito;
533 pending_translations_.erase(to_erase); 529 pending_translations_.erase(to_erase);
534 // No translations will be waiting for entries that will not be stored. 530 // No translations will be blocked waiting for an incongnito translation
535 if (TranslationMayBeCached(to_erase)) 531 if (!is_incognito)
536 RequeryMatchingTranslations(key); 532 RequeryMatchingTranslations(key);
537 } 533 }
538 } 534 }
539 if (pending_translations_.empty()) { 535 if (pending_translations_.empty()) {
540 cache_state_ = CacheUninitialized; 536 cache_state_ = CacheUninitialized;
541 // Freeing the backend causes it to flush to disk, so do it when the 537 // Freeing the backend causes it to flush to disk, so do it when the
542 // last renderer closes rather than on destruction. 538 // last renderer closes rather than on destruction.
543 disk_cache_.reset(); 539 disk_cache_.reset();
544 } 540 }
545 } 541 }
(...skipping 26 matching lines...) Expand all
572 end_time, 568 end_time,
573 base::Bind(&PnaclHost::OnEntriesDoomed, callback)); 569 base::Bind(&PnaclHost::OnEntriesDoomed, callback));
574 if (rv != net::ERR_IO_PENDING) 570 if (rv != net::ERR_IO_PENDING)
575 OnEntriesDoomed(callback, rv); 571 OnEntriesDoomed(callback, rv);
576 } 572 }
577 573
578 // static 574 // static
579 void PnaclHost::OnEntriesDoomed(const base::Closure& callback, int net_error) { 575 void PnaclHost::OnEntriesDoomed(const base::Closure& callback, int net_error) {
580 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback); 576 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback);
581 } 577 }
OLDNEW
« no previous file with comments | « trunk/src/chrome/browser/nacl_host/pnacl_host.h ('k') | trunk/src/chrome/browser/nacl_host/pnacl_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698