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 #ifndef CHROME_BROWSER_WORKER_HOST_WORKER_PROCESS_HOST_H_ | 5 #ifndef CHROME_BROWSER_WORKER_HOST_WORKER_PROCESS_HOST_H_ |
6 #define CHROME_BROWSER_WORKER_HOST_WORKER_PROCESS_HOST_H_ | 6 #define CHROME_BROWSER_WORKER_HOST_WORKER_PROCESS_HOST_H_ |
7 #pragma once | 7 #pragma once |
8 | 8 |
9 #include <list> | 9 #include <list> |
10 | 10 |
11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
12 #include "base/callback.h" | |
13 #include "base/file_path.h" | 12 #include "base/file_path.h" |
14 #include "chrome/browser/browser_child_process_host.h" | 13 #include "chrome/browser/browser_child_process_host.h" |
15 #include "chrome/browser/net/chrome_url_request_context.h" | 14 #include "chrome/browser/net/chrome_url_request_context.h" |
16 #include "chrome/browser/worker_host/worker_document_set.h" | 15 #include "chrome/browser/worker_host/worker_document_set.h" |
17 #include "googleurl/src/gurl.h" | 16 #include "googleurl/src/gurl.h" |
18 | 17 |
19 class ChromeURLRequestContext; | 18 class URLRequestContextGetter; |
20 class ChromeURLRequestContextGetter; | |
21 namespace webkit_database { | |
22 class DatabaseTracker; | |
23 } // namespace webkit_database | |
24 | |
25 struct ViewHostMsg_CreateWorker_Params; | |
26 | 19 |
27 // The WorkerProcessHost is the interface that represents the browser side of | 20 // The WorkerProcessHost is the interface that represents the browser side of |
28 // the browser <-> worker communication channel. There will be one | 21 // the browser <-> worker communication channel. There will be one |
29 // WorkerProcessHost per worker process. Currently each worker runs in its own | 22 // WorkerProcessHost per worker process. Currently each worker runs in its own |
30 // process, but that may change. However, we do assume [by storing a | 23 // process, but that may change. However, we do assume [by storing a |
31 // ChromeURLRequestContext] that a WorkerProcessHost serves a single Profile. | 24 // URLRequestContext] that a WorkerProcessHost serves a single Profile. |
32 class WorkerProcessHost : public BrowserChildProcessHost { | 25 class WorkerProcessHost : public BrowserChildProcessHost { |
33 public: | 26 public: |
34 | 27 |
35 // Contains information about each worker instance, needed to forward messages | 28 // Contains information about each worker instance, needed to forward messages |
36 // between the renderer and worker processes. | 29 // between the renderer and worker processes. |
37 class WorkerInstance { | 30 class WorkerInstance { |
38 public: | 31 public: |
39 WorkerInstance(const GURL& url, | 32 WorkerInstance(const GURL& url, |
40 bool shared, | 33 bool shared, |
41 bool off_the_record, | 34 bool off_the_record, |
42 const string16& name, | 35 const string16& name, |
43 int worker_route_id, | 36 int worker_route_id, |
44 int parent_process_id, | 37 int parent_process_id, |
45 int parent_appcache_host_id, | 38 int parent_appcache_host_id, |
46 int64 main_resource_appcache_id, | 39 int64 main_resource_appcache_id, |
47 ChromeURLRequestContext* request_context); | 40 URLRequestContextGetter* request_context); |
48 ~WorkerInstance(); | 41 ~WorkerInstance(); |
49 | 42 |
50 // Unique identifier for a worker client. | 43 // Unique identifier for a worker client. |
51 typedef std::pair<IPC::Message::Sender*, int> SenderInfo; | 44 typedef std::pair<WorkerMessageFilter*, int> FilterInfo; |
52 | 45 |
53 // APIs to manage the sender list for a given instance. | 46 // APIs to manage the filter list for a given instance. |
54 void AddSender(IPC::Message::Sender* sender, int sender_route_id); | 47 void AddFilter(WorkerMessageFilter* filter, int route_id); |
55 void RemoveSender(IPC::Message::Sender* sender, int sender_route_id); | 48 void RemoveFilter(WorkerMessageFilter* filter, int route_id); |
56 void RemoveSenders(IPC::Message::Sender* sender); | 49 void RemoveFilters(WorkerMessageFilter* filter); |
57 bool HasSender(IPC::Message::Sender* sender, int sender_route_id) const; | 50 bool HasFilter(WorkerMessageFilter* filter, int route_id) const; |
58 bool RendererIsParent(int renderer_id, int render_view_route_id) const; | 51 bool RendererIsParent(int render_process_id, int render_view_id) const; |
59 int NumSenders() const { return senders_.size(); } | 52 int NumFilters() const { return filters_.size(); } |
60 // Returns the single sender (must only be one). | 53 // Returns the single filter (must only be one). |
61 SenderInfo GetSender() const; | 54 FilterInfo GetFilter() const; |
62 | 55 |
63 typedef std::list<SenderInfo> SenderList; | 56 typedef std::list<FilterInfo> FilterList; |
64 const SenderList& senders() const { return senders_; } | 57 const FilterList& filters() const { return filters_; } |
65 | 58 |
66 // Checks if this WorkerInstance matches the passed url/name params | 59 // Checks if this WorkerInstance matches the passed url/name params |
67 // (per the comparison algorithm in the WebWorkers spec). This API only | 60 // (per the comparison algorithm in the WebWorkers spec). This API only |
68 // applies to shared workers. | 61 // applies to shared workers. |
69 bool Matches( | 62 bool Matches( |
70 const GURL& url, const string16& name, bool off_the_record) const; | 63 const GURL& url, const string16& name, bool off_the_record) const; |
71 | 64 |
72 // Shares the passed instance's WorkerDocumentSet with this instance. This | 65 // Shares the passed instance's WorkerDocumentSet with this instance. This |
73 // instance's current WorkerDocumentSet is dereferenced (and freed if this | 66 // instance's current WorkerDocumentSet is dereferenced (and freed if this |
74 // is the only reference) as a result. | 67 // is the only reference) as a result. |
(...skipping 10 matching lines...) Expand all Loading... |
85 const string16 name() const { return name_; } | 78 const string16 name() const { return name_; } |
86 int worker_route_id() const { return worker_route_id_; } | 79 int worker_route_id() const { return worker_route_id_; } |
87 int parent_process_id() const { return parent_process_id_; } | 80 int parent_process_id() const { return parent_process_id_; } |
88 int parent_appcache_host_id() const { return parent_appcache_host_id_; } | 81 int parent_appcache_host_id() const { return parent_appcache_host_id_; } |
89 int64 main_resource_appcache_id() const { | 82 int64 main_resource_appcache_id() const { |
90 return main_resource_appcache_id_; | 83 return main_resource_appcache_id_; |
91 } | 84 } |
92 WorkerDocumentSet* worker_document_set() const { | 85 WorkerDocumentSet* worker_document_set() const { |
93 return worker_document_set_; | 86 return worker_document_set_; |
94 } | 87 } |
95 ChromeURLRequestContext* request_context() const { | 88 URLRequestContextGetter* request_context() const { |
96 return request_context_; | 89 return request_context_; |
97 } | 90 } |
98 | 91 |
99 private: | 92 private: |
100 // Set of all senders (clients) associated with this worker. | 93 // Set of all filters (clients) associated with this worker. |
101 GURL url_; | 94 GURL url_; |
102 bool shared_; | 95 bool shared_; |
103 bool off_the_record_; | 96 bool off_the_record_; |
104 bool closed_; | 97 bool closed_; |
105 string16 name_; | 98 string16 name_; |
106 int worker_route_id_; | 99 int worker_route_id_; |
107 int parent_process_id_; | 100 int parent_process_id_; |
108 int parent_appcache_host_id_; | 101 int parent_appcache_host_id_; |
109 int64 main_resource_appcache_id_; | 102 int64 main_resource_appcache_id_; |
110 scoped_refptr<ChromeURLRequestContext> request_context_; | 103 scoped_refptr<URLRequestContextGetter> request_context_; |
111 SenderList senders_; | 104 FilterList filters_; |
112 scoped_refptr<WorkerDocumentSet> worker_document_set_; | 105 scoped_refptr<WorkerDocumentSet> worker_document_set_; |
113 }; | 106 }; |
114 | 107 |
115 WorkerProcessHost( | 108 WorkerProcessHost( |
116 ResourceDispatcherHost* resource_dispatcher_host, | 109 ResourceDispatcherHost* resource_dispatcher_host, |
117 ChromeURLRequestContext* request_context); | 110 URLRequestContextGetter* request_context); |
118 ~WorkerProcessHost(); | 111 ~WorkerProcessHost(); |
119 | 112 |
120 // Starts the process. Returns true iff it succeeded. | 113 // Starts the process. Returns true iff it succeeded. |
121 bool Init(); | 114 // |render_process_id| is the renderer process responsible for starting this |
| 115 // worker. |
| 116 bool Init(int render_process_id); |
122 | 117 |
123 // Creates a worker object in the process. | 118 // Creates a worker object in the process. |
124 void CreateWorker(const WorkerInstance& instance); | 119 void CreateWorker(const WorkerInstance& instance); |
125 | 120 |
126 // Returns true iff the given message from a renderer process was forwarded to | 121 // Returns true iff the given message from a renderer process was forwarded to |
127 // the worker. | 122 // the worker. |
128 bool FilterMessage(const IPC::Message& message, IPC::Message::Sender* sender); | 123 bool FilterMessage(const IPC::Message& message, WorkerMessageFilter* filter); |
129 | 124 |
130 void SenderShutdown(IPC::Message::Sender* sender); | 125 void FilterShutdown(WorkerMessageFilter* filter); |
131 | 126 |
132 // Shuts down any shared workers that are no longer referenced by active | 127 // Shuts down any shared workers that are no longer referenced by active |
133 // documents. | 128 // documents. |
134 void DocumentDetached(IPC::Message::Sender* sender, | 129 void DocumentDetached(WorkerMessageFilter* filter, |
135 unsigned long long document_id); | 130 unsigned long long document_id); |
136 | 131 |
137 ChromeURLRequestContext* request_context() const { | 132 URLRequestContextGetter* request_context() const { |
138 return request_context_; | 133 return request_context_; |
139 } | 134 } |
140 | 135 |
141 protected: | 136 protected: |
142 friend class WorkerService; | 137 friend class WorkerService; |
143 | 138 |
144 typedef std::list<WorkerInstance> Instances; | 139 typedef std::list<WorkerInstance> Instances; |
145 const Instances& instances() const { return instances_; } | 140 const Instances& instances() const { return instances_; } |
146 Instances& mutable_instances() { return instances_; } | 141 Instances& mutable_instances() { return instances_; } |
147 | 142 |
148 private: | 143 private: |
| 144 // Called when the process has been launched successfully. |
| 145 virtual void OnProcessLaunched(); |
| 146 |
| 147 // Creates and adds the message filters. |
| 148 void CreateMessageFilters(int render_process_id); |
| 149 |
149 // IPC::Channel::Listener implementation: | 150 // IPC::Channel::Listener implementation: |
150 // Called when a message arrives from the worker process. | 151 // Called when a message arrives from the worker process. |
151 virtual void OnMessageReceived(const IPC::Message& message); | 152 virtual void OnMessageReceived(const IPC::Message& message); |
152 | 153 |
153 // Creates and adds the message filters. | |
154 void CreateMessageFilters(); | |
155 | |
156 // Called when the process has been launched successfully. | |
157 virtual void OnProcessLaunched(); | |
158 | |
159 // Called when the app invokes close() from within worker context. | |
160 void OnWorkerContextClosed(int worker_route_id); | 154 void OnWorkerContextClosed(int worker_route_id); |
161 | 155 void OnAllowDatabase(int worker_route_id, |
162 // Called if a worker tries to connect to a shared worker. | 156 const GURL& url, |
163 void OnLookupSharedWorker(const ViewHostMsg_CreateWorker_Params& params, | 157 const string16& name, |
164 bool* exists, | 158 const string16& display_name, |
165 int* route_id, | 159 unsigned long estimated_size, |
166 bool* url_error); | 160 bool* result); |
167 | |
168 // Given a Sender, returns the callback that generates a new routing id. | |
169 static CallbackWithReturnValue<int>::Type* GetNextRouteIdCallback( | |
170 IPC::Message::Sender* sender); | |
171 | 161 |
172 // Relays a message to the given endpoint. Takes care of parsing the message | 162 // Relays a message to the given endpoint. Takes care of parsing the message |
173 // if it contains a message port and sending it a valid route id. | 163 // if it contains a message port and sending it a valid route id. |
174 static void RelayMessage(const IPC::Message& message, | 164 static void RelayMessage(const IPC::Message& message, |
175 IPC::Message::Sender* sender, | 165 WorkerMessageFilter* filter, |
176 int route_id, | 166 int route_id); |
177 CallbackWithReturnValue<int>::Type* next_route_id); | |
178 | 167 |
179 virtual bool CanShutdown(); | 168 virtual bool CanShutdown(); |
180 | 169 |
181 // Updates the title shown in the task manager. | 170 // Updates the title shown in the task manager. |
182 void UpdateTitle(); | 171 void UpdateTitle(); |
183 | 172 |
184 void OnCreateWorker(const ViewHostMsg_CreateWorker_Params& params, | 173 ChromeURLRequestContext* GetChromeURLRequestContext(); |
185 int* route_id); | |
186 void OnCancelCreateDedicatedWorker(int route_id); | |
187 void OnForwardToWorker(const IPC::Message& message); | |
188 | |
189 // Checks the content settings whether access to web databases is enabled and | |
190 // relays the WebDatabaseAccessed message to all documents attached to a | |
191 // worker. | |
192 void OnAllowDatabase(const GURL& url, | |
193 const string16& name, | |
194 const string16& display_name, | |
195 unsigned long estimated_size, | |
196 IPC::Message* reply_msg); | |
197 | 174 |
198 Instances instances_; | 175 Instances instances_; |
199 | 176 |
200 scoped_refptr<ChromeURLRequestContext> request_context_; | 177 scoped_refptr<URLRequestContextGetter> request_context_; |
201 | 178 |
202 // A callback to create a routing id for the associated worker process. | 179 // A reference to the filter associated with this worker process. We need to |
203 scoped_ptr<CallbackWithReturnValue<int>::Type> next_route_id_callback_; | 180 // keep this around since we'll use it when forward messages to the worker |
| 181 // process. |
| 182 scoped_refptr<WorkerMessageFilter> worker_message_filter_; |
204 | 183 |
205 DISALLOW_COPY_AND_ASSIGN(WorkerProcessHost); | 184 DISALLOW_COPY_AND_ASSIGN(WorkerProcessHost); |
206 }; | 185 }; |
207 | 186 |
208 #endif // CHROME_BROWSER_WORKER_HOST_WORKER_PROCESS_HOST_H_ | 187 #endif // CHROME_BROWSER_WORKER_HOST_WORKER_PROCESS_HOST_H_ |
OLD | NEW |