Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Unified Diff: webkit/glue/webworkerclient_impl.cc

Issue 337057: Move webworker{client}_impl.{h,cc} into webkit/api/src (Closed)
Patch Set: mulitple workers per process comment fixed Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/glue/webworkerclient_impl.h ('k') | webkit/webkit.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « webkit/glue/webworkerclient_impl.h ('k') | webkit/webkit.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698