Index: webkit/glue/webworker_impl.cc |
diff --git a/webkit/glue/webworker_impl.cc b/webkit/glue/webworker_impl.cc |
deleted file mode 100644 |
index 172ba4dd377345b9d02b2d144e1f7fa5e2821538..0000000000000000000000000000000000000000 |
--- a/webkit/glue/webworker_impl.cc |
+++ /dev/null |
@@ -1,409 +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" |
- |
-#include "DedicatedWorkerContext.h" |
-#include "DedicatedWorkerThread.h" |
-#include "GenericWorkerTask.h" |
-#include "KURL.h" |
-#include "MessageEvent.h" |
-#include "MessagePort.h" |
-#include "MessagePortChannel.h" |
-#include "ScriptExecutionContext.h" |
-#include "SecurityOrigin.h" |
-#include "SerializedScriptValue.h" |
-#include "SubstituteData.h" |
-#include <wtf/MainThread.h> |
-#include <wtf/Threading.h> |
- |
-#undef LOG |
- |
-#include "webkit/api/public/WebFrameClient.h" |
-#include "webkit/api/public/WebMessagePortChannel.h" |
-#include "webkit/api/public/WebScreenInfo.h" |
-#include "webkit/api/public/WebString.h" |
-#include "webkit/api/public/WebURL.h" |
-#include "webkit/api/public/WebView.h" |
-#include "webkit/api/public/WebWorkerClient.h" |
-#include "webkit/api/src/PlatformMessagePortChannel.h" |
-#include "webkit/api/src/WebDataSourceImpl.h" |
-#include "webkit/glue/empty_webframeclient.h" |
-#include "webkit/glue/glue_util.h" |
-#include "webkit/glue/webframe_impl.h" |
-#include "webkit/glue/webpreferences.h" |
-#include "webkit/glue/webworker_impl.h" |
- |
-using WebKit::WebCursorInfo; |
-using WebKit::WebDataSource; |
-using WebKit::WebDataSourceImpl; |
-using WebKit::WebFrame; |
-using WebKit::WebFrameClient; |
-using WebKit::WebMessagePortChannel; |
-using WebKit::WebMessagePortChannelArray; |
-using WebKit::WebNavigationPolicy; |
-using WebKit::WebRect; |
-using WebKit::WebScreenInfo; |
-using WebKit::WebString; |
-using WebKit::WebURL; |
-using WebKit::WebWorker; |
-using WebKit::WebWorkerClient; |
-using WebKit::WebView; |
- |
-#if ENABLE(WORKERS) |
- |
-// Dummy WebViewDelegate - we only need it in Worker process to load a |
-// 'shadow page' which will initialize WebCore loader. |
-class WorkerWebFrameClient : public webkit_glue::EmptyWebFrameClient { |
- public: |
- // Tell the loader to load the data into the 'shadow page' synchronously, |
- // so we can grab the resulting Document right after load. |
- virtual void didCreateDataSource(WebFrame* frame, WebDataSource* ds) { |
- static_cast<WebDataSourceImpl*>(ds)->setDeferMainResourceDataLoad(false); |
- } |
- |
- // Lazy allocate and leak this instance. |
- static WorkerWebFrameClient* GetSharedInstance() { |
- static WorkerWebFrameClient client; |
- return &client; |
- } |
- |
- private: |
- WorkerWebFrameClient() {} |
-}; |
- |
-namespace WebKit { |
- |
-WebWorker* WebWorker::create(WebWorkerClient* client) { |
- return new WebWorkerImpl(client); |
-} |
- |
-} |
- |
-// This function is called on the main thread to force to initialize some static |
-// values used in WebKit before any worker thread is started. This is because in |
-// our worker processs, we do not run any WebKit code in main thread and thus |
-// when multiple workers try to start at the same time, we might hit crash due |
-// to contention for initializing static values. |
-void InitializeWebKitStaticValues() { |
- static bool initialized = false; |
- if (!initialized) { |
- initialized= true; |
- // Note that we have to pass a URL with valid protocol in order to follow |
- // the path to do static value initializations. |
- WTF::RefPtr<WebCore::SecurityOrigin> origin = |
- WebCore::SecurityOrigin::create(WebCore::KURL(WebCore::ParsedURLString, |
- "http://localhost")); |
- origin.release(); |
- } |
-} |
- |
-WebWorkerImpl::WebWorkerImpl(WebWorkerClient* client) |
- : client_(client), |
- web_view_(NULL), |
- asked_to_terminate_(false) { |
- InitializeWebKitStaticValues(); |
-} |
- |
-WebWorkerImpl::~WebWorkerImpl() { |
- web_view_->close(); |
-} |
- |
-void WebWorkerImpl::PostMessageToWorkerContextTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerImpl* this_ptr, |
- const WebCore::String& message, |
- WTF::PassOwnPtr<WebCore::MessagePortChannelArray> channels) { |
- ASSERT(context->isWorkerContext()); |
- WebCore::DedicatedWorkerContext* worker_context = |
- static_cast<WebCore::DedicatedWorkerContext*>(context); |
- |
- WTF::OwnPtr<WebCore::MessagePortArray> ports = |
- WebCore::MessagePort::entanglePorts(*context, channels.release()); |
- WTF::RefPtr<WebCore::SerializedScriptValue> serialized_message = |
- WebCore::SerializedScriptValue::create(message); |
- worker_context->dispatchEvent( |
- WebCore::MessageEvent::create(ports.release(), |
- serialized_message.release())); |
- |
- this_ptr->confirmMessageFromWorkerObject( |
- worker_context->hasPendingActivity()); |
-} |
- |
-// WebWorker ------------------------------------------------------------------- |
- |
-void WebWorkerImpl::startWorkerContext(const WebURL& script_url, |
- const WebString& user_agent, |
- const WebString& source_code) { |
- // Create 'shadow page'. This page is never displayed, it is used to proxy the |
- // loading requests from the worker context to the rest of WebKit and Chromium |
- // infrastructure. |
- ASSERT(!web_view_); |
- web_view_ = WebView::create(NULL); |
- WebPreferences().Apply(web_view_); |
- web_view_->initializeMainFrame(WorkerWebFrameClient::GetSharedInstance()); |
- |
- WebFrameImpl* web_frame = static_cast<WebFrameImpl*>(web_view_->mainFrame()); |
- |
- // Construct substitute data source for the 'shadow page'. We only need it |
- // to have same origin as the worker so the loading checks work correctly. |
- WebCore::CString content(""); |
- int len = static_cast<int>(content.length()); |
- RefPtr<WebCore::SharedBuffer> buf( |
- WebCore::SharedBuffer::create(content.data(), len)); |
- WebCore::SubstituteData subst_data(buf, |
- WebCore::String("text/html"), |
- WebCore::String("UTF-8"), |
- WebCore::KURL()); |
- WebCore::ResourceRequest request(webkit_glue::GURLToKURL(script_url), |
- WebCore::CString()); |
- web_frame->frame()->loader()->load(request, subst_data, false); |
- |
- // This document will be used as 'loading context' for the worker. |
- loading_document_ = web_frame->frame()->document(); |
- |
- worker_thread_ = WebCore::DedicatedWorkerThread::create( |
- webkit_glue::WebURLToKURL(script_url), |
- webkit_glue::WebStringToString(user_agent), |
- webkit_glue::WebStringToString(source_code), |
- *this, |
- *this); |
- |
- // Worker initialization means a pending activity. |
- reportPendingActivity(true); |
- |
- worker_thread_->start(); |
-} |
- |
-void WebWorkerImpl::terminateWorkerContext() { |
- if (asked_to_terminate_) |
- return; |
- asked_to_terminate_ = true; |
- |
- if (worker_thread_) |
- worker_thread_->stop(); |
-} |
- |
-void WebWorkerImpl::postMessageToWorkerContext( |
- const WebString& message, |
- const WebMessagePortChannelArray& webchannels) { |
- |
- WTF::OwnPtr<WebCore::MessagePortChannelArray> channels; |
- if (webchannels.size()) { |
- channels = new WebCore::MessagePortChannelArray(webchannels.size()); |
- for (size_t i = 0; i < webchannels.size(); ++i) { |
- RefPtr<WebCore::PlatformMessagePortChannel> platform_channel = |
- WebCore::PlatformMessagePortChannel::create(webchannels[i]); |
- webchannels[i]->setClient(platform_channel.get()); |
- (*channels)[i] = WebCore::MessagePortChannel::create(platform_channel); |
- } |
- } |
- |
- worker_thread_->runLoop().postTask(WebCore::createCallbackTask( |
- &PostMessageToWorkerContextTask, |
- this, |
- webkit_glue::WebStringToString(message), |
- channels.release())); |
-} |
- |
-void WebWorkerImpl::workerObjectDestroyed() { |
- // Worker object in the renderer was destroyed, perhaps a result of GC. |
- // For us, it's a signal to start terminating the WorkerContext too. |
- // TODO(dimich): when 'kill a worker' html5 spec algorithm is implemented, it |
- // should be used here instead of 'terminate a worker'. |
- terminateWorkerContext(); |
-} |
- |
-void WebWorkerImpl::clientDestroyed() { |
- client_ = NULL; |
-} |
- |
-void WebWorkerImpl::DispatchTaskToMainThread( |
- PassRefPtr<WebCore::ScriptExecutionContext::Task> task) { |
- return WTF::callOnMainThread(InvokeTaskMethod, task.releaseRef()); |
-} |
- |
-void WebWorkerImpl::InvokeTaskMethod(void* param) { |
- WebCore::ScriptExecutionContext::Task* task = |
- static_cast<WebCore::ScriptExecutionContext::Task*>(param); |
- task->performTask(NULL); |
- task->deref(); |
-} |
- |
-// WorkerObjectProxy ----------------------------------------------------------- |
- |
-void WebWorkerImpl::postMessageToWorkerObject( |
- WTF::PassRefPtr<WebCore::SerializedScriptValue> message, |
- WTF::PassOwnPtr<WebCore::MessagePortChannelArray> channels) { |
- DispatchTaskToMainThread(WebCore::createCallbackTask( |
- &PostMessageTask, |
- this, |
- message->toString(), |
- channels)); |
-} |
- |
-void WebWorkerImpl::PostMessageTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerImpl* this_ptr, |
- WebCore::String message, |
- WTF::PassOwnPtr<WebCore::MessagePortChannelArray> channels) { |
- if (!this_ptr->client_) |
- return; |
- |
- 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->client_->postMessageToWorkerObject( |
- webkit_glue::StringToWebString(message), web_channels); |
-} |
- |
-void WebWorkerImpl::postExceptionToWorkerObject( |
- const WebCore::String& error_message, |
- int line_number, |
- const WebCore::String& source_url) { |
- DispatchTaskToMainThread(WebCore::createCallbackTask( |
- &PostExceptionTask, |
- this, |
- error_message, |
- line_number, |
- source_url)); |
-} |
- |
-void WebWorkerImpl::PostExceptionTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerImpl* this_ptr, |
- const WebCore::String& error_message, |
- int line_number, |
- const WebCore::String& source_url) { |
- if (!this_ptr->client_) |
- return; |
- |
- this_ptr->client_->postExceptionToWorkerObject( |
- webkit_glue::StringToWebString(error_message), |
- line_number, |
- webkit_glue::StringToWebString(source_url)); |
-} |
- |
-void WebWorkerImpl::postConsoleMessageToWorkerObject( |
- WebCore::MessageDestination destination, |
- WebCore::MessageSource source, |
- WebCore::MessageType type, |
- WebCore::MessageLevel level, |
- const WebCore::String& message, |
- int line_number, |
- const WebCore::String& source_url) { |
- DispatchTaskToMainThread(WebCore::createCallbackTask( |
- &PostConsoleMessageTask, |
- this, |
- static_cast<int>(destination), |
- static_cast<int>(source), |
- static_cast<int>(type), |
- static_cast<int>(level), |
- message, |
- line_number, |
- source_url)); |
-} |
- |
-void WebWorkerImpl::PostConsoleMessageTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerImpl* this_ptr, |
- int destination, |
- int source, |
- int type, |
- int level, |
- const WebCore::String& message, |
- int line_number, |
- const WebCore::String& source_url) { |
- if (!this_ptr->client_) |
- return; |
- |
- this_ptr->client_->postConsoleMessageToWorkerObject( |
- destination, |
- source, |
- type, |
- level, |
- webkit_glue::StringToWebString(message), |
- line_number, |
- webkit_glue::StringToWebString(source_url)); |
-} |
- |
-void WebWorkerImpl::confirmMessageFromWorkerObject(bool has_pending_activity) { |
- DispatchTaskToMainThread(WebCore::createCallbackTask( |
- &ConfirmMessageTask, |
- this, |
- has_pending_activity)); |
-} |
- |
-void WebWorkerImpl::ConfirmMessageTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerImpl* this_ptr, |
- bool has_pending_activity) { |
- if (!this_ptr->client_) |
- return; |
- |
- this_ptr->client_->confirmMessageFromWorkerObject(has_pending_activity); |
-} |
- |
-void WebWorkerImpl::reportPendingActivity(bool has_pending_activity) { |
- DispatchTaskToMainThread(WebCore::createCallbackTask( |
- &ReportPendingActivityTask, |
- this, |
- has_pending_activity)); |
-} |
- |
-void WebWorkerImpl::ReportPendingActivityTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerImpl* this_ptr, |
- bool has_pending_activity) { |
- if (!this_ptr->client_) |
- return; |
- |
- this_ptr->client_->reportPendingActivity(has_pending_activity); |
-} |
- |
-void WebWorkerImpl::workerContextDestroyed() { |
- DispatchTaskToMainThread(WebCore::createCallbackTask( |
- &WorkerContextDestroyedTask, |
- this)); |
-} |
- |
-// WorkerLoaderProxy ----------------------------------------------------------- |
- |
-void WebWorkerImpl::postTaskToLoader( |
- PassRefPtr<WebCore::ScriptExecutionContext::Task> task) { |
- ASSERT(loading_document_->isDocument()); |
- loading_document_->postTask(task); |
-} |
- |
-void WebWorkerImpl::postTaskForModeToWorkerContext( |
- PassRefPtr<WebCore::ScriptExecutionContext::Task> task, |
- const WebCore::String& mode) { |
- worker_thread_->runLoop().postTaskForMode(task, mode); |
-} |
- |
-void WebWorkerImpl::WorkerContextDestroyedTask( |
- WebCore::ScriptExecutionContext* context, |
- WebWorkerImpl* this_ptr) { |
- if (this_ptr->client_) |
- this_ptr->client_->workerContextDestroyed(); |
- |
- // The lifetime of this proxy is controlled by the worker context. |
- delete this_ptr; |
-} |
- |
-#else |
- |
-namespace WebKit { |
- |
-WebWorker* WebWorker::create(WebWorkerClient* client) { |
- return NULL; |
-} |
- |
-} |
- |
-#endif |