| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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/renderer_host/database_dispatcher_host.h" | 5 #include "chrome/browser/renderer_host/database_dispatcher_host.h" |
| 6 | 6 |
| 7 #if defined(OS_POSIX) | 7 #if defined(OS_POSIX) |
| 8 #include "base/file_descriptor_posix.h" | 8 #include "base/file_descriptor_posix.h" |
| 9 #endif | 9 #endif |
| 10 | 10 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 } | 60 } |
| 61 } | 61 } |
| 62 | 62 |
| 63 void DatabaseDispatcherHost::AddObserver() { | 63 void DatabaseDispatcherHost::AddObserver() { |
| 64 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); | 64 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
| 65 db_tracker_->AddObserver(this); | 65 db_tracker_->AddObserver(this); |
| 66 } | 66 } |
| 67 | 67 |
| 68 void DatabaseDispatcherHost::RemoveObserver() { | 68 void DatabaseDispatcherHost::RemoveObserver() { |
| 69 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); | 69 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
| 70 |
| 71 // If the renderer process died without closing all databases, |
| 72 // then we need to manually close those connections |
| 73 db_tracker_->CloseDatabases(database_connections_); |
| 74 database_connections_.RemoveAllConnections(); |
| 75 |
| 70 db_tracker_->RemoveObserver(this); | 76 db_tracker_->RemoveObserver(this); |
| 71 } | 77 } |
| 72 | 78 |
| 73 bool DatabaseDispatcherHost::OnMessageReceived( | 79 bool DatabaseDispatcherHost::OnMessageReceived( |
| 74 const IPC::Message& message, bool* message_was_ok) { | 80 const IPC::Message& message, bool* message_was_ok) { |
| 75 DCHECK(!shutdown_); | 81 DCHECK(!shutdown_); |
| 76 *message_was_ok = true; | 82 *message_was_ok = true; |
| 77 bool handled = true; | 83 bool handled = true; |
| 78 IPC_BEGIN_MESSAGE_MAP_EX(DatabaseDispatcherHost, message, *message_was_ok) | 84 IPC_BEGIN_MESSAGE_MAP_EX(DatabaseDispatcherHost, message, *message_was_ok) |
| 79 IPC_MESSAGE_HANDLER(ViewHostMsg_DatabaseOpenFile, OnDatabaseOpenFile) | 85 IPC_MESSAGE_HANDLER(ViewHostMsg_DatabaseOpenFile, OnDatabaseOpenFile) |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 estimated_size)); | 304 estimated_size)); |
| 299 } | 305 } |
| 300 | 306 |
| 301 void DatabaseDispatcherHost::DatabaseOpened(const string16& origin_identifier, | 307 void DatabaseDispatcherHost::DatabaseOpened(const string16& origin_identifier, |
| 302 const string16& database_name, | 308 const string16& database_name, |
| 303 const string16& description, | 309 const string16& description, |
| 304 int64 estimated_size) { | 310 int64 estimated_size) { |
| 305 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); | 311 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
| 306 int64 database_size = 0; | 312 int64 database_size = 0; |
| 307 int64 space_available = 0; | 313 int64 space_available = 0; |
| 308 AddAccessedOrigin(origin_identifier); | 314 database_connections_.AddConnection(origin_identifier, database_name); |
| 309 db_tracker_->DatabaseOpened(origin_identifier, database_name, description, | 315 db_tracker_->DatabaseOpened(origin_identifier, database_name, description, |
| 310 estimated_size, &database_size, &space_available); | 316 estimated_size, &database_size, &space_available); |
| 311 ChromeThread::PostTask( | 317 ChromeThread::PostTask( |
| 312 ChromeThread::IO, FROM_HERE, | 318 ChromeThread::IO, FROM_HERE, |
| 313 NewRunnableMethod(this, | 319 NewRunnableMethod(this, |
| 314 &DatabaseDispatcherHost::SendMessage, | 320 &DatabaseDispatcherHost::SendMessage, |
| 315 new ViewMsg_DatabaseUpdateSize( | 321 new ViewMsg_DatabaseUpdateSize( |
| 316 origin_identifier, database_name, | 322 origin_identifier, database_name, |
| 317 database_size, space_available))); | 323 database_size, space_available))); |
| 318 } | 324 } |
| 319 | 325 |
| 320 void DatabaseDispatcherHost::OnDatabaseModified( | 326 void DatabaseDispatcherHost::OnDatabaseModified( |
| 321 const string16& origin_identifier, | 327 const string16& origin_identifier, |
| 322 const string16& database_name) { | 328 const string16& database_name) { |
| 323 ChromeThread::PostTask( | 329 ChromeThread::PostTask( |
| 324 ChromeThread::FILE, FROM_HERE, | 330 ChromeThread::FILE, FROM_HERE, |
| 325 NewRunnableMethod(this, | 331 NewRunnableMethod(this, |
| 326 &DatabaseDispatcherHost::DatabaseModified, | 332 &DatabaseDispatcherHost::DatabaseModified, |
| 327 origin_identifier, | 333 origin_identifier, |
| 328 database_name)); | 334 database_name)); |
| 329 } | 335 } |
| 330 | 336 |
| 331 void DatabaseDispatcherHost::DatabaseModified(const string16& origin_identifier, | 337 void DatabaseDispatcherHost::DatabaseModified(const string16& origin_identifier, |
| 332 const string16& database_name) { | 338 const string16& database_name) { |
| 333 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); | 339 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
| 334 if (!HasAccessedOrigin(origin_identifier)) { | 340 if (!database_connections_.IsDatabaseOpened( |
| 341 origin_identifier, database_name)) { |
| 335 ReceivedBadMessage(ViewHostMsg_DatabaseModified::ID); | 342 ReceivedBadMessage(ViewHostMsg_DatabaseModified::ID); |
| 336 return; | 343 return; |
| 337 } | 344 } |
| 338 | 345 |
| 339 db_tracker_->DatabaseModified(origin_identifier, database_name); | 346 db_tracker_->DatabaseModified(origin_identifier, database_name); |
| 340 } | 347 } |
| 341 | 348 |
| 342 void DatabaseDispatcherHost::OnDatabaseClosed(const string16& origin_identifier, | 349 void DatabaseDispatcherHost::OnDatabaseClosed(const string16& origin_identifier, |
| 343 const string16& database_name) { | 350 const string16& database_name) { |
| 344 ChromeThread::PostTask( | 351 ChromeThread::PostTask( |
| 345 ChromeThread::FILE, FROM_HERE, | 352 ChromeThread::FILE, FROM_HERE, |
| 346 NewRunnableMethod(this, | 353 NewRunnableMethod(this, |
| 347 &DatabaseDispatcherHost::DatabaseClosed, | 354 &DatabaseDispatcherHost::DatabaseClosed, |
| 348 origin_identifier, | 355 origin_identifier, |
| 349 database_name)); | 356 database_name)); |
| 350 } | 357 } |
| 351 | 358 |
| 352 void DatabaseDispatcherHost::DatabaseClosed(const string16& origin_identifier, | 359 void DatabaseDispatcherHost::DatabaseClosed(const string16& origin_identifier, |
| 353 const string16& database_name) { | 360 const string16& database_name) { |
| 354 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); | 361 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
| 355 if (!HasAccessedOrigin(origin_identifier)) { | 362 if (!database_connections_.IsDatabaseOpened( |
| 363 origin_identifier, database_name)) { |
| 356 ReceivedBadMessage(ViewHostMsg_DatabaseClosed::ID); | 364 ReceivedBadMessage(ViewHostMsg_DatabaseClosed::ID); |
| 357 return; | 365 return; |
| 358 } | 366 } |
| 359 | 367 |
| 360 db_tracker_->DatabaseClosed(origin_identifier, database_name); | 368 db_tracker_->DatabaseClosed(origin_identifier, database_name); |
| 369 database_connections_.RemoveConnection(origin_identifier, database_name); |
| 361 } | 370 } |
| 362 | 371 |
| 363 void DatabaseDispatcherHost::OnDatabaseSizeChanged( | 372 void DatabaseDispatcherHost::OnDatabaseSizeChanged( |
| 364 const string16& origin_identifier, | 373 const string16& origin_identifier, |
| 365 const string16& database_name, | 374 const string16& database_name, |
| 366 int64 database_size, | 375 int64 database_size, |
| 367 int64 space_available) { | 376 int64 space_available) { |
| 368 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); | 377 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
| 369 if (HasAccessedOrigin(origin_identifier)) { | 378 if (database_connections_.IsOriginUsed(origin_identifier)) { |
| 370 ChromeThread::PostTask( | 379 ChromeThread::PostTask( |
| 371 ChromeThread::IO, FROM_HERE, | 380 ChromeThread::IO, FROM_HERE, |
| 372 NewRunnableMethod(this, | 381 NewRunnableMethod(this, |
| 373 &DatabaseDispatcherHost::SendMessage, | 382 &DatabaseDispatcherHost::SendMessage, |
| 374 new ViewMsg_DatabaseUpdateSize( | 383 new ViewMsg_DatabaseUpdateSize( |
| 375 origin_identifier, database_name, | 384 origin_identifier, database_name, |
| 376 database_size, space_available))); | 385 database_size, space_available))); |
| 377 } | 386 } |
| 378 } | 387 } |
| 379 | |
| 380 void DatabaseDispatcherHost::AddAccessedOrigin( | |
| 381 const string16& origin_identifier) { | |
| 382 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); | |
| 383 accessed_origins_.insert(origin_identifier); | |
| 384 } | |
| 385 | |
| 386 bool DatabaseDispatcherHost::HasAccessedOrigin( | |
| 387 const string16& origin_identifier) { | |
| 388 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); | |
| 389 return (accessed_origins_.find(origin_identifier) != accessed_origins_.end()); | |
| 390 } | |
| OLD | NEW |