summaryrefslogtreecommitdiffstats
path: root/webkit/tools/test_shell/test_worker
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-01 20:33:27 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-01 20:33:27 +0000
commit982e781d80d395cd9749de92d2efd6a309168cd3 (patch)
tree74cb4e36be8cf047c25812649a4f3a2f5325520f /webkit/tools/test_shell/test_worker
parent52049d5cfde95de013f8f333f940fef4ecd31533 (diff)
downloadchromium_src-982e781d80d395cd9749de92d2efd6a309168cd3.zip
chromium_src-982e781d80d395cd9749de92d2efd6a309168cd3.tar.gz
chromium_src-982e781d80d395cd9749de92d2efd6a309168cd3.tar.bz2
Call WebWorkerClient on the main thread. This makes it consistent with the rest of the WebKit API, which is single threaded. Also a bunch of small fixes to make layout tests pass: the dll was being unloaded while its functions were still queued to be dispatched, and a string allocated in the dll was being GC'd in test shell.
BUG=11011 Review URL: http://codereview.chromium.org/102005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@15087 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/tools/test_shell/test_worker')
-rw-r--r--webkit/tools/test_shell/test_worker/test_webworker.cc108
-rw-r--r--webkit/tools/test_shell/test_worker/test_worker_main.cc12
2 files changed, 35 insertions, 85 deletions
diff --git a/webkit/tools/test_shell/test_worker/test_webworker.cc b/webkit/tools/test_shell/test_worker/test_webworker.cc
index 6b073b5..29733b4 100644
--- a/webkit/tools/test_shell/test_worker/test_webworker.cc
+++ b/webkit/tools/test_shell/test_worker/test_webworker.cc
@@ -19,21 +19,6 @@ using WebKit::WebURL;
using WebKit::WebWorker;
using WebKit::WebWorkerClient;
-// We use this class to pass a WebString between threads. This works by
-// copying to a string16 which is itself safe to pass between threads.
-// TODO(jam): Remove this once all worker callbacks happen on the main thread.
-class ThreadSafeWebString {
- public:
- explicit ThreadSafeWebString(const WebString& str)
- : str_(str) {
- }
- operator WebString() const {
- return str_;
- }
- private:
- string16 str_;
-};
-
TestWebWorker::TestWebWorker(WebWorkerClient* client,
TestWebWorkerHelper* webworker_helper)
: webworkerclient_delegate_(client),
@@ -81,32 +66,22 @@ void TestWebWorker::workerObjectDestroyed() {
}
void TestWebWorker::postMessageToWorkerObject(const WebString& message) {
- if (webworker_helper_->IsMainThread()) {
- if (webworkerclient_delegate_)
- webworkerclient_delegate_->postMessageToWorkerObject(message);
- } else {
- webworker_helper_->DispatchToMainThread(
- InvokeMainThreadMethod, NewRunnableMethod(
- this, &TestWebWorker::postMessageToWorkerObject,
- ThreadSafeWebString(message)));
- }
+ if (!webworkerclient_delegate_)
+ return;
+ // The string was created in the dll's memory space as a result of a postTask.
+ // If we pass it to test shell's memory space, it'll cause problems when GC
+ // occurs. So duplicate it from the test shell's memory space first.
+ webworkerclient_delegate_->postMessageToWorkerObject(
+ webworker_helper_->DuplicateString(message));
}
void TestWebWorker::postExceptionToWorkerObject(const WebString& error_message,
int line_number,
const WebString& source_url) {
- if (webworker_helper_->IsMainThread()) {
- if (webworkerclient_delegate_)
- webworkerclient_delegate_->postExceptionToWorkerObject(error_message,
- line_number,
- source_url);
- } else {
- webworker_helper_->DispatchToMainThread(
- InvokeMainThreadMethod, NewRunnableMethod(
- this, &TestWebWorker::postExceptionToWorkerObject,
- ThreadSafeWebString(error_message), line_number,
- ThreadSafeWebString(source_url)));
- }
+ if (webworkerclient_delegate_)
+ webworkerclient_delegate_->postExceptionToWorkerObject(error_message,
+ line_number,
+ source_url);
}
void TestWebWorker::postConsoleMessageToWorkerObject(
@@ -116,63 +91,28 @@ void TestWebWorker::postConsoleMessageToWorkerObject(
const WebString& message,
int line_number,
const WebString& source_url) {
- if (webworker_helper_->IsMainThread()) {
- if (webworkerclient_delegate_)
- webworkerclient_delegate_->postConsoleMessageToWorkerObject(
- destination_id, source_id, message_level, message, line_number,
- source_url);
- } else {
- webworker_helper_->DispatchToMainThread(
- InvokeMainThreadMethod, NewRunnableMethod(
- this, &TestWebWorker::postConsoleMessageToWorkerObject,
- destination_id, source_id, message_level,
- ThreadSafeWebString(message), line_number,
- ThreadSafeWebString(source_url)));
- }
+ if (webworkerclient_delegate_)
+ webworkerclient_delegate_->postConsoleMessageToWorkerObject(
+ destination_id, source_id, message_level, message, line_number,
+ source_url);
}
void TestWebWorker::confirmMessageFromWorkerObject(bool has_pending_activity) {
- if (webworker_helper_->IsMainThread()) {
- if (webworkerclient_delegate_)
- webworkerclient_delegate_->confirmMessageFromWorkerObject(
- has_pending_activity);
- } else {
- webworker_helper_->DispatchToMainThread(
- InvokeMainThreadMethod, NewRunnableMethod(
- this, &TestWebWorker::confirmMessageFromWorkerObject,
- has_pending_activity));
- }
+ if (webworkerclient_delegate_)
+ webworkerclient_delegate_->confirmMessageFromWorkerObject(
+ has_pending_activity);
}
void TestWebWorker::reportPendingActivity(bool has_pending_activity) {
- if (webworker_helper_->IsMainThread()) {
- if (webworkerclient_delegate_)
- webworkerclient_delegate_->reportPendingActivity(has_pending_activity);
- } else {
- webworker_helper_->DispatchToMainThread(
- InvokeMainThreadMethod, NewRunnableMethod(
- this, &TestWebWorker::reportPendingActivity,
- has_pending_activity));
- }
+ if (webworkerclient_delegate_)
+ webworkerclient_delegate_->reportPendingActivity(has_pending_activity);
}
void TestWebWorker::workerContextDestroyed() {
- if (webworker_helper_->IsMainThread()) {
- if (webworkerclient_delegate_)
- webworkerclient_delegate_->workerContextDestroyed();
- Release(); // Releases the reference held for worker context object.
- } else {
- webworker_impl_ = NULL;
- webworker_helper_->DispatchToMainThread(
- InvokeMainThreadMethod, NewRunnableMethod(
- this, &TestWebWorker::workerContextDestroyed));
- }
-}
-
-void TestWebWorker::InvokeMainThreadMethod(void* param) {
- Task* task = static_cast<Task*>(param);
- task->Run();
- delete task;
+ webworker_impl_ = NULL;
+ if (webworkerclient_delegate_)
+ webworkerclient_delegate_->workerContextDestroyed();
+ Release(); // Releases the reference held for worker context object.
}
#endif
diff --git a/webkit/tools/test_shell/test_worker/test_worker_main.cc b/webkit/tools/test_shell/test_worker/test_worker_main.cc
index 6695a11..9273d35 100644
--- a/webkit/tools/test_shell/test_worker/test_worker_main.cc
+++ b/webkit/tools/test_shell/test_worker/test_worker_main.cc
@@ -29,6 +29,9 @@ static base::AtExitManager global_at_exit_manager;
// Stub WebKit Client.
class WorkerWebKitClientImpl : public webkit_glue::WebKitClientImpl {
public:
+ explicit WorkerWebKitClientImpl(TestWebWorkerHelper* helper)
+ : helper_(helper) { }
+
// WebKitClient methods:
virtual WebKit::WebClipboard* clipboard() {
NOTREACHED();
@@ -76,6 +79,13 @@ class WorkerWebKitClientImpl : public webkit_glue::WebKitClientImpl {
NOTREACHED();
return WebKit::WebString();
}
+
+ virtual void callOnMainThread(void (*func)()) {
+ helper_->DispatchToMainThread(func);
+ }
+
+ private:
+ TestWebWorkerHelper* helper_;
};
// WebKit client used in DLL.
@@ -89,7 +99,7 @@ extern "C" {
WebWorker* API_CALL CreateWebWorker(WebWorkerClient* webworker_client,
TestWebWorkerHelper* webworker_helper) {
if (!WebKit::webKitClient()) {
- webkit_client.reset(new WorkerWebKitClientImpl());
+ webkit_client.reset(new WorkerWebKitClientImpl(webworker_helper));
WebKit::initialize(webkit_client.get());
}