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 |