2011-06-10  Yury Semikhatsky  <yurys@chromium.org>

        Reviewed by Dmitry Titov.

        [Chromium] Worker object may be garbage collected if it doesn't send any messages
        https://bugs.webkit.org/show_bug.cgi?id=62446

        * fast/workers/resources/worker-init.js: Added.
        * fast/workers/worker-init-expected.txt: Added.
        * fast/workers/worker-init.html: Added.
2011-06-10  Yury Semikhatsky  <yurys@chromium.org>

        Reviewed by Dmitry Titov.

        [Chromium] Worker object may be garbage collected if it doesn't send any messages
        https://bugs.webkit.org/show_bug.cgi?id=62446

        Assume that WorkerContext has pending activity before explicit notification
        is received from it. It prevents worker object from being collected before
        the first message from its context is received.

        * src/WebWorkerClientImpl.cpp:
        (WebKit::WebWorkerClientImpl::startWorkerContext):
        (WebKit::WebWorkerClientImpl::startWorkerContextInternal):
        (WebKit::WebWorkerClientImpl::startWorkerContextTask):
        * src/WebWorkerClientImpl.h:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@88914 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 6d4f716..4f94fd6 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,14 @@
+2011-06-10  Yury Semikhatsky  <yurys@chromium.org>
+
+        Reviewed by Dmitry Titov.
+
+        [Chromium] Worker object may be garbage collected if it doesn't send any messages
+        https://bugs.webkit.org/show_bug.cgi?id=62446
+
+        * fast/workers/resources/worker-init.js: Added.
+        * fast/workers/worker-init-expected.txt: Added.
+        * fast/workers/worker-init.html: Added.
+
 2011-06-15  Nikolas Zimmermann  <nzimmermann@rim.com>
 
         Reviewed by David Hyatt.
diff --git a/LayoutTests/fast/workers/resources/worker-init.js b/LayoutTests/fast/workers/resources/worker-init.js
new file mode 100644
index 0000000..b5c2628
--- /dev/null
+++ b/LayoutTests/fast/workers/resources/worker-init.js
@@ -0,0 +1,2 @@
+postMessage("SUCCESS: Worker context initialized");
+
diff --git a/LayoutTests/fast/workers/worker-init-expected.txt b/LayoutTests/fast/workers/worker-init-expected.txt
new file mode 100644
index 0000000..4414fe5
--- /dev/null
+++ b/LayoutTests/fast/workers/worker-init-expected.txt
@@ -0,0 +1,4 @@
+Test that worker object is not garbage collected if there is a message from worker context. Should print "SUCCESS". Bug 62446
+
+SUCCESS: Worker context initialized
+
diff --git a/LayoutTests/fast/workers/worker-init.html b/LayoutTests/fast/workers/worker-init.html
new file mode 100644
index 0000000..eb3bcdd
--- /dev/null
+++ b/LayoutTests/fast/workers/worker-init.html
@@ -0,0 +1,43 @@
+<body>
+<p>Test that worker object is not garbage collected if there is a message from
+worker context. Should print "SUCCESS".
+<a href="https://bugs.webkit.org/show_bug.cgi?id=62446">Bug 62446</a></p>
+<div id=result></div>
+<script>
+function log(message)
+{
+    document.getElementById("result").innerHTML += message + "<br>";
+}
+
+function gc()
+{
+    if (window.GCController)
+        return GCController.collect();
+
+    var head;
+    for (var i = 0; i < 10000; i++) {
+        var newHead = new Array(1000);
+        newHead[0] = head;
+        head = newHead;
+    }
+}
+
+if (window.layoutTestController) {
+    layoutTestController.dumpAsText();
+    layoutTestController.waitUntilDone();
+}
+
+var interval = setInterval(gc, 0);
+
+var worker = new Worker('resources/worker-init.js');
+worker.onmessage = function(evt) {
+    log(evt.data);
+    clearInterval(interval);
+    if (window.layoutTestController)
+        layoutTestController.notifyDone();
+}
+worker = 0;
+gc();
+</script>
+</body>
+</html>
diff --git a/Source/WebKit/chromium/ChangeLog b/Source/WebKit/chromium/ChangeLog
index 45b5981..e871c1b 100644
--- a/Source/WebKit/chromium/ChangeLog
+++ b/Source/WebKit/chromium/ChangeLog
@@ -1,3 +1,20 @@
+2011-06-10  Yury Semikhatsky  <yurys@chromium.org>
+
+        Reviewed by Dmitry Titov.
+
+        [Chromium] Worker object may be garbage collected if it doesn't send any messages
+        https://bugs.webkit.org/show_bug.cgi?id=62446
+
+        Assume that WorkerContext has pending activity before explicit notification
+        is received from it. It prevents worker object from being collected before
+        the first message from its context is received.
+
+        * src/WebWorkerClientImpl.cpp:
+        (WebKit::WebWorkerClientImpl::startWorkerContext):
+        (WebKit::WebWorkerClientImpl::startWorkerContextInternal):
+        (WebKit::WebWorkerClientImpl::startWorkerContextTask):
+        * src/WebWorkerClientImpl.h:
+
 2011-06-14  Eric Uhrhane  <ericu@chromium.org>
 
         Reviewed by Darin Fisher.
diff --git a/Source/WebKit/chromium/src/WebWorkerClientImpl.cpp b/Source/WebKit/chromium/src/WebWorkerClientImpl.cpp
index 42c5317..c198ccf 100644
--- a/Source/WebKit/chromium/src/WebWorkerClientImpl.cpp
+++ b/Source/WebKit/chromium/src/WebWorkerClientImpl.cpp
@@ -150,7 +150,13 @@
             sourceCode));
         return;
     }
+    startWorkerContextInternal(scriptURL, userAgent, sourceCode);
+}
+
+void WebWorkerClientImpl::startWorkerContextInternal(const KURL& scriptURL, const WTF::String& userAgent, const WTF::String& sourceCode)
+{
     m_webWorker->startWorkerContext(scriptURL, userAgent, sourceCode);
+    m_workerContextHadPendingActivity = true; // Worker initialization means a pending activity.
 }
 
 void WebWorkerClientImpl::terminateWorkerContext()
@@ -351,8 +357,7 @@
                                                  const String& userAgent,
                                                  const String& sourceCode)
 {
-    thisPtr->m_webWorker->startWorkerContext(KURL(ParsedURLString, scriptURL),
-                                             userAgent, sourceCode);
+    thisPtr->startWorkerContextInternal(KURL(ParsedURLString, scriptURL), userAgent, sourceCode);
 }
 
 void WebWorkerClientImpl::terminateWorkerContextTask(ScriptExecutionContext* context,
diff --git a/Source/WebKit/chromium/src/WebWorkerClientImpl.h b/Source/WebKit/chromium/src/WebWorkerClientImpl.h
index 658bf5a..c270ffc 100644
--- a/Source/WebKit/chromium/src/WebWorkerClientImpl.h
+++ b/Source/WebKit/chromium/src/WebWorkerClientImpl.h
@@ -159,6 +159,8 @@
                                           WebWorkerClientImpl* thisPtr,
                                           bool hasPendingActivity);
 
+    void startWorkerContextInternal(const WebCore::KURL& scriptURL, const WTF::String& userAgent, const WTF::String& sourceCode);
+
     // Guard against context from being destroyed before a worker exits.
     RefPtr<WebCore::ScriptExecutionContext> m_scriptExecutionContext;