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;