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 562fc9571cafa89b4f368e976f77d64af40dc6fe..ec6a8396914b9b9dfc235d4c2973855458566018 100644 |
--- a/content/browser/service_worker/service_worker_dispatcher_host.cc |
+++ b/content/browser/service_worker/service_worker_dispatcher_host.cc |
@@ -44,7 +44,9 @@ ServiceWorkerDispatcherHost::ServiceWorkerDispatcherHost( |
: BrowserMessageFilter(kFilteredMessageClasses, |
arraysize(kFilteredMessageClasses)), |
render_process_id_(render_process_id), |
- message_port_message_filter_(message_port_message_filter) {} |
+ message_port_message_filter_(message_port_message_filter), |
+ channel_ready_(false) { |
+} |
ServiceWorkerDispatcherHost::~ServiceWorkerDispatcherHost() { |
if (context_) { |
@@ -68,6 +70,16 @@ void ServiceWorkerDispatcherHost::Init( |
render_process_id_, this); |
} |
+void ServiceWorkerDispatcherHost::OnFilterAdded(IPC::Channel* channel) { |
+ BrowserMessageFilter::OnFilterAdded(channel); |
+ channel_ready_ = true; |
+ std::vector<IPC::Message*> messages; |
+ pending_messages_.release(&messages); |
+ for (size_t i = 0; i < messages.size(); ++i) { |
+ BrowserMessageFilter::Send(messages[i]); |
+ } |
+} |
+ |
void ServiceWorkerDispatcherHost::OnDestruct() const { |
BrowserThread::DeleteOnIOThread::Destruct(this); |
} |
@@ -116,6 +128,17 @@ bool ServiceWorkerDispatcherHost::OnMessageReceived( |
return handled; |
} |
+bool ServiceWorkerDispatcherHost::Send(IPC::Message* message) { |
+ if (channel_ready_) { |
+ BrowserMessageFilter::Send(message); |
+ // Don't bother passing through Send()'s result: it's not reliable. |
+ return true; |
+ } |
+ |
+ pending_messages_.push_back(message); |
+ return true; |
+} |
+ |
void ServiceWorkerDispatcherHost::RegisterServiceWorkerHandle( |
scoped_ptr<ServiceWorkerHandle> handle) { |
int handle_id = handle->handle_id(); |