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

Unified Diff: content/browser/indexed_db/indexed_db_factory.cc

Issue 18023022: Blob support for IDB [Chromium] (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Settle on one name for the live blob journal. Created 7 years 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/indexed_db/indexed_db_factory.cc
diff --git a/content/browser/indexed_db/indexed_db_factory.cc b/content/browser/indexed_db/indexed_db_factory.cc
index 2cfef62c90643e6c8f75bf98910b10bc9a0d21f3..797d4a0ed355337ec0d81f638878bba8113663c5 100644
--- a/content/browser/indexed_db/indexed_db_factory.cc
+++ b/content/browser/indexed_db/indexed_db_factory.cc
@@ -41,7 +41,7 @@ void IndexedDBFactory::ReleaseDatabase(
void IndexedDBFactory::ReleaseBackingStore(const GURL& origin_url,
bool immediate) {
// Only close if this is the last reference.
- if (!HasLastBackingStoreReference(origin_url))
+ if (!HasLastBackingStoreReference(origin_url, immediate))
return;
// If this factory does hold the last reference to the backing store, it can
@@ -64,7 +64,7 @@ void IndexedDBFactory::ReleaseBackingStore(const GURL& origin_url,
void IndexedDBFactory::MaybeCloseBackingStore(const GURL& origin_url) {
// Another reference may have opened since the maybe-close was posted, so it
// is necessary to check again.
- if (HasLastBackingStoreReference(origin_url))
+ if (HasLastBackingStoreReference(origin_url, false))
CloseBackingStore(origin_url);
}
@@ -77,8 +77,8 @@ void IndexedDBFactory::CloseBackingStore(const GURL& origin_url) {
backing_store_map_.erase(it);
}
-bool IndexedDBFactory::HasLastBackingStoreReference(const GURL& origin_url)
- const {
+bool IndexedDBFactory::HasLastBackingStoreReference(const GURL& origin_url,
+ bool forcedClose) const {
IndexedDBBackingStore* ptr;
{
// Scope so that the implicit scoped_refptr<> is freed.
@@ -87,6 +87,11 @@ bool IndexedDBFactory::HasLastBackingStoreReference(const GURL& origin_url)
DCHECK(it != backing_store_map_.end());
ptr = it->second.get();
}
+ if (ptr->HasOneRef())
+ return true;
+ if (!forcedClose)
+ return false;
+ ptr->active_blob_registry()->ForceShutdown();
jsbell 2013/12/03 00:10:03 Hrm, unfortunate placement (in a Has.... method).
jsbell 2013/12/03 00:11:24 ISTM this is a good reason to move away from relyi
ericu 2013/12/03 02:03:55 It's idempotent, but currently assumes that once i
ericu 2013/12/03 02:03:55 I'm fine with that too; this code I've put in feel
return ptr->HasOneRef();
}
@@ -106,7 +111,8 @@ void IndexedDBFactory::ContextDestroyed() {
void IndexedDBFactory::GetDatabaseNames(
scoped_refptr<IndexedDBCallbacks> callbacks,
const GURL& origin_url,
- const base::FilePath& data_directory) {
+ const base::FilePath& data_directory,
+ base::TaskRunner* task_runner) {
IDB_TRACE("IndexedDBFactory::GetDatabaseNames");
// TODO(dgrogan): Plumb data_loss back to script eventually?
blink::WebIDBDataLoss data_loss;
@@ -115,9 +121,11 @@ void IndexedDBFactory::GetDatabaseNames(
scoped_refptr<IndexedDBBackingStore> backing_store =
OpenBackingStore(origin_url,
data_directory,
+ NULL,
&data_loss,
&data_loss_message,
- &disk_full);
+ &disk_full,
+ task_runner);
if (!backing_store) {
callbacks->OnError(
IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError,
@@ -131,9 +139,11 @@ void IndexedDBFactory::GetDatabaseNames(
void IndexedDBFactory::DeleteDatabase(
const string16& name,
+ net::URLRequestContext* request_context,
scoped_refptr<IndexedDBCallbacks> callbacks,
const GURL& origin_url,
- const base::FilePath& data_directory) {
+ const base::FilePath& data_directory,
+ base::TaskRunner* task_runner) {
IDB_TRACE("IndexedDBFactory::DeleteDatabase");
IndexedDBDatabase::Identifier unique_identifier(origin_url, name);
IndexedDBDatabaseMap::iterator it = database_map_.find(unique_identifier);
@@ -151,9 +161,11 @@ void IndexedDBFactory::DeleteDatabase(
scoped_refptr<IndexedDBBackingStore> backing_store =
OpenBackingStore(origin_url,
data_directory,
+ request_context,
&data_loss,
&data_loss_message,
- &disk_full);
+ &disk_full,
+ task_runner);
if (!backing_store) {
callbacks->OnError(
IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError,
@@ -194,9 +206,11 @@ bool IndexedDBFactory::IsBackingStoreOpenForTesting(const GURL& origin_url)
scoped_refptr<IndexedDBBackingStore> IndexedDBFactory::OpenBackingStore(
const GURL& origin_url,
const base::FilePath& data_directory,
+ net::URLRequestContext* request_context,
blink::WebIDBDataLoss* data_loss,
std::string* data_loss_message,
- bool* disk_full) {
+ bool* disk_full,
+ base::TaskRunner* task_runner) {
const bool open_in_memory = data_directory.empty();
IndexedDBBackingStoreMap::iterator it2 = backing_store_map_.find(origin_url);
@@ -206,17 +220,26 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBFactory::OpenBackingStore(
}
scoped_refptr<IndexedDBBackingStore> backing_store;
+ bool first_time = false;
if (open_in_memory) {
+ // TODO(ericu): Support blobs in in-memory backends.
backing_store = IndexedDBBackingStore::OpenInMemory(origin_url);
} else {
- backing_store = IndexedDBBackingStore::Open(origin_url,
+ first_time = !backends_opened_since_boot_.count(origin_url);
+ backing_store = IndexedDBBackingStore::Open(this,
+ origin_url,
data_directory,
+ request_context,
data_loss,
data_loss_message,
- disk_full);
+ disk_full,
+ task_runner,
+ first_time);
}
if (backing_store.get()) {
+ if (first_time)
+ backends_opened_since_boot_.insert(origin_url);
backing_store_map_[origin_url] = backing_store;
// If an in-memory database, bind lifetime to this factory instance.
if (open_in_memory)
@@ -224,7 +247,7 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBFactory::OpenBackingStore(
// All backing stores associated with this factory should be of the same
// type.
- DCHECK(session_only_backing_stores_.empty() || open_in_memory);
+ DCHECK(session_only_backing_stores_.empty() != open_in_memory);
return backing_store;
}
@@ -235,11 +258,14 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBFactory::OpenBackingStore(
void IndexedDBFactory::Open(
const string16& name,
int64 version,
+ net::URLRequestContext* request_context,
int64 transaction_id,
scoped_refptr<IndexedDBCallbacks> callbacks,
scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks,
const GURL& origin_url,
- const base::FilePath& data_directory) {
+ const base::FilePath& data_directory,
+ int child_process_id,
+ base::TaskRunner* task_runner) {
IDB_TRACE("IndexedDBFactory::Open");
scoped_refptr<IndexedDBDatabase> database;
IndexedDBDatabase::Identifier unique_identifier(origin_url, name);
@@ -252,9 +278,11 @@ void IndexedDBFactory::Open(
scoped_refptr<IndexedDBBackingStore> backing_store =
OpenBackingStore(origin_url,
data_directory,
+ request_context,
&data_loss,
&data_loss_message,
- &disk_full);
+ &disk_full,
+ task_runner);
if (!backing_store) {
if (disk_full) {
callbacks->OnError(
@@ -288,6 +316,7 @@ void IndexedDBFactory::Open(
database->OpenConnection(callbacks,
database_callbacks,
+ child_process_id,
transaction_id,
version,
data_loss,
« no previous file with comments | « content/browser/indexed_db/indexed_db_factory.h ('k') | content/browser/indexed_db/indexed_db_index_writer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698