Index: webkit/glue/webworkerclient_impl.cc |
diff --git a/webkit/glue/webworkerclient_impl.cc b/webkit/glue/webworkerclient_impl.cc |
deleted file mode 100644 |
index d909fd2bc525d1c5b0346e4fce6238c3c4c7d1f1..0000000000000000000000000000000000000000 |
--- a/webkit/glue/webworkerclient_impl.cc |
+++ /dev/null |
@@ -1,408 +0,0 @@ |
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "config.h" |
- |
-#if ENABLE(WORKERS) |
- |
-#include "DedicatedWorkerThread.h" |
-#include "ErrorEvent.h" |
-#include "Frame.h" |
-#include "FrameLoaderClient.h" |
-#include "GenericWorkerTask.h" |
-#include "MessageEvent.h" |
-#include "MessagePort.h" |
-#include "MessagePortChannel.h" |
-#include "ScriptExecutionContext.h" |
-#include "Worker.h" |
-#include "WorkerContext.h" |
-#include "WorkerContextExecutionProxy.h" |
-#include "WorkerMessagingProxy.h" |
-#include <wtf/Threading.h> |
- |
-#undef LOG |
- |
-#include "webkit/glue/webworkerclient_impl.h" |
- |
-#include "base/command_line.h" |
-#include "webkit/api/public/WebFrameClient.h" |
-#include "webkit/api/public/WebKit.h" |
-#include "webkit/api/public/WebKitClient.h" |
-#include "webkit/api/public/WebMessagePortChannel.h" |
-#include "webkit/api/public/WebString.h" |
-#include "webkit/api/public/WebURL.h" |
-#include "webkit/api/public/WebWorker.h" |
-#include "webkit/api/src/PlatformMessagePortChannel.h" |
-#include "webkit/glue/glue_util.h" |
-#include "webkit/glue/webframeloaderclient_impl.h" |
-#include "webkit/glue/webframe_impl.h" |
-#include "webkit/glue/webkitclient_impl.h" |
-#include "webkit/glue/webview_impl.h" |
-#include "webkit/glue/webworker_impl.h" |
- |
-using WebKit::WebFrameClient; |
-using WebKit::WebMessagePortChannel; |
-using WebKit::WebMessagePortChannelArray; |
-using WebKit::WebString; |
-using WebKit::WebWorker; |
-using WebKit::WebWorkerClient; |
- |
-// When WebKit creates a WorkerContextProxy object, we check if we're in the |
-// renderer or worker process. If the latter, then we just use |
-// WebCore::WorkerMessagingProxy. |
-// |
-// If we're in the renderer process, then we need use the glue provided |
-// WebWorker object to talk to the worker process over IPC. The worker process |
-// talks to WebCore::Worker* using WorkerObjectProxy, which we implement on |
-// WebWorkerClientImpl. |
-// |
-// Note that if we're running each worker in a separate process, then nested |
-// workers end up using the same codepath as the renderer process. |
- |
-// static |
-WebCore::WorkerContextProxy* WebWorkerClientImpl::createWorkerContextProxy( |
- WebCore::Worker* worker) { |
- if (!worker->scriptExecutionContext()->isDocument() && |
- CommandLine::ForCurrentProcess()->HasSwitch( |
- "web-worker-share-processes")) { |
- return new WebCore::WorkerMessagingProxy(worker); |
- } |
- |
- WebWorker* webworker = NULL; |
- WebWorkerClientImpl* proxy = new WebWorkerClientImpl(worker); |
- |
- if (worker->scriptExecutionContext()->isDocument()) { |
- WebCore::Document* document = static_cast<WebCore::Document*>( |
- worker->scriptExecutionContext()); |
- WebFrameImpl* webframe = WebFrameImpl::FromFrame(document->frame()); |
- webworker = webframe->client()->createWorker(webframe, proxy); |
- } else { |
- WebCore::WorkerContextExecutionProxy* current_context = |
- WebCore::WorkerContextExecutionProxy::retrieve(); |
- if (!current_context) { |
- NOTREACHED(); |
- return NULL; |
- } |
- |
- WebCore::DedicatedWorkerThread* thread = |
- static_cast<WebCore::DedicatedWorkerThread*>( |
- current_context->workerContext()->thread()); |
- WebCore::WorkerObjectProxy* worker_object_proxy = |
- &thread->workerObjectProxy(); |
- WebWorkerImpl* impl = reinterpret_cast<WebWorkerImpl*>(worker_object_proxy); |
- webworker = impl->client()->createWorker(proxy); |
- } |
- |
- proxy->set_webworker(webworker); |
- return proxy; |
-} |
- |
-WebWorkerClientImpl::WebWorkerClientImpl(WebCore::Worker* worker) |
- : script_execution_context_(worker->scriptExecutionContext()), |
- worker_(worker), |
- asked_to_terminate_(false), |
- unconfirmed_message_count_(0), |
- worker_context_had_pending_activity_(false), |
- worker_thread_id_(WTF::currentThread()) { |
-} |
- |
-WebWorkerClientImpl::~WebWorkerClientImpl() { |
-} |
- |
-void WebWorkerClientImpl::set_webworker(WebWorker* webworker) { |
- webworker_ = webworker; |
-} |
- |
-void WebWorkerClientImpl::startWorkerContext( |
- const WebCore::KURL& script_url, |
- const WebCore::String& user_agent, |
- const WebCore::String& source_code) { |
- // Worker.terminate() could be called from JS before the context is started. |
- if (asked_to_terminate_) |
- return; |
- |
- if (!WTF::isMainThread()) { |
- WebWorkerImpl::DispatchTaskToMainThread( |
- WebCore::createCallbackTask(&StartWorkerContextTask, this, |
- script_url.string(), user_agent, source_code)); |
- return; |
- } |
- |
- webworker_->startWorkerContext( |
- webkit_glue::KURLToWebURL(script_url), |
- webkit_glue::StringToWebString(user_agent), |
- webkit_glue::StringToWebString(source_code)); |
-} |
- |
-void WebWorkerClientImpl::terminateWorkerContext() { |
- if (asked_to_terminate_) |
- return; |
- |
- asked_to_terminate_ = true; |
- |
- if (!WTF::isMainThread()) { |
- WebWorkerImpl::DispatchTaskToMainThread( |
- WebCore::createCallbackTask(&TerminateWorkerContextTask, this)); |
- return; |
- } |
- |
- webworker_->terminateWorkerContext(); |
-} |
- |
-void WebWorkerClientImpl::postMessageToWorkerContext( |
- WTF::PassRefPtr<WebCore::SerializedScriptValue> message, |
- WTF::PassOwnPtr<WebCore::MessagePortChannelArray> channels) { |
- // Worker.terminate() could be called from JS before the context is started. |
- if (asked_to_terminate_) |
- return; |
- |
- ++unconfirmed_message_count_; |
- |
- if (!WTF::isMainThread()) { |
- WebWorkerImpl::DispatchTaskToMainThread( |
- WebCore::createCallbackTask( |
- &PostMessageToWorkerContextTask, |
- this, |
- message->toString(), |
- channels)); |
- return; |
- } |
- |
- WebMessagePortChannelArray webchannels(channels.get() ? channels->size() : 0); |
- |
- for (size_t i = 0; i < webchannels.size(); ++i) { |
- WebMessagePortChannel* webchannel = |
- (*channels)[i]->channel()->webChannelRelease(); |
- webchannel->setClient(0); |
- webchannels[i] = webchannel; |
- } |
- |
- webworker_->postMessageToWorkerContext( |
- webkit_glue::StringToWebString(message->toString()), webchannels); |
-} |
- |
-bool WebWorkerClientImpl::hasPendingActivity() const { |
- return !asked_to_terminate_ && |
- (unconfirmed_message_count_ || worker_context_had_pending_activity_); |
-} |
- |
-void WebWorkerClientImpl::workerObjectDestroyed() { |
- if (WTF::isMainThread()) { |
- webworker_->workerObjectDestroyed(); |
- worker_ = NULL; |
- } |
- |
- // Even if this is called on the main thread, there could be a queued task for |
- // this object, so don't delete it right away. |
- WebWorkerImpl::DispatchTaskToMainThread( |
- WebCore::createCallbackTask(&WorkerObjectDestroyedTask, this)); |
-} |
- |
-void WebWorkerClientImpl::postMessageToWorkerObject( |
- const WebString& message, |
- const WebMessagePortChannelArray& channels) { |
- WebCore::String message2 = webkit_glue::WebStringToString(message); |
- OwnPtr<WebCore::MessagePortChannelArray> channels2; |
- if (channels.size()) { |
- channels2 = new WebCore::MessagePortChannelArray(channels.size()); |
- for (size_t i = 0; i < channels.size(); ++i) { |
- RefPtr<WebCore::PlatformMessagePortChannel> platform_channel = |
- WebCore::PlatformMessagePortChannel::create(channels[i]); |
- channels[i]->setClient(platform_channel.get()); |
- (*channels2)[i] = WebCore::MessagePortChannel::create(platform_channel); |
- } |
- } |
- |
- if (WTF::currentThread() != worker_thread_id_) { |
- script_execution_context_->postTask( |
- WebCore::createCallbackTask(&PostMessageToWorkerObjectTask, this, |
- message2, channels2.release())); |
- return; |
- } |
- |
- PostMessageToWorkerObjectTask( |
- script_execution_context_.get(), this, message2, channels2.release()); |
-} |
- |
-void WebWorkerClientImpl::postExceptionToWorkerObject( |
- const WebString& error_message, |
- int line_number, |
- const WebString& source_url) { |
- if (WTF::currentThread() != worker_thread_id_) { |
- script_execution_context_->postTask( |
- WebCore::createCallbackTask(&PostExceptionToWorkerObjectTask, this, |
- webkit_glue::WebStringToString(error_message), |
- line_number, |
- webkit_glue::WebStringToString(source_url))); |
- return; |
- } |
- |
- bool handled = false; |
- handled = worker_->dispatchEvent( |
- WebCore::ErrorEvent::create(webkit_glue::WebStringToString(error_message), |
- webkit_glue::WebStringToString(source_url), |
- line_number)); |
- if (!handled) |
- script_execution_context_->reportException( |
- webkit_glue::WebStringToString(error_message), |
- line_number, |
- webkit_glue::WebStringToString(source_url)); |
-} |
- |
-void WebWorkerClientImpl::postConsoleMessageToWorkerObject( |
- int destination_id, |
- int source_id, |
- int message_type, |
- int message_level, |
- const WebString& message, |
- int line_number, |
- const WebString& source_url) { |
- if (WTF::currentThread() != worker_thread_id_) { |
- script_execution_context_->postTask( |
- WebCore::createCallbackTask(&PostConsoleMessageToWorkerObjectTask, this, |
- destination_id, source_id, message_type, message_level, |
- webkit_glue::WebStringToString(message), |
- line_number, |
- webkit_glue::WebStringToString(source_url))); |
- return; |
- } |
- |
- script_execution_context_->addMessage( |
- static_cast<WebCore::MessageDestination>(destination_id), |
- static_cast<WebCore::MessageSource>(source_id), |
- static_cast<WebCore::MessageType>(message_type), |
- static_cast<WebCore::MessageLevel>(message_level), |
- webkit_glue::WebStringToString(message), |
- line_number, |
- webkit_glue::WebStringToString(source_url)); |
-} |
- |
-void WebWorkerClientImpl::confirmMessageFromWorkerObject( |
- bool has_pending_activity) { |
- // unconfirmed_message_count_ can only be updated on the thread where it's |
- // accessed. Otherwise there are race conditions with v8's garbage |
- // collection. |
- script_execution_context_->postTask( |
- WebCore::createCallbackTask(&ConfirmMessageFromWorkerObjectTask, this)); |
-} |
- |
-void WebWorkerClientImpl::reportPendingActivity(bool has_pending_activity) { |
- // See above comment in confirmMessageFromWorkerObject. |
- script_execution_context_->postTask( |
- WebCore::createCallbackTask(&ReportPendingActivityTask, this, |
- has_pending_activity)); |
-} |
- |
-void WebWorkerClientImpl::workerContextDestroyed() { |
-} |
- |
-void WebWorkerClientImpl::StartWorkerContextTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerClientImpl* this_ptr, |
- const WebCore::String& script_url, |
- const WebCore::String& user_agent, |
- const WebCore::String& source_code) { |
- this_ptr->webworker_->startWorkerContext( |
- webkit_glue::KURLToWebURL( |
- WebCore::KURL(WebCore::ParsedURLString, script_url)), |
- webkit_glue::StringToWebString(user_agent), |
- webkit_glue::StringToWebString(source_code)); |
-} |
- |
-void WebWorkerClientImpl::TerminateWorkerContextTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerClientImpl* this_ptr) { |
- this_ptr->webworker_->terminateWorkerContext(); |
-} |
- |
-void WebWorkerClientImpl::PostMessageToWorkerContextTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerClientImpl* this_ptr, |
- const WebCore::String& message, |
- WTF::PassOwnPtr<WebCore::MessagePortChannelArray> channels) { |
- WebMessagePortChannelArray web_channels(channels.get() ? channels->size() : 0); |
- |
- for (size_t i = 0; i < web_channels.size(); ++i) { |
- web_channels[i] = (*channels)[i]->channel()->webChannelRelease(); |
- web_channels[i]->setClient(0); |
- } |
- |
- this_ptr->webworker_->postMessageToWorkerContext( |
- webkit_glue::StringToWebString(message), web_channels); |
-} |
- |
-void WebWorkerClientImpl::WorkerObjectDestroyedTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerClientImpl* this_ptr) { |
- if (this_ptr->worker_) // Check we haven't alread called this. |
- this_ptr->webworker_->workerObjectDestroyed(); |
- delete this_ptr; |
-} |
- |
-void WebWorkerClientImpl::PostMessageToWorkerObjectTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerClientImpl* this_ptr, |
- const WebCore::String& message, |
- WTF::PassOwnPtr<WebCore::MessagePortChannelArray> channels) { |
- |
- if (this_ptr->worker_) { |
- WTF::OwnPtr<WebCore::MessagePortArray> ports = |
- WebCore::MessagePort::entanglePorts(*context, channels.release()); |
- WTF::RefPtr<WebCore::SerializedScriptValue> serialized_message = |
- WebCore::SerializedScriptValue::create(message); |
- this_ptr->worker_->dispatchEvent( |
- WebCore::MessageEvent::create(ports.release(), |
- serialized_message.release())); |
- } |
-} |
- |
-void WebWorkerClientImpl::PostExceptionToWorkerObjectTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerClientImpl* this_ptr, |
- const WebCore::String& error_message, |
- int line_number, |
- const WebCore::String& source_url) { |
- bool handled = false; |
- if (this_ptr->worker_) |
- handled = this_ptr->worker_->dispatchEvent( |
- WebCore::ErrorEvent::create(error_message, source_url, line_number)); |
- if (!handled) |
- this_ptr->script_execution_context_->reportException( |
- error_message, line_number, source_url); |
-} |
- |
-void WebWorkerClientImpl::PostConsoleMessageToWorkerObjectTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerClientImpl* this_ptr, |
- int destination_id, |
- int source_id, |
- int message_type, |
- int message_level, |
- const WebCore::String& message, |
- int line_number, |
- const WebCore::String& source_url) { |
- this_ptr->script_execution_context_->addMessage( |
- static_cast<WebCore::MessageDestination>(destination_id), |
- static_cast<WebCore::MessageSource>(source_id), |
- static_cast<WebCore::MessageType>(message_type), |
- static_cast<WebCore::MessageLevel>(message_level), |
- message, |
- line_number, |
- source_url); |
-} |
- |
-void WebWorkerClientImpl::ConfirmMessageFromWorkerObjectTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerClientImpl* this_ptr) { |
- this_ptr->unconfirmed_message_count_--; |
-} |
- |
-void WebWorkerClientImpl::ReportPendingActivityTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerClientImpl* this_ptr, |
- bool has_pending_activity) { |
- this_ptr->worker_context_had_pending_activity_ = has_pending_activity; |
-} |
- |
-#endif |