1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
// Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this
// source code is governed by a BSD-style license that can be found in the
// LICENSE file.
#ifndef CHROME_BROWSER_IN_PROCESS_WEBKIT_DOM_STORAGE_DISPATCHER_HOST_H_
#define CHROME_BROWSER_IN_PROCESS_WEBKIT_DOM_STORAGE_DISPATCHER_HOST_H_
#include "base/process.h"
#include "base/ref_counted.h"
#include "base/tracked.h"
#include "chrome/browser/in_process_webkit/dom_storage_area.h"
#include "chrome/browser/in_process_webkit/webkit_context.h"
#include "chrome/common/dom_storage_common.h"
#include "ipc/ipc_message.h"
class DOMStorageContext;
class GURL;
class Task;
class WebKitThread;
struct ViewMsg_DOMStorageEvent_Params;
// This class handles the logistics of DOM Storage within the browser process.
// It mostly ferries information between IPCs and the WebKit implementations,
// but it also handles some special cases like when renderer processes die.
class DOMStorageDispatcherHost
: public base::RefCountedThreadSafe<DOMStorageDispatcherHost> {
public:
// Only call the constructor from the UI thread.
DOMStorageDispatcherHost(IPC::Message::Sender* message_sender,
WebKitContext* webkit_context, WebKitThread* webkit_thread);
// Only call from ResourceMessageFilter on the IO thread.
void Init(base::ProcessHandle process_handle);
// Only call from ResourceMessageFilter on the IO thread. Calls self on the
// WebKit thread in some cases.
void Shutdown();
// Only call from ResourceMessageFilter on the IO thread.
bool OnMessageReceived(const IPC::Message& message, bool *msg_is_ok);
// Clones a session storage namespace and returns the cloned namespaces' id.
// Only call on the IO thread.
int64 CloneSessionStorage(int64 original_id);
// Send a message to the renderer process associated with our
// message_sender_ via the IO thread. May be called from any thread.
void Send(IPC::Message* message);
// Only call on the WebKit thread.
static void DispatchStorageEvent(const NullableString16& key,
const NullableString16& old_value, const NullableString16& new_value,
const string16& origin, const GURL& url, bool is_local_storage);
private:
friend class base::RefCountedThreadSafe<DOMStorageDispatcherHost>;
~DOMStorageDispatcherHost();
// Message Handlers.
void OnStorageAreaId(int64 namespace_id, const string16& origin,
IPC::Message* reply_msg);
void OnLength(int64 storage_area_id, IPC::Message* reply_msg);
void OnKey(int64 storage_area_id, unsigned index, IPC::Message* reply_msg);
void OnGetItem(int64 storage_area_id, const string16& key,
IPC::Message* reply_msg);
void OnSetItem(int64 storage_area_id, const string16& key,
const string16& value, const GURL& url,
IPC::Message* reply_msg);
void OnRemoveItem(int64 storage_area_id, const string16& key,
const GURL& url, IPC::Message* reply_msg);
void OnClear(int64 storage_area_id, const GURL& url, IPC::Message* reply_msg);
// Only call on the IO thread.
void OnStorageEvent(const ViewMsg_DOMStorageEvent_Params& params);
// A shortcut for accessing our context.
DOMStorageContext* Context() {
return webkit_context_->dom_storage_context();
}
// Use whenever there's a chance OnStorageEvent will be called.
class ScopedStorageEventContext {
public:
ScopedStorageEventContext(DOMStorageDispatcherHost* dispatcher_host,
const GURL* url);
~ScopedStorageEventContext();
};
// Only access on the WebKit thread! Used for storage events.
static DOMStorageDispatcherHost* storage_event_host_;
static const GURL* storage_event_url_;
// Data shared between renderer processes with the same profile.
scoped_refptr<WebKitContext> webkit_context_;
// ResourceDispatcherHost takes care of destruction. Immutable.
WebKitThread* webkit_thread_;
// Only set on the IO thread.
IPC::Message::Sender* message_sender_;
// If we get a corrupt message from a renderer, we need to kill it using this
// handle.
base::ProcessHandle process_handle_;
DISALLOW_IMPLICIT_CONSTRUCTORS(DOMStorageDispatcherHost);
};
#endif // CHROME_BROWSER_IN_PROCESS_WEBKIT_DOM_STORAGE_DISPATCHER_HOST_H_
|