summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authoratwilson@chromium.org <atwilson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-09 04:23:26 +0000
committeratwilson@chromium.org <atwilson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-09 04:23:26 +0000
commit702690427d0185fe546ff21a01e501b77732166b (patch)
treeced2e942d4fe058e16cfc5bebbcf4daf79316485 /chrome/renderer
parent2456c5732fe85109c39dbdd3dbbb8262589a847e (diff)
downloadchromium_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.cc18
-rw-r--r--chrome/renderer/websharedworker_proxy.h5
-rw-r--r--chrome/renderer/webworker_base.h3
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();