Index: content/browser/service_worker/service_worker_dispatcher_host.cc |
diff --git a/content/browser/service_worker/service_worker_dispatcher_host.cc b/content/browser/service_worker/service_worker_dispatcher_host.cc |
index a02c5690faf9bd6d5de743a6c257decf1dd056b5..d001130d3e8eed1c6a8acc38ceb01c2562933d83 100644 |
--- a/content/browser/service_worker/service_worker_dispatcher_host.cc |
+++ b/content/browser/service_worker/service_worker_dispatcher_host.cc |
@@ -5,10 +5,12 @@ |
#include "content/browser/service_worker/service_worker_dispatcher_host.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "content/browser/message_port_message_filter.h" |
+#include "content/browser/message_port_service.h" |
#include "content/browser/service_worker/embedded_worker_registry.h" |
#include "content/browser/service_worker/service_worker_context_core.h" |
#include "content/browser/service_worker/service_worker_context_wrapper.h" |
-#include "content/browser/service_worker/service_worker_provider_host.h" |
+#include "content/browser/service_worker/service_worker_registration.h" |
#include "content/common/service_worker/embedded_worker_messages.h" |
#include "content/common/service_worker/service_worker_messages.h" |
#include "ipc/ipc_message_macros.h" |
@@ -34,10 +36,12 @@ const uint32 kFilteredMessageClasses[] = { |
namespace content { |
ServiceWorkerDispatcherHost::ServiceWorkerDispatcherHost( |
- int render_process_id) |
- : BrowserMessageFilter( |
- kFilteredMessageClasses, arraysize(kFilteredMessageClasses)), |
- render_process_id_(render_process_id) { |
+ int render_process_id, |
+ MessagePortMessageFilter* message_port_message_filter) |
+ : BrowserMessageFilter(kFilteredMessageClasses, |
+ arraysize(kFilteredMessageClasses)), |
+ render_process_id_(render_process_id), |
+ message_port_message_filter_(message_port_message_filter) { |
} |
ServiceWorkerDispatcherHost::~ServiceWorkerDispatcherHost() { |
@@ -84,6 +88,8 @@ bool ServiceWorkerDispatcherHost::OnMessageReceived( |
OnAddScriptClient) |
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_RemoveScriptClient, |
OnRemoveScriptClient) |
+ IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessage, |
+ OnPostMessage) |
IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerStarted, |
OnWorkerStarted) |
IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerStopped, |
@@ -157,6 +163,47 @@ void ServiceWorkerDispatcherHost::OnUnregisterServiceWorker( |
request_id)); |
} |
+void ServiceWorkerDispatcherHost::OnPostMessage( |
+ int64 registration_id, |
+ base::string16 message, |
michaeln
2014/03/11 23:17:34
const ref here
jsbell
2014/03/12 18:16:16
Done.
|
+ std::vector<int> sent_message_port_ids) { |
michaeln
2014/03/11 23:17:34
ditto here and in the next method sig too
jsbell
2014/03/12 18:16:16
Done.
|
+ if (!context_ || !context_->IsEnabled()) |
+ return; |
+ |
+ context_->storage()->FindRegistrationForId( |
+ registration_id, |
+ base::Bind(&ServiceWorkerDispatcherHost::PostMessageFoundRegistration, |
+ this, |
+ message, |
+ sent_message_port_ids)); |
+} |
+ |
+static void NoOpStatusCallback(ServiceWorkerStatusCode status) {} |
+ |
+void ServiceWorkerDispatcherHost::PostMessageFoundRegistration( |
+ base::string16 message, |
+ std::vector<int> sent_message_port_ids, |
+ ServiceWorkerStatusCode status, |
+ const scoped_refptr<ServiceWorkerRegistration>& result) { |
+ // TODO(jsbell): Can we assert anything here? |
+ if (status == SERVICE_WORKER_ERROR_NOT_FOUND) |
+ return; |
+ |
+ std::vector<int> new_routing_ids(sent_message_port_ids.size()); |
+ for (size_t i = 0; i < sent_message_port_ids.size(); ++i) { |
+ new_routing_ids[i] = message_port_message_filter_->GetNextRoutingID(); |
+ MessagePortService::GetInstance()->UpdateMessagePort( |
michaeln
2014/03/11 23:17:34
i have no clue about msgport voodoo, but tests pas
|
+ sent_message_port_ids[i], |
+ message_port_message_filter_, |
+ new_routing_ids[i]); |
+ } |
+ |
+ // TODO(jsbell): Need version_id passed along to disambiguate? |
jsbell
2014/03/11 22:01:50
This is probably the biggest issue with this CL. T
michaeln
2014/03/11 23:17:34
This was my main question too. I think there are t
kinuko
2014/03/12 08:19:05
In the current code it'd work for both cases, thou
jsbell
2014/03/12 18:16:16
Agreed, that's the failure case I was thinking of.
|
+ result->active_version()->SendMessage( |
+ ServiceWorkerMsg_Message(message, sent_message_port_ids, new_routing_ids), |
+ base::Bind(&NoOpStatusCallback)); |
+} |
+ |
void ServiceWorkerDispatcherHost::OnProviderCreated(int provider_id) { |
if (!context_) |
return; |