diff options
author | atwilson@chromium.org <atwilson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-09 04:23:26 +0000 |
---|---|---|
committer | atwilson@chromium.org <atwilson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-09 04:23:26 +0000 |
commit | 702690427d0185fe546ff21a01e501b77732166b (patch) | |
tree | ced2e942d4fe058e16cfc5bebbcf4daf79316485 /chrome/renderer | |
parent | 2456c5732fe85109c39dbdd3dbbb8262589a847e (diff) | |
download | chromium_src-702690427d0185fe546ff21a01e501b77732166b.zip chromium_src-702690427d0185fe546ff21a01e501b77732166b.tar.gz chromium_src-702690427d0185fe546ff21a01e501b77732166b.tar.bz2 |
Changed SharedWorkerScriptLoader and WebSharedWorkerProxy to stay alive until worker initialization is complete (they were being freed before the connect event was sent to the worker.
BUG=26233
TEST=none (will be enabled after a separate upstream patch is landed)
Review URL: http://codereview.chromium.org/372047
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@31417 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/websharedworker_proxy.cc | 18 | ||||
-rw-r--r-- | chrome/renderer/websharedworker_proxy.h | 5 | ||||
-rw-r--r-- | chrome/renderer/webworker_base.h | 3 |
3 files changed, 23 insertions, 3 deletions
diff --git a/chrome/renderer/websharedworker_proxy.cc b/chrome/renderer/websharedworker_proxy.cc index c0ecba4..fcaa83b 100644 --- a/chrome/renderer/websharedworker_proxy.cc +++ b/chrome/renderer/websharedworker_proxy.cc @@ -12,7 +12,8 @@ WebSharedWorkerProxy::WebSharedWorkerProxy(ChildThread* child_thread, int route_id, int render_view_route_id) - : WebWorkerBase(child_thread, route_id, render_view_route_id) { + : WebWorkerBase(child_thread, route_id, render_view_route_id), + m_connectListener(NULL) { } bool WebSharedWorkerProxy::isStarted() { @@ -37,7 +38,8 @@ void WebSharedWorkerProxy::clientDestroyed() { NOTREACHED(); } -void WebSharedWorkerProxy::connect(WebKit::WebMessagePortChannel* channel) { +void WebSharedWorkerProxy::connect(WebKit::WebMessagePortChannel* channel, + ConnectListener* listener) { WebMessagePortChannelImpl* webchannel = static_cast<WebMessagePortChannelImpl*>(channel); @@ -46,6 +48,12 @@ void WebSharedWorkerProxy::connect(WebKit::WebMessagePortChannel* channel) { webchannel->QueueMessages(); Send(new WorkerMsg_Connect(route_id_, message_port_id, MSG_ROUTING_NONE)); + if (HasQueuedMessages()) { + m_connectListener = listener; + } else + listener->connected(); + // The listener may free this object, so do not access the object after + // this point. } void WebSharedWorkerProxy::OnMessageReceived(const IPC::Message& message) { @@ -58,5 +66,11 @@ void WebSharedWorkerProxy::OnWorkerCreated() { // The worker is created - now send off the CreateWorkerContext message and // any other queued messages SendQueuedMessages(); + + // Inform any listener that the pending connect event has been sent + // (this can result in this object being freed). + if (m_connectListener) { + m_connectListener->connected(); + } } diff --git a/chrome/renderer/websharedworker_proxy.h b/chrome/renderer/websharedworker_proxy.h index b9ab065..6adcf08 100644 --- a/chrome/renderer/websharedworker_proxy.h +++ b/chrome/renderer/websharedworker_proxy.h @@ -26,7 +26,8 @@ class WebSharedWorkerProxy : public WebKit::WebSharedWorker, // Implementations of WebSharedWorker APIs virtual bool isStarted(); - virtual void connect(WebKit::WebMessagePortChannel* channel); + virtual void connect(WebKit::WebMessagePortChannel* channel, + ConnectListener* listener); virtual void startWorkerContext(const WebKit::WebURL& script_url, const WebKit::WebString& name, const WebKit::WebString& user_agent, @@ -40,6 +41,8 @@ class WebSharedWorkerProxy : public WebKit::WebSharedWorker, private: void OnWorkerCreated(); + ConnectListener* m_connectListener; + DISALLOW_COPY_AND_ASSIGN(WebSharedWorkerProxy); }; diff --git a/chrome/renderer/webworker_base.h b/chrome/renderer/webworker_base.h index 12ee84a..0693863 100644 --- a/chrome/renderer/webworker_base.h +++ b/chrome/renderer/webworker_base.h @@ -42,6 +42,9 @@ class WebWorkerBase : public IPC::Channel::Listener { // If WorkerStarted() has not yet been called, message is queued. bool Send(IPC::Message*); + // Returns true if there are queued messages. + bool HasQueuedMessages() { return queued_messages_.size() != 0; } + // Sends any messages currently in the queue. void SendQueuedMessages(); |