Index: webkit/glue/webworkerclient_impl.cc |
=================================================================== |
--- webkit/glue/webworkerclient_impl.cc (revision 0) |
+++ webkit/glue/webworkerclient_impl.cc (revision 0) |
@@ -0,0 +1,128 @@ |
+// 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 "base/compiler_specific.h" |
+ |
+#include "Frame.h" |
+#include "FrameLoaderClient.h" |
+#include "WorkerMessagingProxy.h" |
+#include "Worker.h" |
+ |
+#undef LOG |
+ |
+#include "webkit/glue/webworkerclient_impl.h" |
+ |
+#include "webkit/glue/glue_util.h" |
+#include "webkit/glue/webframeloaderclient_impl.h" |
+#include "webkit/glue/webframe_impl.h" |
+#include "webkit/glue/webview_delegate.h" |
+#include "webkit/glue/webview_impl.h" |
+#include "webkit/glue/webworker.h" |
+ |
+ |
+// 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. |
+WebCore::WorkerContextProxy* WebCore::WorkerContextProxy::create( |
+ WebCore::Worker* worker) { |
+ if (!worker->scriptExecutionContext()->isDocument()) |
+ return new WebCore::WorkerMessagingProxy(worker); |
+ |
+ WebWorkerClientImpl* proxy = new WebWorkerClientImpl(worker); |
+ |
+ // Get to the RenderView, so that we can tell the browser to create a |
+ // worker process if necessary. |
+ WebCore::Document* document = static_cast<WebCore::Document*>( |
+ worker->scriptExecutionContext()); |
+ WebFrameLoaderClient* frame_loader_client = |
+ static_cast<WebFrameLoaderClient*>(document->frame()->loader()->client()); |
+ WebViewDelegate* webview_delegate = |
+ frame_loader_client->webframe()->webview_impl()->delegate(); |
+ WebWorker* webworker = webview_delegate->CreateWebWorker(proxy); |
+ proxy->set_webworker(webworker); |
+ return proxy; |
+} |
+ |
+ |
+WebWorkerClientImpl::WebWorkerClientImpl(WebCore::Worker* worker) |
+ : worker_(worker) { |
+} |
+ |
+WebWorkerClientImpl::~WebWorkerClientImpl() { |
+} |
+ |
+void WebWorkerClientImpl::set_webworker(WebWorker* webworker) { |
+ webworker_.reset(webworker); |
+} |
+ |
+void WebWorkerClientImpl::startWorkerContext( |
+ const WebCore::KURL& scriptURL, |
+ const WebCore::String& userAgent, |
+ const WebCore::String& sourceCode) { |
+ webworker_->StartWorkerContext(webkit_glue::KURLToGURL(scriptURL), |
+ webkit_glue::StringToString16(userAgent), |
+ webkit_glue::StringToString16(sourceCode)); |
+} |
+ |
+void WebWorkerClientImpl::terminateWorkerContext() { |
+ webworker_->TerminateWorkerContext(); |
+} |
+ |
+void WebWorkerClientImpl::postMessageToWorkerContext( |
+ const WebCore::String& message) { |
+ webworker_->PostMessageToWorkerContext( |
+ webkit_glue::StringToString16(message)); |
+} |
+ |
+bool WebWorkerClientImpl::hasPendingActivity() const { |
+ // TODO(jianli): we should use the same logic from WorkerMessagingProxy |
+ // here, so that we don't do a synchronous IPC. |
+ // Until then, always return true. |
+ return true; |
+} |
+ |
+void WebWorkerClientImpl::workerObjectDestroyed() { |
+ webworker_->WorkerObjectDestroyed(); |
+} |
+ |
+void WebWorkerClientImpl::PostMessageToWorkerObject(const string16& message) { |
+ // TODO(jianli): this method, and the ones below, need to implement |
+ // WorkerObjectProxy. |
+} |
+ |
+void WebWorkerClientImpl::PostExceptionToWorkerObject( |
+ const string16& error_message, |
+ int line_number, |
+ const string16& source_url) { |
+} |
+ |
+void WebWorkerClientImpl::PostConsoleMessageToWorkerObject( |
+ int destination, |
+ int source, |
+ int level, |
+ const string16& message, |
+ int line_number, |
+ const string16& source_url) { |
+} |
+ |
+void WebWorkerClientImpl::ConfirmMessageFromWorkerObject(bool has_pending_activity) { |
+} |
+ |
+void WebWorkerClientImpl::ReportPendingActivity(bool has_pending_activity) { |
+} |
+ |
+void WebWorkerClientImpl::WorkerContextDestroyed() { |
+ delete this; |
+} |
+ |
+#endif |