summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/renderer_web_database_observer.cc
diff options
context:
space:
mode:
authordumi@chromium.org <dumi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-30 01:04:25 +0000
committerdumi@chromium.org <dumi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-30 01:04:25 +0000
commit12cbfda3f72e24147789eed981e68c373ba1c14f (patch)
tree9cf47e58dc21c8bf9ba61cd56ab08cecca80c601 /chrome/renderer/renderer_web_database_observer.cc
parent63b06e38ffea00111f7efdd20e34ed68b6c4eab9 (diff)
downloadchromium_src-12cbfda3f72e24147789eed981e68c373ba1c14f.zip
chromium_src-12cbfda3f72e24147789eed981e68c373ba1c14f.tar.gz
chromium_src-12cbfda3f72e24147789eed981e68c373ba1c14f.tar.bz2
Wait for the DB thread to finish posting tasks to the main thread
before setting the WebKit client to NULL. TEST=none BUG=32228,32226 Review URL: http://codereview.chromium.org/545178 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@37594 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/renderer_web_database_observer.cc')
-rw-r--r--chrome/renderer/renderer_web_database_observer.cc26
1 files changed, 23 insertions, 3 deletions
diff --git a/chrome/renderer/renderer_web_database_observer.cc b/chrome/renderer/renderer_web_database_observer.cc
index 15a5d17..2ded3cb 100644
--- a/chrome/renderer/renderer_web_database_observer.cc
+++ b/chrome/renderer/renderer_web_database_observer.cc
@@ -4,19 +4,26 @@
#include "chrome/renderer/renderer_web_database_observer.h"
+#include "base/auto_reset.h"
+#include "base/message_loop.h"
+#include "base/string16.h"
#include "chrome/common/render_messages.h"
#include "third_party/WebKit/WebKit/chromium/public/WebDatabase.h"
RendererWebDatabaseObserver::RendererWebDatabaseObserver(
IPC::Message::Sender* sender)
- : sender_(sender) {
+ : sender_(sender),
+ waiting_for_dbs_to_close_(false) {
}
void RendererWebDatabaseObserver::databaseOpened(
const WebKit::WebDatabase& database) {
+ string16 origin_identifier = database.securityOrigin().databaseIdentifier();
+ string16 database_name = database.name();
sender_->Send(new ViewHostMsg_DatabaseOpened(
- database.securityOrigin().databaseIdentifier(), database.name(),
+ origin_identifier, database_name,
database.displayName(), database.estimatedSize()));
+ database_connections_.AddConnection(origin_identifier, database_name);
}
void RendererWebDatabaseObserver::databaseModified(
@@ -27,6 +34,19 @@ void RendererWebDatabaseObserver::databaseModified(
void RendererWebDatabaseObserver::databaseClosed(
const WebKit::WebDatabase& database) {
+ string16 origin_identifier = database.securityOrigin().databaseIdentifier();
+ string16 database_name = database.name();
sender_->Send(new ViewHostMsg_DatabaseClosed(
- database.securityOrigin().databaseIdentifier(), database.name()));
+ origin_identifier, database_name));
+ database_connections_.RemoveConnection(origin_identifier, database_name);
+ if (waiting_for_dbs_to_close_ && database_connections_.IsEmpty())
+ MessageLoop::current()->Quit();
+}
+
+void RendererWebDatabaseObserver::WaitForAllDatabasesToClose() {
+ if (!database_connections_.IsEmpty()) {
+ AutoReset waiting_for_dbs_auto_reset(&waiting_for_dbs_to_close_, true);
+ MessageLoop::ScopedNestableTaskAllower nestable(MessageLoop::current());
+ MessageLoop::current()->Run();
+ }
}