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

Unified Diff: content/browser/in_process_webkit/dom_storage_message_filter.cc

Issue 8929007: Restore sessionStorage when chrome restarts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix: cloning storage areas. Created 8 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/in_process_webkit/dom_storage_message_filter.cc
diff --git a/content/browser/in_process_webkit/dom_storage_message_filter.cc b/content/browser/in_process_webkit/dom_storage_message_filter.cc
index 6318c324ede361c47f43473013323f95197c9ede..c8b81a49b1ad87a88ab0a4d41e5b3b0f2e2c54fa 100644
--- a/content/browser/in_process_webkit/dom_storage_message_filter.cc
+++ b/content/browser/in_process_webkit/dom_storage_message_filter.cc
@@ -10,6 +10,8 @@
#include "content/browser/in_process_webkit/dom_storage_context.h"
#include "content/browser/in_process_webkit/dom_storage_namespace.h"
#include "content/common/dom_storage_messages.h"
+#include "content/public/browser/notification_service.h"
+#include "content/public/browser/notification_types.h"
#include "content/public/browser/browser_thread.h"
#include "googleurl/src/gurl.h"
@@ -60,11 +62,20 @@ void DOMStorageMessageFilter::OnChannelConnected(int32 peer_pid) {
}
/* static */
+bool DOMStorageMessageFilter::ignore_storage_events_ = false;
+
+/* static */
void DOMStorageMessageFilter::DispatchStorageEvent(const NullableString16& key,
const NullableString16& old_value, const NullableString16& new_value,
const string16& origin, const GURL& url, bool is_local_storage) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED));
DCHECK(is_local_storage); // Only LocalStorage is implemented right now.
+
+ // |ignore_storage_events_| is set when copying sessionStorages; don't post
+ // events.
+ if (!storage_event_message_filter && ignore_storage_events_)
+ return;
+
DCHECK(storage_event_message_filter);
DOMStorageMsg_Event_Params params;
params.key = key;
@@ -82,6 +93,12 @@ void DOMStorageMessageFilter::DispatchStorageEvent(const NullableString16& key,
storage_event_message_filter, params));
}
+/* static */
+void DOMStorageMessageFilter::SetIgnoreStorageEvents(
+ bool ignore_storage_events) {
+ ignore_storage_events_ = ignore_storage_events;
+}
+
bool DOMStorageMessageFilter::OnMessageReceived(const IPC::Message& message,
bool* message_was_ok) {
bool handled = true;
@@ -110,16 +127,43 @@ void DOMStorageMessageFilter::OverrideThreadForMessage(
*thread = BrowserThread::WEBKIT_DEPRECATED;
}
+void DOMStorageMessageFilter::NotifyOnUIThread(
+ int64 namespace_id,
+ const FilePath& session_storage_directory) {
+ SessionStorageCreatedDetails details;
+ details.id = namespace_id;
+ details.session_storage_directory = session_storage_directory;
+ content::NotificationService::current()->Notify(
+ content::NOTIFICATION_SESSION_STORAGE_NAMESPACE_CREATED,
+ content::Source<DOMStorageMessageFilter>(this),
+ content::Details<SessionStorageCreatedDetails>(&details));
+}
+
void DOMStorageMessageFilter::OnStorageAreaId(int64 namespace_id,
const string16& origin,
int64* storage_area_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED));
+ // Don't allow creation of the namespace.
DOMStorageNamespace* storage_namespace =
- Context()->GetStorageNamespace(namespace_id, true);
+ Context()->GetStorageNamespace(namespace_id, false);
if (!storage_namespace) {
- *storage_area_id = DOMStorageContext::kInvalidStorageId;
- return;
+ // The namespace doesn't exist; create it and send a notification if it was
+ // a session storage.
+ storage_namespace =
+ Context()->GetStorageNamespace(namespace_id, true);
+ if (!storage_namespace) {
+ *storage_area_id = DOMStorageContext::kInvalidStorageId;
+ return;
+ }
+
+ if (storage_namespace->dom_storage_type() == DOM_STORAGE_SESSION) {
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&DOMStorageMessageFilter::NotifyOnUIThread, this,
+ namespace_id,
+ storage_namespace->session_storage_directory()));
+ }
}
DOMStorageArea* storage_area = storage_namespace->GetStorageArea(origin);
*storage_area_id = storage_area->id();

Powered by Google App Engine
This is Rietveld 408576698