Index: chrome/browser/worker_host/worker_process_host.h |
diff --git a/chrome/browser/worker_host/worker_process_host.h b/chrome/browser/worker_host/worker_process_host.h |
index 1fae373a54a71d3d268a52543a74f2cb2bad17c0..8fc67f34140aba78ac3e9e725348c46c4d7e9321 100644 |
--- a/chrome/browser/worker_host/worker_process_host.h |
+++ b/chrome/browser/worker_host/worker_process_host.h |
@@ -17,16 +17,52 @@ class WorkerProcessHost : public ChildProcessHost { |
public: |
// Contains information about each worker instance, needed to forward messages |
// between the renderer and worker processes. |
- struct WorkerInstance { |
+ class WorkerInstance { |
jam
2009/11/12 20:11:23
nit: If this is a class, then it's against the cod
|
+ public: |
+ WorkerInstance() : closed(false) {}; |
+ |
+ // Checks if this WorkerInstance matches the passed url/name params |
jam
2009/11/12 20:11:23
nit: just to make it clear to someone reading the
|
+ // (per the comparison algorithm in the WebWorkers spec). |
+ bool Matches(const GURL& url, const string16& name) const; |
+ |
+ // Adds a document to a shared worker's document set. |
+ void AddToDocumentSet(IPC::Message::Sender* parent, |
+ unsigned long long document_id); |
+ |
+ // Checks to see if a document is in the worker's document set. |
+ bool IsInDocumentSet(IPC::Message::Sender* parent, |
+ unsigned long long document_id) const; |
+ |
+ // Removes a specific document from the set when that document is detached. |
+ void RemoveFromDocumentSet(IPC::Message::Sender* parent, |
+ unsigned long long document_id); |
+ |
+ // Invoked when a render process exits, to remove all associated documents |
+ // from the set. |
+ void RemoveAllAssociatedDocuments(IPC::Message::Sender* parent); |
+ |
+ // APIs to manage the sender list for a given instance. |
+ void AddSender(IPC::Message::Sender* sender, int sender_route_id); |
+ void RemoveSender(IPC::Message::Sender* sender, int sender_route_id); |
+ void RemoveSenders(IPC::Message::Sender* sender); |
+ bool HasSender(IPC::Message::Sender* sender, int sender_route_id) const; |
+ |
+ // Unique identifier for an associated document. |
+ typedef std::pair<IPC::Message::Sender*, unsigned long long> DocumentInfo; |
+ typedef std::set<DocumentInfo> DocumentSet; |
+ |
+ typedef std::pair<IPC::Message::Sender*, int> SenderInfo; |
+ typedef std::set<SenderInfo> SenderList; |
+ |
GURL url; |
bool is_shared; |
+ bool closed; |
string16 name; |
int renderer_id; |
int render_view_route_id; |
int worker_route_id; |
- IPC::Message::Sender* sender; |
- int sender_id; |
- int sender_route_id; |
+ SenderList senders; |
+ DocumentSet document_set; |
}; |
WorkerProcessHost(ResourceDispatcherHost* resource_dispatcher_host_); |
@@ -40,15 +76,21 @@ class WorkerProcessHost : public ChildProcessHost { |
// Returns true iff the given message from a renderer process was forwarded to |
// the worker. |
- bool FilterMessage(const IPC::Message& message, int sender_pid); |
+ bool FilterMessage(const IPC::Message& message, IPC::Message::Sender* sender); |
void SenderShutdown(IPC::Message::Sender* sender); |
+ // Shuts down any shared workers that are no longer referenced by active |
+ // documents. |
+ void DocumentDetached(IPC::Message::Sender* sender, |
+ unsigned long long document_id); |
+ |
protected: |
friend class WorkerService; |
typedef std::list<WorkerInstance> Instances; |
const Instances& instances() const { return instances_; } |
+ Instances& mutable_instances() { return instances_; } |
private: |
// ResourceDispatcherHost::Receiver implementation: |
@@ -59,6 +101,9 @@ class WorkerProcessHost : public ChildProcessHost { |
// Called when a message arrives from the worker process. |
void OnMessageReceived(const IPC::Message& message); |
+ // Called when the app invokes close() from within worker context. |
+ void OnWorkerContextClosed(int worker_route_id); |
+ |
// Given a Sender, returns the callback that generates a new routing id. |
static CallbackWithReturnValue<int>::Type* GetNextRouteIdCallback( |
IPC::Message::Sender* sender); |